region.c revision 4642e01f
105b261ecSmrg/* 205b261ecSmrg * Copyright © 2003 Keith Packard 305b261ecSmrg * 405b261ecSmrg * Permission to use, copy, modify, distribute, and sell this software and its 505b261ecSmrg * documentation for any purpose is hereby granted without fee, provided that 605b261ecSmrg * the above copyright notice appear in all copies and that both that 705b261ecSmrg * copyright notice and this permission notice appear in supporting 805b261ecSmrg * documentation, and that the name of Keith Packard not be used in 905b261ecSmrg * advertising or publicity pertaining to distribution of the software without 1005b261ecSmrg * specific, written prior permission. Keith Packard makes no 1105b261ecSmrg * representations about the suitability of this software for any purpose. It 1205b261ecSmrg * is provided "as is" without express or implied warranty. 1305b261ecSmrg * 1405b261ecSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1505b261ecSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 1605b261ecSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1705b261ecSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1805b261ecSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1905b261ecSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2005b261ecSmrg * PERFORMANCE OF THIS SOFTWARE. 2105b261ecSmrg */ 2205b261ecSmrg 2305b261ecSmrg#ifdef HAVE_DIX_CONFIG_H 2405b261ecSmrg#include <dix-config.h> 2505b261ecSmrg#endif 2605b261ecSmrg 2705b261ecSmrg#include "xfixesint.h" 2805b261ecSmrg#include "scrnintstr.h" 2905b261ecSmrg#ifdef RENDER 3005b261ecSmrg#include <picturestr.h> 3105b261ecSmrgextern int RenderErrBase; 3205b261ecSmrg#endif 3305b261ecSmrg#include <regionstr.h> 3405b261ecSmrg#include <gcstruct.h> 3505b261ecSmrg#include <window.h> 3605b261ecSmrg 3705b261ecSmrgRESTYPE RegionResType; 3805b261ecSmrg 3905b261ecSmrgstatic int 4005b261ecSmrgRegionResFree (pointer data, XID id) 4105b261ecSmrg{ 4205b261ecSmrg RegionPtr pRegion = (RegionPtr) data; 4305b261ecSmrg 4405b261ecSmrg REGION_DESTROY (0, pRegion); 4505b261ecSmrg return Success; 4605b261ecSmrg} 4705b261ecSmrg 4805b261ecSmrgRegionPtr 4905b261ecSmrgXFixesRegionCopy (RegionPtr pRegion) 5005b261ecSmrg{ 5105b261ecSmrg RegionPtr pNew = REGION_CREATE (0, REGION_EXTENTS(0, pRegion), 5205b261ecSmrg REGION_NUM_RECTS(pRegion)); 5305b261ecSmrg if (!pNew) 5405b261ecSmrg return 0; 5505b261ecSmrg if (!REGION_COPY (0, pNew, pRegion)) 5605b261ecSmrg { 5705b261ecSmrg REGION_DESTROY (0, pNew); 5805b261ecSmrg return 0; 5905b261ecSmrg } 6005b261ecSmrg return pNew; 6105b261ecSmrg} 6205b261ecSmrg 6305b261ecSmrgBool 6405b261ecSmrgXFixesRegionInit (void) 6505b261ecSmrg{ 6605b261ecSmrg RegionResType = CreateNewResourceType(RegionResFree); 6705b261ecSmrg return TRUE; 6805b261ecSmrg} 6905b261ecSmrg 7005b261ecSmrgint 7105b261ecSmrgProcXFixesCreateRegion (ClientPtr client) 7205b261ecSmrg{ 7305b261ecSmrg int things; 7405b261ecSmrg RegionPtr pRegion; 7505b261ecSmrg REQUEST (xXFixesCreateRegionReq); 7605b261ecSmrg 7705b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq); 7805b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 7905b261ecSmrg 8005b261ecSmrg things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq); 8105b261ecSmrg if (things & 4) 8205b261ecSmrg return BadLength; 8305b261ecSmrg things >>= 3; 8405b261ecSmrg 8505b261ecSmrg pRegion = RECTS_TO_REGION(0, things, (xRectangle *) (stuff + 1), CT_UNSORTED); 8605b261ecSmrg if (!pRegion) 8705b261ecSmrg return BadAlloc; 8805b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 8905b261ecSmrg return BadAlloc; 9005b261ecSmrg 9105b261ecSmrg return(client->noClientException); 9205b261ecSmrg} 9305b261ecSmrg 9405b261ecSmrgint 9505b261ecSmrgSProcXFixesCreateRegion (ClientPtr client) 9605b261ecSmrg{ 9705b261ecSmrg register int n; 9805b261ecSmrg REQUEST(xXFixesCreateRegionReq); 9905b261ecSmrg 10005b261ecSmrg swaps(&stuff->length, n); 10105b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq); 10205b261ecSmrg swapl(&stuff->region, n); 10305b261ecSmrg SwapRestS(stuff); 10405b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 10505b261ecSmrg} 10605b261ecSmrg 10705b261ecSmrgint 10805b261ecSmrgProcXFixesCreateRegionFromBitmap (ClientPtr client) 10905b261ecSmrg{ 11005b261ecSmrg RegionPtr pRegion; 11105b261ecSmrg PixmapPtr pPixmap; 1124642e01fSmrg int rc; 11305b261ecSmrg REQUEST (xXFixesCreateRegionFromBitmapReq); 11405b261ecSmrg 11505b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq); 11605b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 11705b261ecSmrg 1184642e01fSmrg rc = dixLookupResource((pointer *)&pPixmap, stuff->bitmap, RT_PIXMAP, 1194642e01fSmrg client, DixReadAccess); 1204642e01fSmrg if (rc != Success) 12105b261ecSmrg { 12205b261ecSmrg client->errorValue = stuff->bitmap; 1234642e01fSmrg return (rc == BadValue) ? BadPixmap : rc; 12405b261ecSmrg } 12505b261ecSmrg if (pPixmap->drawable.depth != 1) 12605b261ecSmrg return BadMatch; 12705b261ecSmrg 12805b261ecSmrg pRegion = BITMAP_TO_REGION(pPixmap->drawable.pScreen, pPixmap); 12905b261ecSmrg 13005b261ecSmrg if (!pRegion) 13105b261ecSmrg return BadAlloc; 13205b261ecSmrg 13305b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 13405b261ecSmrg return BadAlloc; 13505b261ecSmrg 13605b261ecSmrg return(client->noClientException); 13705b261ecSmrg} 13805b261ecSmrg 13905b261ecSmrgint 14005b261ecSmrgSProcXFixesCreateRegionFromBitmap (ClientPtr client) 14105b261ecSmrg{ 14205b261ecSmrg int n; 14305b261ecSmrg REQUEST (xXFixesCreateRegionFromBitmapReq); 14405b261ecSmrg 14505b261ecSmrg swaps(&stuff->length, n); 14605b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq); 14705b261ecSmrg swapl(&stuff->region, n); 14805b261ecSmrg swapl(&stuff->bitmap, n); 14905b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 15005b261ecSmrg} 15105b261ecSmrg 15205b261ecSmrgint 15305b261ecSmrgProcXFixesCreateRegionFromWindow (ClientPtr client) 15405b261ecSmrg{ 15505b261ecSmrg RegionPtr pRegion; 15605b261ecSmrg Bool copy = TRUE; 15705b261ecSmrg WindowPtr pWin; 1584642e01fSmrg int rc; 15905b261ecSmrg REQUEST (xXFixesCreateRegionFromWindowReq); 16005b261ecSmrg 16105b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq); 16205b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 1634642e01fSmrg rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, 1644642e01fSmrg client, DixGetAttrAccess); 1654642e01fSmrg if (rc != Success) 16605b261ecSmrg { 16705b261ecSmrg client->errorValue = stuff->window; 1684642e01fSmrg return (rc == BadValue) ? BadWindow : rc; 16905b261ecSmrg } 17005b261ecSmrg switch (stuff->kind) { 17105b261ecSmrg case WindowRegionBounding: 17205b261ecSmrg pRegion = wBoundingShape(pWin); 17305b261ecSmrg if (!pRegion) 17405b261ecSmrg { 17505b261ecSmrg pRegion = CreateBoundingShape (pWin); 17605b261ecSmrg copy = FALSE; 17705b261ecSmrg } 17805b261ecSmrg break; 17905b261ecSmrg case WindowRegionClip: 18005b261ecSmrg pRegion = wClipShape(pWin); 18105b261ecSmrg if (!pRegion) 18205b261ecSmrg { 18305b261ecSmrg pRegion = CreateClipShape (pWin); 18405b261ecSmrg copy = FALSE; 18505b261ecSmrg } 18605b261ecSmrg break; 18705b261ecSmrg default: 18805b261ecSmrg client->errorValue = stuff->kind; 18905b261ecSmrg return BadValue; 19005b261ecSmrg } 19105b261ecSmrg if (copy && pRegion) 19205b261ecSmrg pRegion = XFixesRegionCopy (pRegion); 19305b261ecSmrg if (!pRegion) 19405b261ecSmrg return BadAlloc; 19505b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 19605b261ecSmrg return BadAlloc; 19705b261ecSmrg 19805b261ecSmrg return(client->noClientException); 19905b261ecSmrg} 20005b261ecSmrg 20105b261ecSmrgint 20205b261ecSmrgSProcXFixesCreateRegionFromWindow (ClientPtr client) 20305b261ecSmrg{ 20405b261ecSmrg int n; 20505b261ecSmrg REQUEST (xXFixesCreateRegionFromWindowReq); 20605b261ecSmrg 20705b261ecSmrg swaps(&stuff->length, n); 20805b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq); 20905b261ecSmrg swapl(&stuff->region, n); 21005b261ecSmrg swapl(&stuff->window, n); 21105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 21205b261ecSmrg} 21305b261ecSmrg 21405b261ecSmrgint 21505b261ecSmrgProcXFixesCreateRegionFromGC (ClientPtr client) 21605b261ecSmrg{ 21705b261ecSmrg RegionPtr pRegion, pClip; 21805b261ecSmrg GCPtr pGC; 21905b261ecSmrg int rc; 22005b261ecSmrg REQUEST (xXFixesCreateRegionFromGCReq); 22105b261ecSmrg 22205b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq); 22305b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 22405b261ecSmrg 2254642e01fSmrg rc = dixLookupGC(&pGC, stuff->gc, client, DixGetAttrAccess); 22605b261ecSmrg if (rc != Success) 22705b261ecSmrg return rc; 22805b261ecSmrg 22905b261ecSmrg switch (pGC->clientClipType) { 23005b261ecSmrg case CT_PIXMAP: 23105b261ecSmrg pRegion = BITMAP_TO_REGION(pGC->pScreen, (PixmapPtr) pGC->clientClip); 23205b261ecSmrg if (!pRegion) 23305b261ecSmrg return BadAlloc; 23405b261ecSmrg break; 23505b261ecSmrg case CT_REGION: 23605b261ecSmrg pClip = (RegionPtr) pGC->clientClip; 23705b261ecSmrg pRegion = XFixesRegionCopy (pClip); 23805b261ecSmrg if (!pRegion) 23905b261ecSmrg return BadAlloc; 24005b261ecSmrg break; 24105b261ecSmrg default: 24205b261ecSmrg return BadImplementation; /* assume sane server bits */ 24305b261ecSmrg } 24405b261ecSmrg 24505b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 24605b261ecSmrg return BadAlloc; 24705b261ecSmrg 24805b261ecSmrg return(client->noClientException); 24905b261ecSmrg} 25005b261ecSmrg 25105b261ecSmrgint 25205b261ecSmrgSProcXFixesCreateRegionFromGC (ClientPtr client) 25305b261ecSmrg{ 25405b261ecSmrg int n; 25505b261ecSmrg REQUEST (xXFixesCreateRegionFromGCReq); 25605b261ecSmrg 25705b261ecSmrg swaps(&stuff->length, n); 25805b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq); 25905b261ecSmrg swapl(&stuff->region, n); 26005b261ecSmrg swapl(&stuff->gc, n); 26105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 26205b261ecSmrg} 26305b261ecSmrg 26405b261ecSmrgint 26505b261ecSmrgProcXFixesCreateRegionFromPicture (ClientPtr client) 26605b261ecSmrg{ 26705b261ecSmrg#ifdef RENDER 26805b261ecSmrg RegionPtr pRegion; 26905b261ecSmrg PicturePtr pPicture; 27005b261ecSmrg REQUEST (xXFixesCreateRegionFromPictureReq); 27105b261ecSmrg 27205b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq); 27305b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 27405b261ecSmrg 2754642e01fSmrg VERIFY_PICTURE(pPicture, stuff->picture, client, DixGetAttrAccess, 27605b261ecSmrg RenderErrBase + BadPicture); 27705b261ecSmrg 27805b261ecSmrg switch (pPicture->clientClipType) { 27905b261ecSmrg case CT_PIXMAP: 28005b261ecSmrg pRegion = BITMAP_TO_REGION(pPicture->pDrawable->pScreen, 28105b261ecSmrg (PixmapPtr) pPicture->clientClip); 28205b261ecSmrg if (!pRegion) 28305b261ecSmrg return BadAlloc; 28405b261ecSmrg break; 28505b261ecSmrg case CT_REGION: 28605b261ecSmrg pRegion = XFixesRegionCopy ((RegionPtr) pPicture->clientClip); 28705b261ecSmrg if (!pRegion) 28805b261ecSmrg return BadAlloc; 28905b261ecSmrg break; 29005b261ecSmrg default: 29105b261ecSmrg return BadImplementation; /* assume sane server bits */ 29205b261ecSmrg } 29305b261ecSmrg 29405b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 29505b261ecSmrg return BadAlloc; 29605b261ecSmrg 29705b261ecSmrg return(client->noClientException); 29805b261ecSmrg#else 29905b261ecSmrg return BadRequest; 30005b261ecSmrg#endif 30105b261ecSmrg} 30205b261ecSmrg 30305b261ecSmrgint 30405b261ecSmrgSProcXFixesCreateRegionFromPicture (ClientPtr client) 30505b261ecSmrg{ 30605b261ecSmrg int n; 30705b261ecSmrg REQUEST (xXFixesCreateRegionFromPictureReq); 30805b261ecSmrg 30905b261ecSmrg swaps(&stuff->length, n); 31005b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq); 31105b261ecSmrg swapl(&stuff->region, n); 31205b261ecSmrg swapl(&stuff->picture, n); 31305b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 31405b261ecSmrg} 31505b261ecSmrg 31605b261ecSmrgint 31705b261ecSmrgProcXFixesDestroyRegion (ClientPtr client) 31805b261ecSmrg{ 31905b261ecSmrg REQUEST (xXFixesDestroyRegionReq); 32005b261ecSmrg RegionPtr pRegion; 32105b261ecSmrg 32205b261ecSmrg REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq); 32305b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess); 32405b261ecSmrg FreeResource (stuff->region, RT_NONE); 32505b261ecSmrg return(client->noClientException); 32605b261ecSmrg} 32705b261ecSmrg 32805b261ecSmrgint 32905b261ecSmrgSProcXFixesDestroyRegion (ClientPtr client) 33005b261ecSmrg{ 33105b261ecSmrg int n; 33205b261ecSmrg REQUEST (xXFixesDestroyRegionReq); 33305b261ecSmrg 33405b261ecSmrg swaps (&stuff->length, n); 33505b261ecSmrg REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq); 33605b261ecSmrg swapl (&stuff->region, n); 33705b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 33805b261ecSmrg} 33905b261ecSmrg 34005b261ecSmrgint 34105b261ecSmrgProcXFixesSetRegion (ClientPtr client) 34205b261ecSmrg{ 34305b261ecSmrg int things; 34405b261ecSmrg RegionPtr pRegion, pNew; 34505b261ecSmrg REQUEST (xXFixesSetRegionReq); 34605b261ecSmrg 34705b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq); 34805b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess); 34905b261ecSmrg 35005b261ecSmrg things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq); 35105b261ecSmrg if (things & 4) 35205b261ecSmrg return BadLength; 35305b261ecSmrg things >>= 3; 35405b261ecSmrg 35505b261ecSmrg pNew = RECTS_TO_REGION(0, things, (xRectangle *) (stuff + 1), CT_UNSORTED); 35605b261ecSmrg if (!pNew) 35705b261ecSmrg return BadAlloc; 35805b261ecSmrg if (!REGION_COPY (0, pRegion, pNew)) 35905b261ecSmrg { 36005b261ecSmrg REGION_DESTROY (0, pNew); 36105b261ecSmrg return BadAlloc; 36205b261ecSmrg } 36305b261ecSmrg REGION_DESTROY (0, pNew); 36405b261ecSmrg return(client->noClientException); 36505b261ecSmrg} 36605b261ecSmrg 36705b261ecSmrgint 36805b261ecSmrgSProcXFixesSetRegion (ClientPtr client) 36905b261ecSmrg{ 37005b261ecSmrg int n; 37105b261ecSmrg REQUEST (xXFixesSetRegionReq); 37205b261ecSmrg 37305b261ecSmrg swaps (&stuff->length, n); 37405b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq); 37505b261ecSmrg swapl (&stuff->region, n); 37605b261ecSmrg SwapRestS(stuff); 37705b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 37805b261ecSmrg} 37905b261ecSmrg 38005b261ecSmrgint 38105b261ecSmrgProcXFixesCopyRegion (ClientPtr client) 38205b261ecSmrg{ 38305b261ecSmrg RegionPtr pSource, pDestination; 38405b261ecSmrg REQUEST (xXFixesCopyRegionReq); 38505b261ecSmrg 38605b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 38705b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 38805b261ecSmrg 38905b261ecSmrg if (!REGION_COPY(pScreen, pDestination, pSource)) 39005b261ecSmrg return BadAlloc; 39105b261ecSmrg 39205b261ecSmrg return(client->noClientException); 39305b261ecSmrg} 39405b261ecSmrg 39505b261ecSmrgint 39605b261ecSmrgSProcXFixesCopyRegion (ClientPtr client) 39705b261ecSmrg{ 39805b261ecSmrg int n; 39905b261ecSmrg REQUEST (xXFixesCopyRegionReq); 40005b261ecSmrg 40105b261ecSmrg swaps (&stuff->length, n); 40205b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesCopyRegionReq); 40305b261ecSmrg swapl (&stuff->source, n); 40405b261ecSmrg swapl (&stuff->destination, n); 40505b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 40605b261ecSmrg} 40705b261ecSmrg 40805b261ecSmrgint 40905b261ecSmrgProcXFixesCombineRegion (ClientPtr client) 41005b261ecSmrg{ 41105b261ecSmrg RegionPtr pSource1, pSource2, pDestination; 41205b261ecSmrg int ret = Success; 41305b261ecSmrg REQUEST (xXFixesCombineRegionReq); 41405b261ecSmrg 41505b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCombineRegionReq); 41605b261ecSmrg VERIFY_REGION(pSource1, stuff->source1, client, DixReadAccess); 41705b261ecSmrg VERIFY_REGION(pSource2, stuff->source2, client, DixReadAccess); 41805b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 41905b261ecSmrg 42005b261ecSmrg switch (stuff->xfixesReqType) { 42105b261ecSmrg case X_XFixesUnionRegion: 42205b261ecSmrg if (!REGION_UNION (0, pDestination, pSource1, pSource2)) 42305b261ecSmrg ret = BadAlloc; 42405b261ecSmrg break; 42505b261ecSmrg case X_XFixesIntersectRegion: 42605b261ecSmrg if (!REGION_INTERSECT (0, pDestination, pSource1, pSource2)) 42705b261ecSmrg ret = BadAlloc; 42805b261ecSmrg break; 42905b261ecSmrg case X_XFixesSubtractRegion: 43005b261ecSmrg if (!REGION_SUBTRACT (0, pDestination, pSource1, pSource2)) 43105b261ecSmrg ret = BadAlloc; 43205b261ecSmrg break; 43305b261ecSmrg } 43405b261ecSmrg 43505b261ecSmrg if (ret == Success) 43605b261ecSmrg ret = client->noClientException; 43705b261ecSmrg return ret; 43805b261ecSmrg} 43905b261ecSmrg 44005b261ecSmrgint 44105b261ecSmrgSProcXFixesCombineRegion (ClientPtr client) 44205b261ecSmrg{ 44305b261ecSmrg int n; 44405b261ecSmrg REQUEST (xXFixesCombineRegionReq); 44505b261ecSmrg 44605b261ecSmrg swaps (&stuff->length, n); 44705b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCombineRegionReq); 44805b261ecSmrg swapl (&stuff->source1, n); 44905b261ecSmrg swapl (&stuff->source2, n); 45005b261ecSmrg swapl (&stuff->destination, n); 45105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 45205b261ecSmrg} 45305b261ecSmrg 45405b261ecSmrgint 45505b261ecSmrgProcXFixesInvertRegion (ClientPtr client) 45605b261ecSmrg{ 45705b261ecSmrg RegionPtr pSource, pDestination; 45805b261ecSmrg BoxRec bounds; 45905b261ecSmrg int ret = Success; 46005b261ecSmrg REQUEST(xXFixesInvertRegionReq); 46105b261ecSmrg 46205b261ecSmrg REQUEST_SIZE_MATCH(xXFixesInvertRegionReq); 46305b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 46405b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 46505b261ecSmrg 46605b261ecSmrg /* Compute bounds, limit to 16 bits */ 46705b261ecSmrg bounds.x1 = stuff->x; 46805b261ecSmrg bounds.y1 = stuff->y; 46905b261ecSmrg if ((int) stuff->x + (int) stuff->width > MAXSHORT) 47005b261ecSmrg bounds.x2 = MAXSHORT; 47105b261ecSmrg else 47205b261ecSmrg bounds.x2 = stuff->x + stuff->width; 47305b261ecSmrg 47405b261ecSmrg if ((int) stuff->y + (int) stuff->height > MAXSHORT) 47505b261ecSmrg bounds.y2 = MAXSHORT; 47605b261ecSmrg else 47705b261ecSmrg bounds.y2 = stuff->y + stuff->height; 47805b261ecSmrg 47905b261ecSmrg if (!REGION_INVERSE(0, pDestination, pSource, &bounds)) 48005b261ecSmrg ret = BadAlloc; 48105b261ecSmrg 48205b261ecSmrg if (ret == Success) 48305b261ecSmrg ret = client->noClientException; 48405b261ecSmrg return ret; 48505b261ecSmrg} 48605b261ecSmrg 48705b261ecSmrgint 48805b261ecSmrgSProcXFixesInvertRegion (ClientPtr client) 48905b261ecSmrg{ 49005b261ecSmrg int n; 49105b261ecSmrg REQUEST(xXFixesInvertRegionReq); 49205b261ecSmrg 49305b261ecSmrg swaps (&stuff->length, n); 49405b261ecSmrg REQUEST_SIZE_MATCH(xXFixesInvertRegionReq); 49505b261ecSmrg swapl (&stuff->source, n); 49605b261ecSmrg swaps (&stuff->x, n); 49705b261ecSmrg swaps (&stuff->y, n); 49805b261ecSmrg swaps (&stuff->width, n); 49905b261ecSmrg swaps (&stuff->height, n); 50005b261ecSmrg swapl (&stuff->destination, n); 50105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 50205b261ecSmrg} 50305b261ecSmrg 50405b261ecSmrgint 50505b261ecSmrgProcXFixesTranslateRegion (ClientPtr client) 50605b261ecSmrg{ 50705b261ecSmrg RegionPtr pRegion; 50805b261ecSmrg REQUEST(xXFixesTranslateRegionReq); 50905b261ecSmrg 51005b261ecSmrg REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq); 51105b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess); 51205b261ecSmrg 51305b261ecSmrg REGION_TRANSLATE(pScreen, pRegion, stuff->dx, stuff->dy); 51405b261ecSmrg return (client->noClientException); 51505b261ecSmrg} 51605b261ecSmrg 51705b261ecSmrgint 51805b261ecSmrgSProcXFixesTranslateRegion (ClientPtr client) 51905b261ecSmrg{ 52005b261ecSmrg int n; 52105b261ecSmrg REQUEST(xXFixesTranslateRegionReq); 52205b261ecSmrg 52305b261ecSmrg swaps (&stuff->length, n); 52405b261ecSmrg REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq); 52505b261ecSmrg swapl (&stuff->region, n); 52605b261ecSmrg swaps (&stuff->dx, n); 52705b261ecSmrg swaps (&stuff->dy, n); 52805b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 52905b261ecSmrg} 53005b261ecSmrg 53105b261ecSmrgint 53205b261ecSmrgProcXFixesRegionExtents (ClientPtr client) 53305b261ecSmrg{ 53405b261ecSmrg RegionPtr pSource, pDestination; 53505b261ecSmrg REQUEST(xXFixesRegionExtentsReq); 53605b261ecSmrg 53705b261ecSmrg REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq); 53805b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 53905b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 54005b261ecSmrg 54105b261ecSmrg REGION_RESET (0, pDestination, REGION_EXTENTS (0, pSource)); 54205b261ecSmrg 54305b261ecSmrg return (client->noClientException); 54405b261ecSmrg} 54505b261ecSmrg 54605b261ecSmrgint 54705b261ecSmrgSProcXFixesRegionExtents (ClientPtr client) 54805b261ecSmrg{ 54905b261ecSmrg int n; 55005b261ecSmrg REQUEST(xXFixesRegionExtentsReq); 55105b261ecSmrg 55205b261ecSmrg swaps (&stuff->length, n); 55305b261ecSmrg REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq); 55405b261ecSmrg swapl (&stuff->source, n); 55505b261ecSmrg swapl (&stuff->destination, n); 55605b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 55705b261ecSmrg} 55805b261ecSmrg 55905b261ecSmrgint 56005b261ecSmrgProcXFixesFetchRegion (ClientPtr client) 56105b261ecSmrg{ 56205b261ecSmrg RegionPtr pRegion; 56305b261ecSmrg xXFixesFetchRegionReply *reply; 56405b261ecSmrg xRectangle *pRect; 56505b261ecSmrg BoxPtr pExtent; 56605b261ecSmrg BoxPtr pBox; 56705b261ecSmrg int i, nBox; 56805b261ecSmrg REQUEST(xXFixesFetchRegionReq); 56905b261ecSmrg 57005b261ecSmrg REQUEST_SIZE_MATCH(xXFixesFetchRegionReq); 57105b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess); 57205b261ecSmrg 57305b261ecSmrg pExtent = REGION_EXTENTS (0, pRegion); 57405b261ecSmrg pBox = REGION_RECTS (pRegion); 57505b261ecSmrg nBox = REGION_NUM_RECTS (pRegion); 57605b261ecSmrg 57705b261ecSmrg reply = xalloc (sizeof (xXFixesFetchRegionReply) + 57805b261ecSmrg nBox * sizeof (xRectangle)); 57905b261ecSmrg if (!reply) 58005b261ecSmrg return BadAlloc; 58105b261ecSmrg reply->type = X_Reply; 58205b261ecSmrg reply->sequenceNumber = client->sequence; 58305b261ecSmrg reply->length = nBox << 1; 58405b261ecSmrg reply->x = pExtent->x1; 58505b261ecSmrg reply->y = pExtent->y1; 58605b261ecSmrg reply->width = pExtent->x2 - pExtent->x1; 58705b261ecSmrg reply->height = pExtent->y2 - pExtent->y1; 58805b261ecSmrg 58905b261ecSmrg pRect = (xRectangle *) (reply + 1); 59005b261ecSmrg for (i = 0; i < nBox; i++) 59105b261ecSmrg { 59205b261ecSmrg pRect[i].x = pBox[i].x1; 59305b261ecSmrg pRect[i].y = pBox[i].y1; 59405b261ecSmrg pRect[i].width = pBox[i].x2 - pBox[i].x1; 59505b261ecSmrg pRect[i].height = pBox[i].y2 - pBox[i].y1; 59605b261ecSmrg } 59705b261ecSmrg if (client->swapped) 59805b261ecSmrg { 59905b261ecSmrg int n; 60005b261ecSmrg swaps (&reply->sequenceNumber, n); 60105b261ecSmrg swapl (&reply->length, n); 60205b261ecSmrg swaps (&reply->x, n); 60305b261ecSmrg swaps (&reply->y, n); 60405b261ecSmrg swaps (&reply->width, n); 60505b261ecSmrg swaps (&reply->height, n); 60605b261ecSmrg SwapShorts ((INT16 *) pRect, nBox * 4); 60705b261ecSmrg } 60805b261ecSmrg (void) WriteToClient(client, sizeof (xXFixesFetchRegionReply) + 60905b261ecSmrg nBox * sizeof (xRectangle), (char *) reply); 61005b261ecSmrg xfree (reply); 61105b261ecSmrg return (client->noClientException); 61205b261ecSmrg} 61305b261ecSmrg 61405b261ecSmrgint 61505b261ecSmrgSProcXFixesFetchRegion (ClientPtr client) 61605b261ecSmrg{ 61705b261ecSmrg int n; 61805b261ecSmrg REQUEST(xXFixesFetchRegionReq); 61905b261ecSmrg 62005b261ecSmrg swaps (&stuff->length, n); 62105b261ecSmrg REQUEST_SIZE_MATCH(xXFixesFetchRegionReq); 62205b261ecSmrg swapl (&stuff->region, n); 62305b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 62405b261ecSmrg} 62505b261ecSmrg 62605b261ecSmrgint 62705b261ecSmrgProcXFixesSetGCClipRegion (ClientPtr client) 62805b261ecSmrg{ 62905b261ecSmrg GCPtr pGC; 63005b261ecSmrg RegionPtr pRegion; 63105b261ecSmrg XID vals[2]; 63205b261ecSmrg int rc; 63305b261ecSmrg REQUEST(xXFixesSetGCClipRegionReq); 63405b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq); 63505b261ecSmrg 6364642e01fSmrg rc = dixLookupGC(&pGC, stuff->gc, client, DixSetAttrAccess); 63705b261ecSmrg if (rc != Success) 63805b261ecSmrg return rc; 63905b261ecSmrg 64005b261ecSmrg VERIFY_REGION_OR_NONE (pRegion, stuff->region, client, DixReadAccess); 64105b261ecSmrg 64205b261ecSmrg if (pRegion) 64305b261ecSmrg { 64405b261ecSmrg pRegion = XFixesRegionCopy (pRegion); 64505b261ecSmrg if (!pRegion) 64605b261ecSmrg return BadAlloc; 64705b261ecSmrg } 64805b261ecSmrg 64905b261ecSmrg vals[0] = stuff->xOrigin; 65005b261ecSmrg vals[1] = stuff->yOrigin; 65105b261ecSmrg DoChangeGC (pGC, GCClipXOrigin|GCClipYOrigin, vals, 0); 65205b261ecSmrg (*pGC->funcs->ChangeClip)(pGC, pRegion ? CT_REGION : CT_NONE, (pointer)pRegion, 0); 65305b261ecSmrg 65405b261ecSmrg return (client->noClientException); 65505b261ecSmrg} 65605b261ecSmrg 65705b261ecSmrgint 65805b261ecSmrgSProcXFixesSetGCClipRegion (ClientPtr client) 65905b261ecSmrg{ 66005b261ecSmrg int n; 66105b261ecSmrg REQUEST(xXFixesSetGCClipRegionReq); 66205b261ecSmrg 66305b261ecSmrg swaps (&stuff->length, n); 66405b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq); 66505b261ecSmrg swapl (&stuff->gc, n); 66605b261ecSmrg swapl (&stuff->region, n); 66705b261ecSmrg swaps (&stuff->xOrigin, n); 66805b261ecSmrg swaps (&stuff->yOrigin, n); 66905b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 67005b261ecSmrg} 67105b261ecSmrg 67205b261ecSmrgtypedef RegionPtr (*CreateDftPtr)(WindowPtr pWin); 67305b261ecSmrg 67405b261ecSmrgint 67505b261ecSmrgProcXFixesSetWindowShapeRegion (ClientPtr client) 67605b261ecSmrg{ 67705b261ecSmrg WindowPtr pWin; 67805b261ecSmrg ScreenPtr pScreen; 67905b261ecSmrg RegionPtr pRegion; 68005b261ecSmrg RegionPtr *pDestRegion; 6814642e01fSmrg int rc; 68205b261ecSmrg REQUEST(xXFixesSetWindowShapeRegionReq); 68305b261ecSmrg 68405b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq); 6854642e01fSmrg rc = dixLookupResource((pointer *)&pWin, stuff->dest, RT_WINDOW, 6864642e01fSmrg client, DixSetAttrAccess); 6874642e01fSmrg if (rc != Success) 68805b261ecSmrg { 68905b261ecSmrg client->errorValue = stuff->dest; 6904642e01fSmrg return (rc == BadValue) ? BadWindow : rc; 69105b261ecSmrg } 69205b261ecSmrg VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixWriteAccess); 69305b261ecSmrg pScreen = pWin->drawable.pScreen; 69405b261ecSmrg switch (stuff->destKind) { 69505b261ecSmrg case ShapeBounding: 69605b261ecSmrg case ShapeClip: 69705b261ecSmrg case ShapeInput: 69805b261ecSmrg break; 69905b261ecSmrg default: 70005b261ecSmrg client->errorValue = stuff->destKind; 70105b261ecSmrg return BadValue; 70205b261ecSmrg } 70305b261ecSmrg if (pRegion) 70405b261ecSmrg { 70505b261ecSmrg pRegion = XFixesRegionCopy (pRegion); 70605b261ecSmrg if (!pRegion) 70705b261ecSmrg return BadAlloc; 70805b261ecSmrg if (!pWin->optional) 70905b261ecSmrg MakeWindowOptional (pWin); 71005b261ecSmrg switch (stuff->destKind) { 71105b261ecSmrg default: 71205b261ecSmrg case ShapeBounding: 71305b261ecSmrg pDestRegion = &pWin->optional->boundingShape; 71405b261ecSmrg break; 71505b261ecSmrg case ShapeClip: 71605b261ecSmrg pDestRegion = &pWin->optional->clipShape; 71705b261ecSmrg break; 71805b261ecSmrg case ShapeInput: 71905b261ecSmrg pDestRegion = &pWin->optional->inputShape; 72005b261ecSmrg break; 72105b261ecSmrg } 72205b261ecSmrg if (stuff->xOff || stuff->yOff) 72305b261ecSmrg REGION_TRANSLATE (0, pRegion, stuff->xOff, stuff->yOff); 72405b261ecSmrg } 72505b261ecSmrg else 72605b261ecSmrg { 72705b261ecSmrg if (pWin->optional) 72805b261ecSmrg { 72905b261ecSmrg switch (stuff->destKind) { 73005b261ecSmrg default: 73105b261ecSmrg case ShapeBounding: 73205b261ecSmrg pDestRegion = &pWin->optional->boundingShape; 73305b261ecSmrg break; 73405b261ecSmrg case ShapeClip: 73505b261ecSmrg pDestRegion = &pWin->optional->clipShape; 73605b261ecSmrg break; 73705b261ecSmrg case ShapeInput: 73805b261ecSmrg pDestRegion = &pWin->optional->inputShape; 73905b261ecSmrg break; 74005b261ecSmrg } 74105b261ecSmrg } 74205b261ecSmrg else 74305b261ecSmrg pDestRegion = &pRegion; /* a NULL region pointer */ 74405b261ecSmrg } 74505b261ecSmrg if (*pDestRegion) 74605b261ecSmrg REGION_DESTROY(pScreen, *pDestRegion); 74705b261ecSmrg *pDestRegion = pRegion; 74805b261ecSmrg (*pScreen->SetShape) (pWin); 74905b261ecSmrg SendShapeNotify (pWin, stuff->destKind); 75005b261ecSmrg return (client->noClientException); 75105b261ecSmrg} 75205b261ecSmrg 75305b261ecSmrgint 75405b261ecSmrgSProcXFixesSetWindowShapeRegion (ClientPtr client) 75505b261ecSmrg{ 75605b261ecSmrg int n; 75705b261ecSmrg REQUEST(xXFixesSetWindowShapeRegionReq); 75805b261ecSmrg 75905b261ecSmrg swaps (&stuff->length, n); 76005b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq); 76105b261ecSmrg swapl (&stuff->dest, n); 76205b261ecSmrg swaps (&stuff->xOff, n); 76305b261ecSmrg swaps (&stuff->yOff, n); 76405b261ecSmrg swapl (&stuff->region, n); 76505b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 76605b261ecSmrg} 76705b261ecSmrg 76805b261ecSmrgint 76905b261ecSmrgProcXFixesSetPictureClipRegion (ClientPtr client) 77005b261ecSmrg{ 77105b261ecSmrg#ifdef RENDER 77205b261ecSmrg PicturePtr pPicture; 77305b261ecSmrg RegionPtr pRegion; 77405b261ecSmrg ScreenPtr pScreen; 77505b261ecSmrg PictureScreenPtr ps; 77605b261ecSmrg REQUEST(xXFixesSetPictureClipRegionReq); 77705b261ecSmrg 77805b261ecSmrg REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq); 7794642e01fSmrg VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess, 78005b261ecSmrg RenderErrBase + BadPicture); 78105b261ecSmrg pScreen = pPicture->pDrawable->pScreen; 78205b261ecSmrg ps = GetPictureScreen (pScreen); 78305b261ecSmrg VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess); 78405b261ecSmrg 78505b261ecSmrg return SetPictureClipRegion (pPicture, stuff->xOrigin, stuff->yOrigin, 78605b261ecSmrg pRegion); 78705b261ecSmrg#else 78805b261ecSmrg return BadRequest; 78905b261ecSmrg#endif 79005b261ecSmrg} 79105b261ecSmrg 79205b261ecSmrgint 79305b261ecSmrgSProcXFixesSetPictureClipRegion (ClientPtr client) 79405b261ecSmrg{ 79505b261ecSmrg int n; 79605b261ecSmrg REQUEST(xXFixesSetPictureClipRegionReq); 79705b261ecSmrg 79805b261ecSmrg swaps (&stuff->length, n); 79905b261ecSmrg REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq); 80005b261ecSmrg swapl (&stuff->picture, n); 80105b261ecSmrg swapl (&stuff->region, n); 80205b261ecSmrg swaps (&stuff->xOrigin, n); 80305b261ecSmrg swaps (&stuff->yOrigin, n); 80405b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 80505b261ecSmrg} 80605b261ecSmrg 80705b261ecSmrgint 80805b261ecSmrgProcXFixesExpandRegion (ClientPtr client) 80905b261ecSmrg{ 81005b261ecSmrg RegionPtr pSource, pDestination; 81105b261ecSmrg int ret = Success; 81205b261ecSmrg REQUEST (xXFixesExpandRegionReq); 81305b261ecSmrg BoxPtr pTmp; 81405b261ecSmrg BoxPtr pSrc; 81505b261ecSmrg int nBoxes; 81605b261ecSmrg int i; 81705b261ecSmrg 81805b261ecSmrg REQUEST_SIZE_MATCH (xXFixesExpandRegionReq); 81905b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 82005b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 82105b261ecSmrg 82205b261ecSmrg nBoxes = REGION_NUM_RECTS(pSource); 82305b261ecSmrg pSrc = REGION_RECTS(pSource); 82405b261ecSmrg if (nBoxes) 82505b261ecSmrg { 82605b261ecSmrg pTmp = xalloc (nBoxes * sizeof (BoxRec)); 82705b261ecSmrg if (!pTmp) 82805b261ecSmrg return BadAlloc; 82905b261ecSmrg for (i = 0; i < nBoxes; i++) 83005b261ecSmrg { 83105b261ecSmrg pTmp[i].x1 = pSrc[i].x1 - stuff->left; 83205b261ecSmrg pTmp[i].x2 = pSrc[i].x2 + stuff->right; 83305b261ecSmrg pTmp[i].y1 = pSrc[i].y1 - stuff->top; 83405b261ecSmrg pTmp[i].y2 = pSrc[i].y2 + stuff->bottom; 83505b261ecSmrg } 83605b261ecSmrg REGION_EMPTY (pScreen, pDestination); 83705b261ecSmrg for (i = 0; i < nBoxes; i++) 83805b261ecSmrg { 83905b261ecSmrg RegionRec r; 84005b261ecSmrg REGION_INIT (pScreen, &r, &pTmp[i], 0); 84105b261ecSmrg REGION_UNION (pScreen, pDestination, pDestination, &r); 84205b261ecSmrg } 84305b261ecSmrg xfree(pTmp); 84405b261ecSmrg } 84505b261ecSmrg if (ret == Success) 84605b261ecSmrg ret = client->noClientException; 84705b261ecSmrg return ret; 84805b261ecSmrg} 84905b261ecSmrg 85005b261ecSmrgint 85105b261ecSmrgSProcXFixesExpandRegion (ClientPtr client) 85205b261ecSmrg{ 85305b261ecSmrg int n; 85405b261ecSmrg REQUEST (xXFixesExpandRegionReq); 85505b261ecSmrg 85605b261ecSmrg swaps (&stuff->length, n); 85705b261ecSmrg REQUEST_SIZE_MATCH (xXFixesExpandRegionReq); 85805b261ecSmrg swapl (&stuff->source, n); 85905b261ecSmrg swapl (&stuff->destination, n); 86005b261ecSmrg swaps (&stuff->left, n); 86105b261ecSmrg swaps (&stuff->right, n); 86205b261ecSmrg swaps (&stuff->top, n); 86305b261ecSmrg swaps (&stuff->bottom, n); 86405b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 86505b261ecSmrg} 86605b261ecSmrg 867