xenocara/lib/libXfixes/src/Region.c
2006-11-25 16:46:32 +00:00

447 lines
12 KiB
C

/*
* $Id: Region.c,v 1.1.1.1 2006/11/25 17:11:05 matthieu Exp $
*
* 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.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#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->x = rect->x;
req->y = rect->y;
req->width = rect->width;
req->height = rect->height;
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;
*nrectanglesRet = 0;
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();
}