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