1/*
2
3Copyright 1989, 1998  The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included
12in all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20OTHER DEALINGS IN THE SOFTWARE.
21
22Except as contained in this notice, the name of The Open Group shall
23not be used in advertising or otherwise to promote the sale, use or
24other dealings in this Software without prior written authorization
25from The Open Group.
26
27*/
28
29/*
30 * Author:  Davor Matic, MIT X Consortium
31 */
32
33
34
35#ifndef _BitmapP_h
36#define _BitmapP_h
37
38#define bit int
39
40#include "Bitmap.h"
41#include "Requests.h"
42#include <X11/Xaw/SimpleP.h>
43
44typedef struct {
45    Atom           *targets;
46    Cardinal        num_targets;
47    BWRequestRec   *requests;
48    Cardinal        num_requests;
49    BWRequestRec   *request[100];
50
51} BitmapClassPart;
52
53/* Full class record declaration */
54typedef struct _BitmapClassRec {
55  CoreClassPart          core_class;
56  SimpleClassPart        simple_class;
57  BitmapClassPart        bitmap_class;
58} BitmapClassRec;
59
60extern BitmapClassRec bitmapClassRec;
61
62typedef void (*EngageProc)(Widget, BWStatus *, XtPointer, int *);
63typedef void (*TerminateProc)( Widget, BWStatus *, XtPointer);
64typedef void (*RemoveProc)(Widget w, BWStatus *, XtPointer);
65
66/**********/
67struct _BWRequestRec {
68  char         *name;
69  int           status_size;
70  EngageProc    engage;
71  XtPointer     engage_client_data;
72  TerminateProc terminate;
73  XtPointer     terminate_client_data;
74  RemoveProc    remove;
75  XtPointer     remove_client_data;
76} ;
77
78typedef struct {
79  Position from_x, from_y,
80           to_x, to_y;
81} BWArea;
82
83typedef struct {
84    BWRequestRec *request;
85    XtPointer     status;
86    Boolean       trap;
87    XtPointer     call_data;
88} BWRequestStack;
89
90typedef struct {
91    XImage   *image, *buffer;
92    XPoint    hot;
93    Position  at_x, at_y;
94    Boolean   fold;
95    Boolean   grid;
96    Boolean   changed;
97} BWZoom;
98
99typedef struct {
100    Boolean   own;
101    Boolean   limbo;
102} BWSelection;
103
104/* New fields for the Bitmap widget record */
105typedef struct {
106  /* resources */
107  Pixel            foreground_pixel;
108  Pixel            highlight_pixel;
109  Pixel            frame_pixel;
110  Pixmap           stipple;
111  Boolean          stippled;
112  Boolean          proportional;
113  Boolean          grid;
114  Dimension        grid_tolerance;
115  Pixmap           dashes;
116  Boolean          dashed;
117  Boolean          axes;
118  Boolean          resize;
119  Dimension        margin, squareW, squareH, width, height;
120  XPoint           hot;
121  int              button_function[5];
122  _XtString        filename;
123  _XtString        basename;
124  /* private state */
125  String           size;
126  Position         horizOffset, vertOffset;
127  XtActionProc     notify;
128  BWRequestStack  *request_stack;
129  Cardinal         cardinal, current;
130  /*Boolean          trapping;*/
131  XImage          *image, *buffer, *storage;
132  XPoint           buffer_hot;
133  BWArea           mark, buffer_mark;
134  GC               drawing_gc;
135  GC               highlighting_gc;
136  GC               frame_gc;
137  GC               axes_gc;
138  Boolean          changed;
139  Boolean          fold;
140  Boolean          zooming;
141  BWZoom           zoom;
142  XtPointer        *value;
143  char             status[80];
144  BWSelection      selection;
145  Boolean          stipple_change_expose_event;
146} BitmapPart;
147
148/* Full instance record declaration */
149typedef struct _BitmapRec {
150  CorePart      core;
151  SimplePart    simple;
152  BitmapPart    bitmap;
153} BitmapRec;
154
155/* Private functions */
156
157#define Length(width, height)\
158        (((int)(width) + 7) / 8 * (height))
159
160#define InBitmapX(BW, x)\
161	(Position)(min((Position)((Dimension)(max(BW->bitmap.horizOffset,x)  -\
162				   BW->bitmap.horizOffset) /\
163				   BW->bitmap.squareW), BW->bitmap.width - 1))
164
165#define InBitmapY(BW, y)\
166	(Position)(min((Position)((Dimension)(max(BW->bitmap.vertOffset, y)  -\
167				   BW->bitmap.vertOffset) /\
168				   BW->bitmap.squareH), BW->bitmap.height - 1))
169
170#define InWindowX(BW, x)\
171	(Position) (BW->bitmap.horizOffset + ((x) * BW->bitmap.squareW))
172
173#define InWindowY(BW, y)\
174	(Position) (BW->bitmap.vertOffset + ((y) * BW->bitmap.squareH))
175
176#define GetPixmap(BW, image)\
177    XCreateBitmapFromData(XtDisplay(BW), XtWindow(BW),\
178			  image->data, image->width, image->height)
179
180
181#define QuerySet(x, y) (((x) != NotSet) && ((y) != NotSet))
182
183#define bit int
184
185#define QueryZero(x, y) (((x) == 0) || ((y) == 0))
186
187#define Swap(x, y) {Position t; t = x; x = y; y = t;}
188
189#define QuerySwap(x, y) if(x > y) Swap(x, y)
190
191#define QueryInBitmap(BW, x, y)\
192  (((x) >= 0) && ((x) < BW->bitmap.image->width) &&\
193   ((y) >= 0) && ((y) < BW->bitmap.image->height))
194
195#define Value(BW, button)   (BW->bitmap.button_function[button - 1])
196
197#define CreateCleanData(length) XtCalloc(length, sizeof(char))
198XImage *CreateBitmapImage(BitmapWidget BW, char *data, Dimension width, Dimension height);
199void DestroyBitmapImage(XImage **image);
200void  TransferImageData(XImage *source, XImage *destination);
201void CopyImageData(XImage *source, XImage *destination,
202	      Position from_x, Position from_y,
203	      Position to_x, Position to_y,
204	      Position at_x, Position at_y);
205XImage *GetImage(BitmapWidget BW, Pixmap pixmap);
206XImage *ConvertToBitmapImage(BitmapWidget BW, XImage *image);
207XImage *ScaleBitmapImage(BitmapWidget BW, XImage *src,
208			 double scale_x, double scale_y);
209
210extern Boolean DEBUG;
211
212#endif /* _BitmapP_h */
213