region.c revision 35c4bbdf
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>
3035c4bbdfSmrg
3105b261ecSmrg#include <regionstr.h>
3205b261ecSmrg#include <gcstruct.h>
3305b261ecSmrg#include <window.h>
3405b261ecSmrg
356747b715SmrgRESTYPE RegionResType;
3605b261ecSmrg
3705b261ecSmrgstatic int
3835c4bbdfSmrgRegionResFree(void *data, XID id)
3905b261ecSmrg{
4035c4bbdfSmrg    RegionPtr pRegion = (RegionPtr) data;
4105b261ecSmrg
426747b715Smrg    RegionDestroy(pRegion);
4305b261ecSmrg    return Success;
4405b261ecSmrg}
4505b261ecSmrg
4605b261ecSmrgRegionPtr
4735c4bbdfSmrgXFixesRegionCopy(RegionPtr pRegion)
4805b261ecSmrg{
4935c4bbdfSmrg    RegionPtr pNew = RegionCreate(RegionExtents(pRegion),
5035c4bbdfSmrg                                  RegionNumRects(pRegion));
5135c4bbdfSmrg
5205b261ecSmrg    if (!pNew)
5335c4bbdfSmrg        return 0;
5435c4bbdfSmrg    if (!RegionCopy(pNew, pRegion)) {
5535c4bbdfSmrg        RegionDestroy(pNew);
5635c4bbdfSmrg        return 0;
5705b261ecSmrg    }
5805b261ecSmrg    return pNew;
5905b261ecSmrg}
6005b261ecSmrg
6105b261ecSmrgBool
6235c4bbdfSmrgXFixesRegionInit(void)
6305b261ecSmrg{
646747b715Smrg    RegionResType = CreateNewResourceType(RegionResFree, "XFixesRegion");
656747b715Smrg
666747b715Smrg    return RegionResType != 0;
6705b261ecSmrg}
6805b261ecSmrg
6905b261ecSmrgint
7035c4bbdfSmrgProcXFixesCreateRegion(ClientPtr client)
7105b261ecSmrg{
7235c4bbdfSmrg    int things;
7335c4bbdfSmrg    RegionPtr pRegion;
7435c4bbdfSmrg
7535c4bbdfSmrg    REQUEST(xXFixesCreateRegionReq);
7635c4bbdfSmrg
7705b261ecSmrg    REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq);
7835c4bbdfSmrg    LEGAL_NEW_RESOURCE(stuff->region, client);
7935c4bbdfSmrg
8035c4bbdfSmrg    things = (client->req_len << 2) - sizeof(xXFixesCreateRegionReq);
8105b261ecSmrg    if (things & 4)
8235c4bbdfSmrg        return BadLength;
8305b261ecSmrg    things >>= 3;
8405b261ecSmrg
856747b715Smrg    pRegion = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED);
8605b261ecSmrg    if (!pRegion)
8735c4bbdfSmrg        return BadAlloc;
8835c4bbdfSmrg    if (!AddResource(stuff->region, RegionResType, (void *) pRegion))
8935c4bbdfSmrg        return BadAlloc;
9035c4bbdfSmrg
916747b715Smrg    return Success;
9205b261ecSmrg}
9305b261ecSmrg
9405b261ecSmrgint
9535c4bbdfSmrgSProcXFixesCreateRegion(ClientPtr client)
9605b261ecSmrg{
9705b261ecSmrg    REQUEST(xXFixesCreateRegionReq);
9835c4bbdfSmrg
9935c4bbdfSmrg    swaps(&stuff->length);
10005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq);
10135c4bbdfSmrg    swapl(&stuff->region);
10205b261ecSmrg    SwapRestS(stuff);
10305b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
10405b261ecSmrg}
10505b261ecSmrg
10605b261ecSmrgint
10735c4bbdfSmrgProcXFixesCreateRegionFromBitmap(ClientPtr client)
10805b261ecSmrg{
10935c4bbdfSmrg    RegionPtr pRegion;
11035c4bbdfSmrg    PixmapPtr pPixmap;
1114642e01fSmrg    int rc;
11205b261ecSmrg
11335c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromBitmapReq);
11405b261ecSmrg
11535c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromBitmapReq);
11635c4bbdfSmrg    LEGAL_NEW_RESOURCE(stuff->region, client);
11735c4bbdfSmrg
11835c4bbdfSmrg    rc = dixLookupResourceByType((void **) &pPixmap, stuff->bitmap, RT_PIXMAP,
11935c4bbdfSmrg                                 client, DixReadAccess);
12035c4bbdfSmrg    if (rc != Success) {
12135c4bbdfSmrg        client->errorValue = stuff->bitmap;
12235c4bbdfSmrg        return rc;
12305b261ecSmrg    }
12405b261ecSmrg    if (pPixmap->drawable.depth != 1)
12535c4bbdfSmrg        return BadMatch;
12605b261ecSmrg
1276747b715Smrg    pRegion = BitmapToRegion(pPixmap->drawable.pScreen, pPixmap);
12805b261ecSmrg
12905b261ecSmrg    if (!pRegion)
13035c4bbdfSmrg        return BadAlloc;
13135c4bbdfSmrg
13235c4bbdfSmrg    if (!AddResource(stuff->region, RegionResType, (void *) pRegion))
13335c4bbdfSmrg        return BadAlloc;
13435c4bbdfSmrg
1356747b715Smrg    return Success;
13605b261ecSmrg}
13705b261ecSmrg
13805b261ecSmrgint
13935c4bbdfSmrgSProcXFixesCreateRegionFromBitmap(ClientPtr client)
14005b261ecSmrg{
14135c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromBitmapReq);
14205b261ecSmrg
14335c4bbdfSmrg    swaps(&stuff->length);
14435c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromBitmapReq);
14535c4bbdfSmrg    swapl(&stuff->region);
14635c4bbdfSmrg    swapl(&stuff->bitmap);
14705b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
14805b261ecSmrg}
14905b261ecSmrg
15005b261ecSmrgint
15135c4bbdfSmrgProcXFixesCreateRegionFromWindow(ClientPtr client)
15205b261ecSmrg{
15335c4bbdfSmrg    RegionPtr pRegion;
15435c4bbdfSmrg    Bool copy = TRUE;
15535c4bbdfSmrg    WindowPtr pWin;
1564642e01fSmrg    int rc;
15735c4bbdfSmrg
15835c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromWindowReq);
15935c4bbdfSmrg
16035c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromWindowReq);
16135c4bbdfSmrg    LEGAL_NEW_RESOURCE(stuff->region, client);
16235c4bbdfSmrg    rc = dixLookupResourceByType((void **) &pWin, stuff->window, RT_WINDOW,
16335c4bbdfSmrg                                 client, DixGetAttrAccess);
16435c4bbdfSmrg    if (rc != Success) {
16535c4bbdfSmrg        client->errorValue = stuff->window;
16635c4bbdfSmrg        return rc;
16705b261ecSmrg    }
16805b261ecSmrg    switch (stuff->kind) {
16905b261ecSmrg    case WindowRegionBounding:
17035c4bbdfSmrg        pRegion = wBoundingShape(pWin);
17135c4bbdfSmrg        if (!pRegion) {
17235c4bbdfSmrg            pRegion = CreateBoundingShape(pWin);
17335c4bbdfSmrg            copy = FALSE;
17435c4bbdfSmrg        }
17535c4bbdfSmrg        break;
17605b261ecSmrg    case WindowRegionClip:
17735c4bbdfSmrg        pRegion = wClipShape(pWin);
17835c4bbdfSmrg        if (!pRegion) {
17935c4bbdfSmrg            pRegion = CreateClipShape(pWin);
18035c4bbdfSmrg            copy = FALSE;
18135c4bbdfSmrg        }
18235c4bbdfSmrg        break;
18305b261ecSmrg    default:
18435c4bbdfSmrg        client->errorValue = stuff->kind;
18535c4bbdfSmrg        return BadValue;
18605b261ecSmrg    }
18705b261ecSmrg    if (copy && pRegion)
18835c4bbdfSmrg        pRegion = XFixesRegionCopy(pRegion);
18905b261ecSmrg    if (!pRegion)
19035c4bbdfSmrg        return BadAlloc;
19135c4bbdfSmrg    if (!AddResource(stuff->region, RegionResType, (void *) pRegion))
19235c4bbdfSmrg        return BadAlloc;
19335c4bbdfSmrg
1946747b715Smrg    return Success;
19505b261ecSmrg}
19605b261ecSmrg
19705b261ecSmrgint
19835c4bbdfSmrgSProcXFixesCreateRegionFromWindow(ClientPtr client)
19905b261ecSmrg{
20035c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromWindowReq);
20105b261ecSmrg
20235c4bbdfSmrg    swaps(&stuff->length);
20335c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromWindowReq);
20435c4bbdfSmrg    swapl(&stuff->region);
20535c4bbdfSmrg    swapl(&stuff->window);
20605b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
20705b261ecSmrg}
20805b261ecSmrg
20905b261ecSmrgint
21035c4bbdfSmrgProcXFixesCreateRegionFromGC(ClientPtr client)
21105b261ecSmrg{
21235c4bbdfSmrg    RegionPtr pRegion, pClip;
21335c4bbdfSmrg    GCPtr pGC;
21435c4bbdfSmrg    int rc;
21505b261ecSmrg
21635c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromGCReq);
21735c4bbdfSmrg
21835c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromGCReq);
21935c4bbdfSmrg    LEGAL_NEW_RESOURCE(stuff->region, client);
22005b261ecSmrg
2214642e01fSmrg    rc = dixLookupGC(&pGC, stuff->gc, client, DixGetAttrAccess);
22205b261ecSmrg    if (rc != Success)
22335c4bbdfSmrg        return rc;
22435c4bbdfSmrg
22535c4bbdfSmrg    if (pGC->clientClip) {
22635c4bbdfSmrg        pClip = (RegionPtr) pGC->clientClip;
22735c4bbdfSmrg        pRegion = XFixesRegionCopy(pClip);
22835c4bbdfSmrg        if (!pRegion)
22935c4bbdfSmrg            return BadAlloc;
23035c4bbdfSmrg    } else {
23135c4bbdfSmrg        return BadMatch;
23205b261ecSmrg    }
23335c4bbdfSmrg
23435c4bbdfSmrg    if (!AddResource(stuff->region, RegionResType, (void *) pRegion))
23535c4bbdfSmrg        return BadAlloc;
23635c4bbdfSmrg
2376747b715Smrg    return Success;
23805b261ecSmrg}
23905b261ecSmrg
24005b261ecSmrgint
24135c4bbdfSmrgSProcXFixesCreateRegionFromGC(ClientPtr client)
24205b261ecSmrg{
24335c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromGCReq);
24405b261ecSmrg
24535c4bbdfSmrg    swaps(&stuff->length);
24635c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromGCReq);
24735c4bbdfSmrg    swapl(&stuff->region);
24835c4bbdfSmrg    swapl(&stuff->gc);
24905b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
25005b261ecSmrg}
25105b261ecSmrg
25205b261ecSmrgint
25335c4bbdfSmrgProcXFixesCreateRegionFromPicture(ClientPtr client)
25405b261ecSmrg{
25535c4bbdfSmrg    RegionPtr pRegion;
25635c4bbdfSmrg    PicturePtr pPicture;
25735c4bbdfSmrg
25835c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromPictureReq);
25905b261ecSmrg
26035c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromPictureReq);
26135c4bbdfSmrg    LEGAL_NEW_RESOURCE(stuff->region, client);
26205b261ecSmrg
2636747b715Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixGetAttrAccess);
26435c4bbdfSmrg
26535c4bbdfSmrg    if (!pPicture->pDrawable)
26635c4bbdfSmrg        return RenderErrBase + BadPicture;
26735c4bbdfSmrg
26835c4bbdfSmrg    if (pPicture->clientClip) {
26935c4bbdfSmrg        pRegion = XFixesRegionCopy((RegionPtr) pPicture->clientClip);
27035c4bbdfSmrg        if (!pRegion)
27135c4bbdfSmrg            return BadAlloc;
27235c4bbdfSmrg    } else {
27335c4bbdfSmrg        return BadMatch;
27405b261ecSmrg    }
27535c4bbdfSmrg
27635c4bbdfSmrg    if (!AddResource(stuff->region, RegionResType, (void *) pRegion))
27735c4bbdfSmrg        return BadAlloc;
27835c4bbdfSmrg
2796747b715Smrg    return Success;
28005b261ecSmrg}
28105b261ecSmrg
28205b261ecSmrgint
28335c4bbdfSmrgSProcXFixesCreateRegionFromPicture(ClientPtr client)
28405b261ecSmrg{
28535c4bbdfSmrg    REQUEST(xXFixesCreateRegionFromPictureReq);
28605b261ecSmrg
28735c4bbdfSmrg    swaps(&stuff->length);
28835c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCreateRegionFromPictureReq);
28935c4bbdfSmrg    swapl(&stuff->region);
29035c4bbdfSmrg    swapl(&stuff->picture);
29105b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
29205b261ecSmrg}
29305b261ecSmrg
29405b261ecSmrgint
29535c4bbdfSmrgProcXFixesDestroyRegion(ClientPtr client)
29605b261ecSmrg{
29735c4bbdfSmrg    REQUEST(xXFixesDestroyRegionReq);
29835c4bbdfSmrg    RegionPtr pRegion;
29905b261ecSmrg
30005b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq);
30105b261ecSmrg    VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
30235c4bbdfSmrg    FreeResource(stuff->region, RT_NONE);
3036747b715Smrg    return Success;
30405b261ecSmrg}
30505b261ecSmrg
30605b261ecSmrgint
30735c4bbdfSmrgSProcXFixesDestroyRegion(ClientPtr client)
30805b261ecSmrg{
30935c4bbdfSmrg    REQUEST(xXFixesDestroyRegionReq);
31005b261ecSmrg
31135c4bbdfSmrg    swaps(&stuff->length);
31205b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq);
31335c4bbdfSmrg    swapl(&stuff->region);
31405b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
31505b261ecSmrg}
31605b261ecSmrg
31705b261ecSmrgint
31835c4bbdfSmrgProcXFixesSetRegion(ClientPtr client)
31905b261ecSmrg{
32035c4bbdfSmrg    int things;
32135c4bbdfSmrg    RegionPtr pRegion, pNew;
32235c4bbdfSmrg
32335c4bbdfSmrg    REQUEST(xXFixesSetRegionReq);
32405b261ecSmrg
32505b261ecSmrg    REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq);
32605b261ecSmrg    VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
32735c4bbdfSmrg
32835c4bbdfSmrg    things = (client->req_len << 2) - sizeof(xXFixesCreateRegionReq);
32905b261ecSmrg    if (things & 4)
33035c4bbdfSmrg        return BadLength;
33105b261ecSmrg    things >>= 3;
33205b261ecSmrg
3336747b715Smrg    pNew = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED);
33405b261ecSmrg    if (!pNew)
33535c4bbdfSmrg        return BadAlloc;
33635c4bbdfSmrg    if (!RegionCopy(pRegion, pNew)) {
33735c4bbdfSmrg        RegionDestroy(pNew);
33835c4bbdfSmrg        return BadAlloc;
33905b261ecSmrg    }
3406747b715Smrg    RegionDestroy(pNew);
3416747b715Smrg    return Success;
34205b261ecSmrg}
34305b261ecSmrg
34405b261ecSmrgint
34535c4bbdfSmrgSProcXFixesSetRegion(ClientPtr client)
34605b261ecSmrg{
34735c4bbdfSmrg    REQUEST(xXFixesSetRegionReq);
34805b261ecSmrg
34935c4bbdfSmrg    swaps(&stuff->length);
35005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq);
35135c4bbdfSmrg    swapl(&stuff->region);
35205b261ecSmrg    SwapRestS(stuff);
35305b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
35405b261ecSmrg}
35505b261ecSmrg
35605b261ecSmrgint
35735c4bbdfSmrgProcXFixesCopyRegion(ClientPtr client)
35805b261ecSmrg{
35935c4bbdfSmrg    RegionPtr pSource, pDestination;
36035c4bbdfSmrg
36135c4bbdfSmrg    REQUEST(xXFixesCopyRegionReq);
36235c4bbdfSmrg
36305b261ecSmrg    VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
36405b261ecSmrg    VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
36535c4bbdfSmrg
3666747b715Smrg    if (!RegionCopy(pDestination, pSource))
36735c4bbdfSmrg        return BadAlloc;
36805b261ecSmrg
3696747b715Smrg    return Success;
37005b261ecSmrg}
37105b261ecSmrg
37205b261ecSmrgint
37335c4bbdfSmrgSProcXFixesCopyRegion(ClientPtr client)
37405b261ecSmrg{
37535c4bbdfSmrg    REQUEST(xXFixesCopyRegionReq);
37605b261ecSmrg
37735c4bbdfSmrg    swaps(&stuff->length);
37805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xXFixesCopyRegionReq);
37935c4bbdfSmrg    swapl(&stuff->source);
38035c4bbdfSmrg    swapl(&stuff->destination);
38105b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
38205b261ecSmrg}
38305b261ecSmrg
38405b261ecSmrgint
38535c4bbdfSmrgProcXFixesCombineRegion(ClientPtr client)
38605b261ecSmrg{
38735c4bbdfSmrg    RegionPtr pSource1, pSource2, pDestination;
38805b261ecSmrg
38935c4bbdfSmrg    REQUEST(xXFixesCombineRegionReq);
39035c4bbdfSmrg
39135c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCombineRegionReq);
39205b261ecSmrg    VERIFY_REGION(pSource1, stuff->source1, client, DixReadAccess);
39305b261ecSmrg    VERIFY_REGION(pSource2, stuff->source2, client, DixReadAccess);
39405b261ecSmrg    VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
39535c4bbdfSmrg
39605b261ecSmrg    switch (stuff->xfixesReqType) {
39705b261ecSmrg    case X_XFixesUnionRegion:
39835c4bbdfSmrg        if (!RegionUnion(pDestination, pSource1, pSource2))
39935c4bbdfSmrg            return BadAlloc;
40035c4bbdfSmrg        break;
40105b261ecSmrg    case X_XFixesIntersectRegion:
40235c4bbdfSmrg        if (!RegionIntersect(pDestination, pSource1, pSource2))
40335c4bbdfSmrg            return BadAlloc;
40435c4bbdfSmrg        break;
40505b261ecSmrg    case X_XFixesSubtractRegion:
40635c4bbdfSmrg        if (!RegionSubtract(pDestination, pSource1, pSource2))
40735c4bbdfSmrg            return BadAlloc;
40835c4bbdfSmrg        break;
40905b261ecSmrg    }
41035c4bbdfSmrg
4116747b715Smrg    return Success;
41205b261ecSmrg}
41305b261ecSmrg
41405b261ecSmrgint
41535c4bbdfSmrgSProcXFixesCombineRegion(ClientPtr client)
41605b261ecSmrg{
41735c4bbdfSmrg    REQUEST(xXFixesCombineRegionReq);
41805b261ecSmrg
41935c4bbdfSmrg    swaps(&stuff->length);
42035c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesCombineRegionReq);
42135c4bbdfSmrg    swapl(&stuff->source1);
42235c4bbdfSmrg    swapl(&stuff->source2);
42335c4bbdfSmrg    swapl(&stuff->destination);
42405b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
42505b261ecSmrg}
42605b261ecSmrg
42705b261ecSmrgint
42835c4bbdfSmrgProcXFixesInvertRegion(ClientPtr client)
42905b261ecSmrg{
43035c4bbdfSmrg    RegionPtr pSource, pDestination;
43135c4bbdfSmrg    BoxRec bounds;
43235c4bbdfSmrg
43305b261ecSmrg    REQUEST(xXFixesInvertRegionReq);
43405b261ecSmrg
43505b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesInvertRegionReq);
43605b261ecSmrg    VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
43705b261ecSmrg    VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
43805b261ecSmrg
43905b261ecSmrg    /* Compute bounds, limit to 16 bits */
44005b261ecSmrg    bounds.x1 = stuff->x;
44105b261ecSmrg    bounds.y1 = stuff->y;
44205b261ecSmrg    if ((int) stuff->x + (int) stuff->width > MAXSHORT)
44335c4bbdfSmrg        bounds.x2 = MAXSHORT;
44405b261ecSmrg    else
44535c4bbdfSmrg        bounds.x2 = stuff->x + stuff->width;
44635c4bbdfSmrg
44705b261ecSmrg    if ((int) stuff->y + (int) stuff->height > MAXSHORT)
44835c4bbdfSmrg        bounds.y2 = MAXSHORT;
44905b261ecSmrg    else
45035c4bbdfSmrg        bounds.y2 = stuff->y + stuff->height;
45105b261ecSmrg
4526747b715Smrg    if (!RegionInverse(pDestination, pSource, &bounds))
45335c4bbdfSmrg        return BadAlloc;
45405b261ecSmrg
4556747b715Smrg    return Success;
45605b261ecSmrg}
45705b261ecSmrg
45805b261ecSmrgint
45935c4bbdfSmrgSProcXFixesInvertRegion(ClientPtr client)
46005b261ecSmrg{
46105b261ecSmrg    REQUEST(xXFixesInvertRegionReq);
46205b261ecSmrg
46335c4bbdfSmrg    swaps(&stuff->length);
46405b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesInvertRegionReq);
46535c4bbdfSmrg    swapl(&stuff->source);
46635c4bbdfSmrg    swaps(&stuff->x);
46735c4bbdfSmrg    swaps(&stuff->y);
46835c4bbdfSmrg    swaps(&stuff->width);
46935c4bbdfSmrg    swaps(&stuff->height);
47035c4bbdfSmrg    swapl(&stuff->destination);
47105b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
47205b261ecSmrg}
47305b261ecSmrg
47405b261ecSmrgint
47535c4bbdfSmrgProcXFixesTranslateRegion(ClientPtr client)
47605b261ecSmrg{
47735c4bbdfSmrg    RegionPtr pRegion;
47835c4bbdfSmrg
47905b261ecSmrg    REQUEST(xXFixesTranslateRegionReq);
48005b261ecSmrg
48105b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq);
48205b261ecSmrg    VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
48305b261ecSmrg
4846747b715Smrg    RegionTranslate(pRegion, stuff->dx, stuff->dy);
4856747b715Smrg    return Success;
48605b261ecSmrg}
48705b261ecSmrg
48805b261ecSmrgint
48935c4bbdfSmrgSProcXFixesTranslateRegion(ClientPtr client)
49005b261ecSmrg{
49105b261ecSmrg    REQUEST(xXFixesTranslateRegionReq);
49205b261ecSmrg
49335c4bbdfSmrg    swaps(&stuff->length);
49405b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq);
49535c4bbdfSmrg    swapl(&stuff->region);
49635c4bbdfSmrg    swaps(&stuff->dx);
49735c4bbdfSmrg    swaps(&stuff->dy);
49805b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
49905b261ecSmrg}
50005b261ecSmrg
50105b261ecSmrgint
50235c4bbdfSmrgProcXFixesRegionExtents(ClientPtr client)
50305b261ecSmrg{
50435c4bbdfSmrg    RegionPtr pSource, pDestination;
50535c4bbdfSmrg
50605b261ecSmrg    REQUEST(xXFixesRegionExtentsReq);
50705b261ecSmrg
50805b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq);
50905b261ecSmrg    VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
51005b261ecSmrg    VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
51105b261ecSmrg
5126747b715Smrg    RegionReset(pDestination, RegionExtents(pSource));
51305b261ecSmrg
5146747b715Smrg    return Success;
51505b261ecSmrg}
51605b261ecSmrg
51705b261ecSmrgint
51835c4bbdfSmrgSProcXFixesRegionExtents(ClientPtr client)
51905b261ecSmrg{
52005b261ecSmrg    REQUEST(xXFixesRegionExtentsReq);
52135c4bbdfSmrg
52235c4bbdfSmrg    swaps(&stuff->length);
52305b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq);
52435c4bbdfSmrg    swapl(&stuff->source);
52535c4bbdfSmrg    swapl(&stuff->destination);
52605b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
52705b261ecSmrg}
52805b261ecSmrg
52905b261ecSmrgint
53035c4bbdfSmrgProcXFixesFetchRegion(ClientPtr client)
53105b261ecSmrg{
53235c4bbdfSmrg    RegionPtr pRegion;
53305b261ecSmrg    xXFixesFetchRegionReply *reply;
53435c4bbdfSmrg    xRectangle *pRect;
53535c4bbdfSmrg    BoxPtr pExtent;
53635c4bbdfSmrg    BoxPtr pBox;
53735c4bbdfSmrg    int i, nBox;
53835c4bbdfSmrg
53905b261ecSmrg    REQUEST(xXFixesFetchRegionReq);
54005b261ecSmrg
54105b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesFetchRegionReq);
54205b261ecSmrg    VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess);
54305b261ecSmrg
5446747b715Smrg    pExtent = RegionExtents(pRegion);
54535c4bbdfSmrg    pBox = RegionRects(pRegion);
54635c4bbdfSmrg    nBox = RegionNumRects(pRegion);
54735c4bbdfSmrg
54835c4bbdfSmrg    reply = calloc(sizeof(xXFixesFetchRegionReply) + nBox * sizeof(xRectangle),
54935c4bbdfSmrg                   1);
55005b261ecSmrg    if (!reply)
55135c4bbdfSmrg        return BadAlloc;
55205b261ecSmrg    reply->type = X_Reply;
55305b261ecSmrg    reply->sequenceNumber = client->sequence;
55405b261ecSmrg    reply->length = nBox << 1;
55505b261ecSmrg    reply->x = pExtent->x1;
55605b261ecSmrg    reply->y = pExtent->y1;
55705b261ecSmrg    reply->width = pExtent->x2 - pExtent->x1;
55805b261ecSmrg    reply->height = pExtent->y2 - pExtent->y1;
55905b261ecSmrg
56005b261ecSmrg    pRect = (xRectangle *) (reply + 1);
56135c4bbdfSmrg    for (i = 0; i < nBox; i++) {
56235c4bbdfSmrg        pRect[i].x = pBox[i].x1;
56335c4bbdfSmrg        pRect[i].y = pBox[i].y1;
56435c4bbdfSmrg        pRect[i].width = pBox[i].x2 - pBox[i].x1;
56535c4bbdfSmrg        pRect[i].height = pBox[i].y2 - pBox[i].y1;
56605b261ecSmrg    }
56735c4bbdfSmrg    if (client->swapped) {
56835c4bbdfSmrg        swaps(&reply->sequenceNumber);
56935c4bbdfSmrg        swapl(&reply->length);
57035c4bbdfSmrg        swaps(&reply->x);
57135c4bbdfSmrg        swaps(&reply->y);
57235c4bbdfSmrg        swaps(&reply->width);
57335c4bbdfSmrg        swaps(&reply->height);
57435c4bbdfSmrg        SwapShorts((INT16 *) pRect, nBox * 4);
57505b261ecSmrg    }
57635c4bbdfSmrg    WriteToClient(client, sizeof(xXFixesFetchRegionReply) +
57735c4bbdfSmrg                         nBox * sizeof(xRectangle), (char *) reply);
5786747b715Smrg    free(reply);
5796747b715Smrg    return Success;
58005b261ecSmrg}
58105b261ecSmrg
58205b261ecSmrgint
58335c4bbdfSmrgSProcXFixesFetchRegion(ClientPtr client)
58405b261ecSmrg{
58505b261ecSmrg    REQUEST(xXFixesFetchRegionReq);
58605b261ecSmrg
58735c4bbdfSmrg    swaps(&stuff->length);
58805b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesFetchRegionReq);
58935c4bbdfSmrg    swapl(&stuff->region);
59005b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
59105b261ecSmrg}
59205b261ecSmrg
59305b261ecSmrgint
59435c4bbdfSmrgProcXFixesSetGCClipRegion(ClientPtr client)
59505b261ecSmrg{
59635c4bbdfSmrg    GCPtr pGC;
59735c4bbdfSmrg    RegionPtr pRegion;
59835c4bbdfSmrg    ChangeGCVal vals[2];
59935c4bbdfSmrg    int rc;
60035c4bbdfSmrg
60105b261ecSmrg    REQUEST(xXFixesSetGCClipRegionReq);
60205b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
60305b261ecSmrg
6044642e01fSmrg    rc = dixLookupGC(&pGC, stuff->gc, client, DixSetAttrAccess);
60505b261ecSmrg    if (rc != Success)
60635c4bbdfSmrg        return rc;
60705b261ecSmrg
60835c4bbdfSmrg    VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess);
60905b261ecSmrg
61035c4bbdfSmrg    if (pRegion) {
61135c4bbdfSmrg        pRegion = XFixesRegionCopy(pRegion);
61235c4bbdfSmrg        if (!pRegion)
61335c4bbdfSmrg            return BadAlloc;
61405b261ecSmrg    }
61535c4bbdfSmrg
6166747b715Smrg    vals[0].val = stuff->xOrigin;
6176747b715Smrg    vals[1].val = stuff->yOrigin;
61835c4bbdfSmrg    ChangeGC(NullClient, pGC, GCClipXOrigin | GCClipYOrigin, vals);
61935c4bbdfSmrg    (*pGC->funcs->ChangeClip) (pGC, pRegion ? CT_REGION : CT_NONE,
62035c4bbdfSmrg                               (void *) pRegion, 0);
62105b261ecSmrg
6226747b715Smrg    return Success;
62305b261ecSmrg}
62405b261ecSmrg
62505b261ecSmrgint
62635c4bbdfSmrgSProcXFixesSetGCClipRegion(ClientPtr client)
62705b261ecSmrg{
62805b261ecSmrg    REQUEST(xXFixesSetGCClipRegionReq);
62905b261ecSmrg
63035c4bbdfSmrg    swaps(&stuff->length);
63105b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
63235c4bbdfSmrg    swapl(&stuff->gc);
63335c4bbdfSmrg    swapl(&stuff->region);
63435c4bbdfSmrg    swaps(&stuff->xOrigin);
63535c4bbdfSmrg    swaps(&stuff->yOrigin);
63605b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
63705b261ecSmrg}
63805b261ecSmrg
63935c4bbdfSmrgtypedef RegionPtr (*CreateDftPtr) (WindowPtr pWin);
64005b261ecSmrg
64105b261ecSmrgint
64235c4bbdfSmrgProcXFixesSetWindowShapeRegion(ClientPtr client)
64305b261ecSmrg{
64435c4bbdfSmrg    WindowPtr pWin;
64535c4bbdfSmrg    RegionPtr pRegion;
64635c4bbdfSmrg    RegionPtr *pDestRegion;
6474642e01fSmrg    int rc;
64835c4bbdfSmrg
64905b261ecSmrg    REQUEST(xXFixesSetWindowShapeRegionReq);
65005b261ecSmrg
65105b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
65235c4bbdfSmrg    rc = dixLookupResourceByType((void **) &pWin, stuff->dest, RT_WINDOW,
65335c4bbdfSmrg                                 client, DixSetAttrAccess);
65435c4bbdfSmrg    if (rc != Success) {
65535c4bbdfSmrg        client->errorValue = stuff->dest;
65635c4bbdfSmrg        return rc;
65705b261ecSmrg    }
65805b261ecSmrg    VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixWriteAccess);
65905b261ecSmrg    switch (stuff->destKind) {
66005b261ecSmrg    case ShapeBounding:
66105b261ecSmrg    case ShapeClip:
66205b261ecSmrg    case ShapeInput:
66335c4bbdfSmrg        break;
66405b261ecSmrg    default:
66535c4bbdfSmrg        client->errorValue = stuff->destKind;
66635c4bbdfSmrg        return BadValue;
66705b261ecSmrg    }
66835c4bbdfSmrg    if (pRegion) {
66935c4bbdfSmrg        pRegion = XFixesRegionCopy(pRegion);
67035c4bbdfSmrg        if (!pRegion)
67135c4bbdfSmrg            return BadAlloc;
67235c4bbdfSmrg        if (!pWin->optional)
67335c4bbdfSmrg            MakeWindowOptional(pWin);
67435c4bbdfSmrg        switch (stuff->destKind) {
67535c4bbdfSmrg        default:
67635c4bbdfSmrg        case ShapeBounding:
67735c4bbdfSmrg            pDestRegion = &pWin->optional->boundingShape;
67835c4bbdfSmrg            break;
67935c4bbdfSmrg        case ShapeClip:
68035c4bbdfSmrg            pDestRegion = &pWin->optional->clipShape;
68135c4bbdfSmrg            break;
68235c4bbdfSmrg        case ShapeInput:
68335c4bbdfSmrg            pDestRegion = &pWin->optional->inputShape;
68435c4bbdfSmrg            break;
68535c4bbdfSmrg        }
68635c4bbdfSmrg        if (stuff->xOff || stuff->yOff)
68735c4bbdfSmrg            RegionTranslate(pRegion, stuff->xOff, stuff->yOff);
68805b261ecSmrg    }
68935c4bbdfSmrg    else {
69035c4bbdfSmrg        if (pWin->optional) {
69135c4bbdfSmrg            switch (stuff->destKind) {
69235c4bbdfSmrg            default:
69335c4bbdfSmrg            case ShapeBounding:
69435c4bbdfSmrg                pDestRegion = &pWin->optional->boundingShape;
69535c4bbdfSmrg                break;
69635c4bbdfSmrg            case ShapeClip:
69735c4bbdfSmrg                pDestRegion = &pWin->optional->clipShape;
69835c4bbdfSmrg                break;
69935c4bbdfSmrg            case ShapeInput:
70035c4bbdfSmrg                pDestRegion = &pWin->optional->inputShape;
70135c4bbdfSmrg                break;
70235c4bbdfSmrg            }
70335c4bbdfSmrg        }
70435c4bbdfSmrg        else
70535c4bbdfSmrg            pDestRegion = &pRegion;     /* a NULL region pointer */
70605b261ecSmrg    }
70705b261ecSmrg    if (*pDestRegion)
70835c4bbdfSmrg        RegionDestroy(*pDestRegion);
70905b261ecSmrg    *pDestRegion = pRegion;
7106747b715Smrg    (*pWin->drawable.pScreen->SetShape) (pWin, stuff->destKind);
71135c4bbdfSmrg    SendShapeNotify(pWin, stuff->destKind);
7126747b715Smrg    return Success;
71305b261ecSmrg}
71405b261ecSmrg
71505b261ecSmrgint
71635c4bbdfSmrgSProcXFixesSetWindowShapeRegion(ClientPtr client)
71705b261ecSmrg{
71805b261ecSmrg    REQUEST(xXFixesSetWindowShapeRegionReq);
71905b261ecSmrg
72035c4bbdfSmrg    swaps(&stuff->length);
72105b261ecSmrg    REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
72235c4bbdfSmrg    swapl(&stuff->dest);
72335c4bbdfSmrg    swaps(&stuff->xOff);
72435c4bbdfSmrg    swaps(&stuff->yOff);
72535c4bbdfSmrg    swapl(&stuff->region);
72605b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
72705b261ecSmrg}
72805b261ecSmrg
72905b261ecSmrgint
73035c4bbdfSmrgProcXFixesSetPictureClipRegion(ClientPtr client)
73105b261ecSmrg{
73235c4bbdfSmrg    PicturePtr pPicture;
73335c4bbdfSmrg    RegionPtr pRegion;
73435c4bbdfSmrg
73505b261ecSmrg    REQUEST(xXFixesSetPictureClipRegionReq);
73635c4bbdfSmrg
73735c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesSetPictureClipRegionReq);
7386747b715Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
73905b261ecSmrg    VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess);
74035c4bbdfSmrg
74135c4bbdfSmrg    if (!pPicture->pDrawable)
74235c4bbdfSmrg        return RenderErrBase + BadPicture;
74335c4bbdfSmrg
74435c4bbdfSmrg    return SetPictureClipRegion(pPicture, stuff->xOrigin, stuff->yOrigin,
74535c4bbdfSmrg                                pRegion);
74605b261ecSmrg}
74705b261ecSmrg
74805b261ecSmrgint
74935c4bbdfSmrgSProcXFixesSetPictureClipRegion(ClientPtr client)
75005b261ecSmrg{
75105b261ecSmrg    REQUEST(xXFixesSetPictureClipRegionReq);
75235c4bbdfSmrg
75335c4bbdfSmrg    swaps(&stuff->length);
75435c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesSetPictureClipRegionReq);
75535c4bbdfSmrg    swapl(&stuff->picture);
75635c4bbdfSmrg    swapl(&stuff->region);
75735c4bbdfSmrg    swaps(&stuff->xOrigin);
75835c4bbdfSmrg    swaps(&stuff->yOrigin);
75905b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
76005b261ecSmrg}
76105b261ecSmrg
76205b261ecSmrgint
76335c4bbdfSmrgProcXFixesExpandRegion(ClientPtr client)
76405b261ecSmrg{
76535c4bbdfSmrg    RegionPtr pSource, pDestination;
76605b261ecSmrg
76735c4bbdfSmrg    REQUEST(xXFixesExpandRegionReq);
76835c4bbdfSmrg    BoxPtr pTmp;
76935c4bbdfSmrg    BoxPtr pSrc;
77035c4bbdfSmrg    int nBoxes;
77135c4bbdfSmrg    int i;
77235c4bbdfSmrg
77335c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesExpandRegionReq);
77405b261ecSmrg    VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
77505b261ecSmrg    VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
77635c4bbdfSmrg
7776747b715Smrg    nBoxes = RegionNumRects(pSource);
7786747b715Smrg    pSrc = RegionRects(pSource);
77935c4bbdfSmrg    if (nBoxes) {
78035c4bbdfSmrg        pTmp = xallocarray(nBoxes, sizeof(BoxRec));
78135c4bbdfSmrg        if (!pTmp)
78235c4bbdfSmrg            return BadAlloc;
78335c4bbdfSmrg        for (i = 0; i < nBoxes; i++) {
78435c4bbdfSmrg            pTmp[i].x1 = pSrc[i].x1 - stuff->left;
78535c4bbdfSmrg            pTmp[i].x2 = pSrc[i].x2 + stuff->right;
78635c4bbdfSmrg            pTmp[i].y1 = pSrc[i].y1 - stuff->top;
78735c4bbdfSmrg            pTmp[i].y2 = pSrc[i].y2 + stuff->bottom;
78835c4bbdfSmrg        }
78935c4bbdfSmrg        RegionEmpty(pDestination);
79035c4bbdfSmrg        for (i = 0; i < nBoxes; i++) {
79135c4bbdfSmrg            RegionRec r;
79235c4bbdfSmrg
79335c4bbdfSmrg            RegionInit(&r, &pTmp[i], 0);
79435c4bbdfSmrg            RegionUnion(pDestination, pDestination, &r);
79535c4bbdfSmrg        }
79635c4bbdfSmrg        free(pTmp);
79705b261ecSmrg    }
7986747b715Smrg    return Success;
79905b261ecSmrg}
80005b261ecSmrg
80105b261ecSmrgint
80235c4bbdfSmrgSProcXFixesExpandRegion(ClientPtr client)
80305b261ecSmrg{
80435c4bbdfSmrg    REQUEST(xXFixesExpandRegionReq);
80505b261ecSmrg
80635c4bbdfSmrg    swaps(&stuff->length);
80735c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesExpandRegionReq);
80835c4bbdfSmrg    swapl(&stuff->source);
80935c4bbdfSmrg    swapl(&stuff->destination);
81035c4bbdfSmrg    swaps(&stuff->left);
81135c4bbdfSmrg    swaps(&stuff->right);
81235c4bbdfSmrg    swaps(&stuff->top);
81335c4bbdfSmrg    swaps(&stuff->bottom);
81405b261ecSmrg    return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
81505b261ecSmrg}
81605b261ecSmrg
8179ace9065Smrg#ifdef PANORAMIX
8189ace9065Smrg#include "panoramiX.h"
8199ace9065Smrg#include "panoramiXsrv.h"
8209ace9065Smrg
8219ace9065Smrgint
82235c4bbdfSmrgPanoramiXFixesSetGCClipRegion(ClientPtr client)
8239ace9065Smrg{
8249ace9065Smrg    REQUEST(xXFixesSetGCClipRegionReq);
82535c4bbdfSmrg    int result = Success, j;
82635c4bbdfSmrg    PanoramiXRes *gc;
82735c4bbdfSmrg
8289ace9065Smrg    REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
8299ace9065Smrg
83035c4bbdfSmrg    if ((result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
83135c4bbdfSmrg                                          client, DixWriteAccess))) {
83235c4bbdfSmrg        client->errorValue = stuff->gc;
83335c4bbdfSmrg        return result;
8349ace9065Smrg    }
8359ace9065Smrg
8369ace9065Smrg    FOR_NSCREENS_BACKWARD(j) {
8379ace9065Smrg        stuff->gc = gc->info[j].id;
8389ace9065Smrg        result = (*PanoramiXSaveXFixesVector[X_XFixesSetGCClipRegion]) (client);
83935c4bbdfSmrg        if (result != Success)
84035c4bbdfSmrg            break;
8419ace9065Smrg    }
8429ace9065Smrg
8439ace9065Smrg    return result;
8449ace9065Smrg}
8459ace9065Smrg
8469ace9065Smrgint
84735c4bbdfSmrgPanoramiXFixesSetWindowShapeRegion(ClientPtr client)
8489ace9065Smrg{
84935c4bbdfSmrg    int result = Success, j;
85035c4bbdfSmrg    PanoramiXRes *win;
85135c4bbdfSmrg    RegionPtr reg = NULL;
85235c4bbdfSmrg
8539ace9065Smrg    REQUEST(xXFixesSetWindowShapeRegionReq);
8549ace9065Smrg
8559ace9065Smrg    REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
8569ace9065Smrg
85735c4bbdfSmrg    if ((result = dixLookupResourceByType((void **) &win, stuff->dest,
85835c4bbdfSmrg                                          XRT_WINDOW, client,
85935c4bbdfSmrg                                          DixWriteAccess))) {
86035c4bbdfSmrg        client->errorValue = stuff->dest;
86135c4bbdfSmrg        return result;
8629ace9065Smrg    }
8639ace9065Smrg
86435c4bbdfSmrg    if (win->u.win.root)
86535c4bbdfSmrg        VERIFY_REGION_OR_NONE(reg, stuff->region, client, DixReadAccess);
86635c4bbdfSmrg
8679ace9065Smrg    FOR_NSCREENS_FORWARD(j) {
86835c4bbdfSmrg        ScreenPtr screen = screenInfo.screens[j];
86935c4bbdfSmrg        stuff->dest = win->info[j].id;
87035c4bbdfSmrg
87135c4bbdfSmrg        if (reg)
87235c4bbdfSmrg            RegionTranslate(reg, -screen->x, -screen->y);
87335c4bbdfSmrg
87435c4bbdfSmrg        result =
87535c4bbdfSmrg            (*PanoramiXSaveXFixesVector[X_XFixesSetWindowShapeRegion]) (client);
87635c4bbdfSmrg
87735c4bbdfSmrg        if (reg)
87835c4bbdfSmrg            RegionTranslate(reg, screen->x, screen->y);
87935c4bbdfSmrg
88035c4bbdfSmrg        if (result != Success)
88135c4bbdfSmrg            break;
8829ace9065Smrg    }
8839ace9065Smrg
8849ace9065Smrg    return result;
8859ace9065Smrg}
8869ace9065Smrg
8879ace9065Smrgint
88835c4bbdfSmrgPanoramiXFixesSetPictureClipRegion(ClientPtr client)
8899ace9065Smrg{
8909ace9065Smrg    REQUEST(xXFixesSetPictureClipRegionReq);
89135c4bbdfSmrg    int result = Success, j;
89235c4bbdfSmrg    PanoramiXRes *pict;
89335c4bbdfSmrg    RegionPtr reg = NULL;
8949ace9065Smrg
89535c4bbdfSmrg    REQUEST_SIZE_MATCH(xXFixesSetPictureClipRegionReq);
8969ace9065Smrg
89735c4bbdfSmrg    if ((result = dixLookupResourceByType((void **) &pict, stuff->picture,
89835c4bbdfSmrg                                          XRT_PICTURE, client,
89935c4bbdfSmrg                                          DixWriteAccess))) {
90035c4bbdfSmrg        client->errorValue = stuff->picture;
90135c4bbdfSmrg        return result;
9029ace9065Smrg    }
9039ace9065Smrg
90435c4bbdfSmrg    if (pict->u.pict.root)
90535c4bbdfSmrg        VERIFY_REGION_OR_NONE(reg, stuff->region, client, DixReadAccess);
90635c4bbdfSmrg
9079ace9065Smrg    FOR_NSCREENS_BACKWARD(j) {
90835c4bbdfSmrg        ScreenPtr screen = screenInfo.screens[j];
9099ace9065Smrg        stuff->picture = pict->info[j].id;
91035c4bbdfSmrg
91135c4bbdfSmrg        if (reg)
91235c4bbdfSmrg            RegionTranslate(reg, -screen->x, -screen->y);
91335c4bbdfSmrg
91435c4bbdfSmrg        result =
91535c4bbdfSmrg            (*PanoramiXSaveXFixesVector[X_XFixesSetPictureClipRegion]) (client);
91635c4bbdfSmrg
91735c4bbdfSmrg        if (reg)
91835c4bbdfSmrg            RegionTranslate(reg, screen->x, screen->y);
91935c4bbdfSmrg
92035c4bbdfSmrg        if (result != Success)
92135c4bbdfSmrg            break;
9229ace9065Smrg    }
9239ace9065Smrg
9249ace9065Smrg    return result;
9259ace9065Smrg}
9269ace9065Smrg
9279ace9065Smrg#endif
928