summaryrefslogtreecommitdiff
path: root/src/Region.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Region.c')
-rw-r--r--src/Region.c438
1 files changed, 438 insertions, 0 deletions
diff --git a/src/Region.c b/src/Region.c
new file mode 100644
index 0000000..6bf0329
--- /dev/null
+++ b/src/Region.c
@@ -0,0 +1,438 @@
+/*
+ * $Id$
+ *
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "Xfixesint.h"
+
+XserverRegion
+XFixesCreateRegion (Display *dpy, XRectangle *rectangles, int nrectangles)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesCreateRegionReq *req;
+ long len;
+ XserverRegion region;
+
+ XFixesCheckExtension (dpy, info, 0);
+ LockDisplay (dpy);
+ GetReq (XFixesCreateRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesCreateRegion;
+ region = req->region = XAllocID (dpy);
+ len = ((long) nrectangles) << 1;
+ SetReqLen (req, len, len);
+ len <<= 2;
+ Data16 (dpy, (short *) rectangles, len);
+ UnlockDisplay (dpy);
+ SyncHandle();
+ return region;
+}
+
+XserverRegion
+XFixesCreateRegionFromBitmap (Display *dpy, Pixmap bitmap)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesCreateRegionFromBitmapReq *req;
+ XserverRegion region;
+
+ XFixesCheckExtension (dpy, info, 0);
+ LockDisplay (dpy);
+ GetReq (XFixesCreateRegionFromBitmap, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesCreateRegionFromBitmap;
+ region = req->region = XAllocID (dpy);
+ req->bitmap = bitmap;
+ UnlockDisplay (dpy);
+ SyncHandle();
+ return region;
+}
+
+XserverRegion
+XFixesCreateRegionFromWindow (Display *dpy, Window window, int kind)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesCreateRegionFromWindowReq *req;
+ XserverRegion region;
+
+ XFixesCheckExtension (dpy, info, 0);
+ LockDisplay (dpy);
+ GetReq (XFixesCreateRegionFromWindow, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesCreateRegionFromWindow;
+ region = req->region = XAllocID (dpy);
+ req->window = window;
+ req->kind = kind;
+ UnlockDisplay (dpy);
+ SyncHandle();
+ return region;
+}
+
+XserverRegion
+XFixesCreateRegionFromGC (Display *dpy, GC gc)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesCreateRegionFromGCReq *req;
+ XserverRegion region;
+
+ XFixesCheckExtension (dpy, info, 0);
+ LockDisplay (dpy);
+ GetReq (XFixesCreateRegionFromGC, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesCreateRegionFromGC;
+ region = req->region = XAllocID (dpy);
+ req->gc = gc->gid;
+ UnlockDisplay (dpy);
+ SyncHandle();
+ return region;
+}
+
+XserverRegion
+XFixesCreateRegionFromPicture (Display *dpy, XID picture)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesCreateRegionFromPictureReq *req;
+ XserverRegion region;
+
+ XFixesCheckExtension (dpy, info, 0);
+ LockDisplay (dpy);
+ GetReq (XFixesCreateRegionFromPicture, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesCreateRegionFromPicture;
+ region = req->region = XAllocID (dpy);
+ req->picture = picture;
+ UnlockDisplay (dpy);
+ SyncHandle();
+ return region;
+}
+
+void
+XFixesDestroyRegion (Display *dpy, XserverRegion region)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesDestroyRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesDestroyRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesDestroyRegion;
+ req->region = region;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesSetRegion (Display *dpy, XserverRegion region,
+ XRectangle *rectangles, int nrectangles)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesSetRegionReq *req;
+ long len;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesSetRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesSetRegion;
+ req->region = region;
+ len = ((long) nrectangles) << 1;
+ SetReqLen (req, len, len);
+ len <<= 2;
+ Data16 (dpy, (short *) rectangles, len);
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesCopyRegion (Display *dpy, XserverRegion dst, XserverRegion src)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesCopyRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesCopyRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesCopyRegion;
+ req->source = src;
+ req->destination = dst;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesUnionRegion (Display *dpy, XserverRegion dst,
+ XserverRegion src1, XserverRegion src2)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesUnionRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesUnionRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesUnionRegion;
+ req->source1 = src1;
+ req->source2 = src2;
+ req->destination = dst;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesIntersectRegion (Display *dpy, XserverRegion dst,
+ XserverRegion src1, XserverRegion src2)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesIntersectRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesIntersectRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesIntersectRegion;
+ req->source1 = src1;
+ req->source2 = src2;
+ req->destination = dst;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesSubtractRegion (Display *dpy, XserverRegion dst,
+ XserverRegion src1, XserverRegion src2)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesSubtractRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesSubtractRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesSubtractRegion;
+ req->source1 = src1;
+ req->source2 = src2;
+ req->destination = dst;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesInvertRegion (Display *dpy, XserverRegion dst,
+ XRectangle *rect, XserverRegion src)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesInvertRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesInvertRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesInvertRegion;
+ req->source = src;
+ req->destination = dst;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesTranslateRegion (Display *dpy, XserverRegion region, int dx, int dy)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesTranslateRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesTranslateRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesTranslateRegion;
+ req->region = region;
+ req->dx = dx;
+ req->dy = dy;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesRegionExtents (Display *dpy, XserverRegion dst, XserverRegion src)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesRegionExtentsReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesRegionExtents, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesRegionExtents;
+ req->source = src;
+ req->destination = dst;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+XRectangle *
+XFixesFetchRegion (Display *dpy, XserverRegion region, int *nrectanglesRet)
+{
+ XRectangle bounds;
+
+ return XFixesFetchRegionAndBounds (dpy, region, nrectanglesRet, &bounds);
+}
+
+XRectangle *
+XFixesFetchRegionAndBounds (Display *dpy,
+ XserverRegion region,
+ int *nrectanglesRet,
+ XRectangle *bounds)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesFetchRegionReq *req;
+ xXFixesFetchRegionReply rep;
+ XRectangle *rects;
+ int nrects;
+ long nbytes;
+ long nread;
+
+ XFixesCheckExtension (dpy, info, 0);
+ LockDisplay (dpy);
+ GetReq (XFixesFetchRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesFetchRegion;
+ req->region = region;
+ if (!_XReply (dpy, (xReply *) &rep, 0, xFalse))
+ {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return 0;
+ }
+ bounds->x = rep.x;
+ bounds->y = rep.y;
+ bounds->width = rep.width;
+ bounds->height = rep.height;
+ nbytes = (long) rep.length << 2;
+ nrects = rep.length >> 1;
+ nread = nrects << 3;
+ rects = Xmalloc (nrects * sizeof (XRectangle));
+ if (!rects)
+ {
+ _XEatData (dpy, nbytes);
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return 0;
+ }
+ _XRead16 (dpy, (short *) rects, nrects << 3);
+ /* skip any padding */
+ if(nbytes > nread)
+ {
+ _XEatData (dpy, (unsigned long) (nbytes - nread));
+ }
+ UnlockDisplay (dpy);
+ SyncHandle();
+ *nrectanglesRet = nrects;
+ return rects;
+}
+
+void
+XFixesSetGCClipRegion (Display *dpy, GC gc,
+ int clip_x_origin, int clip_y_origin,
+ XserverRegion region)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesSetGCClipRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesSetGCClipRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesSetGCClipRegion;
+ req->gc = gc->gid;
+ req->region = region;
+ req->xOrigin = clip_x_origin;
+ req->yOrigin = clip_y_origin;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesSetWindowShapeRegion (Display *dpy, Window win, int shape_kind,
+ int x_off, int y_off, XserverRegion region)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesSetWindowShapeRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesSetWindowShapeRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesSetWindowShapeRegion;
+ req->dest = win;
+ req->destKind = shape_kind;
+ req->xOff = x_off;
+ req->yOff = y_off;
+ req->region = region;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesSetPictureClipRegion (Display *dpy, XID picture,
+ int clip_x_origin, int clip_y_origin,
+ XserverRegion region)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesSetPictureClipRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesSetPictureClipRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesSetPictureClipRegion;
+ req->picture = picture;
+ req->region = region;
+ req->xOrigin = clip_x_origin;
+ req->yOrigin = clip_y_origin;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+
+void
+XFixesExpandRegion (Display *dpy, XserverRegion dst, XserverRegion src,
+ unsigned left, unsigned right,
+ unsigned top, unsigned bottom)
+{
+ XFixesExtDisplayInfo *info = XFixesFindDisplay (dpy);
+ xXFixesExpandRegionReq *req;
+
+ XFixesSimpleCheckExtension (dpy, info);
+ LockDisplay (dpy);
+ GetReq (XFixesExpandRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->xfixesReqType = X_XFixesExpandRegion;
+ req->source = src;
+ req->destination = dst;
+ req->left = left;
+ req->right = right;
+ req->top = top;
+ req->bottom = bottom;
+ UnlockDisplay (dpy);
+ SyncHandle();
+}
+