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