1 /*
2 
3 Copyright 1989, 1998  The Open Group
4 
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
9 documentation.
10 
11 The above copyright notice and this permission notice shall be included
12 in all copies or substantial portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 OTHER DEALINGS IN THE SOFTWARE.
21 
22 Except as contained in this notice, the name of The Open Group shall
23 not be used in advertising or otherwise to promote the sale, use or
24 other dealings in this Software without prior written authorization
25 from 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 
44 typedef 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 */
54 typedef struct _BitmapClassRec {
55   CoreClassPart          core_class;
56   SimpleClassPart        simple_class;
57   BitmapClassPart        bitmap_class;
58 } BitmapClassRec;
59 
60 extern BitmapClassRec bitmapClassRec;
61 
62 typedef void (*EngageProc)(Widget, BWStatus *, XtPointer, int *);
63 typedef void (*TerminateProc)( Widget, BWStatus *, XtPointer);
64 typedef void (*RemoveProc)(Widget w, BWStatus *, XtPointer);
65 
66 /**********/
67 struct _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 
78 typedef struct {
79   Position from_x, from_y,
80            to_x, to_y;
81 } BWArea;
82 
83 typedef struct {
84     BWRequestRec *request;
85     XtPointer     status;
86     Boolean       trap;
87     XtPointer     call_data;
88 } BWRequestStack;
89 
90 typedef 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 
99 typedef struct {
100     Boolean   own;
101     Boolean   limbo;
102 } BWSelection;
103 
104 /* New fields for the Bitmap widget record */
105 typedef 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   String           filename, basename;
123   /* private state */
124   String           size;
125   Position         horizOffset, vertOffset;
126   XtActionProc     notify;
127   BWRequestStack  *request_stack;
128   Cardinal         cardinal, current;
129   /*Boolean          trapping;*/
130   XImage          *image, *buffer, *storage;
131   XPoint           buffer_hot;
132   BWArea           mark, buffer_mark;
133   GC               drawing_gc;
134   GC               highlighting_gc;
135   GC               frame_gc;
136   GC               axes_gc;
137   Boolean          changed;
138   Boolean          fold;
139   Boolean          zooming;
140   BWZoom           zoom;
141   XtPointer        *value;
142   char             status[80];
143   BWSelection      selection;
144   Boolean          stipple_change_expose_event;
145 } BitmapPart;
146 
147 /* Full instance record declaration */
148 typedef struct _BitmapRec {
149   CorePart      core;
150   SimplePart    simple;
151   BitmapPart    bitmap;
152 } BitmapRec;
153 
154 /* Private functions */
155 
156 #define Length(width, height)\
157         (((int)(width) + 7) / 8 * (height))
158 
159 #define InBitmapX(BW, x)\
160 	(Position)(min((Position)((Dimension)(max(BW->bitmap.horizOffset,x)  -\
161 				   BW->bitmap.horizOffset) /\
162 				   BW->bitmap.squareW), BW->bitmap.width - 1))
163 
164 #define InBitmapY(BW, y)\
165 	(Position)(min((Position)((Dimension)(max(BW->bitmap.vertOffset, y)  -\
166 				   BW->bitmap.vertOffset) /\
167 				   BW->bitmap.squareH), BW->bitmap.height - 1))
168 
169 #define InWindowX(BW, x)\
170 	(Position) (BW->bitmap.horizOffset + ((x) * BW->bitmap.squareW))
171 
172 #define InWindowY(BW, y)\
173 	(Position) (BW->bitmap.vertOffset + ((y) * BW->bitmap.squareH))
174 
175 #define GetPixmap(BW, image)\
176     XCreateBitmapFromData(XtDisplay(BW), XtWindow(BW),\
177 			  image->data, image->width, image->height)
178 
179 
180 #define QuerySet(x, y) (((x) != NotSet) && ((y) != NotSet))
181 
182 #define bit int
183 
184 #define QueryZero(x, y) (((x) == 0) || ((y) == 0))
185 
186 #define Swap(x, y) {Position t; t = x; x = y; y = t;}
187 
188 #define QuerySwap(x, y) if(x > y) Swap(x, y)
189 
190 #define QueryInBitmap(BW, x, y)\
191   (((x) >= 0) && ((x) < BW->bitmap.image->width) &&\
192    ((y) >= 0) && ((y) < BW->bitmap.image->height))
193 
194 #define Value(BW, button)   (BW->bitmap.button_function[button - 1])
195 
196 #define CreateCleanData(length) XtCalloc(length, sizeof(char))
197 XImage *CreateBitmapImage(BitmapWidget BW, char *data, Dimension width, Dimension height);
198 void DestroyBitmapImage(XImage **image);
199 void  TransferImageData(XImage *source, XImage *destination);
200 void CopyImageData(XImage *source, XImage *destination,
201 	      Position from_x, Position from_y,
202 	      Position to_x, Position to_y,
203 	      Position at_x, Position at_y);
204 XImage *GetImage(BitmapWidget BW, Pixmap pixmap);
205 XImage *ConvertToBitmapImage(BitmapWidget BW, XImage *image);
206 XImage *ScaleBitmapImage(BitmapWidget BW, XImage *src,
207 			 double scale_x, double scale_y);
208 
209 extern Boolean DEBUG;
210 
211 #endif /* _BitmapP_h */
212