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