Region.c revision a7e741d5
1/*
2 * Copyright © 2003 Keith Packard
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission.  Keith Packard makes no
11 * representations about the suitability of this software for any purpose.  It
12 * is provided "as is" without express or implied warranty.
13 *
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include <config.h>
25#endif
26#include <limits.h>
27#include "Xfixesint.h"
28
29XserverRegion
30XFixesCreateRegion (Display *dpy, XRectangle *rectangles, int nrectangles)
31{
32    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
33    xXFixesCreateRegionReq	*req;
34    long    			len;
35    XserverRegion		region;
36
37    XFixesCheckExtension (dpy, info, 0);
38    LockDisplay (dpy);
39    GetReq (XFixesCreateRegion, req);
40    req->reqType = (CARD8) info->codes->major_opcode;
41    req->xfixesReqType = X_XFixesCreateRegion;
42    region = XAllocID (dpy);
43    req->region = (CARD32) region;
44    len = ((long) nrectangles) << 1;
45    SetReqLen (req, len, len);
46    len <<= 2;
47    Data16 (dpy, (short *) rectangles, len);
48    UnlockDisplay (dpy);
49    SyncHandle();
50    return region;
51}
52
53XserverRegion
54XFixesCreateRegionFromBitmap (Display *dpy, Pixmap bitmap)
55{
56    XFixesExtDisplayInfo		*info = XFixesFindDisplay (dpy);
57    xXFixesCreateRegionFromBitmapReq	*req;
58    XserverRegion			region;
59
60    XFixesCheckExtension (dpy, info, 0);
61    LockDisplay (dpy);
62    GetReq (XFixesCreateRegionFromBitmap, req);
63    req->reqType = (CARD8) info->codes->major_opcode;
64    req->xfixesReqType = X_XFixesCreateRegionFromBitmap;
65    region = XAllocID (dpy);
66    req->region = (CARD32) region;
67    req->bitmap = (CARD32) bitmap;
68    UnlockDisplay (dpy);
69    SyncHandle();
70    return region;
71}
72
73XserverRegion
74XFixesCreateRegionFromWindow (Display *dpy, Window window, int kind)
75{
76    XFixesExtDisplayInfo		*info = XFixesFindDisplay (dpy);
77    xXFixesCreateRegionFromWindowReq	*req;
78    XserverRegion			region;
79
80    XFixesCheckExtension (dpy, info, 0);
81    LockDisplay (dpy);
82    GetReq (XFixesCreateRegionFromWindow, req);
83    req->reqType = (CARD8) info->codes->major_opcode;
84    req->xfixesReqType = X_XFixesCreateRegionFromWindow;
85    region = XAllocID (dpy);
86    req->region = (CARD32) region;
87    req->window = (CARD32) window;
88    req->kind = (CARD8) kind;
89    UnlockDisplay (dpy);
90    SyncHandle();
91    return region;
92}
93
94XserverRegion
95XFixesCreateRegionFromGC (Display *dpy, GC gc)
96{
97    XFixesExtDisplayInfo		*info = XFixesFindDisplay (dpy);
98    xXFixesCreateRegionFromGCReq	*req;
99    XserverRegion			region;
100
101    XFixesCheckExtension (dpy, info, 0);
102    LockDisplay (dpy);
103    GetReq (XFixesCreateRegionFromGC, req);
104    req->reqType = (CARD8) info->codes->major_opcode;
105    req->xfixesReqType = X_XFixesCreateRegionFromGC;
106    region = XAllocID (dpy);
107    req->region = (CARD32) region;
108    req->gc = (CARD32) gc->gid;
109    UnlockDisplay (dpy);
110    SyncHandle();
111    return region;
112}
113
114XserverRegion
115XFixesCreateRegionFromPicture (Display *dpy, XID picture)
116{
117    XFixesExtDisplayInfo		*info = XFixesFindDisplay (dpy);
118    xXFixesCreateRegionFromPictureReq	*req;
119    XserverRegion			region;
120
121    XFixesCheckExtension (dpy, info, 0);
122    LockDisplay (dpy);
123    GetReq (XFixesCreateRegionFromPicture, req);
124    req->reqType = (CARD8) info->codes->major_opcode;
125    req->xfixesReqType = X_XFixesCreateRegionFromPicture;
126    region = XAllocID (dpy);
127    req->region = (CARD32) region;
128    req->picture = (CARD32) picture;
129    UnlockDisplay (dpy);
130    SyncHandle();
131    return region;
132}
133
134void
135XFixesDestroyRegion (Display *dpy, XserverRegion region)
136{
137    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
138    xXFixesDestroyRegionReq	*req;
139
140    XFixesSimpleCheckExtension (dpy, info);
141    LockDisplay (dpy);
142    GetReq (XFixesDestroyRegion, req);
143    req->reqType = (CARD8) info->codes->major_opcode;
144    req->xfixesReqType = X_XFixesDestroyRegion;
145    req->region = (CARD32) region;
146    UnlockDisplay (dpy);
147    SyncHandle();
148}
149
150void
151XFixesSetRegion (Display *dpy, XserverRegion region,
152		 XRectangle *rectangles, int nrectangles)
153{
154    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
155    xXFixesSetRegionReq		*req;
156    long    			len;
157
158    XFixesSimpleCheckExtension (dpy, info);
159    LockDisplay (dpy);
160    GetReq (XFixesSetRegion, req);
161    req->reqType = (CARD8) info->codes->major_opcode;
162    req->xfixesReqType = X_XFixesSetRegion;
163    req->region = (CARD32) region;
164    len = ((long) nrectangles) << 1;
165    SetReqLen (req, len, len);
166    len <<= 2;
167    Data16 (dpy, (short *) rectangles, len);
168    UnlockDisplay (dpy);
169    SyncHandle();
170}
171
172void
173XFixesCopyRegion (Display *dpy, XserverRegion dst, XserverRegion src)
174{
175    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
176    xXFixesCopyRegionReq	*req;
177
178    XFixesSimpleCheckExtension (dpy, info);
179    LockDisplay (dpy);
180    GetReq (XFixesCopyRegion, req);
181    req->reqType = (CARD8) info->codes->major_opcode;
182    req->xfixesReqType = X_XFixesCopyRegion;
183    req->source = (CARD32) src;
184    req->destination = (CARD32) dst;
185    UnlockDisplay (dpy);
186    SyncHandle();
187}
188
189void
190XFixesUnionRegion (Display *dpy, XserverRegion dst,
191		   XserverRegion src1, XserverRegion src2)
192{
193    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
194    xXFixesUnionRegionReq	*req;
195
196    XFixesSimpleCheckExtension (dpy, info);
197    LockDisplay (dpy);
198    GetReq (XFixesUnionRegion, req);
199    req->reqType = (CARD8) info->codes->major_opcode;
200    req->xfixesReqType = X_XFixesUnionRegion;
201    req->source1 = (CARD32) src1;
202    req->source2 = (CARD32) src2;
203    req->destination = (CARD32) dst;
204    UnlockDisplay (dpy);
205    SyncHandle();
206}
207
208void
209XFixesIntersectRegion (Display *dpy, XserverRegion dst,
210		       XserverRegion src1, XserverRegion src2)
211{
212    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
213    xXFixesIntersectRegionReq	*req;
214
215    XFixesSimpleCheckExtension (dpy, info);
216    LockDisplay (dpy);
217    GetReq (XFixesIntersectRegion, req);
218    req->reqType = (CARD8) info->codes->major_opcode;
219    req->xfixesReqType = X_XFixesIntersectRegion;
220    req->source1 = (CARD32) src1;
221    req->source2 = (CARD32) src2;
222    req->destination = (CARD32) dst;
223    UnlockDisplay (dpy);
224    SyncHandle();
225}
226
227void
228XFixesSubtractRegion (Display *dpy, XserverRegion dst,
229		      XserverRegion src1, XserverRegion src2)
230{
231    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
232    xXFixesSubtractRegionReq	*req;
233
234    XFixesSimpleCheckExtension (dpy, info);
235    LockDisplay (dpy);
236    GetReq (XFixesSubtractRegion, req);
237    req->reqType = (CARD8) info->codes->major_opcode;
238    req->xfixesReqType = X_XFixesSubtractRegion;
239    req->source1 = (CARD32) src1;
240    req->source2 = (CARD32) src2;
241    req->destination = (CARD32) dst;
242    UnlockDisplay (dpy);
243    SyncHandle();
244}
245
246void
247XFixesInvertRegion (Display *dpy, XserverRegion dst,
248		    XRectangle *rect, XserverRegion src)
249{
250    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
251    xXFixesInvertRegionReq	*req;
252
253    XFixesSimpleCheckExtension (dpy, info);
254    LockDisplay (dpy);
255    GetReq (XFixesInvertRegion, req);
256    req->reqType = (CARD8) info->codes->major_opcode;
257    req->xfixesReqType = X_XFixesInvertRegion;
258    req->x = rect->x;
259    req->y = rect->y;
260    req->width = rect->width;
261    req->height = rect->height;
262    req->source = (CARD32) src;
263    req->destination = (CARD32) dst;
264    UnlockDisplay (dpy);
265    SyncHandle();
266}
267
268void
269XFixesTranslateRegion (Display *dpy, XserverRegion region, int dx, int dy)
270{
271    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
272    xXFixesTranslateRegionReq	*req;
273
274    XFixesSimpleCheckExtension (dpy, info);
275    LockDisplay (dpy);
276    GetReq (XFixesTranslateRegion, req);
277    req->reqType = (CARD8) info->codes->major_opcode;
278    req->xfixesReqType = X_XFixesTranslateRegion;
279    req->region = (CARD32) region;
280    req->dx = (INT16) dx;
281    req->dy = (INT16) dy;
282    UnlockDisplay (dpy);
283    SyncHandle();
284}
285
286void
287XFixesRegionExtents (Display *dpy, XserverRegion dst, XserverRegion src)
288{
289    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
290    xXFixesRegionExtentsReq	*req;
291
292    XFixesSimpleCheckExtension (dpy, info);
293    LockDisplay (dpy);
294    GetReq (XFixesRegionExtents, req);
295    req->reqType = (CARD8) info->codes->major_opcode;
296    req->xfixesReqType = X_XFixesRegionExtents;
297    req->source = (CARD32) src;
298    req->destination = (CARD32) dst;
299    UnlockDisplay (dpy);
300    SyncHandle();
301}
302
303XRectangle *
304XFixesFetchRegion (Display *dpy, XserverRegion region, int *nrectanglesRet)
305{
306    XRectangle	bounds;
307
308    return XFixesFetchRegionAndBounds (dpy, region, nrectanglesRet, &bounds);
309}
310
311XRectangle *
312XFixesFetchRegionAndBounds (Display	    *dpy,
313			    XserverRegion   region,
314			    int		    *nrectanglesRet,
315			    XRectangle	    *bounds)
316{
317    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
318    xXFixesFetchRegionReq	*req;
319    xXFixesFetchRegionReply	rep;
320    XRectangle			*rects;
321    int    			nrects;
322    long    			nbytes;
323    long			nread;
324
325    XFixesCheckExtension (dpy, info, NULL);
326    LockDisplay (dpy);
327    GetReq (XFixesFetchRegion, req);
328    req->reqType = (CARD8) info->codes->major_opcode;
329    req->xfixesReqType = X_XFixesFetchRegion;
330    req->region = (CARD32) region;
331    *nrectanglesRet = 0;
332    if (!_XReply (dpy, (xReply *) &rep, 0, xFalse))
333    {
334	UnlockDisplay (dpy);
335	SyncHandle ();
336	return NULL;
337    }
338    bounds->x = rep.x;
339    bounds->y = rep.y;
340    bounds->width = rep.width;
341    bounds->height = rep.height;
342
343    if (rep.length < (INT_MAX >> 2)) {
344	nbytes = (long) rep.length << 2;
345	nrects = rep.length >> 1;
346	rects = Xmalloc ((size_t) nrects * sizeof (XRectangle));
347    } else {
348	nbytes = 0;
349	nrects = 0;
350	rects = NULL;
351    }
352
353    if (!rects)
354    {
355	_XEatDataWords(dpy, rep.length);
356	UnlockDisplay (dpy);
357	SyncHandle ();
358	return NULL;
359    }
360    nread = nrects << 3;
361    _XRead16 (dpy, (short *) rects, nread);
362    /* skip any padding */
363    if(nbytes > nread)
364    {
365	_XEatData (dpy, (unsigned long) (nbytes - nread));
366    }
367    UnlockDisplay (dpy);
368    SyncHandle();
369    *nrectanglesRet = nrects;
370    return rects;
371}
372
373void
374XFixesSetGCClipRegion (Display *dpy, GC gc,
375		       int clip_x_origin, int clip_y_origin,
376		       XserverRegion region)
377{
378    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
379    xXFixesSetGCClipRegionReq	    *req;
380
381    XFixesSimpleCheckExtension (dpy, info);
382    LockDisplay (dpy);
383    GetReq (XFixesSetGCClipRegion, req);
384    req->reqType = (CARD8) info->codes->major_opcode;
385    req->xfixesReqType = X_XFixesSetGCClipRegion;
386    req->gc = (CARD32) gc->gid;
387    req->region = (CARD32) region;
388    req->xOrigin = (INT16) clip_x_origin;
389    req->yOrigin = (INT16) clip_y_origin;
390    UnlockDisplay (dpy);
391    SyncHandle();
392}
393
394void
395XFixesSetWindowShapeRegion (Display *dpy, Window win, int shape_kind,
396			    int x_off, int y_off, XserverRegion region)
397{
398    XFixesExtDisplayInfo	    *info = XFixesFindDisplay (dpy);
399    xXFixesSetWindowShapeRegionReq  *req;
400
401    XFixesSimpleCheckExtension (dpy, info);
402    LockDisplay (dpy);
403    GetReq (XFixesSetWindowShapeRegion, req);
404    req->reqType = (CARD8) info->codes->major_opcode;
405    req->xfixesReqType = X_XFixesSetWindowShapeRegion;
406    req->dest = (CARD32) win;
407    req->destKind = (BYTE) shape_kind;
408    req->xOff = (INT16) x_off;
409    req->yOff = (INT16) y_off;
410    req->region = (CARD32) region;
411    UnlockDisplay (dpy);
412    SyncHandle();
413}
414
415void
416XFixesSetPictureClipRegion (Display *dpy, XID picture,
417			    int clip_x_origin, int clip_y_origin,
418			    XserverRegion region)
419{
420    XFixesExtDisplayInfo	    *info = XFixesFindDisplay (dpy);
421    xXFixesSetPictureClipRegionReq  *req;
422
423    XFixesSimpleCheckExtension (dpy, info);
424    LockDisplay (dpy);
425    GetReq (XFixesSetPictureClipRegion, req);
426    req->reqType = (CARD8) info->codes->major_opcode;
427    req->xfixesReqType = X_XFixesSetPictureClipRegion;
428    req->picture = (CARD32) picture;
429    req->region = (CARD32) region;
430    req->xOrigin = (INT16) clip_x_origin;
431    req->yOrigin = (INT16) clip_y_origin;
432    UnlockDisplay (dpy);
433    SyncHandle();
434}
435
436void
437XFixesExpandRegion (Display *dpy, XserverRegion dst, XserverRegion src,
438		    unsigned left, unsigned right,
439		    unsigned top, unsigned bottom)
440{
441    XFixesExtDisplayInfo	*info = XFixesFindDisplay (dpy);
442    xXFixesExpandRegionReq	*req;
443
444    XFixesSimpleCheckExtension (dpy, info);
445    LockDisplay (dpy);
446    GetReq (XFixesExpandRegion, req);
447    req->reqType = (CARD8) info->codes->major_opcode;
448    req->xfixesReqType = X_XFixesExpandRegion;
449    req->source = (CARD32) src;
450    req->destination = (CARD32) dst;
451    req->left = (CARD16) left;
452    req->right = (CARD16) right;
453    req->top = (CARD16) top;
454    req->bottom = (CARD16) bottom;
455    UnlockDisplay (dpy);
456    SyncHandle();
457}
458
459