region.c revision 9ace9065
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#include <picturestr.h> 3005b261ecSmrgextern int RenderErrBase; 3105b261ecSmrg#include <regionstr.h> 3205b261ecSmrg#include <gcstruct.h> 3305b261ecSmrg#include <window.h> 3405b261ecSmrg 356747b715SmrgRESTYPE RegionResType; 3605b261ecSmrg 3705b261ecSmrgstatic int 3805b261ecSmrgRegionResFree (pointer data, XID id) 3905b261ecSmrg{ 4005b261ecSmrg RegionPtr pRegion = (RegionPtr) data; 4105b261ecSmrg 426747b715Smrg RegionDestroy(pRegion); 4305b261ecSmrg return Success; 4405b261ecSmrg} 4505b261ecSmrg 4605b261ecSmrgRegionPtr 4705b261ecSmrgXFixesRegionCopy (RegionPtr pRegion) 4805b261ecSmrg{ 496747b715Smrg RegionPtr pNew = RegionCreate(RegionExtents(pRegion), 506747b715Smrg RegionNumRects(pRegion)); 5105b261ecSmrg if (!pNew) 5205b261ecSmrg return 0; 536747b715Smrg if (!RegionCopy(pNew, pRegion)) 5405b261ecSmrg { 556747b715Smrg RegionDestroy(pNew); 5605b261ecSmrg return 0; 5705b261ecSmrg } 5805b261ecSmrg return pNew; 5905b261ecSmrg} 6005b261ecSmrg 6105b261ecSmrgBool 6205b261ecSmrgXFixesRegionInit (void) 6305b261ecSmrg{ 646747b715Smrg RegionResType = CreateNewResourceType(RegionResFree, "XFixesRegion"); 656747b715Smrg 666747b715Smrg return RegionResType != 0; 6705b261ecSmrg} 6805b261ecSmrg 6905b261ecSmrgint 7005b261ecSmrgProcXFixesCreateRegion (ClientPtr client) 7105b261ecSmrg{ 7205b261ecSmrg int things; 7305b261ecSmrg RegionPtr pRegion; 7405b261ecSmrg REQUEST (xXFixesCreateRegionReq); 7505b261ecSmrg 7605b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq); 7705b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 7805b261ecSmrg 7905b261ecSmrg things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq); 8005b261ecSmrg if (things & 4) 8105b261ecSmrg return BadLength; 8205b261ecSmrg things >>= 3; 8305b261ecSmrg 846747b715Smrg pRegion = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED); 8505b261ecSmrg if (!pRegion) 8605b261ecSmrg return BadAlloc; 8705b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 8805b261ecSmrg return BadAlloc; 8905b261ecSmrg 906747b715Smrg return Success; 9105b261ecSmrg} 9205b261ecSmrg 9305b261ecSmrgint 9405b261ecSmrgSProcXFixesCreateRegion (ClientPtr client) 9505b261ecSmrg{ 9605b261ecSmrg register int n; 9705b261ecSmrg REQUEST(xXFixesCreateRegionReq); 9805b261ecSmrg 9905b261ecSmrg swaps(&stuff->length, n); 10005b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq); 10105b261ecSmrg swapl(&stuff->region, n); 10205b261ecSmrg SwapRestS(stuff); 10305b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 10405b261ecSmrg} 10505b261ecSmrg 10605b261ecSmrgint 10705b261ecSmrgProcXFixesCreateRegionFromBitmap (ClientPtr client) 10805b261ecSmrg{ 10905b261ecSmrg RegionPtr pRegion; 11005b261ecSmrg PixmapPtr pPixmap; 1114642e01fSmrg int rc; 11205b261ecSmrg REQUEST (xXFixesCreateRegionFromBitmapReq); 11305b261ecSmrg 11405b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq); 11505b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 11605b261ecSmrg 117b86d567bSmrg rc = dixLookupResourceByType((pointer *)&pPixmap, stuff->bitmap, RT_PIXMAP, 1184642e01fSmrg client, DixReadAccess); 1194642e01fSmrg if (rc != Success) 12005b261ecSmrg { 12105b261ecSmrg client->errorValue = stuff->bitmap; 1226747b715Smrg return rc; 12305b261ecSmrg } 12405b261ecSmrg if (pPixmap->drawable.depth != 1) 12505b261ecSmrg return BadMatch; 12605b261ecSmrg 1276747b715Smrg pRegion = BitmapToRegion(pPixmap->drawable.pScreen, pPixmap); 12805b261ecSmrg 12905b261ecSmrg if (!pRegion) 13005b261ecSmrg return BadAlloc; 13105b261ecSmrg 13205b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 13305b261ecSmrg return BadAlloc; 13405b261ecSmrg 1356747b715Smrg return Success; 13605b261ecSmrg} 13705b261ecSmrg 13805b261ecSmrgint 13905b261ecSmrgSProcXFixesCreateRegionFromBitmap (ClientPtr client) 14005b261ecSmrg{ 14105b261ecSmrg int n; 14205b261ecSmrg REQUEST (xXFixesCreateRegionFromBitmapReq); 14305b261ecSmrg 14405b261ecSmrg swaps(&stuff->length, n); 14505b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq); 14605b261ecSmrg swapl(&stuff->region, n); 14705b261ecSmrg swapl(&stuff->bitmap, n); 14805b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 14905b261ecSmrg} 15005b261ecSmrg 15105b261ecSmrgint 15205b261ecSmrgProcXFixesCreateRegionFromWindow (ClientPtr client) 15305b261ecSmrg{ 15405b261ecSmrg RegionPtr pRegion; 15505b261ecSmrg Bool copy = TRUE; 15605b261ecSmrg WindowPtr pWin; 1574642e01fSmrg int rc; 15805b261ecSmrg REQUEST (xXFixesCreateRegionFromWindowReq); 15905b261ecSmrg 16005b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq); 16105b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 162b86d567bSmrg rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, 1634642e01fSmrg client, DixGetAttrAccess); 1644642e01fSmrg if (rc != Success) 16505b261ecSmrg { 16605b261ecSmrg client->errorValue = stuff->window; 1676747b715Smrg return rc; 16805b261ecSmrg } 16905b261ecSmrg switch (stuff->kind) { 17005b261ecSmrg case WindowRegionBounding: 17105b261ecSmrg pRegion = wBoundingShape(pWin); 17205b261ecSmrg if (!pRegion) 17305b261ecSmrg { 17405b261ecSmrg pRegion = CreateBoundingShape (pWin); 17505b261ecSmrg copy = FALSE; 17605b261ecSmrg } 17705b261ecSmrg break; 17805b261ecSmrg case WindowRegionClip: 17905b261ecSmrg pRegion = wClipShape(pWin); 18005b261ecSmrg if (!pRegion) 18105b261ecSmrg { 18205b261ecSmrg pRegion = CreateClipShape (pWin); 18305b261ecSmrg copy = FALSE; 18405b261ecSmrg } 18505b261ecSmrg break; 18605b261ecSmrg default: 18705b261ecSmrg client->errorValue = stuff->kind; 18805b261ecSmrg return BadValue; 18905b261ecSmrg } 19005b261ecSmrg if (copy && pRegion) 19105b261ecSmrg pRegion = XFixesRegionCopy (pRegion); 19205b261ecSmrg if (!pRegion) 19305b261ecSmrg return BadAlloc; 19405b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 19505b261ecSmrg return BadAlloc; 19605b261ecSmrg 1976747b715Smrg return Success; 19805b261ecSmrg} 19905b261ecSmrg 20005b261ecSmrgint 20105b261ecSmrgSProcXFixesCreateRegionFromWindow (ClientPtr client) 20205b261ecSmrg{ 20305b261ecSmrg int n; 20405b261ecSmrg REQUEST (xXFixesCreateRegionFromWindowReq); 20505b261ecSmrg 20605b261ecSmrg swaps(&stuff->length, n); 20705b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq); 20805b261ecSmrg swapl(&stuff->region, n); 20905b261ecSmrg swapl(&stuff->window, n); 21005b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 21105b261ecSmrg} 21205b261ecSmrg 21305b261ecSmrgint 21405b261ecSmrgProcXFixesCreateRegionFromGC (ClientPtr client) 21505b261ecSmrg{ 21605b261ecSmrg RegionPtr pRegion, pClip; 21705b261ecSmrg GCPtr pGC; 21805b261ecSmrg int rc; 21905b261ecSmrg REQUEST (xXFixesCreateRegionFromGCReq); 22005b261ecSmrg 22105b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq); 22205b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 22305b261ecSmrg 2244642e01fSmrg rc = dixLookupGC(&pGC, stuff->gc, client, DixGetAttrAccess); 22505b261ecSmrg if (rc != Success) 22605b261ecSmrg return rc; 22705b261ecSmrg 22805b261ecSmrg switch (pGC->clientClipType) { 22905b261ecSmrg case CT_PIXMAP: 2306747b715Smrg pRegion = BitmapToRegion(pGC->pScreen, (PixmapPtr) pGC->clientClip); 23105b261ecSmrg if (!pRegion) 23205b261ecSmrg return BadAlloc; 23305b261ecSmrg break; 23405b261ecSmrg case CT_REGION: 23505b261ecSmrg pClip = (RegionPtr) pGC->clientClip; 23605b261ecSmrg pRegion = XFixesRegionCopy (pClip); 23705b261ecSmrg if (!pRegion) 23805b261ecSmrg return BadAlloc; 23905b261ecSmrg break; 24005b261ecSmrg default: 24105b261ecSmrg return BadImplementation; /* assume sane server bits */ 24205b261ecSmrg } 24305b261ecSmrg 24405b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 24505b261ecSmrg return BadAlloc; 24605b261ecSmrg 2476747b715Smrg return Success; 24805b261ecSmrg} 24905b261ecSmrg 25005b261ecSmrgint 25105b261ecSmrgSProcXFixesCreateRegionFromGC (ClientPtr client) 25205b261ecSmrg{ 25305b261ecSmrg int n; 25405b261ecSmrg REQUEST (xXFixesCreateRegionFromGCReq); 25505b261ecSmrg 25605b261ecSmrg swaps(&stuff->length, n); 25705b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq); 25805b261ecSmrg swapl(&stuff->region, n); 25905b261ecSmrg swapl(&stuff->gc, n); 26005b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 26105b261ecSmrg} 26205b261ecSmrg 26305b261ecSmrgint 26405b261ecSmrgProcXFixesCreateRegionFromPicture (ClientPtr client) 26505b261ecSmrg{ 26605b261ecSmrg RegionPtr pRegion; 26705b261ecSmrg PicturePtr pPicture; 26805b261ecSmrg REQUEST (xXFixesCreateRegionFromPictureReq); 26905b261ecSmrg 27005b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq); 27105b261ecSmrg LEGAL_NEW_RESOURCE (stuff->region, client); 27205b261ecSmrg 2736747b715Smrg VERIFY_PICTURE(pPicture, stuff->picture, client, DixGetAttrAccess); 27405b261ecSmrg 27505b261ecSmrg switch (pPicture->clientClipType) { 27605b261ecSmrg case CT_PIXMAP: 2776747b715Smrg pRegion = BitmapToRegion(pPicture->pDrawable->pScreen, 27805b261ecSmrg (PixmapPtr) pPicture->clientClip); 27905b261ecSmrg if (!pRegion) 28005b261ecSmrg return BadAlloc; 28105b261ecSmrg break; 28205b261ecSmrg case CT_REGION: 28305b261ecSmrg pRegion = XFixesRegionCopy ((RegionPtr) pPicture->clientClip); 28405b261ecSmrg if (!pRegion) 28505b261ecSmrg return BadAlloc; 28605b261ecSmrg break; 28705b261ecSmrg default: 28805b261ecSmrg return BadImplementation; /* assume sane server bits */ 28905b261ecSmrg } 29005b261ecSmrg 29105b261ecSmrg if (!AddResource (stuff->region, RegionResType, (pointer) pRegion)) 29205b261ecSmrg return BadAlloc; 29305b261ecSmrg 2946747b715Smrg return Success; 29505b261ecSmrg} 29605b261ecSmrg 29705b261ecSmrgint 29805b261ecSmrgSProcXFixesCreateRegionFromPicture (ClientPtr client) 29905b261ecSmrg{ 30005b261ecSmrg int n; 30105b261ecSmrg REQUEST (xXFixesCreateRegionFromPictureReq); 30205b261ecSmrg 30305b261ecSmrg swaps(&stuff->length, n); 30405b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq); 30505b261ecSmrg swapl(&stuff->region, n); 30605b261ecSmrg swapl(&stuff->picture, n); 30705b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 30805b261ecSmrg} 30905b261ecSmrg 31005b261ecSmrgint 31105b261ecSmrgProcXFixesDestroyRegion (ClientPtr client) 31205b261ecSmrg{ 31305b261ecSmrg REQUEST (xXFixesDestroyRegionReq); 31405b261ecSmrg RegionPtr pRegion; 31505b261ecSmrg 31605b261ecSmrg REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq); 31705b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess); 31805b261ecSmrg FreeResource (stuff->region, RT_NONE); 3196747b715Smrg return Success; 32005b261ecSmrg} 32105b261ecSmrg 32205b261ecSmrgint 32305b261ecSmrgSProcXFixesDestroyRegion (ClientPtr client) 32405b261ecSmrg{ 32505b261ecSmrg int n; 32605b261ecSmrg REQUEST (xXFixesDestroyRegionReq); 32705b261ecSmrg 32805b261ecSmrg swaps (&stuff->length, n); 32905b261ecSmrg REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq); 33005b261ecSmrg swapl (&stuff->region, n); 33105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 33205b261ecSmrg} 33305b261ecSmrg 33405b261ecSmrgint 33505b261ecSmrgProcXFixesSetRegion (ClientPtr client) 33605b261ecSmrg{ 33705b261ecSmrg int things; 33805b261ecSmrg RegionPtr pRegion, pNew; 33905b261ecSmrg REQUEST (xXFixesSetRegionReq); 34005b261ecSmrg 34105b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq); 34205b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess); 34305b261ecSmrg 34405b261ecSmrg things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq); 34505b261ecSmrg if (things & 4) 34605b261ecSmrg return BadLength; 34705b261ecSmrg things >>= 3; 34805b261ecSmrg 3496747b715Smrg pNew = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED); 35005b261ecSmrg if (!pNew) 35105b261ecSmrg return BadAlloc; 3526747b715Smrg if (!RegionCopy(pRegion, pNew)) 35305b261ecSmrg { 3546747b715Smrg RegionDestroy(pNew); 35505b261ecSmrg return BadAlloc; 35605b261ecSmrg } 3576747b715Smrg RegionDestroy(pNew); 3586747b715Smrg return Success; 35905b261ecSmrg} 36005b261ecSmrg 36105b261ecSmrgint 36205b261ecSmrgSProcXFixesSetRegion (ClientPtr client) 36305b261ecSmrg{ 36405b261ecSmrg int n; 36505b261ecSmrg REQUEST (xXFixesSetRegionReq); 36605b261ecSmrg 36705b261ecSmrg swaps (&stuff->length, n); 36805b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq); 36905b261ecSmrg swapl (&stuff->region, n); 37005b261ecSmrg SwapRestS(stuff); 37105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 37205b261ecSmrg} 37305b261ecSmrg 37405b261ecSmrgint 37505b261ecSmrgProcXFixesCopyRegion (ClientPtr client) 37605b261ecSmrg{ 37705b261ecSmrg RegionPtr pSource, pDestination; 37805b261ecSmrg REQUEST (xXFixesCopyRegionReq); 37905b261ecSmrg 38005b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 38105b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 38205b261ecSmrg 3836747b715Smrg if (!RegionCopy(pDestination, pSource)) 38405b261ecSmrg return BadAlloc; 38505b261ecSmrg 3866747b715Smrg return Success; 38705b261ecSmrg} 38805b261ecSmrg 38905b261ecSmrgint 39005b261ecSmrgSProcXFixesCopyRegion (ClientPtr client) 39105b261ecSmrg{ 39205b261ecSmrg int n; 39305b261ecSmrg REQUEST (xXFixesCopyRegionReq); 39405b261ecSmrg 39505b261ecSmrg swaps (&stuff->length, n); 39605b261ecSmrg REQUEST_AT_LEAST_SIZE(xXFixesCopyRegionReq); 39705b261ecSmrg swapl (&stuff->source, n); 39805b261ecSmrg swapl (&stuff->destination, n); 39905b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 40005b261ecSmrg} 40105b261ecSmrg 40205b261ecSmrgint 40305b261ecSmrgProcXFixesCombineRegion (ClientPtr client) 40405b261ecSmrg{ 40505b261ecSmrg RegionPtr pSource1, pSource2, pDestination; 40605b261ecSmrg REQUEST (xXFixesCombineRegionReq); 40705b261ecSmrg 40805b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCombineRegionReq); 40905b261ecSmrg VERIFY_REGION(pSource1, stuff->source1, client, DixReadAccess); 41005b261ecSmrg VERIFY_REGION(pSource2, stuff->source2, client, DixReadAccess); 41105b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 41205b261ecSmrg 41305b261ecSmrg switch (stuff->xfixesReqType) { 41405b261ecSmrg case X_XFixesUnionRegion: 4156747b715Smrg if (!RegionUnion(pDestination, pSource1, pSource2)) 4166747b715Smrg return BadAlloc; 41705b261ecSmrg break; 41805b261ecSmrg case X_XFixesIntersectRegion: 4196747b715Smrg if (!RegionIntersect(pDestination, pSource1, pSource2)) 4206747b715Smrg return BadAlloc; 42105b261ecSmrg break; 42205b261ecSmrg case X_XFixesSubtractRegion: 4236747b715Smrg if (!RegionSubtract(pDestination, pSource1, pSource2)) 4246747b715Smrg return BadAlloc; 42505b261ecSmrg break; 42605b261ecSmrg } 42705b261ecSmrg 4286747b715Smrg return Success; 42905b261ecSmrg} 43005b261ecSmrg 43105b261ecSmrgint 43205b261ecSmrgSProcXFixesCombineRegion (ClientPtr client) 43305b261ecSmrg{ 43405b261ecSmrg int n; 43505b261ecSmrg REQUEST (xXFixesCombineRegionReq); 43605b261ecSmrg 43705b261ecSmrg swaps (&stuff->length, n); 43805b261ecSmrg REQUEST_SIZE_MATCH (xXFixesCombineRegionReq); 43905b261ecSmrg swapl (&stuff->source1, n); 44005b261ecSmrg swapl (&stuff->source2, n); 44105b261ecSmrg swapl (&stuff->destination, n); 44205b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 44305b261ecSmrg} 44405b261ecSmrg 44505b261ecSmrgint 44605b261ecSmrgProcXFixesInvertRegion (ClientPtr client) 44705b261ecSmrg{ 44805b261ecSmrg RegionPtr pSource, pDestination; 44905b261ecSmrg BoxRec bounds; 45005b261ecSmrg REQUEST(xXFixesInvertRegionReq); 45105b261ecSmrg 45205b261ecSmrg REQUEST_SIZE_MATCH(xXFixesInvertRegionReq); 45305b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 45405b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 45505b261ecSmrg 45605b261ecSmrg /* Compute bounds, limit to 16 bits */ 45705b261ecSmrg bounds.x1 = stuff->x; 45805b261ecSmrg bounds.y1 = stuff->y; 45905b261ecSmrg if ((int) stuff->x + (int) stuff->width > MAXSHORT) 46005b261ecSmrg bounds.x2 = MAXSHORT; 46105b261ecSmrg else 46205b261ecSmrg bounds.x2 = stuff->x + stuff->width; 46305b261ecSmrg 46405b261ecSmrg if ((int) stuff->y + (int) stuff->height > MAXSHORT) 46505b261ecSmrg bounds.y2 = MAXSHORT; 46605b261ecSmrg else 46705b261ecSmrg bounds.y2 = stuff->y + stuff->height; 46805b261ecSmrg 4696747b715Smrg if (!RegionInverse(pDestination, pSource, &bounds)) 4706747b715Smrg return BadAlloc; 47105b261ecSmrg 4726747b715Smrg return Success; 47305b261ecSmrg} 47405b261ecSmrg 47505b261ecSmrgint 47605b261ecSmrgSProcXFixesInvertRegion (ClientPtr client) 47705b261ecSmrg{ 47805b261ecSmrg int n; 47905b261ecSmrg REQUEST(xXFixesInvertRegionReq); 48005b261ecSmrg 48105b261ecSmrg swaps (&stuff->length, n); 48205b261ecSmrg REQUEST_SIZE_MATCH(xXFixesInvertRegionReq); 48305b261ecSmrg swapl (&stuff->source, n); 48405b261ecSmrg swaps (&stuff->x, n); 48505b261ecSmrg swaps (&stuff->y, n); 48605b261ecSmrg swaps (&stuff->width, n); 48705b261ecSmrg swaps (&stuff->height, n); 48805b261ecSmrg swapl (&stuff->destination, n); 48905b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 49005b261ecSmrg} 49105b261ecSmrg 49205b261ecSmrgint 49305b261ecSmrgProcXFixesTranslateRegion (ClientPtr client) 49405b261ecSmrg{ 49505b261ecSmrg RegionPtr pRegion; 49605b261ecSmrg REQUEST(xXFixesTranslateRegionReq); 49705b261ecSmrg 49805b261ecSmrg REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq); 49905b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess); 50005b261ecSmrg 5016747b715Smrg RegionTranslate(pRegion, stuff->dx, stuff->dy); 5026747b715Smrg return Success; 50305b261ecSmrg} 50405b261ecSmrg 50505b261ecSmrgint 50605b261ecSmrgSProcXFixesTranslateRegion (ClientPtr client) 50705b261ecSmrg{ 50805b261ecSmrg int n; 50905b261ecSmrg REQUEST(xXFixesTranslateRegionReq); 51005b261ecSmrg 51105b261ecSmrg swaps (&stuff->length, n); 51205b261ecSmrg REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq); 51305b261ecSmrg swapl (&stuff->region, n); 51405b261ecSmrg swaps (&stuff->dx, n); 51505b261ecSmrg swaps (&stuff->dy, n); 51605b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 51705b261ecSmrg} 51805b261ecSmrg 51905b261ecSmrgint 52005b261ecSmrgProcXFixesRegionExtents (ClientPtr client) 52105b261ecSmrg{ 52205b261ecSmrg RegionPtr pSource, pDestination; 52305b261ecSmrg REQUEST(xXFixesRegionExtentsReq); 52405b261ecSmrg 52505b261ecSmrg REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq); 52605b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 52705b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 52805b261ecSmrg 5296747b715Smrg RegionReset(pDestination, RegionExtents(pSource)); 53005b261ecSmrg 5316747b715Smrg return Success; 53205b261ecSmrg} 53305b261ecSmrg 53405b261ecSmrgint 53505b261ecSmrgSProcXFixesRegionExtents (ClientPtr client) 53605b261ecSmrg{ 53705b261ecSmrg int n; 53805b261ecSmrg REQUEST(xXFixesRegionExtentsReq); 53905b261ecSmrg 54005b261ecSmrg swaps (&stuff->length, n); 54105b261ecSmrg REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq); 54205b261ecSmrg swapl (&stuff->source, n); 54305b261ecSmrg swapl (&stuff->destination, n); 54405b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 54505b261ecSmrg} 54605b261ecSmrg 54705b261ecSmrgint 54805b261ecSmrgProcXFixesFetchRegion (ClientPtr client) 54905b261ecSmrg{ 55005b261ecSmrg RegionPtr pRegion; 55105b261ecSmrg xXFixesFetchRegionReply *reply; 55205b261ecSmrg xRectangle *pRect; 55305b261ecSmrg BoxPtr pExtent; 55405b261ecSmrg BoxPtr pBox; 55505b261ecSmrg int i, nBox; 55605b261ecSmrg REQUEST(xXFixesFetchRegionReq); 55705b261ecSmrg 55805b261ecSmrg REQUEST_SIZE_MATCH(xXFixesFetchRegionReq); 55905b261ecSmrg VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess); 56005b261ecSmrg 5616747b715Smrg pExtent = RegionExtents(pRegion); 5626747b715Smrg pBox = RegionRects (pRegion); 5636747b715Smrg nBox = RegionNumRects (pRegion); 56405b261ecSmrg 5656747b715Smrg reply = malloc(sizeof (xXFixesFetchRegionReply) + 56605b261ecSmrg nBox * sizeof (xRectangle)); 56705b261ecSmrg if (!reply) 56805b261ecSmrg return BadAlloc; 56905b261ecSmrg reply->type = X_Reply; 57005b261ecSmrg reply->sequenceNumber = client->sequence; 57105b261ecSmrg reply->length = nBox << 1; 57205b261ecSmrg reply->x = pExtent->x1; 57305b261ecSmrg reply->y = pExtent->y1; 57405b261ecSmrg reply->width = pExtent->x2 - pExtent->x1; 57505b261ecSmrg reply->height = pExtent->y2 - pExtent->y1; 57605b261ecSmrg 57705b261ecSmrg pRect = (xRectangle *) (reply + 1); 57805b261ecSmrg for (i = 0; i < nBox; i++) 57905b261ecSmrg { 58005b261ecSmrg pRect[i].x = pBox[i].x1; 58105b261ecSmrg pRect[i].y = pBox[i].y1; 58205b261ecSmrg pRect[i].width = pBox[i].x2 - pBox[i].x1; 58305b261ecSmrg pRect[i].height = pBox[i].y2 - pBox[i].y1; 58405b261ecSmrg } 58505b261ecSmrg if (client->swapped) 58605b261ecSmrg { 58705b261ecSmrg int n; 58805b261ecSmrg swaps (&reply->sequenceNumber, n); 58905b261ecSmrg swapl (&reply->length, n); 59005b261ecSmrg swaps (&reply->x, n); 59105b261ecSmrg swaps (&reply->y, n); 59205b261ecSmrg swaps (&reply->width, n); 59305b261ecSmrg swaps (&reply->height, n); 59405b261ecSmrg SwapShorts ((INT16 *) pRect, nBox * 4); 59505b261ecSmrg } 59605b261ecSmrg (void) WriteToClient(client, sizeof (xXFixesFetchRegionReply) + 59705b261ecSmrg nBox * sizeof (xRectangle), (char *) reply); 5986747b715Smrg free(reply); 5996747b715Smrg return Success; 60005b261ecSmrg} 60105b261ecSmrg 60205b261ecSmrgint 60305b261ecSmrgSProcXFixesFetchRegion (ClientPtr client) 60405b261ecSmrg{ 60505b261ecSmrg int n; 60605b261ecSmrg REQUEST(xXFixesFetchRegionReq); 60705b261ecSmrg 60805b261ecSmrg swaps (&stuff->length, n); 60905b261ecSmrg REQUEST_SIZE_MATCH(xXFixesFetchRegionReq); 61005b261ecSmrg swapl (&stuff->region, n); 61105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 61205b261ecSmrg} 61305b261ecSmrg 61405b261ecSmrgint 61505b261ecSmrgProcXFixesSetGCClipRegion (ClientPtr client) 61605b261ecSmrg{ 61705b261ecSmrg GCPtr pGC; 61805b261ecSmrg RegionPtr pRegion; 6196747b715Smrg ChangeGCVal vals[2]; 62005b261ecSmrg int rc; 62105b261ecSmrg REQUEST(xXFixesSetGCClipRegionReq); 62205b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq); 62305b261ecSmrg 6244642e01fSmrg rc = dixLookupGC(&pGC, stuff->gc, client, DixSetAttrAccess); 62505b261ecSmrg if (rc != Success) 62605b261ecSmrg return rc; 62705b261ecSmrg 62805b261ecSmrg VERIFY_REGION_OR_NONE (pRegion, stuff->region, client, DixReadAccess); 62905b261ecSmrg 63005b261ecSmrg if (pRegion) 63105b261ecSmrg { 63205b261ecSmrg pRegion = XFixesRegionCopy (pRegion); 63305b261ecSmrg if (!pRegion) 63405b261ecSmrg return BadAlloc; 63505b261ecSmrg } 63605b261ecSmrg 6376747b715Smrg vals[0].val = stuff->xOrigin; 6386747b715Smrg vals[1].val = stuff->yOrigin; 6396747b715Smrg ChangeGC (NullClient, pGC, GCClipXOrigin|GCClipYOrigin, vals); 64005b261ecSmrg (*pGC->funcs->ChangeClip)(pGC, pRegion ? CT_REGION : CT_NONE, (pointer)pRegion, 0); 64105b261ecSmrg 6426747b715Smrg return Success; 64305b261ecSmrg} 64405b261ecSmrg 64505b261ecSmrgint 64605b261ecSmrgSProcXFixesSetGCClipRegion (ClientPtr client) 64705b261ecSmrg{ 64805b261ecSmrg int n; 64905b261ecSmrg REQUEST(xXFixesSetGCClipRegionReq); 65005b261ecSmrg 65105b261ecSmrg swaps (&stuff->length, n); 65205b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq); 65305b261ecSmrg swapl (&stuff->gc, n); 65405b261ecSmrg swapl (&stuff->region, n); 65505b261ecSmrg swaps (&stuff->xOrigin, n); 65605b261ecSmrg swaps (&stuff->yOrigin, n); 65705b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 65805b261ecSmrg} 65905b261ecSmrg 66005b261ecSmrgtypedef RegionPtr (*CreateDftPtr)(WindowPtr pWin); 66105b261ecSmrg 66205b261ecSmrgint 66305b261ecSmrgProcXFixesSetWindowShapeRegion (ClientPtr client) 66405b261ecSmrg{ 66505b261ecSmrg WindowPtr pWin; 66605b261ecSmrg RegionPtr pRegion; 66705b261ecSmrg RegionPtr *pDestRegion; 6684642e01fSmrg int rc; 66905b261ecSmrg REQUEST(xXFixesSetWindowShapeRegionReq); 67005b261ecSmrg 67105b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq); 672b86d567bSmrg rc = dixLookupResourceByType((pointer *)&pWin, stuff->dest, RT_WINDOW, 6734642e01fSmrg client, DixSetAttrAccess); 6744642e01fSmrg if (rc != Success) 67505b261ecSmrg { 67605b261ecSmrg client->errorValue = stuff->dest; 6776747b715Smrg return rc; 67805b261ecSmrg } 67905b261ecSmrg VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixWriteAccess); 68005b261ecSmrg switch (stuff->destKind) { 68105b261ecSmrg case ShapeBounding: 68205b261ecSmrg case ShapeClip: 68305b261ecSmrg case ShapeInput: 68405b261ecSmrg break; 68505b261ecSmrg default: 68605b261ecSmrg client->errorValue = stuff->destKind; 68705b261ecSmrg return BadValue; 68805b261ecSmrg } 68905b261ecSmrg if (pRegion) 69005b261ecSmrg { 69105b261ecSmrg pRegion = XFixesRegionCopy (pRegion); 69205b261ecSmrg if (!pRegion) 69305b261ecSmrg return BadAlloc; 69405b261ecSmrg if (!pWin->optional) 69505b261ecSmrg MakeWindowOptional (pWin); 69605b261ecSmrg switch (stuff->destKind) { 69705b261ecSmrg default: 69805b261ecSmrg case ShapeBounding: 69905b261ecSmrg pDestRegion = &pWin->optional->boundingShape; 70005b261ecSmrg break; 70105b261ecSmrg case ShapeClip: 70205b261ecSmrg pDestRegion = &pWin->optional->clipShape; 70305b261ecSmrg break; 70405b261ecSmrg case ShapeInput: 70505b261ecSmrg pDestRegion = &pWin->optional->inputShape; 70605b261ecSmrg break; 70705b261ecSmrg } 70805b261ecSmrg if (stuff->xOff || stuff->yOff) 7096747b715Smrg RegionTranslate(pRegion, stuff->xOff, stuff->yOff); 71005b261ecSmrg } 71105b261ecSmrg else 71205b261ecSmrg { 71305b261ecSmrg if (pWin->optional) 71405b261ecSmrg { 71505b261ecSmrg switch (stuff->destKind) { 71605b261ecSmrg default: 71705b261ecSmrg case ShapeBounding: 71805b261ecSmrg pDestRegion = &pWin->optional->boundingShape; 71905b261ecSmrg break; 72005b261ecSmrg case ShapeClip: 72105b261ecSmrg pDestRegion = &pWin->optional->clipShape; 72205b261ecSmrg break; 72305b261ecSmrg case ShapeInput: 72405b261ecSmrg pDestRegion = &pWin->optional->inputShape; 72505b261ecSmrg break; 72605b261ecSmrg } 72705b261ecSmrg } 72805b261ecSmrg else 72905b261ecSmrg pDestRegion = &pRegion; /* a NULL region pointer */ 73005b261ecSmrg } 73105b261ecSmrg if (*pDestRegion) 7326747b715Smrg RegionDestroy(*pDestRegion); 73305b261ecSmrg *pDestRegion = pRegion; 7346747b715Smrg (*pWin->drawable.pScreen->SetShape) (pWin, stuff->destKind); 73505b261ecSmrg SendShapeNotify (pWin, stuff->destKind); 7366747b715Smrg return Success; 73705b261ecSmrg} 73805b261ecSmrg 73905b261ecSmrgint 74005b261ecSmrgSProcXFixesSetWindowShapeRegion (ClientPtr client) 74105b261ecSmrg{ 74205b261ecSmrg int n; 74305b261ecSmrg REQUEST(xXFixesSetWindowShapeRegionReq); 74405b261ecSmrg 74505b261ecSmrg swaps (&stuff->length, n); 74605b261ecSmrg REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq); 74705b261ecSmrg swapl (&stuff->dest, n); 74805b261ecSmrg swaps (&stuff->xOff, n); 74905b261ecSmrg swaps (&stuff->yOff, n); 75005b261ecSmrg swapl (&stuff->region, n); 75105b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 75205b261ecSmrg} 75305b261ecSmrg 75405b261ecSmrgint 75505b261ecSmrgProcXFixesSetPictureClipRegion (ClientPtr client) 75605b261ecSmrg{ 75705b261ecSmrg PicturePtr pPicture; 75805b261ecSmrg RegionPtr pRegion; 75905b261ecSmrg ScreenPtr pScreen; 76005b261ecSmrg REQUEST(xXFixesSetPictureClipRegionReq); 76105b261ecSmrg 76205b261ecSmrg REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq); 7636747b715Smrg VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess); 76405b261ecSmrg pScreen = pPicture->pDrawable->pScreen; 76505b261ecSmrg VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess); 76605b261ecSmrg 76705b261ecSmrg return SetPictureClipRegion (pPicture, stuff->xOrigin, stuff->yOrigin, 76805b261ecSmrg pRegion); 76905b261ecSmrg} 77005b261ecSmrg 77105b261ecSmrgint 77205b261ecSmrgSProcXFixesSetPictureClipRegion (ClientPtr client) 77305b261ecSmrg{ 77405b261ecSmrg int n; 77505b261ecSmrg REQUEST(xXFixesSetPictureClipRegionReq); 77605b261ecSmrg 77705b261ecSmrg swaps (&stuff->length, n); 77805b261ecSmrg REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq); 77905b261ecSmrg swapl (&stuff->picture, n); 78005b261ecSmrg swapl (&stuff->region, n); 78105b261ecSmrg swaps (&stuff->xOrigin, n); 78205b261ecSmrg swaps (&stuff->yOrigin, n); 78305b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 78405b261ecSmrg} 78505b261ecSmrg 78605b261ecSmrgint 78705b261ecSmrgProcXFixesExpandRegion (ClientPtr client) 78805b261ecSmrg{ 78905b261ecSmrg RegionPtr pSource, pDestination; 79005b261ecSmrg REQUEST (xXFixesExpandRegionReq); 79105b261ecSmrg BoxPtr pTmp; 79205b261ecSmrg BoxPtr pSrc; 79305b261ecSmrg int nBoxes; 79405b261ecSmrg int i; 79505b261ecSmrg 79605b261ecSmrg REQUEST_SIZE_MATCH (xXFixesExpandRegionReq); 79705b261ecSmrg VERIFY_REGION(pSource, stuff->source, client, DixReadAccess); 79805b261ecSmrg VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess); 79905b261ecSmrg 8006747b715Smrg nBoxes = RegionNumRects(pSource); 8016747b715Smrg pSrc = RegionRects(pSource); 80205b261ecSmrg if (nBoxes) 80305b261ecSmrg { 8046747b715Smrg pTmp = malloc(nBoxes * sizeof (BoxRec)); 80505b261ecSmrg if (!pTmp) 80605b261ecSmrg return BadAlloc; 80705b261ecSmrg for (i = 0; i < nBoxes; i++) 80805b261ecSmrg { 80905b261ecSmrg pTmp[i].x1 = pSrc[i].x1 - stuff->left; 81005b261ecSmrg pTmp[i].x2 = pSrc[i].x2 + stuff->right; 81105b261ecSmrg pTmp[i].y1 = pSrc[i].y1 - stuff->top; 81205b261ecSmrg pTmp[i].y2 = pSrc[i].y2 + stuff->bottom; 81305b261ecSmrg } 8146747b715Smrg RegionEmpty(pDestination); 81505b261ecSmrg for (i = 0; i < nBoxes; i++) 81605b261ecSmrg { 81705b261ecSmrg RegionRec r; 8186747b715Smrg RegionInit(&r, &pTmp[i], 0); 8196747b715Smrg RegionUnion(pDestination, pDestination, &r); 82005b261ecSmrg } 8216747b715Smrg free(pTmp); 82205b261ecSmrg } 8236747b715Smrg return Success; 82405b261ecSmrg} 82505b261ecSmrg 82605b261ecSmrgint 82705b261ecSmrgSProcXFixesExpandRegion (ClientPtr client) 82805b261ecSmrg{ 82905b261ecSmrg int n; 83005b261ecSmrg REQUEST (xXFixesExpandRegionReq); 83105b261ecSmrg 83205b261ecSmrg swaps (&stuff->length, n); 83305b261ecSmrg REQUEST_SIZE_MATCH (xXFixesExpandRegionReq); 83405b261ecSmrg swapl (&stuff->source, n); 83505b261ecSmrg swapl (&stuff->destination, n); 83605b261ecSmrg swaps (&stuff->left, n); 83705b261ecSmrg swaps (&stuff->right, n); 83805b261ecSmrg swaps (&stuff->top, n); 83905b261ecSmrg swaps (&stuff->bottom, n); 84005b261ecSmrg return (*ProcXFixesVector[stuff->xfixesReqType]) (client); 84105b261ecSmrg} 84205b261ecSmrg 8439ace9065Smrg#ifdef PANORAMIX 8449ace9065Smrg#include "panoramiX.h" 8459ace9065Smrg#include "panoramiXsrv.h" 8469ace9065Smrg 8479ace9065Smrgint 8489ace9065SmrgPanoramiXFixesSetGCClipRegion (ClientPtr client) 8499ace9065Smrg{ 8509ace9065Smrg REQUEST(xXFixesSetGCClipRegionReq); 8519ace9065Smrg int result = Success, j; 8529ace9065Smrg PanoramiXRes *gc; 8539ace9065Smrg REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq); 8549ace9065Smrg 8559ace9065Smrg if ((result = dixLookupResourceByType((void **)&gc, stuff->gc, XRT_GC, 8569ace9065Smrg client, DixWriteAccess))) { 8579ace9065Smrg client->errorValue = stuff->gc; 8589ace9065Smrg return result; 8599ace9065Smrg } 8609ace9065Smrg 8619ace9065Smrg FOR_NSCREENS_BACKWARD(j) { 8629ace9065Smrg stuff->gc = gc->info[j].id; 8639ace9065Smrg result = (*PanoramiXSaveXFixesVector[X_XFixesSetGCClipRegion]) (client); 8649ace9065Smrg if(result != Success) break; 8659ace9065Smrg } 8669ace9065Smrg 8679ace9065Smrg return result; 8689ace9065Smrg} 8699ace9065Smrg 8709ace9065Smrgint 8719ace9065SmrgPanoramiXFixesSetWindowShapeRegion (ClientPtr client) 8729ace9065Smrg{ 8739ace9065Smrg int result = Success, j; 8749ace9065Smrg PanoramiXRes *win; 8759ace9065Smrg REQUEST(xXFixesSetWindowShapeRegionReq); 8769ace9065Smrg 8779ace9065Smrg REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq); 8789ace9065Smrg 8799ace9065Smrg if ((result = dixLookupResourceByType((void **)&win, stuff->dest, 8809ace9065Smrg XRT_WINDOW, client, 8819ace9065Smrg DixWriteAccess))) { 8829ace9065Smrg client->errorValue = stuff->dest; 8839ace9065Smrg return result; 8849ace9065Smrg } 8859ace9065Smrg 8869ace9065Smrg FOR_NSCREENS_FORWARD(j) { 8879ace9065Smrg stuff->dest = win->info[j].id; 8889ace9065Smrg result = (*PanoramiXSaveXFixesVector[X_XFixesSetWindowShapeRegion]) (client); 8899ace9065Smrg if(result != Success) break; 8909ace9065Smrg } 8919ace9065Smrg 8929ace9065Smrg return result; 8939ace9065Smrg} 8949ace9065Smrg 8959ace9065Smrgint 8969ace9065SmrgPanoramiXFixesSetPictureClipRegion (ClientPtr client) 8979ace9065Smrg{ 8989ace9065Smrg REQUEST(xXFixesSetPictureClipRegionReq); 8999ace9065Smrg int result = Success, j; 9009ace9065Smrg PanoramiXRes *pict; 9019ace9065Smrg 9029ace9065Smrg REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq); 9039ace9065Smrg 9049ace9065Smrg if ((result = dixLookupResourceByType((void **)&pict, stuff->picture, 9059ace9065Smrg XRT_PICTURE, client, 9069ace9065Smrg DixWriteAccess))) { 9079ace9065Smrg client->errorValue = stuff->picture; 9089ace9065Smrg return result; 9099ace9065Smrg } 9109ace9065Smrg 9119ace9065Smrg FOR_NSCREENS_BACKWARD(j) { 9129ace9065Smrg stuff->picture = pict->info[j].id; 9139ace9065Smrg result = (*PanoramiXSaveXFixesVector[X_XFixesSetPictureClipRegion]) (client); 9149ace9065Smrg if(result != Success) break; 9159ace9065Smrg } 9169ace9065Smrg 9179ace9065Smrg return result; 9189ace9065Smrg} 9199ace9065Smrg 9209ace9065Smrg#endif 921