render.c revision 8223e2f2
105b261ecSmrg/*
205b261ecSmrg *
305b261ecSmrg * Copyright © 2000 SuSE, Inc.
405b261ecSmrg *
505b261ecSmrg * Permission to use, copy, modify, distribute, and sell this software and its
605b261ecSmrg * documentation for any purpose is hereby granted without fee, provided that
705b261ecSmrg * the above copyright notice appear in all copies and that both that
805b261ecSmrg * copyright notice and this permission notice appear in supporting
905b261ecSmrg * documentation, and that the name of SuSE not be used in advertising or
1005b261ecSmrg * publicity pertaining to distribution of the software without specific,
1105b261ecSmrg * written prior permission.  SuSE makes no representations about the
1205b261ecSmrg * suitability of this software for any purpose.  It is provided "as is"
1305b261ecSmrg * without express or implied warranty.
1405b261ecSmrg *
1505b261ecSmrg * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
1605b261ecSmrg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
1705b261ecSmrg * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1805b261ecSmrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
1905b261ecSmrg * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
2005b261ecSmrg * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2105b261ecSmrg *
2205b261ecSmrg * Author:  Keith Packard, SuSE, Inc.
2305b261ecSmrg */
2405b261ecSmrg
2505b261ecSmrg#ifdef HAVE_DIX_CONFIG_H
2605b261ecSmrg#include <dix-config.h>
2705b261ecSmrg#endif
2805b261ecSmrg
2905b261ecSmrg#include <X11/X.h>
3005b261ecSmrg#include <X11/Xproto.h>
3105b261ecSmrg#include "misc.h"
3205b261ecSmrg#include "os.h"
3305b261ecSmrg#include "dixstruct.h"
3405b261ecSmrg#include "resource.h"
3505b261ecSmrg#include "scrnintstr.h"
3605b261ecSmrg#include "windowstr.h"
3705b261ecSmrg#include "pixmapstr.h"
3805b261ecSmrg#include "colormapst.h"
3905b261ecSmrg#include "extnsionst.h"
4005b261ecSmrg#include "servermd.h"
4105b261ecSmrg#include <X11/extensions/render.h>
4205b261ecSmrg#include <X11/extensions/renderproto.h>
4305b261ecSmrg#include "picturestr.h"
4405b261ecSmrg#include "glyphstr.h"
4505b261ecSmrg#include <X11/Xfuncproto.h>
4605b261ecSmrg#include "cursorstr.h"
474642e01fSmrg#include "xace.h"
486747b715Smrg#include "protocol-versions.h"
4905b261ecSmrg
5005b261ecSmrg#if HAVE_STDINT_H
5105b261ecSmrg#include <stdint.h>
5205b261ecSmrg#elif !defined(UINT32_MAX)
5305b261ecSmrg#define UINT32_MAX 0xffffffffU
5405b261ecSmrg#endif
5505b261ecSmrg
5605b261ecSmrgstatic int ProcRenderQueryVersion (ClientPtr pClient);
5705b261ecSmrgstatic int ProcRenderQueryPictFormats (ClientPtr pClient);
5805b261ecSmrgstatic int ProcRenderQueryPictIndexValues (ClientPtr pClient);
5905b261ecSmrgstatic int ProcRenderQueryDithers (ClientPtr pClient);
6005b261ecSmrgstatic int ProcRenderCreatePicture (ClientPtr pClient);
6105b261ecSmrgstatic int ProcRenderChangePicture (ClientPtr pClient);
6205b261ecSmrgstatic int ProcRenderSetPictureClipRectangles (ClientPtr pClient);
6305b261ecSmrgstatic int ProcRenderFreePicture (ClientPtr pClient);
6405b261ecSmrgstatic int ProcRenderComposite (ClientPtr pClient);
6505b261ecSmrgstatic int ProcRenderScale (ClientPtr pClient);
6605b261ecSmrgstatic int ProcRenderTrapezoids (ClientPtr pClient);
6705b261ecSmrgstatic int ProcRenderTriangles (ClientPtr pClient);
6805b261ecSmrgstatic int ProcRenderTriStrip (ClientPtr pClient);
6905b261ecSmrgstatic int ProcRenderTriFan (ClientPtr pClient);
7005b261ecSmrgstatic int ProcRenderColorTrapezoids (ClientPtr pClient);
7105b261ecSmrgstatic int ProcRenderColorTriangles (ClientPtr pClient);
7205b261ecSmrgstatic int ProcRenderTransform (ClientPtr pClient);
7305b261ecSmrgstatic int ProcRenderCreateGlyphSet (ClientPtr pClient);
7405b261ecSmrgstatic int ProcRenderReferenceGlyphSet (ClientPtr pClient);
7505b261ecSmrgstatic int ProcRenderFreeGlyphSet (ClientPtr pClient);
7605b261ecSmrgstatic int ProcRenderAddGlyphs (ClientPtr pClient);
7705b261ecSmrgstatic int ProcRenderAddGlyphsFromPicture (ClientPtr pClient);
7805b261ecSmrgstatic int ProcRenderFreeGlyphs (ClientPtr pClient);
7905b261ecSmrgstatic int ProcRenderCompositeGlyphs (ClientPtr pClient);
8005b261ecSmrgstatic int ProcRenderFillRectangles (ClientPtr pClient);
8105b261ecSmrgstatic int ProcRenderCreateCursor (ClientPtr pClient);
8205b261ecSmrgstatic int ProcRenderSetPictureTransform (ClientPtr pClient);
8305b261ecSmrgstatic int ProcRenderQueryFilters (ClientPtr pClient);
8405b261ecSmrgstatic int ProcRenderSetPictureFilter (ClientPtr pClient);
8505b261ecSmrgstatic int ProcRenderCreateAnimCursor (ClientPtr pClient);
8605b261ecSmrgstatic int ProcRenderAddTraps (ClientPtr pClient);
8705b261ecSmrgstatic int ProcRenderCreateSolidFill (ClientPtr pClient);
8805b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr pClient);
8905b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr pClient);
9005b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr pClient);
9105b261ecSmrg
9205b261ecSmrgstatic int ProcRenderDispatch (ClientPtr pClient);
9305b261ecSmrg
9405b261ecSmrgstatic int SProcRenderQueryVersion (ClientPtr pClient);
9505b261ecSmrgstatic int SProcRenderQueryPictFormats (ClientPtr pClient);
9605b261ecSmrgstatic int SProcRenderQueryPictIndexValues (ClientPtr pClient);
9705b261ecSmrgstatic int SProcRenderQueryDithers (ClientPtr pClient);
9805b261ecSmrgstatic int SProcRenderCreatePicture (ClientPtr pClient);
9905b261ecSmrgstatic int SProcRenderChangePicture (ClientPtr pClient);
10005b261ecSmrgstatic int SProcRenderSetPictureClipRectangles (ClientPtr pClient);
10105b261ecSmrgstatic int SProcRenderFreePicture (ClientPtr pClient);
10205b261ecSmrgstatic int SProcRenderComposite (ClientPtr pClient);
10305b261ecSmrgstatic int SProcRenderScale (ClientPtr pClient);
10405b261ecSmrgstatic int SProcRenderTrapezoids (ClientPtr pClient);
10505b261ecSmrgstatic int SProcRenderTriangles (ClientPtr pClient);
10605b261ecSmrgstatic int SProcRenderTriStrip (ClientPtr pClient);
10705b261ecSmrgstatic int SProcRenderTriFan (ClientPtr pClient);
10805b261ecSmrgstatic int SProcRenderColorTrapezoids (ClientPtr pClient);
10905b261ecSmrgstatic int SProcRenderColorTriangles (ClientPtr pClient);
11005b261ecSmrgstatic int SProcRenderTransform (ClientPtr pClient);
11105b261ecSmrgstatic int SProcRenderCreateGlyphSet (ClientPtr pClient);
11205b261ecSmrgstatic int SProcRenderReferenceGlyphSet (ClientPtr pClient);
11305b261ecSmrgstatic int SProcRenderFreeGlyphSet (ClientPtr pClient);
11405b261ecSmrgstatic int SProcRenderAddGlyphs (ClientPtr pClient);
11505b261ecSmrgstatic int SProcRenderAddGlyphsFromPicture (ClientPtr pClient);
11605b261ecSmrgstatic int SProcRenderFreeGlyphs (ClientPtr pClient);
11705b261ecSmrgstatic int SProcRenderCompositeGlyphs (ClientPtr pClient);
11805b261ecSmrgstatic int SProcRenderFillRectangles (ClientPtr pClient);
11905b261ecSmrgstatic int SProcRenderCreateCursor (ClientPtr pClient);
12005b261ecSmrgstatic int SProcRenderSetPictureTransform (ClientPtr pClient);
12105b261ecSmrgstatic int SProcRenderQueryFilters (ClientPtr pClient);
12205b261ecSmrgstatic int SProcRenderSetPictureFilter (ClientPtr pClient);
12305b261ecSmrgstatic int SProcRenderCreateAnimCursor (ClientPtr pClient);
12405b261ecSmrgstatic int SProcRenderAddTraps (ClientPtr pClient);
12505b261ecSmrgstatic int SProcRenderCreateSolidFill (ClientPtr pClient);
12605b261ecSmrgstatic int SProcRenderCreateLinearGradient (ClientPtr pClient);
12705b261ecSmrgstatic int SProcRenderCreateRadialGradient (ClientPtr pClient);
12805b261ecSmrgstatic int SProcRenderCreateConicalGradient (ClientPtr pClient);
12905b261ecSmrg
13005b261ecSmrgstatic int SProcRenderDispatch (ClientPtr pClient);
13105b261ecSmrg
13205b261ecSmrgint	(*ProcRenderVector[RenderNumberRequests])(ClientPtr) = {
13305b261ecSmrg    ProcRenderQueryVersion,
13405b261ecSmrg    ProcRenderQueryPictFormats,
13505b261ecSmrg    ProcRenderQueryPictIndexValues,
13605b261ecSmrg    ProcRenderQueryDithers,
13705b261ecSmrg    ProcRenderCreatePicture,
13805b261ecSmrg    ProcRenderChangePicture,
13905b261ecSmrg    ProcRenderSetPictureClipRectangles,
14005b261ecSmrg    ProcRenderFreePicture,
14105b261ecSmrg    ProcRenderComposite,
14205b261ecSmrg    ProcRenderScale,
14305b261ecSmrg    ProcRenderTrapezoids,
14405b261ecSmrg    ProcRenderTriangles,
14505b261ecSmrg    ProcRenderTriStrip,
14605b261ecSmrg    ProcRenderTriFan,
14705b261ecSmrg    ProcRenderColorTrapezoids,
14805b261ecSmrg    ProcRenderColorTriangles,
14905b261ecSmrg    ProcRenderTransform,
15005b261ecSmrg    ProcRenderCreateGlyphSet,
15105b261ecSmrg    ProcRenderReferenceGlyphSet,
15205b261ecSmrg    ProcRenderFreeGlyphSet,
15305b261ecSmrg    ProcRenderAddGlyphs,
15405b261ecSmrg    ProcRenderAddGlyphsFromPicture,
15505b261ecSmrg    ProcRenderFreeGlyphs,
15605b261ecSmrg    ProcRenderCompositeGlyphs,
15705b261ecSmrg    ProcRenderCompositeGlyphs,
15805b261ecSmrg    ProcRenderCompositeGlyphs,
15905b261ecSmrg    ProcRenderFillRectangles,
16005b261ecSmrg    ProcRenderCreateCursor,
16105b261ecSmrg    ProcRenderSetPictureTransform,
16205b261ecSmrg    ProcRenderQueryFilters,
16305b261ecSmrg    ProcRenderSetPictureFilter,
16405b261ecSmrg    ProcRenderCreateAnimCursor,
16505b261ecSmrg    ProcRenderAddTraps,
16605b261ecSmrg    ProcRenderCreateSolidFill,
16705b261ecSmrg    ProcRenderCreateLinearGradient,
16805b261ecSmrg    ProcRenderCreateRadialGradient,
16905b261ecSmrg    ProcRenderCreateConicalGradient
17005b261ecSmrg};
17105b261ecSmrg
17205b261ecSmrgint	(*SProcRenderVector[RenderNumberRequests])(ClientPtr) = {
17305b261ecSmrg    SProcRenderQueryVersion,
17405b261ecSmrg    SProcRenderQueryPictFormats,
17505b261ecSmrg    SProcRenderQueryPictIndexValues,
17605b261ecSmrg    SProcRenderQueryDithers,
17705b261ecSmrg    SProcRenderCreatePicture,
17805b261ecSmrg    SProcRenderChangePicture,
17905b261ecSmrg    SProcRenderSetPictureClipRectangles,
18005b261ecSmrg    SProcRenderFreePicture,
18105b261ecSmrg    SProcRenderComposite,
18205b261ecSmrg    SProcRenderScale,
18305b261ecSmrg    SProcRenderTrapezoids,
18405b261ecSmrg    SProcRenderTriangles,
18505b261ecSmrg    SProcRenderTriStrip,
18605b261ecSmrg    SProcRenderTriFan,
18705b261ecSmrg    SProcRenderColorTrapezoids,
18805b261ecSmrg    SProcRenderColorTriangles,
18905b261ecSmrg    SProcRenderTransform,
19005b261ecSmrg    SProcRenderCreateGlyphSet,
19105b261ecSmrg    SProcRenderReferenceGlyphSet,
19205b261ecSmrg    SProcRenderFreeGlyphSet,
19305b261ecSmrg    SProcRenderAddGlyphs,
19405b261ecSmrg    SProcRenderAddGlyphsFromPicture,
19505b261ecSmrg    SProcRenderFreeGlyphs,
19605b261ecSmrg    SProcRenderCompositeGlyphs,
19705b261ecSmrg    SProcRenderCompositeGlyphs,
19805b261ecSmrg    SProcRenderCompositeGlyphs,
19905b261ecSmrg    SProcRenderFillRectangles,
20005b261ecSmrg    SProcRenderCreateCursor,
20105b261ecSmrg    SProcRenderSetPictureTransform,
20205b261ecSmrg    SProcRenderQueryFilters,
20305b261ecSmrg    SProcRenderSetPictureFilter,
20405b261ecSmrg    SProcRenderCreateAnimCursor,
20505b261ecSmrg    SProcRenderAddTraps,
20605b261ecSmrg    SProcRenderCreateSolidFill,
20705b261ecSmrg    SProcRenderCreateLinearGradient,
20805b261ecSmrg    SProcRenderCreateRadialGradient,
20905b261ecSmrg    SProcRenderCreateConicalGradient
21005b261ecSmrg};
21105b261ecSmrg
21205b261ecSmrgint	RenderErrBase;
2136747b715Smrgstatic DevPrivateKeyRec RenderClientPrivateKeyRec;
2146747b715Smrg#define RenderClientPrivateKey (&RenderClientPrivateKeyRec )
21505b261ecSmrg
21605b261ecSmrgtypedef struct _RenderClient {
21705b261ecSmrg    int	    major_version;
21805b261ecSmrg    int	    minor_version;
21905b261ecSmrg} RenderClientRec, *RenderClientPtr;
22005b261ecSmrg
2214642e01fSmrg#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey))
22205b261ecSmrg
22305b261ecSmrgstatic void
22405b261ecSmrgRenderClientCallback (CallbackListPtr	*list,
22505b261ecSmrg		      pointer		closure,
22605b261ecSmrg		      pointer		data)
22705b261ecSmrg{
22805b261ecSmrg    NewClientInfoRec	*clientinfo = (NewClientInfoRec *) data;
22905b261ecSmrg    ClientPtr		pClient = clientinfo->client;
23005b261ecSmrg    RenderClientPtr	pRenderClient = GetRenderClient (pClient);
23105b261ecSmrg
23205b261ecSmrg    pRenderClient->major_version = 0;
23305b261ecSmrg    pRenderClient->minor_version = 0;
23405b261ecSmrg}
23505b261ecSmrg
2366747b715Smrg#ifdef PANORAMIX
2376747b715Smrgunsigned long	XRT_PICTURE;
2386747b715Smrg#endif
2396747b715Smrg
24005b261ecSmrgvoid
24105b261ecSmrgRenderExtensionInit (void)
24205b261ecSmrg{
24305b261ecSmrg    ExtensionEntry *extEntry;
24405b261ecSmrg
24505b261ecSmrg    if (!PictureType)
24605b261ecSmrg	return;
24705b261ecSmrg    if (!PictureFinishInit ())
24805b261ecSmrg	return;
2496747b715Smrg    if (!dixRegisterPrivateKey(&RenderClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(RenderClientRec)))
25005b261ecSmrg	return;
25105b261ecSmrg    if (!AddCallback (&ClientStateCallback, RenderClientCallback, 0))
25205b261ecSmrg	return;
25305b261ecSmrg
25405b261ecSmrg    extEntry = AddExtension (RENDER_NAME, 0, RenderNumberErrors,
25505b261ecSmrg			     ProcRenderDispatch, SProcRenderDispatch,
2564642e01fSmrg			     NULL, StandardMinorOpcode);
25705b261ecSmrg    if (!extEntry)
25805b261ecSmrg	return;
25905b261ecSmrg    RenderErrBase = extEntry->errorBase;
2606747b715Smrg#ifdef PANORAMIX
2616747b715Smrg    if (XRT_PICTURE)
2626747b715Smrg	SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
2636747b715Smrg#endif
2646747b715Smrg    SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture);
2656747b715Smrg    SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat);
2666747b715Smrg    SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet);
26705b261ecSmrg}
26805b261ecSmrg
26905b261ecSmrgstatic int
27005b261ecSmrgProcRenderQueryVersion (ClientPtr client)
27105b261ecSmrg{
27205b261ecSmrg    RenderClientPtr pRenderClient = GetRenderClient (client);
27305b261ecSmrg    xRenderQueryVersionReply rep;
27405b261ecSmrg    register int n;
27505b261ecSmrg    REQUEST(xRenderQueryVersionReq);
27605b261ecSmrg
27705b261ecSmrg    pRenderClient->major_version = stuff->majorVersion;
27805b261ecSmrg    pRenderClient->minor_version = stuff->minorVersion;
27905b261ecSmrg
28005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
2816747b715Smrg    memset(&rep, 0, sizeof(xRenderQueryVersionReply));
28205b261ecSmrg    rep.type = X_Reply;
28305b261ecSmrg    rep.length = 0;
28405b261ecSmrg    rep.sequenceNumber = client->sequence;
2856747b715Smrg
2866747b715Smrg    if ((stuff->majorVersion * 1000 + stuff->minorVersion) <
2876747b715Smrg        (SERVER_RENDER_MAJOR_VERSION * 1000 + SERVER_RENDER_MINOR_VERSION))
2886747b715Smrg    {
2896747b715Smrg	rep.majorVersion = stuff->majorVersion;
2906747b715Smrg	rep.minorVersion = stuff->minorVersion;
2916747b715Smrg    } else
2926747b715Smrg    {
2936747b715Smrg	rep.majorVersion = SERVER_RENDER_MAJOR_VERSION;
2946747b715Smrg	rep.minorVersion = SERVER_RENDER_MINOR_VERSION;
2956747b715Smrg    }
2966747b715Smrg
29705b261ecSmrg    if (client->swapped) {
29805b261ecSmrg    	swaps(&rep.sequenceNumber, n);
29905b261ecSmrg    	swapl(&rep.length, n);
30005b261ecSmrg	swapl(&rep.majorVersion, n);
30105b261ecSmrg	swapl(&rep.minorVersion, n);
30205b261ecSmrg    }
30305b261ecSmrg    WriteToClient(client, sizeof(xRenderQueryVersionReply), (char *)&rep);
3046747b715Smrg    return Success;
30505b261ecSmrg}
30605b261ecSmrg
30705b261ecSmrgstatic VisualPtr
30805b261ecSmrgfindVisual (ScreenPtr pScreen, VisualID vid)
30905b261ecSmrg{
31005b261ecSmrg    VisualPtr	pVisual;
31105b261ecSmrg    int		v;
31205b261ecSmrg
31305b261ecSmrg    for (v = 0; v < pScreen->numVisuals; v++)
31405b261ecSmrg    {
31505b261ecSmrg	pVisual = pScreen->visuals + v;
31605b261ecSmrg	if (pVisual->vid == vid)
31705b261ecSmrg	    return pVisual;
31805b261ecSmrg    }
31905b261ecSmrg    return 0;
32005b261ecSmrg}
32105b261ecSmrg
32205b261ecSmrgstatic int
32305b261ecSmrgProcRenderQueryPictFormats (ClientPtr client)
32405b261ecSmrg{
32505b261ecSmrg    RenderClientPtr		    pRenderClient = GetRenderClient (client);
32605b261ecSmrg    xRenderQueryPictFormatsReply    *reply;
32705b261ecSmrg    xPictScreen			    *pictScreen;
32805b261ecSmrg    xPictDepth			    *pictDepth;
32905b261ecSmrg    xPictVisual			    *pictVisual;
33005b261ecSmrg    xPictFormInfo		    *pictForm;
33105b261ecSmrg    CARD32			    *pictSubpixel;
33205b261ecSmrg    ScreenPtr			    pScreen;
33305b261ecSmrg    VisualPtr			    pVisual;
33405b261ecSmrg    DepthPtr			    pDepth;
33505b261ecSmrg    int				    v, d;
33605b261ecSmrg    PictureScreenPtr		    ps;
33705b261ecSmrg    PictFormatPtr		    pFormat;
33805b261ecSmrg    int				    nformat;
33905b261ecSmrg    int				    ndepth;
34005b261ecSmrg    int				    nvisual;
34105b261ecSmrg    int				    rlength;
34205b261ecSmrg    int				    s;
34305b261ecSmrg    int				    n;
34405b261ecSmrg    int				    numScreens;
34505b261ecSmrg    int				    numSubpixel;
34605b261ecSmrg/*    REQUEST(xRenderQueryPictFormatsReq); */
34705b261ecSmrg
34805b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
34905b261ecSmrg
35005b261ecSmrg#ifdef PANORAMIX
35105b261ecSmrg    if (noPanoramiXExtension)
35205b261ecSmrg	numScreens = screenInfo.numScreens;
35305b261ecSmrg    else
35405b261ecSmrg        numScreens = ((xConnSetup *)ConnectionInfo)->numRoots;
35505b261ecSmrg#else
35605b261ecSmrg    numScreens = screenInfo.numScreens;
35705b261ecSmrg#endif
35805b261ecSmrg    ndepth = nformat = nvisual = 0;
35905b261ecSmrg    for (s = 0; s < numScreens; s++)
36005b261ecSmrg    {
36105b261ecSmrg	pScreen = screenInfo.screens[s];
36205b261ecSmrg	for (d = 0; d < pScreen->numDepths; d++)
36305b261ecSmrg	{
36405b261ecSmrg	    pDepth = pScreen->allowedDepths + d;
36505b261ecSmrg	    ++ndepth;
36605b261ecSmrg
36705b261ecSmrg	    for (v = 0; v < pDepth->numVids; v++)
36805b261ecSmrg	    {
36905b261ecSmrg		pVisual = findVisual (pScreen, pDepth->vids[v]);
37005b261ecSmrg		if (pVisual && PictureMatchVisual (pScreen, pDepth->depth, pVisual))
37105b261ecSmrg		    ++nvisual;
37205b261ecSmrg	    }
37305b261ecSmrg	}
37405b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
37505b261ecSmrg	if (ps)
37605b261ecSmrg	    nformat += ps->nformats;
37705b261ecSmrg    }
37805b261ecSmrg    if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6)
37905b261ecSmrg	numSubpixel = 0;
38005b261ecSmrg    else
38105b261ecSmrg	numSubpixel = numScreens;
38205b261ecSmrg
38305b261ecSmrg    rlength = (sizeof (xRenderQueryPictFormatsReply) +
38405b261ecSmrg	       nformat * sizeof (xPictFormInfo) +
38505b261ecSmrg	       numScreens * sizeof (xPictScreen) +
38605b261ecSmrg	       ndepth * sizeof (xPictDepth) +
38705b261ecSmrg	       nvisual * sizeof (xPictVisual) +
38805b261ecSmrg	       numSubpixel * sizeof (CARD32));
3896747b715Smrg    reply = (xRenderQueryPictFormatsReply *) calloc(1, rlength);
39005b261ecSmrg    if (!reply)
39105b261ecSmrg	return BadAlloc;
39205b261ecSmrg    reply->type = X_Reply;
39305b261ecSmrg    reply->sequenceNumber = client->sequence;
3946747b715Smrg    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
39505b261ecSmrg    reply->numFormats = nformat;
39605b261ecSmrg    reply->numScreens = numScreens;
39705b261ecSmrg    reply->numDepths = ndepth;
39805b261ecSmrg    reply->numVisuals = nvisual;
39905b261ecSmrg    reply->numSubpixel = numSubpixel;
40005b261ecSmrg
40105b261ecSmrg    pictForm = (xPictFormInfo *) (reply + 1);
40205b261ecSmrg
40305b261ecSmrg    for (s = 0; s < numScreens; s++)
40405b261ecSmrg    {
40505b261ecSmrg	pScreen = screenInfo.screens[s];
40605b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
40705b261ecSmrg	if (ps)
40805b261ecSmrg	{
40905b261ecSmrg	    for (nformat = 0, pFormat = ps->formats;
41005b261ecSmrg		 nformat < ps->nformats;
41105b261ecSmrg		 nformat++, pFormat++)
41205b261ecSmrg	    {
41305b261ecSmrg		pictForm->id = pFormat->id;
41405b261ecSmrg		pictForm->type = pFormat->type;
41505b261ecSmrg		pictForm->depth = pFormat->depth;
41605b261ecSmrg		pictForm->direct.red = pFormat->direct.red;
41705b261ecSmrg		pictForm->direct.redMask = pFormat->direct.redMask;
41805b261ecSmrg		pictForm->direct.green = pFormat->direct.green;
41905b261ecSmrg		pictForm->direct.greenMask = pFormat->direct.greenMask;
42005b261ecSmrg		pictForm->direct.blue = pFormat->direct.blue;
42105b261ecSmrg		pictForm->direct.blueMask = pFormat->direct.blueMask;
42205b261ecSmrg		pictForm->direct.alpha = pFormat->direct.alpha;
42305b261ecSmrg		pictForm->direct.alphaMask = pFormat->direct.alphaMask;
42405b261ecSmrg		if (pFormat->type == PictTypeIndexed && pFormat->index.pColormap)
42505b261ecSmrg		    pictForm->colormap = pFormat->index.pColormap->mid;
42605b261ecSmrg		else
42705b261ecSmrg		    pictForm->colormap = None;
42805b261ecSmrg		if (client->swapped)
42905b261ecSmrg		{
43005b261ecSmrg		    swapl (&pictForm->id, n);
43105b261ecSmrg		    swaps (&pictForm->direct.red, n);
43205b261ecSmrg		    swaps (&pictForm->direct.redMask, n);
43305b261ecSmrg		    swaps (&pictForm->direct.green, n);
43405b261ecSmrg		    swaps (&pictForm->direct.greenMask, n);
43505b261ecSmrg		    swaps (&pictForm->direct.blue, n);
43605b261ecSmrg		    swaps (&pictForm->direct.blueMask, n);
43705b261ecSmrg		    swaps (&pictForm->direct.alpha, n);
43805b261ecSmrg		    swaps (&pictForm->direct.alphaMask, n);
43905b261ecSmrg		    swapl (&pictForm->colormap, n);
44005b261ecSmrg		}
44105b261ecSmrg		pictForm++;
44205b261ecSmrg	    }
44305b261ecSmrg	}
44405b261ecSmrg    }
44505b261ecSmrg
44605b261ecSmrg    pictScreen = (xPictScreen *) pictForm;
44705b261ecSmrg    for (s = 0; s < numScreens; s++)
44805b261ecSmrg    {
44905b261ecSmrg	pScreen = screenInfo.screens[s];
45005b261ecSmrg	pictDepth = (xPictDepth *) (pictScreen + 1);
45105b261ecSmrg	ndepth = 0;
45205b261ecSmrg	for (d = 0; d < pScreen->numDepths; d++)
45305b261ecSmrg	{
45405b261ecSmrg	    pictVisual = (xPictVisual *) (pictDepth + 1);
45505b261ecSmrg	    pDepth = pScreen->allowedDepths + d;
45605b261ecSmrg
45705b261ecSmrg	    nvisual = 0;
45805b261ecSmrg	    for (v = 0; v < pDepth->numVids; v++)
45905b261ecSmrg	    {
46005b261ecSmrg		pVisual = findVisual (pScreen, pDepth->vids[v]);
46105b261ecSmrg		if (pVisual && (pFormat = PictureMatchVisual (pScreen,
46205b261ecSmrg							      pDepth->depth,
46305b261ecSmrg							      pVisual)))
46405b261ecSmrg		{
46505b261ecSmrg		    pictVisual->visual = pVisual->vid;
46605b261ecSmrg		    pictVisual->format = pFormat->id;
46705b261ecSmrg		    if (client->swapped)
46805b261ecSmrg		    {
46905b261ecSmrg			swapl (&pictVisual->visual, n);
47005b261ecSmrg			swapl (&pictVisual->format, n);
47105b261ecSmrg		    }
47205b261ecSmrg		    pictVisual++;
47305b261ecSmrg		    nvisual++;
47405b261ecSmrg		}
47505b261ecSmrg	    }
47605b261ecSmrg	    pictDepth->depth = pDepth->depth;
47705b261ecSmrg	    pictDepth->nPictVisuals = nvisual;
47805b261ecSmrg	    if (client->swapped)
47905b261ecSmrg	    {
48005b261ecSmrg		swaps (&pictDepth->nPictVisuals, n);
48105b261ecSmrg	    }
48205b261ecSmrg	    ndepth++;
48305b261ecSmrg	    pictDepth = (xPictDepth *) pictVisual;
48405b261ecSmrg	}
48505b261ecSmrg	pictScreen->nDepth = ndepth;
48605b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
48705b261ecSmrg	if (ps)
48805b261ecSmrg	    pictScreen->fallback = ps->fallback->id;
48905b261ecSmrg	else
49005b261ecSmrg	    pictScreen->fallback = 0;
49105b261ecSmrg	if (client->swapped)
49205b261ecSmrg	{
49305b261ecSmrg	    swapl (&pictScreen->nDepth, n);
49405b261ecSmrg	    swapl (&pictScreen->fallback, n);
49505b261ecSmrg	}
49605b261ecSmrg	pictScreen = (xPictScreen *) pictDepth;
49705b261ecSmrg    }
49805b261ecSmrg    pictSubpixel = (CARD32 *) pictScreen;
49905b261ecSmrg
50005b261ecSmrg    for (s = 0; s < numSubpixel; s++)
50105b261ecSmrg    {
50205b261ecSmrg	pScreen = screenInfo.screens[s];
50305b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
50405b261ecSmrg	if (ps)
50505b261ecSmrg	    *pictSubpixel = ps->subpixel;
50605b261ecSmrg	else
50705b261ecSmrg	    *pictSubpixel = SubPixelUnknown;
50805b261ecSmrg	if (client->swapped)
50905b261ecSmrg	{
51005b261ecSmrg	    swapl (pictSubpixel, n);
51105b261ecSmrg	}
51205b261ecSmrg	++pictSubpixel;
51305b261ecSmrg    }
51405b261ecSmrg
51505b261ecSmrg    if (client->swapped)
51605b261ecSmrg    {
51705b261ecSmrg	swaps (&reply->sequenceNumber, n);
51805b261ecSmrg	swapl (&reply->length, n);
51905b261ecSmrg	swapl (&reply->numFormats, n);
52005b261ecSmrg	swapl (&reply->numScreens, n);
52105b261ecSmrg	swapl (&reply->numDepths, n);
52205b261ecSmrg	swapl (&reply->numVisuals, n);
52305b261ecSmrg	swapl (&reply->numSubpixel, n);
52405b261ecSmrg    }
52505b261ecSmrg    WriteToClient(client, rlength, (char *) reply);
5266747b715Smrg    free(reply);
5276747b715Smrg    return Success;
52805b261ecSmrg}
52905b261ecSmrg
53005b261ecSmrgstatic int
53105b261ecSmrgProcRenderQueryPictIndexValues (ClientPtr client)
53205b261ecSmrg{
53305b261ecSmrg    PictFormatPtr   pFormat;
5346747b715Smrg    int		    rc, num;
53505b261ecSmrg    int		    rlength;
53605b261ecSmrg    int		    i, n;
53705b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
53805b261ecSmrg    xRenderQueryPictIndexValuesReply *reply;
53905b261ecSmrg    xIndexValue	    *values;
54005b261ecSmrg
54105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
54205b261ecSmrg
5436747b715Smrg    rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
5446747b715Smrg				 PictFormatType, client, DixReadAccess);
5456747b715Smrg    if (rc != Success)
5466747b715Smrg	return rc;
54705b261ecSmrg
54805b261ecSmrg    if (pFormat->type != PictTypeIndexed)
54905b261ecSmrg    {
55005b261ecSmrg	client->errorValue = stuff->format;
55105b261ecSmrg	return BadMatch;
55205b261ecSmrg    }
55305b261ecSmrg    num = pFormat->index.nvalues;
55405b261ecSmrg    rlength = (sizeof (xRenderQueryPictIndexValuesReply) +
55505b261ecSmrg	       num * sizeof(xIndexValue));
5566747b715Smrg    reply = (xRenderQueryPictIndexValuesReply *) malloc(rlength);
55705b261ecSmrg    if (!reply)
55805b261ecSmrg	return BadAlloc;
55905b261ecSmrg
56005b261ecSmrg    reply->type = X_Reply;
56105b261ecSmrg    reply->sequenceNumber = client->sequence;
5626747b715Smrg    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
56305b261ecSmrg    reply->numIndexValues = num;
56405b261ecSmrg
56505b261ecSmrg    values = (xIndexValue *) (reply + 1);
56605b261ecSmrg
56705b261ecSmrg    memcpy (reply + 1, pFormat->index.pValues, num * sizeof (xIndexValue));
56805b261ecSmrg
56905b261ecSmrg    if (client->swapped)
57005b261ecSmrg    {
57105b261ecSmrg	for (i = 0; i < num; i++)
57205b261ecSmrg	{
57305b261ecSmrg	    swapl (&values[i].pixel, n);
57405b261ecSmrg	    swaps (&values[i].red, n);
57505b261ecSmrg	    swaps (&values[i].green, n);
57605b261ecSmrg	    swaps (&values[i].blue, n);
57705b261ecSmrg	    swaps (&values[i].alpha, n);
57805b261ecSmrg	}
57905b261ecSmrg	swaps (&reply->sequenceNumber, n);
58005b261ecSmrg	swapl (&reply->length, n);
58105b261ecSmrg	swapl (&reply->numIndexValues, n);
58205b261ecSmrg    }
58305b261ecSmrg
58405b261ecSmrg    WriteToClient(client, rlength, (char *) reply);
5856747b715Smrg    free(reply);
5866747b715Smrg    return Success;
58705b261ecSmrg}
58805b261ecSmrg
58905b261ecSmrgstatic int
59005b261ecSmrgProcRenderQueryDithers (ClientPtr client)
59105b261ecSmrg{
59205b261ecSmrg    return BadImplementation;
59305b261ecSmrg}
59405b261ecSmrg
59505b261ecSmrgstatic int
59605b261ecSmrgProcRenderCreatePicture (ClientPtr client)
59705b261ecSmrg{
59805b261ecSmrg    PicturePtr	    pPicture;
59905b261ecSmrg    DrawablePtr	    pDrawable;
60005b261ecSmrg    PictFormatPtr   pFormat;
60105b261ecSmrg    int		    len, error, rc;
60205b261ecSmrg    REQUEST(xRenderCreatePictureReq);
60305b261ecSmrg
60405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
60505b261ecSmrg
60605b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
60705b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
6084642e01fSmrg			   DixReadAccess|DixAddAccess);
60905b261ecSmrg    if (rc != Success)
61005b261ecSmrg	return rc;
61105b261ecSmrg
6126747b715Smrg    rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
6136747b715Smrg				 PictFormatType, client, DixReadAccess);
6146747b715Smrg    if (rc != Success)
6156747b715Smrg	return rc;
6166747b715Smrg
61705b261ecSmrg    if (pFormat->depth != pDrawable->depth)
61805b261ecSmrg	return BadMatch;
6196747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq));
62005b261ecSmrg    if (Ones(stuff->mask) != len)
62105b261ecSmrg	return BadLength;
62205b261ecSmrg
62305b261ecSmrg    pPicture = CreatePicture (stuff->pid,
62405b261ecSmrg			      pDrawable,
62505b261ecSmrg			      pFormat,
62605b261ecSmrg			      stuff->mask,
62705b261ecSmrg			      (XID *) (stuff + 1),
62805b261ecSmrg			      client,
62905b261ecSmrg			      &error);
63005b261ecSmrg    if (!pPicture)
63105b261ecSmrg	return error;
63205b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
63305b261ecSmrg	return BadAlloc;
63405b261ecSmrg    return Success;
63505b261ecSmrg}
63605b261ecSmrg
63705b261ecSmrgstatic int
63805b261ecSmrgProcRenderChangePicture (ClientPtr client)
63905b261ecSmrg{
64005b261ecSmrg    PicturePtr	    pPicture;
64105b261ecSmrg    REQUEST(xRenderChangePictureReq);
64205b261ecSmrg    int len;
64305b261ecSmrg
64405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
6456747b715Smrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
64605b261ecSmrg
6476747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq));
64805b261ecSmrg    if (Ones(stuff->mask) != len)
64905b261ecSmrg	return BadLength;
65005b261ecSmrg
65105b261ecSmrg    return ChangePicture (pPicture, stuff->mask, (XID *) (stuff + 1),
65205b261ecSmrg			  (DevUnion *) 0, client);
65305b261ecSmrg}
65405b261ecSmrg
65505b261ecSmrgstatic int
65605b261ecSmrgProcRenderSetPictureClipRectangles (ClientPtr client)
65705b261ecSmrg{
65805b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
65905b261ecSmrg    PicturePtr	    pPicture;
66005b261ecSmrg    int		    nr;
66105b261ecSmrg
66205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
6636747b715Smrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
66405b261ecSmrg    if (!pPicture->pDrawable)
66505b261ecSmrg        return BadDrawable;
66605b261ecSmrg
6676747b715Smrg    nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq);
66805b261ecSmrg    if (nr & 4)
66905b261ecSmrg	return BadLength;
67005b261ecSmrg    nr >>= 3;
6716747b715Smrg    return SetPictureClipRects (pPicture,
67205b261ecSmrg				  stuff->xOrigin, stuff->yOrigin,
67305b261ecSmrg				  nr, (xRectangle *) &stuff[1]);
67405b261ecSmrg}
67505b261ecSmrg
67605b261ecSmrgstatic int
67705b261ecSmrgProcRenderFreePicture (ClientPtr client)
67805b261ecSmrg{
67905b261ecSmrg    PicturePtr	pPicture;
68005b261ecSmrg    REQUEST(xRenderFreePictureReq);
68105b261ecSmrg
68205b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
68305b261ecSmrg
6846747b715Smrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess);
68505b261ecSmrg    FreeResource (stuff->picture, RT_NONE);
6866747b715Smrg    return Success;
68705b261ecSmrg}
68805b261ecSmrg
68905b261ecSmrgstatic Bool
69005b261ecSmrgPictOpValid (CARD8 op)
69105b261ecSmrg{
69205b261ecSmrg    if (/*PictOpMinimum <= op && */ op <= PictOpMaximum)
69305b261ecSmrg	return TRUE;
69405b261ecSmrg    if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum)
69505b261ecSmrg	return TRUE;
69605b261ecSmrg    if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum)
69705b261ecSmrg	return TRUE;
6986747b715Smrg    if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum)
6996747b715Smrg	return TRUE;
70005b261ecSmrg    return FALSE;
70105b261ecSmrg}
70205b261ecSmrg
70305b261ecSmrgstatic int
70405b261ecSmrgProcRenderComposite (ClientPtr client)
70505b261ecSmrg{
70605b261ecSmrg    PicturePtr	pSrc, pMask, pDst;
70705b261ecSmrg    REQUEST(xRenderCompositeReq);
70805b261ecSmrg
70905b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
71005b261ecSmrg    if (!PictOpValid (stuff->op))
71105b261ecSmrg    {
71205b261ecSmrg	client->errorValue = stuff->op;
71305b261ecSmrg	return BadValue;
71405b261ecSmrg    }
7156747b715Smrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
71605b261ecSmrg    if (!pDst->pDrawable)
71705b261ecSmrg        return BadDrawable;
7186747b715Smrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
7196747b715Smrg    VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess);
72005b261ecSmrg    if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) ||
72105b261ecSmrg	(pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen))
72205b261ecSmrg	return BadMatch;
72305b261ecSmrg    CompositePicture (stuff->op,
72405b261ecSmrg		      pSrc,
72505b261ecSmrg		      pMask,
72605b261ecSmrg		      pDst,
72705b261ecSmrg		      stuff->xSrc,
72805b261ecSmrg		      stuff->ySrc,
72905b261ecSmrg		      stuff->xMask,
73005b261ecSmrg		      stuff->yMask,
73105b261ecSmrg		      stuff->xDst,
73205b261ecSmrg		      stuff->yDst,
73305b261ecSmrg		      stuff->width,
73405b261ecSmrg		      stuff->height);
73505b261ecSmrg    return Success;
73605b261ecSmrg}
73705b261ecSmrg
73805b261ecSmrgstatic int
73905b261ecSmrgProcRenderScale (ClientPtr client)
74005b261ecSmrg{
74105b261ecSmrg    return BadImplementation;
74205b261ecSmrg}
74305b261ecSmrg
74405b261ecSmrgstatic int
74505b261ecSmrgProcRenderTrapezoids (ClientPtr client)
74605b261ecSmrg{
7476747b715Smrg    int		rc, ntraps;
74805b261ecSmrg    PicturePtr	pSrc, pDst;
74905b261ecSmrg    PictFormatPtr   pFormat;
75005b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
75105b261ecSmrg
75205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
75305b261ecSmrg    if (!PictOpValid (stuff->op))
75405b261ecSmrg    {
75505b261ecSmrg	client->errorValue = stuff->op;
75605b261ecSmrg	return BadValue;
75705b261ecSmrg    }
7586747b715Smrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
7596747b715Smrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
76005b261ecSmrg    if (!pDst->pDrawable)
76105b261ecSmrg        return BadDrawable;
76205b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
76305b261ecSmrg	return BadMatch;
76405b261ecSmrg    if (stuff->maskFormat)
76505b261ecSmrg    {
7666747b715Smrg	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
7676747b715Smrg				     PictFormatType, client, DixReadAccess);
7686747b715Smrg	if (rc != Success)
7696747b715Smrg	    return rc;
77005b261ecSmrg    }
77105b261ecSmrg    else
77205b261ecSmrg	pFormat = 0;
77305b261ecSmrg    ntraps = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
77405b261ecSmrg    if (ntraps % sizeof (xTrapezoid))
77505b261ecSmrg	return BadLength;
77605b261ecSmrg    ntraps /= sizeof (xTrapezoid);
77705b261ecSmrg    if (ntraps)
77805b261ecSmrg	CompositeTrapezoids (stuff->op, pSrc, pDst, pFormat,
77905b261ecSmrg			     stuff->xSrc, stuff->ySrc,
78005b261ecSmrg			     ntraps, (xTrapezoid *) &stuff[1]);
7816747b715Smrg    return Success;
78205b261ecSmrg}
78305b261ecSmrg
78405b261ecSmrgstatic int
78505b261ecSmrgProcRenderTriangles (ClientPtr client)
78605b261ecSmrg{
7876747b715Smrg    int		rc, ntris;
78805b261ecSmrg    PicturePtr	pSrc, pDst;
78905b261ecSmrg    PictFormatPtr   pFormat;
79005b261ecSmrg    REQUEST(xRenderTrianglesReq);
79105b261ecSmrg
79205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
79305b261ecSmrg    if (!PictOpValid (stuff->op))
79405b261ecSmrg    {
79505b261ecSmrg	client->errorValue = stuff->op;
79605b261ecSmrg	return BadValue;
79705b261ecSmrg    }
7986747b715Smrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
7996747b715Smrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
80005b261ecSmrg    if (!pDst->pDrawable)
80105b261ecSmrg        return BadDrawable;
80205b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
80305b261ecSmrg	return BadMatch;
80405b261ecSmrg    if (stuff->maskFormat)
80505b261ecSmrg    {
8066747b715Smrg	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
8076747b715Smrg				     PictFormatType, client, DixReadAccess);
8086747b715Smrg	if (rc != Success)
8096747b715Smrg	    return rc;
81005b261ecSmrg    }
81105b261ecSmrg    else
81205b261ecSmrg	pFormat = 0;
81305b261ecSmrg    ntris = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
81405b261ecSmrg    if (ntris % sizeof (xTriangle))
81505b261ecSmrg	return BadLength;
81605b261ecSmrg    ntris /= sizeof (xTriangle);
81705b261ecSmrg    if (ntris)
81805b261ecSmrg	CompositeTriangles (stuff->op, pSrc, pDst, pFormat,
81905b261ecSmrg			    stuff->xSrc, stuff->ySrc,
82005b261ecSmrg			    ntris, (xTriangle *) &stuff[1]);
8216747b715Smrg    return Success;
82205b261ecSmrg}
82305b261ecSmrg
82405b261ecSmrgstatic int
82505b261ecSmrgProcRenderTriStrip (ClientPtr client)
82605b261ecSmrg{
8276747b715Smrg    int		rc, npoints;
82805b261ecSmrg    PicturePtr	pSrc, pDst;
82905b261ecSmrg    PictFormatPtr   pFormat;
83005b261ecSmrg    REQUEST(xRenderTrianglesReq);
83105b261ecSmrg
83205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
83305b261ecSmrg    if (!PictOpValid (stuff->op))
83405b261ecSmrg    {
83505b261ecSmrg	client->errorValue = stuff->op;
83605b261ecSmrg	return BadValue;
83705b261ecSmrg    }
8386747b715Smrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
8396747b715Smrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
84005b261ecSmrg    if (!pDst->pDrawable)
84105b261ecSmrg        return BadDrawable;
84205b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
84305b261ecSmrg	return BadMatch;
84405b261ecSmrg    if (stuff->maskFormat)
84505b261ecSmrg    {
8466747b715Smrg	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
8476747b715Smrg				     PictFormatType, client, DixReadAccess);
8486747b715Smrg	if (rc != Success)
8496747b715Smrg	    return rc;
85005b261ecSmrg    }
85105b261ecSmrg    else
85205b261ecSmrg	pFormat = 0;
85305b261ecSmrg    npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
85405b261ecSmrg    if (npoints & 4)
8556747b715Smrg	return BadLength;
85605b261ecSmrg    npoints >>= 3;
85705b261ecSmrg    if (npoints >= 3)
85805b261ecSmrg	CompositeTriStrip (stuff->op, pSrc, pDst, pFormat,
85905b261ecSmrg			   stuff->xSrc, stuff->ySrc,
86005b261ecSmrg			   npoints, (xPointFixed *) &stuff[1]);
8616747b715Smrg    return Success;
86205b261ecSmrg}
86305b261ecSmrg
86405b261ecSmrgstatic int
86505b261ecSmrgProcRenderTriFan (ClientPtr client)
86605b261ecSmrg{
8676747b715Smrg    int		rc, npoints;
86805b261ecSmrg    PicturePtr	pSrc, pDst;
86905b261ecSmrg    PictFormatPtr   pFormat;
87005b261ecSmrg    REQUEST(xRenderTrianglesReq);
87105b261ecSmrg
87205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
87305b261ecSmrg    if (!PictOpValid (stuff->op))
87405b261ecSmrg    {
87505b261ecSmrg	client->errorValue = stuff->op;
87605b261ecSmrg	return BadValue;
87705b261ecSmrg    }
8786747b715Smrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
8796747b715Smrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
88005b261ecSmrg    if (!pDst->pDrawable)
88105b261ecSmrg        return BadDrawable;
88205b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
88305b261ecSmrg	return BadMatch;
88405b261ecSmrg    if (stuff->maskFormat)
88505b261ecSmrg    {
8866747b715Smrg	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
8876747b715Smrg				     PictFormatType, client, DixReadAccess);
8886747b715Smrg	if (rc != Success)
8896747b715Smrg	    return rc;
89005b261ecSmrg    }
89105b261ecSmrg    else
89205b261ecSmrg	pFormat = 0;
89305b261ecSmrg    npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
89405b261ecSmrg    if (npoints & 4)
8956747b715Smrg	return BadLength;
89605b261ecSmrg    npoints >>= 3;
89705b261ecSmrg    if (npoints >= 3)
89805b261ecSmrg	CompositeTriFan (stuff->op, pSrc, pDst, pFormat,
89905b261ecSmrg			 stuff->xSrc, stuff->ySrc,
90005b261ecSmrg			 npoints, (xPointFixed *) &stuff[1]);
9016747b715Smrg    return Success;
90205b261ecSmrg}
90305b261ecSmrg
90405b261ecSmrgstatic int
90505b261ecSmrgProcRenderColorTrapezoids (ClientPtr client)
90605b261ecSmrg{
90705b261ecSmrg    return BadImplementation;
90805b261ecSmrg}
90905b261ecSmrg
91005b261ecSmrgstatic int
91105b261ecSmrgProcRenderColorTriangles (ClientPtr client)
91205b261ecSmrg{
91305b261ecSmrg    return BadImplementation;
91405b261ecSmrg}
91505b261ecSmrg
91605b261ecSmrgstatic int
91705b261ecSmrgProcRenderTransform (ClientPtr client)
91805b261ecSmrg{
91905b261ecSmrg    return BadImplementation;
92005b261ecSmrg}
92105b261ecSmrg
92205b261ecSmrgstatic int
92305b261ecSmrgProcRenderCreateGlyphSet (ClientPtr client)
92405b261ecSmrg{
92505b261ecSmrg    GlyphSetPtr	    glyphSet;
92605b261ecSmrg    PictFormatPtr   format;
9274642e01fSmrg    int		    rc, f;
92805b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
92905b261ecSmrg
93005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
93105b261ecSmrg
93205b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
9336747b715Smrg    rc = dixLookupResourceByType((pointer *)&format, stuff->format,
9346747b715Smrg				 PictFormatType, client, DixReadAccess);
9356747b715Smrg    if (rc != Success)
9366747b715Smrg	return rc;
9376747b715Smrg
93805b261ecSmrg    switch (format->depth) {
93905b261ecSmrg    case 1:
94005b261ecSmrg	f = GlyphFormat1;
94105b261ecSmrg	break;
94205b261ecSmrg    case 4:
94305b261ecSmrg	f = GlyphFormat4;
94405b261ecSmrg	break;
94505b261ecSmrg    case 8:
94605b261ecSmrg	f = GlyphFormat8;
94705b261ecSmrg	break;
94805b261ecSmrg    case 16:
94905b261ecSmrg	f = GlyphFormat16;
95005b261ecSmrg	break;
95105b261ecSmrg    case 32:
95205b261ecSmrg	f = GlyphFormat32;
95305b261ecSmrg	break;
95405b261ecSmrg    default:
95505b261ecSmrg	return BadMatch;
95605b261ecSmrg    }
95705b261ecSmrg    if (format->type != PictTypeDirect)
95805b261ecSmrg	return BadMatch;
95905b261ecSmrg    glyphSet = AllocateGlyphSet (f, format);
96005b261ecSmrg    if (!glyphSet)
96105b261ecSmrg	return BadAlloc;
9624642e01fSmrg    /* security creation/labeling check */
9634642e01fSmrg    rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType,
9644642e01fSmrg		  glyphSet, RT_NONE, NULL, DixCreateAccess);
9654642e01fSmrg    if (rc != Success)
9664642e01fSmrg	return rc;
96705b261ecSmrg    if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
96805b261ecSmrg	return BadAlloc;
96905b261ecSmrg    return Success;
97005b261ecSmrg}
97105b261ecSmrg
97205b261ecSmrgstatic int
97305b261ecSmrgProcRenderReferenceGlyphSet (ClientPtr client)
97405b261ecSmrg{
97505b261ecSmrg    GlyphSetPtr     glyphSet;
9764642e01fSmrg    int rc;
97705b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
97805b261ecSmrg
97905b261ecSmrg    REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
98005b261ecSmrg
98105b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
98205b261ecSmrg
983b86d567bSmrg    rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->existing, GlyphSetType,
9844642e01fSmrg			   client, DixGetAttrAccess);
9854642e01fSmrg    if (rc != Success)
98605b261ecSmrg    {
98705b261ecSmrg	client->errorValue = stuff->existing;
9886747b715Smrg	return rc;
98905b261ecSmrg    }
99005b261ecSmrg    glyphSet->refcnt++;
99105b261ecSmrg    if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
99205b261ecSmrg	return BadAlloc;
9936747b715Smrg    return Success;
99405b261ecSmrg}
99505b261ecSmrg
99605b261ecSmrg#define NLOCALDELTA	64
99705b261ecSmrg#define NLOCALGLYPH	256
99805b261ecSmrg
99905b261ecSmrgstatic int
100005b261ecSmrgProcRenderFreeGlyphSet (ClientPtr client)
100105b261ecSmrg{
100205b261ecSmrg    GlyphSetPtr     glyphSet;
10034642e01fSmrg    int rc;
100405b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
100505b261ecSmrg
100605b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
1007b86d567bSmrg    rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
10084642e01fSmrg			   client, DixDestroyAccess);
10094642e01fSmrg    if (rc != Success)
101005b261ecSmrg    {
101105b261ecSmrg	client->errorValue = stuff->glyphset;
10126747b715Smrg	return rc;
101305b261ecSmrg    }
101405b261ecSmrg    FreeResource (stuff->glyphset, RT_NONE);
10156747b715Smrg    return Success;
101605b261ecSmrg}
101705b261ecSmrg
101805b261ecSmrgtypedef struct _GlyphNew {
10194642e01fSmrg    Glyph	    id;
10204642e01fSmrg    GlyphPtr        glyph;
10214642e01fSmrg    Bool	    found;
10224642e01fSmrg    unsigned char   sha1[20];
102305b261ecSmrg} GlyphNewRec, *GlyphNewPtr;
102405b261ecSmrg
10254642e01fSmrg#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
10264642e01fSmrg
102705b261ecSmrgstatic int
102805b261ecSmrgProcRenderAddGlyphs (ClientPtr client)
102905b261ecSmrg{
103005b261ecSmrg    GlyphSetPtr     glyphSet;
103105b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
103205b261ecSmrg    GlyphNewRec	    glyphsLocal[NLOCALGLYPH];
10334642e01fSmrg    GlyphNewPtr	    glyphsBase, glyphs, glyph_new;
103405b261ecSmrg    int		    remain, nglyphs;
103505b261ecSmrg    CARD32	    *gids;
103605b261ecSmrg    xGlyphInfo	    *gi;
103705b261ecSmrg    CARD8	    *bits;
10386747b715Smrg    unsigned int    size;
10394642e01fSmrg    int		    err;
10404642e01fSmrg    int		    i, screen;
10414642e01fSmrg    PicturePtr	    pSrc = NULL, pDst = NULL;
10424642e01fSmrg    PixmapPtr	    pSrcPix = NULL, pDstPix = NULL;
10434642e01fSmrg    CARD32	    component_alpha;
104405b261ecSmrg
104505b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
1046b86d567bSmrg    err = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
10474642e01fSmrg			    client, DixAddAccess);
10484642e01fSmrg    if (err != Success)
104905b261ecSmrg    {
105005b261ecSmrg	client->errorValue = stuff->glyphset;
10516747b715Smrg	return err;
105205b261ecSmrg    }
105305b261ecSmrg
10544642e01fSmrg    err = BadAlloc;
105505b261ecSmrg    nglyphs = stuff->nglyphs;
105605b261ecSmrg    if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec))
105705b261ecSmrg	    return BadAlloc;
105805b261ecSmrg
10594642e01fSmrg    component_alpha = NeedsComponent (glyphSet->format->format);
10604642e01fSmrg
10614642e01fSmrg    if (nglyphs <= NLOCALGLYPH) {
10624642e01fSmrg	memset (glyphsLocal, 0, sizeof (glyphsLocal));
106305b261ecSmrg	glyphsBase = glyphsLocal;
10644642e01fSmrg    }
106505b261ecSmrg    else
106605b261ecSmrg    {
10676747b715Smrg	glyphsBase = (GlyphNewPtr)calloc(nglyphs, sizeof (GlyphNewRec));
106805b261ecSmrg	if (!glyphsBase)
106905b261ecSmrg	    return BadAlloc;
107005b261ecSmrg    }
107105b261ecSmrg
107205b261ecSmrg    remain = (client->req_len << 2) - sizeof (xRenderAddGlyphsReq);
107305b261ecSmrg
107405b261ecSmrg    glyphs = glyphsBase;
107505b261ecSmrg
107605b261ecSmrg    gids = (CARD32 *) (stuff + 1);
107705b261ecSmrg    gi = (xGlyphInfo *) (gids + nglyphs);
107805b261ecSmrg    bits = (CARD8 *) (gi + nglyphs);
107905b261ecSmrg    remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs;
10806747b715Smrg
10816747b715Smrg    /* protect against bad nglyphs */
10826747b715Smrg    if (gi < stuff || gi > ((CARD32 *)stuff + client->req_len) ||
10836747b715Smrg        bits < stuff || bits > ((CARD32 *)stuff + client->req_len)) {
10846747b715Smrg        err = BadLength;
10856747b715Smrg        goto bail;
10866747b715Smrg    }
10876747b715Smrg
10884642e01fSmrg    for (i = 0; i < nglyphs; i++)
108905b261ecSmrg    {
10904642e01fSmrg	size_t padded_width;
10914642e01fSmrg	glyph_new = &glyphs[i];
10924642e01fSmrg
10934642e01fSmrg	padded_width = PixmapBytePad (gi[i].width,
10944642e01fSmrg				      glyphSet->format->depth);
10954642e01fSmrg
10964642e01fSmrg	if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height)
10974642e01fSmrg	    break;
109805b261ecSmrg
10994642e01fSmrg	size = gi[i].height * padded_width;
110005b261ecSmrg	if (remain < size)
110105b261ecSmrg	    break;
11024642e01fSmrg
11034642e01fSmrg	err = HashGlyph (&gi[i], bits, size, glyph_new->sha1);
11044642e01fSmrg	if (err)
11054642e01fSmrg	    goto bail;
11064642e01fSmrg
11074642e01fSmrg	glyph_new->glyph = FindGlyphByHash (glyph_new->sha1,
11084642e01fSmrg					    glyphSet->fdepth);
11094642e01fSmrg
11104642e01fSmrg	if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph)
11114642e01fSmrg	{
11124642e01fSmrg	    glyph_new->found = TRUE;
11134642e01fSmrg	}
11144642e01fSmrg	else
11154642e01fSmrg	{
11164642e01fSmrg	    GlyphPtr glyph;
11174642e01fSmrg
11184642e01fSmrg	    glyph_new->found = FALSE;
11194642e01fSmrg	    glyph_new->glyph = glyph = AllocateGlyph (&gi[i], glyphSet->fdepth);
11204642e01fSmrg	    if (! glyph)
11214642e01fSmrg	    {
11224642e01fSmrg		err = BadAlloc;
11234642e01fSmrg		goto bail;
11244642e01fSmrg	    }
11254642e01fSmrg
11264642e01fSmrg	    for (screen = 0; screen < screenInfo.numScreens; screen++)
11274642e01fSmrg	    {
11284642e01fSmrg		int	    width = gi[i].width;
11294642e01fSmrg		int	    height = gi[i].height;
11304642e01fSmrg		int	    depth = glyphSet->format->depth;
11314642e01fSmrg		ScreenPtr   pScreen;
11324642e01fSmrg		int	    error;
11334642e01fSmrg
11346747b715Smrg		/* Skip work if it's invisibly small anyway */
11356747b715Smrg		if (!width || !height)
11366747b715Smrg		    break;
11376747b715Smrg
11384642e01fSmrg		pScreen = screenInfo.screens[screen];
11394642e01fSmrg		pSrcPix = GetScratchPixmapHeader (pScreen,
11404642e01fSmrg						  width, height,
11414642e01fSmrg						  depth, depth,
11424642e01fSmrg						  -1, bits);
11434642e01fSmrg		if (! pSrcPix)
11444642e01fSmrg		{
11454642e01fSmrg		    err = BadAlloc;
11464642e01fSmrg		    goto bail;
11474642e01fSmrg		}
11484642e01fSmrg
11494642e01fSmrg		pSrc = CreatePicture (0, &pSrcPix->drawable,
11504642e01fSmrg				      glyphSet->format, 0, NULL,
11514642e01fSmrg				      serverClient, &error);
11524642e01fSmrg		if (! pSrc)
11534642e01fSmrg		{
11544642e01fSmrg		    err = BadAlloc;
11554642e01fSmrg		    goto bail;
11564642e01fSmrg		}
11574642e01fSmrg
11584642e01fSmrg		pDstPix = (pScreen->CreatePixmap) (pScreen,
11594642e01fSmrg						   width, height, depth,
11604642e01fSmrg						   CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
11614642e01fSmrg
11626747b715Smrg		if (!pDstPix)
11636747b715Smrg		{
11646747b715Smrg		    err = BadAlloc;
11656747b715Smrg		    goto bail;
11666747b715Smrg		}
11676747b715Smrg
11684642e01fSmrg		GlyphPicture (glyph)[screen] = pDst =
11694642e01fSmrg			CreatePicture (0, &pDstPix->drawable,
11704642e01fSmrg				       glyphSet->format,
11714642e01fSmrg				       CPComponentAlpha, &component_alpha,
11724642e01fSmrg				       serverClient, &error);
11734642e01fSmrg
11744642e01fSmrg		/* The picture takes a reference to the pixmap, so we
11754642e01fSmrg		   drop ours. */
11764642e01fSmrg		(pScreen->DestroyPixmap) (pDstPix);
11776747b715Smrg		pDstPix = NULL;
11784642e01fSmrg
11794642e01fSmrg		if (! pDst)
11804642e01fSmrg		{
11814642e01fSmrg		    err = BadAlloc;
11824642e01fSmrg		    goto bail;
11834642e01fSmrg		}
11844642e01fSmrg
11854642e01fSmrg		CompositePicture (PictOpSrc,
11864642e01fSmrg				  pSrc,
11874642e01fSmrg				  None,
11884642e01fSmrg				  pDst,
11894642e01fSmrg				  0, 0,
11904642e01fSmrg				  0, 0,
11914642e01fSmrg				  0, 0,
11924642e01fSmrg				  width, height);
11934642e01fSmrg
11944642e01fSmrg		FreePicture ((pointer) pSrc, 0);
11954642e01fSmrg		pSrc = NULL;
11964642e01fSmrg		FreeScratchPixmapHeader (pSrcPix);
11974642e01fSmrg		pSrcPix = NULL;
11984642e01fSmrg	    }
11994642e01fSmrg
12004642e01fSmrg	    memcpy (glyph_new->glyph->sha1, glyph_new->sha1, 20);
12014642e01fSmrg	}
12024642e01fSmrg
12034642e01fSmrg	glyph_new->id = gids[i];
120405b261ecSmrg
120505b261ecSmrg	if (size & 3)
120605b261ecSmrg	    size += 4 - (size & 3);
120705b261ecSmrg	bits += size;
120805b261ecSmrg	remain -= size;
120905b261ecSmrg    }
12104642e01fSmrg    if (remain || i < nglyphs)
121105b261ecSmrg    {
121205b261ecSmrg	err = BadLength;
121305b261ecSmrg	goto bail;
121405b261ecSmrg    }
121505b261ecSmrg    if (!ResizeGlyphSet (glyphSet, nglyphs))
121605b261ecSmrg    {
121705b261ecSmrg	err = BadAlloc;
121805b261ecSmrg	goto bail;
121905b261ecSmrg    }
12204642e01fSmrg    for (i = 0; i < nglyphs; i++)
12214642e01fSmrg	AddGlyph (glyphSet, glyphs[i].glyph, glyphs[i].id);
122205b261ecSmrg
122305b261ecSmrg    if (glyphsBase != glyphsLocal)
12246747b715Smrg	free(glyphsBase);
12256747b715Smrg    return Success;
122605b261ecSmrgbail:
12274642e01fSmrg    if (pSrc)
12284642e01fSmrg	FreePicture ((pointer) pSrc, 0);
12294642e01fSmrg    if (pSrcPix)
12304642e01fSmrg	FreeScratchPixmapHeader (pSrcPix);
12314642e01fSmrg    for (i = 0; i < nglyphs; i++)
12324642e01fSmrg	if (glyphs[i].glyph && ! glyphs[i].found)
12336747b715Smrg	    free(glyphs[i].glyph);
123405b261ecSmrg    if (glyphsBase != glyphsLocal)
12356747b715Smrg	free(glyphsBase);
123605b261ecSmrg    return err;
123705b261ecSmrg}
123805b261ecSmrg
123905b261ecSmrgstatic int
124005b261ecSmrgProcRenderAddGlyphsFromPicture (ClientPtr client)
124105b261ecSmrg{
124205b261ecSmrg    return BadImplementation;
124305b261ecSmrg}
124405b261ecSmrg
124505b261ecSmrgstatic int
124605b261ecSmrgProcRenderFreeGlyphs (ClientPtr client)
124705b261ecSmrg{
124805b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
124905b261ecSmrg    GlyphSetPtr     glyphSet;
12504642e01fSmrg    int		    rc, nglyph;
125105b261ecSmrg    CARD32	    *gids;
125205b261ecSmrg    CARD32	    glyph;
125305b261ecSmrg
125405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
1255b86d567bSmrg    rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
12564642e01fSmrg			   client, DixRemoveAccess);
12574642e01fSmrg    if (rc != Success)
125805b261ecSmrg    {
125905b261ecSmrg	client->errorValue = stuff->glyphset;
12606747b715Smrg	return rc;
126105b261ecSmrg    }
12626747b715Smrg    nglyph = bytes_to_int32((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq));
126305b261ecSmrg    gids = (CARD32 *) (stuff + 1);
126405b261ecSmrg    while (nglyph-- > 0)
126505b261ecSmrg    {
126605b261ecSmrg	glyph = *gids++;
126705b261ecSmrg	if (!DeleteGlyph (glyphSet, glyph))
126805b261ecSmrg	{
126905b261ecSmrg	    client->errorValue = glyph;
127005b261ecSmrg	    return RenderErrBase + BadGlyph;
127105b261ecSmrg	}
127205b261ecSmrg    }
12736747b715Smrg    return Success;
127405b261ecSmrg}
127505b261ecSmrg
127605b261ecSmrgstatic int
127705b261ecSmrgProcRenderCompositeGlyphs (ClientPtr client)
127805b261ecSmrg{
127905b261ecSmrg    GlyphSetPtr     glyphSet;
128005b261ecSmrg    GlyphSet	    gs;
128105b261ecSmrg    PicturePtr      pSrc, pDst;
128205b261ecSmrg    PictFormatPtr   pFormat;
128305b261ecSmrg    GlyphListRec    listsLocal[NLOCALDELTA];
128405b261ecSmrg    GlyphListPtr    lists, listsBase;
128505b261ecSmrg    GlyphPtr	    glyphsLocal[NLOCALGLYPH];
128605b261ecSmrg    Glyph	    glyph;
128705b261ecSmrg    GlyphPtr	    *glyphs, *glyphsBase;
128805b261ecSmrg    xGlyphElt	    *elt;
128905b261ecSmrg    CARD8	    *buffer, *end;
129005b261ecSmrg    int		    nglyph;
129105b261ecSmrg    int		    nlist;
129205b261ecSmrg    int		    space;
129305b261ecSmrg    int		    size;
12946747b715Smrg    int		    rc, n;
129505b261ecSmrg
129605b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
129705b261ecSmrg
129805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
129905b261ecSmrg
130005b261ecSmrg    switch (stuff->renderReqType) {
130105b261ecSmrg    default:			    size = 1; break;
130205b261ecSmrg    case X_RenderCompositeGlyphs16: size = 2; break;
130305b261ecSmrg    case X_RenderCompositeGlyphs32: size = 4; break;
130405b261ecSmrg    }
130505b261ecSmrg
130605b261ecSmrg    if (!PictOpValid (stuff->op))
130705b261ecSmrg    {
130805b261ecSmrg	client->errorValue = stuff->op;
130905b261ecSmrg	return BadValue;
131005b261ecSmrg    }
13116747b715Smrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
13126747b715Smrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
131305b261ecSmrg    if (!pDst->pDrawable)
131405b261ecSmrg        return BadDrawable;
131505b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
131605b261ecSmrg	return BadMatch;
131705b261ecSmrg    if (stuff->maskFormat)
131805b261ecSmrg    {
13196747b715Smrg	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
13206747b715Smrg				     PictFormatType, client, DixReadAccess);
13216747b715Smrg	if (rc != Success)
13226747b715Smrg	    return rc;
132305b261ecSmrg    }
132405b261ecSmrg    else
132505b261ecSmrg	pFormat = 0;
132605b261ecSmrg
13276747b715Smrg    rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset,
13286747b715Smrg				 GlyphSetType, client, DixUseAccess);
13296747b715Smrg    if (rc != Success)
13306747b715Smrg	return rc;
133105b261ecSmrg
133205b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
133305b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
133405b261ecSmrg    nglyph = 0;
133505b261ecSmrg    nlist = 0;
133605b261ecSmrg    while (buffer + sizeof (xGlyphElt) < end)
133705b261ecSmrg    {
133805b261ecSmrg	elt = (xGlyphElt *) buffer;
133905b261ecSmrg	buffer += sizeof (xGlyphElt);
134005b261ecSmrg
134105b261ecSmrg	if (elt->len == 0xff)
134205b261ecSmrg	{
134305b261ecSmrg	    buffer += 4;
134405b261ecSmrg	}
134505b261ecSmrg	else
134605b261ecSmrg	{
134705b261ecSmrg	    nlist++;
134805b261ecSmrg	    nglyph += elt->len;
134905b261ecSmrg	    space = size * elt->len;
135005b261ecSmrg	    if (space & 3)
135105b261ecSmrg		space += 4 - (space & 3);
135205b261ecSmrg	    buffer += space;
135305b261ecSmrg	}
135405b261ecSmrg    }
135505b261ecSmrg    if (nglyph <= NLOCALGLYPH)
135605b261ecSmrg	glyphsBase = glyphsLocal;
135705b261ecSmrg    else
135805b261ecSmrg    {
13596747b715Smrg	glyphsBase = (GlyphPtr *) malloc(nglyph * sizeof (GlyphPtr));
136005b261ecSmrg	if (!glyphsBase)
136105b261ecSmrg	    return BadAlloc;
136205b261ecSmrg    }
136305b261ecSmrg    if (nlist <= NLOCALDELTA)
136405b261ecSmrg	listsBase = listsLocal;
136505b261ecSmrg    else
136605b261ecSmrg    {
13676747b715Smrg	listsBase = (GlyphListPtr) malloc(nlist * sizeof (GlyphListRec));
136805b261ecSmrg	if (!listsBase)
136905b261ecSmrg	    return BadAlloc;
137005b261ecSmrg    }
137105b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
137205b261ecSmrg    glyphs = glyphsBase;
137305b261ecSmrg    lists = listsBase;
137405b261ecSmrg    while (buffer + sizeof (xGlyphElt) < end)
137505b261ecSmrg    {
137605b261ecSmrg	elt = (xGlyphElt *) buffer;
137705b261ecSmrg	buffer += sizeof (xGlyphElt);
137805b261ecSmrg
137905b261ecSmrg	if (elt->len == 0xff)
138005b261ecSmrg	{
138105b261ecSmrg	    if (buffer + sizeof (GlyphSet) < end)
138205b261ecSmrg	    {
138305b261ecSmrg                memcpy(&gs, buffer, sizeof(GlyphSet));
13846747b715Smrg		rc = dixLookupResourceByType((pointer *)&glyphSet, gs,
13856747b715Smrg					     GlyphSetType, client,
13866747b715Smrg					     DixUseAccess);
13876747b715Smrg		if (rc != Success)
138805b261ecSmrg		{
138905b261ecSmrg		    if (glyphsBase != glyphsLocal)
13906747b715Smrg			free(glyphsBase);
139105b261ecSmrg		    if (listsBase != listsLocal)
13926747b715Smrg			free(listsBase);
13936747b715Smrg		    return rc;
139405b261ecSmrg		}
139505b261ecSmrg	    }
139605b261ecSmrg	    buffer += 4;
139705b261ecSmrg	}
139805b261ecSmrg	else
139905b261ecSmrg	{
140005b261ecSmrg	    lists->xOff = elt->deltax;
140105b261ecSmrg	    lists->yOff = elt->deltay;
140205b261ecSmrg	    lists->format = glyphSet->format;
140305b261ecSmrg	    lists->len = 0;
140405b261ecSmrg	    n = elt->len;
140505b261ecSmrg	    while (n--)
140605b261ecSmrg	    {
140705b261ecSmrg		if (buffer + size <= end)
140805b261ecSmrg		{
140905b261ecSmrg		    switch (size) {
141005b261ecSmrg		    case 1:
141105b261ecSmrg			glyph = *((CARD8 *)buffer); break;
141205b261ecSmrg		    case 2:
141305b261ecSmrg			glyph = *((CARD16 *)buffer); break;
141405b261ecSmrg		    case 4:
141505b261ecSmrg		    default:
141605b261ecSmrg			glyph = *((CARD32 *)buffer); break;
141705b261ecSmrg		    }
141805b261ecSmrg		    if ((*glyphs = FindGlyph (glyphSet, glyph)))
141905b261ecSmrg		    {
142005b261ecSmrg			lists->len++;
142105b261ecSmrg			glyphs++;
142205b261ecSmrg		    }
142305b261ecSmrg		}
142405b261ecSmrg		buffer += size;
142505b261ecSmrg	    }
142605b261ecSmrg	    space = size * elt->len;
142705b261ecSmrg	    if (space & 3)
142805b261ecSmrg		buffer += 4 - (space & 3);
142905b261ecSmrg	    lists++;
143005b261ecSmrg	}
143105b261ecSmrg    }
143205b261ecSmrg    if (buffer > end)
143305b261ecSmrg	return BadLength;
143405b261ecSmrg
143505b261ecSmrg    CompositeGlyphs (stuff->op,
143605b261ecSmrg		     pSrc,
143705b261ecSmrg		     pDst,
143805b261ecSmrg		     pFormat,
143905b261ecSmrg		     stuff->xSrc,
144005b261ecSmrg		     stuff->ySrc,
144105b261ecSmrg		     nlist,
144205b261ecSmrg		     listsBase,
144305b261ecSmrg		     glyphsBase);
144405b261ecSmrg
144505b261ecSmrg    if (glyphsBase != glyphsLocal)
14466747b715Smrg	free(glyphsBase);
144705b261ecSmrg    if (listsBase != listsLocal)
14486747b715Smrg	free(listsBase);
144905b261ecSmrg
14506747b715Smrg    return Success;
145105b261ecSmrg}
145205b261ecSmrg
145305b261ecSmrgstatic int
145405b261ecSmrgProcRenderFillRectangles (ClientPtr client)
145505b261ecSmrg{
145605b261ecSmrg    PicturePtr	    pDst;
145705b261ecSmrg    int             things;
145805b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
145905b261ecSmrg
146005b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
146105b261ecSmrg    if (!PictOpValid (stuff->op))
146205b261ecSmrg    {
146305b261ecSmrg	client->errorValue = stuff->op;
146405b261ecSmrg	return BadValue;
146505b261ecSmrg    }
14666747b715Smrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
146705b261ecSmrg    if (!pDst->pDrawable)
146805b261ecSmrg        return BadDrawable;
146905b261ecSmrg
147005b261ecSmrg    things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
147105b261ecSmrg    if (things & 4)
14726747b715Smrg	return BadLength;
147305b261ecSmrg    things >>= 3;
147405b261ecSmrg
147505b261ecSmrg    CompositeRects (stuff->op,
147605b261ecSmrg		    pDst,
147705b261ecSmrg		    &stuff->color,
147805b261ecSmrg		    things,
147905b261ecSmrg		    (xRectangle *) &stuff[1]);
148005b261ecSmrg
14816747b715Smrg    return Success;
148205b261ecSmrg}
148305b261ecSmrg
148405b261ecSmrgstatic void
14856747b715SmrgRenderSetBit (unsigned char *line, int x, int bit)
148605b261ecSmrg{
148705b261ecSmrg    unsigned char   mask;
148805b261ecSmrg
148905b261ecSmrg    if (screenInfo.bitmapBitOrder == LSBFirst)
149005b261ecSmrg	mask = (1 << (x & 7));
149105b261ecSmrg    else
149205b261ecSmrg	mask = (0x80 >> (x & 7));
149305b261ecSmrg    /* XXX assumes byte order is host byte order */
149405b261ecSmrg    line += (x >> 3);
149505b261ecSmrg    if (bit)
149605b261ecSmrg	*line |= mask;
149705b261ecSmrg    else
149805b261ecSmrg	*line &= ~mask;
149905b261ecSmrg}
150005b261ecSmrg
150105b261ecSmrg#define DITHER_DIM 2
150205b261ecSmrg
150305b261ecSmrgstatic CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = {
150405b261ecSmrg    {  1,  3,  },
150505b261ecSmrg    {  4,  2,  },
150605b261ecSmrg};
150705b261ecSmrg
150805b261ecSmrg#define DITHER_SIZE  ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1)
150905b261ecSmrg
151005b261ecSmrgstatic int
151105b261ecSmrgProcRenderCreateCursor (ClientPtr client)
151205b261ecSmrg{
151305b261ecSmrg    REQUEST(xRenderCreateCursorReq);
151405b261ecSmrg    PicturePtr	    pSrc;
151505b261ecSmrg    ScreenPtr	    pScreen;
151605b261ecSmrg    unsigned short  width, height;
151705b261ecSmrg    CARD32	    *argbbits, *argb;
151805b261ecSmrg    unsigned char   *srcbits, *srcline;
151905b261ecSmrg    unsigned char   *mskbits, *mskline;
152005b261ecSmrg    int		    stride;
152105b261ecSmrg    int		    x, y;
152205b261ecSmrg    int		    nbytes_mono;
152305b261ecSmrg    CursorMetricRec cm;
152405b261ecSmrg    CursorPtr	    pCursor;
152505b261ecSmrg    CARD32	    twocolor[3];
15264642e01fSmrg    int		    rc, ncolor;
152705b261ecSmrg
152805b261ecSmrg    REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
152905b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
153005b261ecSmrg
15316747b715Smrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
153205b261ecSmrg    if (!pSrc->pDrawable)
153305b261ecSmrg        return BadDrawable;
153405b261ecSmrg    pScreen = pSrc->pDrawable->pScreen;
153505b261ecSmrg    width = pSrc->pDrawable->width;
153605b261ecSmrg    height = pSrc->pDrawable->height;
153705b261ecSmrg    if (height && width > UINT32_MAX/(height*sizeof(CARD32)))
153805b261ecSmrg	return BadAlloc;
153905b261ecSmrg    if ( stuff->x > width
154005b261ecSmrg      || stuff->y > height )
15416747b715Smrg	return BadMatch;
15426747b715Smrg    argbbits = malloc(width * height * sizeof (CARD32));
154305b261ecSmrg    if (!argbbits)
15446747b715Smrg	return BadAlloc;
154505b261ecSmrg
154605b261ecSmrg    stride = BitmapBytePad(width);
154705b261ecSmrg    nbytes_mono = stride*height;
15486747b715Smrg    srcbits = calloc(1, nbytes_mono);
154905b261ecSmrg    if (!srcbits)
155005b261ecSmrg    {
15516747b715Smrg	free(argbbits);
15526747b715Smrg	return BadAlloc;
155305b261ecSmrg    }
15546747b715Smrg    mskbits = calloc(1, nbytes_mono);
155505b261ecSmrg    if (!mskbits)
155605b261ecSmrg    {
15576747b715Smrg	free(argbbits);
15586747b715Smrg	free(srcbits);
15596747b715Smrg	return BadAlloc;
156005b261ecSmrg    }
156105b261ecSmrg
156205b261ecSmrg    if (pSrc->format == PICT_a8r8g8b8)
156305b261ecSmrg    {
156405b261ecSmrg	(*pScreen->GetImage) (pSrc->pDrawable,
156505b261ecSmrg			      0, 0, width, height, ZPixmap,
156605b261ecSmrg			      0xffffffff, (pointer) argbbits);
156705b261ecSmrg    }
156805b261ecSmrg    else
156905b261ecSmrg    {
157005b261ecSmrg	PixmapPtr	pPixmap;
157105b261ecSmrg	PicturePtr	pPicture;
157205b261ecSmrg	PictFormatPtr	pFormat;
157305b261ecSmrg	int		error;
157405b261ecSmrg
157505b261ecSmrg	pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8);
157605b261ecSmrg	if (!pFormat)
157705b261ecSmrg	{
15786747b715Smrg	    free(argbbits);
15796747b715Smrg	    free(srcbits);
15806747b715Smrg	    free(mskbits);
15816747b715Smrg	    return BadImplementation;
158205b261ecSmrg	}
15834642e01fSmrg	pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
15844642e01fSmrg					    CREATE_PIXMAP_USAGE_SCRATCH);
158505b261ecSmrg	if (!pPixmap)
158605b261ecSmrg	{
15876747b715Smrg	    free(argbbits);
15886747b715Smrg	    free(srcbits);
15896747b715Smrg	    free(mskbits);
15906747b715Smrg	    return BadAlloc;
159105b261ecSmrg	}
159205b261ecSmrg	pPicture = CreatePicture (0, &pPixmap->drawable, pFormat, 0, 0,
159305b261ecSmrg				  client, &error);
159405b261ecSmrg	if (!pPicture)
159505b261ecSmrg	{
15966747b715Smrg	    free(argbbits);
15976747b715Smrg	    free(srcbits);
15986747b715Smrg	    free(mskbits);
159905b261ecSmrg	    return error;
160005b261ecSmrg	}
160105b261ecSmrg	(*pScreen->DestroyPixmap) (pPixmap);
160205b261ecSmrg	CompositePicture (PictOpSrc,
160305b261ecSmrg			  pSrc, 0, pPicture,
160405b261ecSmrg			  0, 0, 0, 0, 0, 0, width, height);
160505b261ecSmrg	(*pScreen->GetImage) (pPicture->pDrawable,
160605b261ecSmrg			      0, 0, width, height, ZPixmap,
160705b261ecSmrg			      0xffffffff, (pointer) argbbits);
160805b261ecSmrg	FreePicture (pPicture, 0);
160905b261ecSmrg    }
161005b261ecSmrg    /*
161105b261ecSmrg     * Check whether the cursor can be directly supported by
161205b261ecSmrg     * the core cursor code
161305b261ecSmrg     */
161405b261ecSmrg    ncolor = 0;
161505b261ecSmrg    argb = argbbits;
161605b261ecSmrg    for (y = 0; ncolor <= 2 && y < height; y++)
161705b261ecSmrg    {
161805b261ecSmrg	for (x = 0; ncolor <= 2 && x < width; x++)
161905b261ecSmrg	{
162005b261ecSmrg	    CARD32  p = *argb++;
162105b261ecSmrg	    CARD32  a = (p >> 24);
162205b261ecSmrg
162305b261ecSmrg	    if (a == 0)	    /* transparent */
162405b261ecSmrg		continue;
162505b261ecSmrg	    if (a == 0xff)  /* opaque */
162605b261ecSmrg	    {
162705b261ecSmrg		int n;
162805b261ecSmrg		for (n = 0; n < ncolor; n++)
162905b261ecSmrg		    if (p == twocolor[n])
163005b261ecSmrg			break;
163105b261ecSmrg		if (n == ncolor)
163205b261ecSmrg		    twocolor[ncolor++] = p;
163305b261ecSmrg	    }
163405b261ecSmrg	    else
163505b261ecSmrg		ncolor = 3;
163605b261ecSmrg	}
163705b261ecSmrg    }
163805b261ecSmrg
163905b261ecSmrg    /*
164005b261ecSmrg     * Convert argb image to two plane cursor
164105b261ecSmrg     */
164205b261ecSmrg    srcline = srcbits;
164305b261ecSmrg    mskline = mskbits;
164405b261ecSmrg    argb = argbbits;
164505b261ecSmrg    for (y = 0; y < height; y++)
164605b261ecSmrg    {
164705b261ecSmrg	for (x = 0; x < width; x++)
164805b261ecSmrg	{
164905b261ecSmrg	    CARD32  p = *argb++;
165005b261ecSmrg
165105b261ecSmrg	    if (ncolor <= 2)
165205b261ecSmrg	    {
165305b261ecSmrg		CARD32	a = ((p >> 24));
165405b261ecSmrg
16556747b715Smrg		RenderSetBit (mskline, x, a != 0);
16566747b715Smrg		RenderSetBit (srcline, x, a != 0 && p == twocolor[0]);
165705b261ecSmrg	    }
165805b261ecSmrg	    else
165905b261ecSmrg	    {
166005b261ecSmrg		CARD32	a = ((p >> 24) * DITHER_SIZE + 127) / 255;
166105b261ecSmrg		CARD32	i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255;
166205b261ecSmrg		CARD32	d = orderedDither[y&(DITHER_DIM-1)][x&(DITHER_DIM-1)];
166305b261ecSmrg		/* Set mask from dithered alpha value */
16646747b715Smrg		RenderSetBit(mskline, x, a > d);
166505b261ecSmrg		/* Set src from dithered intensity value */
16666747b715Smrg		RenderSetBit(srcline, x, a > d && i <= d);
166705b261ecSmrg	    }
166805b261ecSmrg	}
166905b261ecSmrg	srcline += stride;
167005b261ecSmrg	mskline += stride;
167105b261ecSmrg    }
167205b261ecSmrg    /*
167305b261ecSmrg     * Dither to white and black if the cursor has more than two colors
167405b261ecSmrg     */
167505b261ecSmrg    if (ncolor > 2)
167605b261ecSmrg    {
167705b261ecSmrg	twocolor[0] = 0xff000000;
167805b261ecSmrg	twocolor[1] = 0xffffffff;
167905b261ecSmrg    }
168005b261ecSmrg    else
168105b261ecSmrg    {
16826747b715Smrg	free(argbbits);
168305b261ecSmrg	argbbits = 0;
168405b261ecSmrg    }
168505b261ecSmrg
168605b261ecSmrg#define GetByte(p,s)	(((p) >> (s)) & 0xff)
168705b261ecSmrg#define GetColor(p,s)	(GetByte(p,s) | (GetByte(p,s) << 8))
168805b261ecSmrg
168905b261ecSmrg    cm.width = width;
169005b261ecSmrg    cm.height = height;
169105b261ecSmrg    cm.xhot = stuff->x;
169205b261ecSmrg    cm.yhot = stuff->y;
16934642e01fSmrg    rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm,
16944642e01fSmrg			 GetColor(twocolor[0], 16),
16954642e01fSmrg			 GetColor(twocolor[0], 8),
16964642e01fSmrg			 GetColor(twocolor[0], 0),
16974642e01fSmrg			 GetColor(twocolor[1], 16),
16984642e01fSmrg			 GetColor(twocolor[1], 8),
16994642e01fSmrg			 GetColor(twocolor[1], 0),
17004642e01fSmrg			 &pCursor, client, stuff->cid);
17014642e01fSmrg    if (rc != Success)
17024642e01fSmrg	return rc;
17034642e01fSmrg    if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor))
17044642e01fSmrg	return BadAlloc;
17054642e01fSmrg
17066747b715Smrg    return Success;
170705b261ecSmrg}
170805b261ecSmrg
170905b261ecSmrgstatic int
171005b261ecSmrgProcRenderSetPictureTransform (ClientPtr client)
171105b261ecSmrg{
171205b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
171305b261ecSmrg    PicturePtr	pPicture;
171405b261ecSmrg
171505b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
17166747b715Smrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
17176747b715Smrg    return SetPictureTransform (pPicture, (PictTransform *) &stuff->transform);
171805b261ecSmrg}
171905b261ecSmrg
172005b261ecSmrgstatic int
172105b261ecSmrgProcRenderQueryFilters (ClientPtr client)
172205b261ecSmrg{
172305b261ecSmrg    REQUEST (xRenderQueryFiltersReq);
172405b261ecSmrg    DrawablePtr			pDrawable;
172505b261ecSmrg    xRenderQueryFiltersReply	*reply;
172605b261ecSmrg    int				nbytesName;
172705b261ecSmrg    int				nnames;
172805b261ecSmrg    ScreenPtr			pScreen;
172905b261ecSmrg    PictureScreenPtr		ps;
173005b261ecSmrg    int				i, j, len, total_bytes, rc;
173105b261ecSmrg    INT16			*aliases;
173205b261ecSmrg    char			*names;
173305b261ecSmrg
173405b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
173505b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
17364642e01fSmrg			   DixGetAttrAccess);
173705b261ecSmrg    if (rc != Success)
173805b261ecSmrg	return rc;
173905b261ecSmrg
174005b261ecSmrg    pScreen = pDrawable->pScreen;
174105b261ecSmrg    nbytesName = 0;
174205b261ecSmrg    nnames = 0;
174305b261ecSmrg    ps = GetPictureScreenIfSet(pScreen);
174405b261ecSmrg    if (ps)
174505b261ecSmrg    {
174605b261ecSmrg	for (i = 0; i < ps->nfilters; i++)
174705b261ecSmrg	    nbytesName += 1 + strlen (ps->filters[i].name);
174805b261ecSmrg	for (i = 0; i < ps->nfilterAliases; i++)
174905b261ecSmrg	    nbytesName += 1 + strlen (ps->filterAliases[i].alias);
175005b261ecSmrg	nnames = ps->nfilters + ps->nfilterAliases;
175105b261ecSmrg    }
17526747b715Smrg    len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName);
175305b261ecSmrg    total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2);
17546747b715Smrg    reply = (xRenderQueryFiltersReply *) malloc(total_bytes);
175505b261ecSmrg    if (!reply)
175605b261ecSmrg	return BadAlloc;
175705b261ecSmrg    aliases = (INT16 *) (reply + 1);
175805b261ecSmrg    names = (char *) (aliases + ((nnames + 1) & ~1));
175905b261ecSmrg
176005b261ecSmrg    reply->type = X_Reply;
176105b261ecSmrg    reply->sequenceNumber = client->sequence;
176205b261ecSmrg    reply->length = len;
176305b261ecSmrg    reply->numAliases = nnames;
176405b261ecSmrg    reply->numFilters = nnames;
176505b261ecSmrg    if (ps)
176605b261ecSmrg    {
176705b261ecSmrg
176805b261ecSmrg	/* fill in alias values */
176905b261ecSmrg	for (i = 0; i < ps->nfilters; i++)
177005b261ecSmrg	    aliases[i] = FilterAliasNone;
177105b261ecSmrg	for (i = 0; i < ps->nfilterAliases; i++)
177205b261ecSmrg	{
177305b261ecSmrg	    for (j = 0; j < ps->nfilters; j++)
177405b261ecSmrg		if (ps->filterAliases[i].filter_id == ps->filters[j].id)
177505b261ecSmrg		    break;
177605b261ecSmrg	    if (j == ps->nfilters)
177705b261ecSmrg	    {
177805b261ecSmrg		for (j = 0; j < ps->nfilterAliases; j++)
177905b261ecSmrg		    if (ps->filterAliases[i].filter_id ==
178005b261ecSmrg			ps->filterAliases[j].alias_id)
178105b261ecSmrg		    {
178205b261ecSmrg			break;
178305b261ecSmrg		    }
178405b261ecSmrg		if (j == ps->nfilterAliases)
178505b261ecSmrg		    j = FilterAliasNone;
178605b261ecSmrg		else
178705b261ecSmrg		    j = j + ps->nfilters;
178805b261ecSmrg	    }
178905b261ecSmrg	    aliases[i + ps->nfilters] = j;
179005b261ecSmrg	}
179105b261ecSmrg
179205b261ecSmrg	/* fill in filter names */
179305b261ecSmrg	for (i = 0; i < ps->nfilters; i++)
179405b261ecSmrg	{
179505b261ecSmrg	    j = strlen (ps->filters[i].name);
179605b261ecSmrg	    *names++ = j;
179705b261ecSmrg	    strncpy (names, ps->filters[i].name, j);
179805b261ecSmrg	    names += j;
179905b261ecSmrg	}
180005b261ecSmrg
180105b261ecSmrg	/* fill in filter alias names */
180205b261ecSmrg	for (i = 0; i < ps->nfilterAliases; i++)
180305b261ecSmrg	{
180405b261ecSmrg	    j = strlen (ps->filterAliases[i].alias);
180505b261ecSmrg	    *names++ = j;
180605b261ecSmrg	    strncpy (names, ps->filterAliases[i].alias, j);
180705b261ecSmrg	    names += j;
180805b261ecSmrg	}
180905b261ecSmrg    }
181005b261ecSmrg
181105b261ecSmrg    if (client->swapped)
181205b261ecSmrg    {
181305b261ecSmrg	register int n;
181405b261ecSmrg
181505b261ecSmrg	for (i = 0; i < reply->numAliases; i++)
181605b261ecSmrg	{
181705b261ecSmrg	    swaps (&aliases[i], n);
181805b261ecSmrg	}
181905b261ecSmrg    	swaps(&reply->sequenceNumber, n);
182005b261ecSmrg    	swapl(&reply->length, n);
182105b261ecSmrg	swapl(&reply->numAliases, n);
182205b261ecSmrg	swapl(&reply->numFilters, n);
182305b261ecSmrg    }
182405b261ecSmrg    WriteToClient(client, total_bytes, (char *) reply);
18256747b715Smrg    free(reply);
182605b261ecSmrg
18276747b715Smrg    return Success;
182805b261ecSmrg}
182905b261ecSmrg
183005b261ecSmrgstatic int
183105b261ecSmrgProcRenderSetPictureFilter (ClientPtr client)
183205b261ecSmrg{
183305b261ecSmrg    REQUEST (xRenderSetPictureFilterReq);
183405b261ecSmrg    PicturePtr	pPicture;
183505b261ecSmrg    int		result;
183605b261ecSmrg    xFixed	*params;
183705b261ecSmrg    int		nparams;
183805b261ecSmrg    char	*name;
183905b261ecSmrg
184005b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
18416747b715Smrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
184205b261ecSmrg    name = (char *) (stuff + 1);
18436747b715Smrg    params = (xFixed *) (name + pad_to_int32(stuff->nbytes));
184405b261ecSmrg    nparams = ((xFixed *) stuff + client->req_len) - params;
184505b261ecSmrg    result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams);
184605b261ecSmrg    return result;
184705b261ecSmrg}
184805b261ecSmrg
184905b261ecSmrgstatic int
185005b261ecSmrgProcRenderCreateAnimCursor (ClientPtr client)
185105b261ecSmrg{
185205b261ecSmrg    REQUEST(xRenderCreateAnimCursorReq);
185305b261ecSmrg    CursorPtr	    *cursors;
185405b261ecSmrg    CARD32	    *deltas;
185505b261ecSmrg    CursorPtr	    pCursor;
185605b261ecSmrg    int		    ncursor;
185705b261ecSmrg    xAnimCursorElt  *elt;
185805b261ecSmrg    int		    i;
185905b261ecSmrg    int		    ret;
186005b261ecSmrg
186105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
186205b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
186305b261ecSmrg    if (client->req_len & 1)
186405b261ecSmrg	return BadLength;
18656747b715Smrg    ncursor = (client->req_len - (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1;
18666747b715Smrg    cursors = malloc(ncursor * (sizeof (CursorPtr) + sizeof (CARD32)));
186705b261ecSmrg    if (!cursors)
186805b261ecSmrg	return BadAlloc;
186905b261ecSmrg    deltas = (CARD32 *) (cursors + ncursor);
187005b261ecSmrg    elt = (xAnimCursorElt *) (stuff + 1);
187105b261ecSmrg    for (i = 0; i < ncursor; i++)
187205b261ecSmrg    {
18736747b715Smrg	ret = dixLookupResourceByType((pointer *)(cursors + i), elt->cursor,
18746747b715Smrg				      RT_CURSOR, client, DixReadAccess);
18756747b715Smrg	if (ret != Success)
187605b261ecSmrg	{
18776747b715Smrg	    free(cursors);
18786747b715Smrg	    return ret;
187905b261ecSmrg	}
188005b261ecSmrg	deltas[i] = elt->delay;
188105b261ecSmrg	elt++;
188205b261ecSmrg    }
18834642e01fSmrg    ret = AnimCursorCreate (cursors, deltas, ncursor, &pCursor, client,
18844642e01fSmrg			    stuff->cid);
18856747b715Smrg    free(cursors);
188605b261ecSmrg    if (ret != Success)
188705b261ecSmrg	return ret;
188805b261ecSmrg
188905b261ecSmrg    if (AddResource (stuff->cid, RT_CURSOR, (pointer)pCursor))
18906747b715Smrg	return Success;
189105b261ecSmrg    return BadAlloc;
189205b261ecSmrg}
189305b261ecSmrg
189405b261ecSmrgstatic int
189505b261ecSmrgProcRenderAddTraps (ClientPtr client)
189605b261ecSmrg{
189705b261ecSmrg    int		ntraps;
189805b261ecSmrg    PicturePtr	pPicture;
189905b261ecSmrg    REQUEST(xRenderAddTrapsReq);
190005b261ecSmrg
190105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
19026747b715Smrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess);
190305b261ecSmrg    if (!pPicture->pDrawable)
190405b261ecSmrg        return BadDrawable;
190505b261ecSmrg    ntraps = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
190605b261ecSmrg    if (ntraps % sizeof (xTrap))
190705b261ecSmrg	return BadLength;
190805b261ecSmrg    ntraps /= sizeof (xTrap);
190905b261ecSmrg    if (ntraps)
191005b261ecSmrg	AddTraps (pPicture,
191105b261ecSmrg		  stuff->xOff, stuff->yOff,
191205b261ecSmrg		  ntraps, (xTrap *) &stuff[1]);
19136747b715Smrg    return Success;
191405b261ecSmrg}
191505b261ecSmrg
191605b261ecSmrgstatic int ProcRenderCreateSolidFill(ClientPtr client)
191705b261ecSmrg{
191805b261ecSmrg    PicturePtr	    pPicture;
191905b261ecSmrg    int		    error = 0;
192005b261ecSmrg    REQUEST(xRenderCreateSolidFillReq);
192105b261ecSmrg
192205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
192305b261ecSmrg
192405b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
192505b261ecSmrg
192605b261ecSmrg    pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error);
192705b261ecSmrg    if (!pPicture)
192805b261ecSmrg	return error;
19294642e01fSmrg    /* security creation/labeling check */
19304642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
19314642e01fSmrg		     pPicture, RT_NONE, NULL, DixCreateAccess);
19324642e01fSmrg    if (error != Success)
19334642e01fSmrg	return error;
193405b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
193505b261ecSmrg	return BadAlloc;
193605b261ecSmrg    return Success;
193705b261ecSmrg}
193805b261ecSmrg
193905b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr client)
194005b261ecSmrg{
194105b261ecSmrg    PicturePtr	    pPicture;
194205b261ecSmrg    int		    len;
194305b261ecSmrg    int		    error = 0;
194405b261ecSmrg    xFixed          *stops;
194505b261ecSmrg    xRenderColor   *colors;
194605b261ecSmrg    REQUEST(xRenderCreateLinearGradientReq);
194705b261ecSmrg
194805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
194905b261ecSmrg
195005b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
195105b261ecSmrg
195205b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
195305b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
195405b261ecSmrg	return BadLength;
195505b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
195605b261ecSmrg        return BadLength;
195705b261ecSmrg
195805b261ecSmrg    stops = (xFixed *)(stuff + 1);
195905b261ecSmrg    colors = (xRenderColor *)(stops + stuff->nStops);
196005b261ecSmrg
196105b261ecSmrg    pPicture = CreateLinearGradientPicture (stuff->pid, &stuff->p1, &stuff->p2,
196205b261ecSmrg                                            stuff->nStops, stops, colors, &error);
196305b261ecSmrg    if (!pPicture)
196405b261ecSmrg	return error;
19654642e01fSmrg    /* security creation/labeling check */
19664642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
19674642e01fSmrg		     pPicture, RT_NONE, NULL, DixCreateAccess);
19684642e01fSmrg    if (error != Success)
19694642e01fSmrg	return error;
197005b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
197105b261ecSmrg	return BadAlloc;
197205b261ecSmrg    return Success;
197305b261ecSmrg}
197405b261ecSmrg
197505b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr client)
197605b261ecSmrg{
197705b261ecSmrg    PicturePtr	    pPicture;
197805b261ecSmrg    int		    len;
197905b261ecSmrg    int		    error = 0;
198005b261ecSmrg    xFixed          *stops;
198105b261ecSmrg    xRenderColor   *colors;
198205b261ecSmrg    REQUEST(xRenderCreateRadialGradientReq);
198305b261ecSmrg
198405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
198505b261ecSmrg
198605b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
198705b261ecSmrg
198805b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
198905b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
199005b261ecSmrg        return BadLength;
199105b261ecSmrg
199205b261ecSmrg    stops = (xFixed *)(stuff + 1);
199305b261ecSmrg    colors = (xRenderColor *)(stops + stuff->nStops);
199405b261ecSmrg
199505b261ecSmrg    pPicture = CreateRadialGradientPicture (stuff->pid, &stuff->inner, &stuff->outer,
199605b261ecSmrg                                            stuff->inner_radius, stuff->outer_radius,
199705b261ecSmrg                                            stuff->nStops, stops, colors, &error);
199805b261ecSmrg    if (!pPicture)
199905b261ecSmrg	return error;
20004642e01fSmrg    /* security creation/labeling check */
20014642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
20024642e01fSmrg		     pPicture, RT_NONE, NULL, DixCreateAccess);
20034642e01fSmrg    if (error != Success)
20044642e01fSmrg	return error;
200505b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
200605b261ecSmrg	return BadAlloc;
200705b261ecSmrg    return Success;
200805b261ecSmrg}
200905b261ecSmrg
201005b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr client)
201105b261ecSmrg{
201205b261ecSmrg    PicturePtr	    pPicture;
201305b261ecSmrg    int		    len;
201405b261ecSmrg    int		    error = 0;
201505b261ecSmrg    xFixed          *stops;
201605b261ecSmrg    xRenderColor   *colors;
201705b261ecSmrg    REQUEST(xRenderCreateConicalGradientReq);
201805b261ecSmrg
201905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
202005b261ecSmrg
202105b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
202205b261ecSmrg
202305b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
202405b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
202505b261ecSmrg        return BadLength;
202605b261ecSmrg
202705b261ecSmrg    stops = (xFixed *)(stuff + 1);
202805b261ecSmrg    colors = (xRenderColor *)(stops + stuff->nStops);
202905b261ecSmrg
203005b261ecSmrg    pPicture = CreateConicalGradientPicture (stuff->pid, &stuff->center, stuff->angle,
203105b261ecSmrg                                             stuff->nStops, stops, colors, &error);
203205b261ecSmrg    if (!pPicture)
203305b261ecSmrg	return error;
20344642e01fSmrg    /* security creation/labeling check */
20354642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
20364642e01fSmrg		     pPicture, RT_NONE, NULL, DixCreateAccess);
20374642e01fSmrg    if (error != Success)
20384642e01fSmrg	return error;
203905b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
204005b261ecSmrg	return BadAlloc;
204105b261ecSmrg    return Success;
204205b261ecSmrg}
204305b261ecSmrg
204405b261ecSmrg
204505b261ecSmrgstatic int
204605b261ecSmrgProcRenderDispatch (ClientPtr client)
204705b261ecSmrg{
204805b261ecSmrg    REQUEST(xReq);
204905b261ecSmrg
205005b261ecSmrg    if (stuff->data < RenderNumberRequests)
205105b261ecSmrg	return (*ProcRenderVector[stuff->data]) (client);
205205b261ecSmrg    else
205305b261ecSmrg	return BadRequest;
205405b261ecSmrg}
205505b261ecSmrg
205605b261ecSmrgstatic int
205705b261ecSmrgSProcRenderQueryVersion (ClientPtr client)
205805b261ecSmrg{
205905b261ecSmrg    register int n;
206005b261ecSmrg    REQUEST(xRenderQueryVersionReq);
206105b261ecSmrg
206205b261ecSmrg    swaps(&stuff->length, n);
206305b261ecSmrg    swapl(&stuff->majorVersion, n);
206405b261ecSmrg    swapl(&stuff->minorVersion, n);
206505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType])(client);
206605b261ecSmrg}
206705b261ecSmrg
206805b261ecSmrgstatic int
206905b261ecSmrgSProcRenderQueryPictFormats (ClientPtr client)
207005b261ecSmrg{
207105b261ecSmrg    register int n;
207205b261ecSmrg    REQUEST(xRenderQueryPictFormatsReq);
207305b261ecSmrg    swaps(&stuff->length, n);
207405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
207505b261ecSmrg}
207605b261ecSmrg
207705b261ecSmrgstatic int
207805b261ecSmrgSProcRenderQueryPictIndexValues (ClientPtr client)
207905b261ecSmrg{
208005b261ecSmrg    register int n;
208105b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
208205b261ecSmrg    swaps(&stuff->length, n);
208305b261ecSmrg    swapl(&stuff->format, n);
208405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
208505b261ecSmrg}
208605b261ecSmrg
208705b261ecSmrgstatic int
208805b261ecSmrgSProcRenderQueryDithers (ClientPtr client)
208905b261ecSmrg{
209005b261ecSmrg    return BadImplementation;
209105b261ecSmrg}
209205b261ecSmrg
209305b261ecSmrgstatic int
209405b261ecSmrgSProcRenderCreatePicture (ClientPtr client)
209505b261ecSmrg{
209605b261ecSmrg    register int n;
209705b261ecSmrg    REQUEST(xRenderCreatePictureReq);
209805b261ecSmrg    swaps(&stuff->length, n);
209905b261ecSmrg    swapl(&stuff->pid, n);
210005b261ecSmrg    swapl(&stuff->drawable, n);
210105b261ecSmrg    swapl(&stuff->format, n);
210205b261ecSmrg    swapl(&stuff->mask, n);
210305b261ecSmrg    SwapRestL(stuff);
210405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
210505b261ecSmrg}
210605b261ecSmrg
210705b261ecSmrgstatic int
210805b261ecSmrgSProcRenderChangePicture (ClientPtr client)
210905b261ecSmrg{
211005b261ecSmrg    register int n;
211105b261ecSmrg    REQUEST(xRenderChangePictureReq);
211205b261ecSmrg    swaps(&stuff->length, n);
211305b261ecSmrg    swapl(&stuff->picture, n);
211405b261ecSmrg    swapl(&stuff->mask, n);
211505b261ecSmrg    SwapRestL(stuff);
211605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
211705b261ecSmrg}
211805b261ecSmrg
211905b261ecSmrgstatic int
212005b261ecSmrgSProcRenderSetPictureClipRectangles (ClientPtr client)
212105b261ecSmrg{
212205b261ecSmrg    register int n;
212305b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
212405b261ecSmrg    swaps(&stuff->length, n);
212505b261ecSmrg    swapl(&stuff->picture, n);
212605b261ecSmrg    swaps(&stuff->xOrigin, n);
212705b261ecSmrg    swaps(&stuff->yOrigin, n);
212805b261ecSmrg    SwapRestS(stuff);
212905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
213005b261ecSmrg}
213105b261ecSmrg
213205b261ecSmrgstatic int
213305b261ecSmrgSProcRenderFreePicture (ClientPtr client)
213405b261ecSmrg{
213505b261ecSmrg    register int n;
213605b261ecSmrg    REQUEST(xRenderFreePictureReq);
213705b261ecSmrg    swaps(&stuff->length, n);
213805b261ecSmrg    swapl(&stuff->picture, n);
213905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
214005b261ecSmrg}
214105b261ecSmrg
214205b261ecSmrgstatic int
214305b261ecSmrgSProcRenderComposite (ClientPtr client)
214405b261ecSmrg{
214505b261ecSmrg    register int n;
214605b261ecSmrg    REQUEST(xRenderCompositeReq);
214705b261ecSmrg    swaps(&stuff->length, n);
214805b261ecSmrg    swapl(&stuff->src, n);
214905b261ecSmrg    swapl(&stuff->mask, n);
215005b261ecSmrg    swapl(&stuff->dst, n);
215105b261ecSmrg    swaps(&stuff->xSrc, n);
215205b261ecSmrg    swaps(&stuff->ySrc, n);
215305b261ecSmrg    swaps(&stuff->xMask, n);
215405b261ecSmrg    swaps(&stuff->yMask, n);
215505b261ecSmrg    swaps(&stuff->xDst, n);
215605b261ecSmrg    swaps(&stuff->yDst, n);
215705b261ecSmrg    swaps(&stuff->width, n);
215805b261ecSmrg    swaps(&stuff->height, n);
215905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
216005b261ecSmrg}
216105b261ecSmrg
216205b261ecSmrgstatic int
216305b261ecSmrgSProcRenderScale (ClientPtr client)
216405b261ecSmrg{
216505b261ecSmrg    register int n;
216605b261ecSmrg    REQUEST(xRenderScaleReq);
216705b261ecSmrg    swaps(&stuff->length, n);
216805b261ecSmrg    swapl(&stuff->src, n);
216905b261ecSmrg    swapl(&stuff->dst, n);
217005b261ecSmrg    swapl(&stuff->colorScale, n);
217105b261ecSmrg    swapl(&stuff->alphaScale, n);
217205b261ecSmrg    swaps(&stuff->xSrc, n);
217305b261ecSmrg    swaps(&stuff->ySrc, n);
217405b261ecSmrg    swaps(&stuff->xDst, n);
217505b261ecSmrg    swaps(&stuff->yDst, n);
217605b261ecSmrg    swaps(&stuff->width, n);
217705b261ecSmrg    swaps(&stuff->height, n);
217805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
217905b261ecSmrg}
218005b261ecSmrg
218105b261ecSmrgstatic int
218205b261ecSmrgSProcRenderTrapezoids (ClientPtr client)
218305b261ecSmrg{
218405b261ecSmrg    register int n;
218505b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
218605b261ecSmrg
218705b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
218805b261ecSmrg    swaps (&stuff->length, n);
218905b261ecSmrg    swapl (&stuff->src, n);
219005b261ecSmrg    swapl (&stuff->dst, n);
219105b261ecSmrg    swapl (&stuff->maskFormat, n);
219205b261ecSmrg    swaps (&stuff->xSrc, n);
219305b261ecSmrg    swaps (&stuff->ySrc, n);
219405b261ecSmrg    SwapRestL(stuff);
219505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
219605b261ecSmrg}
219705b261ecSmrg
219805b261ecSmrgstatic int
219905b261ecSmrgSProcRenderTriangles (ClientPtr client)
220005b261ecSmrg{
220105b261ecSmrg    register int n;
220205b261ecSmrg    REQUEST(xRenderTrianglesReq);
220305b261ecSmrg
220405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
220505b261ecSmrg    swaps (&stuff->length, n);
220605b261ecSmrg    swapl (&stuff->src, n);
220705b261ecSmrg    swapl (&stuff->dst, n);
220805b261ecSmrg    swapl (&stuff->maskFormat, n);
220905b261ecSmrg    swaps (&stuff->xSrc, n);
221005b261ecSmrg    swaps (&stuff->ySrc, n);
221105b261ecSmrg    SwapRestL(stuff);
221205b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
221305b261ecSmrg}
221405b261ecSmrg
221505b261ecSmrgstatic int
221605b261ecSmrgSProcRenderTriStrip (ClientPtr client)
221705b261ecSmrg{
221805b261ecSmrg    register int n;
221905b261ecSmrg    REQUEST(xRenderTriStripReq);
222005b261ecSmrg
222105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
222205b261ecSmrg    swaps (&stuff->length, n);
222305b261ecSmrg    swapl (&stuff->src, n);
222405b261ecSmrg    swapl (&stuff->dst, n);
222505b261ecSmrg    swapl (&stuff->maskFormat, n);
222605b261ecSmrg    swaps (&stuff->xSrc, n);
222705b261ecSmrg    swaps (&stuff->ySrc, n);
222805b261ecSmrg    SwapRestL(stuff);
222905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
223005b261ecSmrg}
223105b261ecSmrg
223205b261ecSmrgstatic int
223305b261ecSmrgSProcRenderTriFan (ClientPtr client)
223405b261ecSmrg{
223505b261ecSmrg    register int n;
223605b261ecSmrg    REQUEST(xRenderTriFanReq);
223705b261ecSmrg
223805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
223905b261ecSmrg    swaps (&stuff->length, n);
224005b261ecSmrg    swapl (&stuff->src, n);
224105b261ecSmrg    swapl (&stuff->dst, n);
224205b261ecSmrg    swapl (&stuff->maskFormat, n);
224305b261ecSmrg    swaps (&stuff->xSrc, n);
224405b261ecSmrg    swaps (&stuff->ySrc, n);
224505b261ecSmrg    SwapRestL(stuff);
224605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
224705b261ecSmrg}
224805b261ecSmrg
224905b261ecSmrgstatic int
225005b261ecSmrgSProcRenderColorTrapezoids (ClientPtr client)
225105b261ecSmrg{
225205b261ecSmrg    return BadImplementation;
225305b261ecSmrg}
225405b261ecSmrg
225505b261ecSmrgstatic int
225605b261ecSmrgSProcRenderColorTriangles (ClientPtr client)
225705b261ecSmrg{
225805b261ecSmrg    return BadImplementation;
225905b261ecSmrg}
226005b261ecSmrg
226105b261ecSmrgstatic int
226205b261ecSmrgSProcRenderTransform (ClientPtr client)
226305b261ecSmrg{
226405b261ecSmrg    return BadImplementation;
226505b261ecSmrg}
226605b261ecSmrg
226705b261ecSmrgstatic int
226805b261ecSmrgSProcRenderCreateGlyphSet (ClientPtr client)
226905b261ecSmrg{
227005b261ecSmrg    register int n;
227105b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
227205b261ecSmrg    swaps(&stuff->length, n);
227305b261ecSmrg    swapl(&stuff->gsid, n);
227405b261ecSmrg    swapl(&stuff->format, n);
227505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
227605b261ecSmrg}
227705b261ecSmrg
227805b261ecSmrgstatic int
227905b261ecSmrgSProcRenderReferenceGlyphSet (ClientPtr client)
228005b261ecSmrg{
228105b261ecSmrg    register int n;
228205b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
228305b261ecSmrg    swaps(&stuff->length, n);
228405b261ecSmrg    swapl(&stuff->gsid, n);
228505b261ecSmrg    swapl(&stuff->existing, n);
228605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType])  (client);
228705b261ecSmrg}
228805b261ecSmrg
228905b261ecSmrgstatic int
229005b261ecSmrgSProcRenderFreeGlyphSet (ClientPtr client)
229105b261ecSmrg{
229205b261ecSmrg    register int n;
229305b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
229405b261ecSmrg    swaps(&stuff->length, n);
229505b261ecSmrg    swapl(&stuff->glyphset, n);
229605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
229705b261ecSmrg}
229805b261ecSmrg
229905b261ecSmrgstatic int
230005b261ecSmrgSProcRenderAddGlyphs (ClientPtr client)
230105b261ecSmrg{
230205b261ecSmrg    register int n;
230305b261ecSmrg    register int i;
230405b261ecSmrg    CARD32  *gids;
230505b261ecSmrg    void    *end;
230605b261ecSmrg    xGlyphInfo *gi;
230705b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
230805b261ecSmrg    swaps(&stuff->length, n);
230905b261ecSmrg    swapl(&stuff->glyphset, n);
231005b261ecSmrg    swapl(&stuff->nglyphs, n);
231105b261ecSmrg    if (stuff->nglyphs & 0xe0000000)
231205b261ecSmrg	return BadLength;
231305b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
231405b261ecSmrg    gids = (CARD32 *) (stuff + 1);
231505b261ecSmrg    gi = (xGlyphInfo *) (gids + stuff->nglyphs);
231605b261ecSmrg    if ((char *) end - (char *) (gids + stuff->nglyphs) < 0)
231705b261ecSmrg	return BadLength;
231805b261ecSmrg    if ((char *) end - (char *) (gi + stuff->nglyphs) < 0)
231905b261ecSmrg	return BadLength;
232005b261ecSmrg    for (i = 0; i < stuff->nglyphs; i++)
232105b261ecSmrg    {
232205b261ecSmrg	swapl (&gids[i], n);
232305b261ecSmrg	swaps (&gi[i].width, n);
232405b261ecSmrg	swaps (&gi[i].height, n);
232505b261ecSmrg	swaps (&gi[i].x, n);
232605b261ecSmrg	swaps (&gi[i].y, n);
232705b261ecSmrg	swaps (&gi[i].xOff, n);
232805b261ecSmrg	swaps (&gi[i].yOff, n);
232905b261ecSmrg    }
233005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
233105b261ecSmrg}
233205b261ecSmrg
233305b261ecSmrgstatic int
233405b261ecSmrgSProcRenderAddGlyphsFromPicture (ClientPtr client)
233505b261ecSmrg{
233605b261ecSmrg    return BadImplementation;
233705b261ecSmrg}
233805b261ecSmrg
233905b261ecSmrgstatic int
234005b261ecSmrgSProcRenderFreeGlyphs (ClientPtr client)
234105b261ecSmrg{
234205b261ecSmrg    register int n;
234305b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
234405b261ecSmrg    swaps(&stuff->length, n);
234505b261ecSmrg    swapl(&stuff->glyphset, n);
234605b261ecSmrg    SwapRestL(stuff);
234705b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
234805b261ecSmrg}
234905b261ecSmrg
235005b261ecSmrgstatic int
235105b261ecSmrgSProcRenderCompositeGlyphs (ClientPtr client)
235205b261ecSmrg{
235305b261ecSmrg    register int n;
235405b261ecSmrg    xGlyphElt	*elt;
235505b261ecSmrg    CARD8	*buffer;
235605b261ecSmrg    CARD8	*end;
235705b261ecSmrg    int		space;
235805b261ecSmrg    int		i;
235905b261ecSmrg    int		size;
236005b261ecSmrg
236105b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
236205b261ecSmrg
236305b261ecSmrg    switch (stuff->renderReqType) {
236405b261ecSmrg    default:			    size = 1; break;
236505b261ecSmrg    case X_RenderCompositeGlyphs16: size = 2; break;
236605b261ecSmrg    case X_RenderCompositeGlyphs32: size = 4; break;
236705b261ecSmrg    }
236805b261ecSmrg
236905b261ecSmrg    swaps(&stuff->length, n);
237005b261ecSmrg    swapl(&stuff->src, n);
237105b261ecSmrg    swapl(&stuff->dst, n);
237205b261ecSmrg    swapl(&stuff->maskFormat, n);
237305b261ecSmrg    swapl(&stuff->glyphset, n);
237405b261ecSmrg    swaps(&stuff->xSrc, n);
237505b261ecSmrg    swaps(&stuff->ySrc, n);
237605b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
237705b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
237805b261ecSmrg    while (buffer + sizeof (xGlyphElt) < end)
237905b261ecSmrg    {
238005b261ecSmrg	elt = (xGlyphElt *) buffer;
238105b261ecSmrg	buffer += sizeof (xGlyphElt);
238205b261ecSmrg
238305b261ecSmrg	swaps (&elt->deltax, n);
238405b261ecSmrg	swaps (&elt->deltay, n);
238505b261ecSmrg
238605b261ecSmrg	i = elt->len;
238705b261ecSmrg	if (i == 0xff)
238805b261ecSmrg	{
238905b261ecSmrg	    swapl (buffer, n);
239005b261ecSmrg	    buffer += 4;
239105b261ecSmrg	}
239205b261ecSmrg	else
239305b261ecSmrg	{
239405b261ecSmrg	    space = size * i;
239505b261ecSmrg	    switch (size) {
239605b261ecSmrg	    case 1:
239705b261ecSmrg		buffer += i;
239805b261ecSmrg		break;
239905b261ecSmrg	    case 2:
240005b261ecSmrg		while (i--)
240105b261ecSmrg		{
240205b261ecSmrg		    swaps (buffer, n);
240305b261ecSmrg		    buffer += 2;
240405b261ecSmrg		}
240505b261ecSmrg		break;
240605b261ecSmrg	    case 4:
240705b261ecSmrg		while (i--)
240805b261ecSmrg		{
240905b261ecSmrg		    swapl (buffer, n);
241005b261ecSmrg		    buffer += 4;
241105b261ecSmrg		}
241205b261ecSmrg		break;
241305b261ecSmrg	    }
241405b261ecSmrg	    if (space & 3)
241505b261ecSmrg		buffer += 4 - (space & 3);
241605b261ecSmrg	}
241705b261ecSmrg    }
241805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
241905b261ecSmrg}
242005b261ecSmrg
242105b261ecSmrgstatic int
242205b261ecSmrgSProcRenderFillRectangles (ClientPtr client)
242305b261ecSmrg{
242405b261ecSmrg    register int n;
242505b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
242605b261ecSmrg
242705b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
242805b261ecSmrg    swaps(&stuff->length, n);
242905b261ecSmrg    swapl(&stuff->dst, n);
243005b261ecSmrg    swaps(&stuff->color.red, n);
243105b261ecSmrg    swaps(&stuff->color.green, n);
243205b261ecSmrg    swaps(&stuff->color.blue, n);
243305b261ecSmrg    swaps(&stuff->color.alpha, n);
243405b261ecSmrg    SwapRestS(stuff);
243505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
243605b261ecSmrg}
243705b261ecSmrg
243805b261ecSmrgstatic int
243905b261ecSmrgSProcRenderCreateCursor (ClientPtr client)
244005b261ecSmrg{
244105b261ecSmrg    register int n;
244205b261ecSmrg    REQUEST(xRenderCreateCursorReq);
244305b261ecSmrg    REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
244405b261ecSmrg
244505b261ecSmrg    swaps(&stuff->length, n);
244605b261ecSmrg    swapl(&stuff->cid, n);
244705b261ecSmrg    swapl(&stuff->src, n);
244805b261ecSmrg    swaps(&stuff->x, n);
244905b261ecSmrg    swaps(&stuff->y, n);
245005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
245105b261ecSmrg}
245205b261ecSmrg
245305b261ecSmrgstatic int
245405b261ecSmrgSProcRenderSetPictureTransform (ClientPtr client)
245505b261ecSmrg{
245605b261ecSmrg    register int n;
245705b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
245805b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
245905b261ecSmrg
246005b261ecSmrg    swaps(&stuff->length, n);
246105b261ecSmrg    swapl(&stuff->picture, n);
246205b261ecSmrg    swapl(&stuff->transform.matrix11, n);
246305b261ecSmrg    swapl(&stuff->transform.matrix12, n);
246405b261ecSmrg    swapl(&stuff->transform.matrix13, n);
246505b261ecSmrg    swapl(&stuff->transform.matrix21, n);
246605b261ecSmrg    swapl(&stuff->transform.matrix22, n);
246705b261ecSmrg    swapl(&stuff->transform.matrix23, n);
246805b261ecSmrg    swapl(&stuff->transform.matrix31, n);
246905b261ecSmrg    swapl(&stuff->transform.matrix32, n);
247005b261ecSmrg    swapl(&stuff->transform.matrix33, n);
247105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
247205b261ecSmrg}
247305b261ecSmrg
247405b261ecSmrgstatic int
247505b261ecSmrgSProcRenderQueryFilters (ClientPtr client)
247605b261ecSmrg{
247705b261ecSmrg    register int n;
247805b261ecSmrg    REQUEST (xRenderQueryFiltersReq);
247905b261ecSmrg    REQUEST_SIZE_MATCH (xRenderQueryFiltersReq);
248005b261ecSmrg
248105b261ecSmrg    swaps(&stuff->length, n);
248205b261ecSmrg    swapl(&stuff->drawable, n);
248305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
248405b261ecSmrg}
248505b261ecSmrg
248605b261ecSmrgstatic int
248705b261ecSmrgSProcRenderSetPictureFilter (ClientPtr client)
248805b261ecSmrg{
248905b261ecSmrg    register int n;
249005b261ecSmrg    REQUEST (xRenderSetPictureFilterReq);
249105b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
249205b261ecSmrg
249305b261ecSmrg    swaps(&stuff->length, n);
249405b261ecSmrg    swapl(&stuff->picture, n);
249505b261ecSmrg    swaps(&stuff->nbytes, n);
249605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
249705b261ecSmrg}
249805b261ecSmrg
249905b261ecSmrgstatic int
250005b261ecSmrgSProcRenderCreateAnimCursor (ClientPtr client)
250105b261ecSmrg{
250205b261ecSmrg    register int n;
250305b261ecSmrg    REQUEST (xRenderCreateAnimCursorReq);
250405b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateAnimCursorReq);
250505b261ecSmrg
250605b261ecSmrg    swaps(&stuff->length, n);
250705b261ecSmrg    swapl(&stuff->cid, n);
250805b261ecSmrg    SwapRestL(stuff);
250905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
251005b261ecSmrg}
251105b261ecSmrg
251205b261ecSmrgstatic int
251305b261ecSmrgSProcRenderAddTraps (ClientPtr client)
251405b261ecSmrg{
251505b261ecSmrg    register int n;
251605b261ecSmrg    REQUEST (xRenderAddTrapsReq);
251705b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
251805b261ecSmrg
251905b261ecSmrg    swaps(&stuff->length, n);
252005b261ecSmrg    swapl(&stuff->picture, n);
252105b261ecSmrg    swaps(&stuff->xOff, n);
252205b261ecSmrg    swaps(&stuff->yOff, n);
252305b261ecSmrg    SwapRestL(stuff);
252405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
252505b261ecSmrg}
252605b261ecSmrg
252705b261ecSmrgstatic int
252805b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client)
252905b261ecSmrg{
253005b261ecSmrg    register int n;
253105b261ecSmrg    REQUEST (xRenderCreateSolidFillReq);
253205b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateSolidFillReq);
253305b261ecSmrg
253405b261ecSmrg    swaps(&stuff->length, n);
253505b261ecSmrg    swapl(&stuff->pid, n);
253605b261ecSmrg    swaps(&stuff->color.alpha, n);
253705b261ecSmrg    swaps(&stuff->color.red, n);
253805b261ecSmrg    swaps(&stuff->color.green, n);
253905b261ecSmrg    swaps(&stuff->color.blue, n);
254005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
254105b261ecSmrg}
254205b261ecSmrg
254305b261ecSmrgstatic void swapStops(void *stuff, int num)
254405b261ecSmrg{
254505b261ecSmrg    int i, n;
254605b261ecSmrg    CARD32 *stops;
254705b261ecSmrg    CARD16 *colors;
254805b261ecSmrg    stops = (CARD32 *)(stuff);
254905b261ecSmrg    for (i = 0; i < num; ++i) {
255005b261ecSmrg        swapl(stops, n);
255105b261ecSmrg        ++stops;
255205b261ecSmrg    }
255305b261ecSmrg    colors = (CARD16 *)(stops);
255405b261ecSmrg    for (i = 0; i < 4*num; ++i) {
25558223e2f2Smrg        swaps(colors, n);
25568223e2f2Smrg        ++colors;
255705b261ecSmrg    }
255805b261ecSmrg}
255905b261ecSmrg
256005b261ecSmrgstatic int
256105b261ecSmrgSProcRenderCreateLinearGradient (ClientPtr client)
256205b261ecSmrg{
256305b261ecSmrg    register int n;
256405b261ecSmrg    int len;
256505b261ecSmrg    REQUEST (xRenderCreateLinearGradientReq);
256605b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateLinearGradientReq);
256705b261ecSmrg
256805b261ecSmrg    swaps(&stuff->length, n);
256905b261ecSmrg    swapl(&stuff->pid, n);
257005b261ecSmrg    swapl(&stuff->p1.x, n);
257105b261ecSmrg    swapl(&stuff->p1.y, n);
257205b261ecSmrg    swapl(&stuff->p2.x, n);
257305b261ecSmrg    swapl(&stuff->p2.y, n);
257405b261ecSmrg    swapl(&stuff->nStops, n);
257505b261ecSmrg
257605b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
257705b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
257805b261ecSmrg	return BadLength;
257905b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
258005b261ecSmrg        return BadLength;
258105b261ecSmrg
258205b261ecSmrg    swapStops(stuff+1, stuff->nStops);
258305b261ecSmrg
258405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
258505b261ecSmrg}
258605b261ecSmrg
258705b261ecSmrgstatic int
258805b261ecSmrgSProcRenderCreateRadialGradient (ClientPtr client)
258905b261ecSmrg{
259005b261ecSmrg    register int n;
259105b261ecSmrg    int len;
259205b261ecSmrg    REQUEST (xRenderCreateRadialGradientReq);
259305b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateRadialGradientReq);
259405b261ecSmrg
259505b261ecSmrg    swaps(&stuff->length, n);
259605b261ecSmrg    swapl(&stuff->pid, n);
259705b261ecSmrg    swapl(&stuff->inner.x, n);
259805b261ecSmrg    swapl(&stuff->inner.y, n);
259905b261ecSmrg    swapl(&stuff->outer.x, n);
260005b261ecSmrg    swapl(&stuff->outer.y, n);
260105b261ecSmrg    swapl(&stuff->inner_radius, n);
260205b261ecSmrg    swapl(&stuff->outer_radius, n);
260305b261ecSmrg    swapl(&stuff->nStops, n);
260405b261ecSmrg
260505b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
260605b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
260705b261ecSmrg	return BadLength;
260805b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
260905b261ecSmrg        return BadLength;
261005b261ecSmrg
261105b261ecSmrg    swapStops(stuff+1, stuff->nStops);
261205b261ecSmrg
261305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
261405b261ecSmrg}
261505b261ecSmrg
261605b261ecSmrgstatic int
261705b261ecSmrgSProcRenderCreateConicalGradient (ClientPtr client)
261805b261ecSmrg{
261905b261ecSmrg    register int n;
262005b261ecSmrg    int len;
262105b261ecSmrg    REQUEST (xRenderCreateConicalGradientReq);
262205b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateConicalGradientReq);
262305b261ecSmrg
262405b261ecSmrg    swaps(&stuff->length, n);
262505b261ecSmrg    swapl(&stuff->pid, n);
262605b261ecSmrg    swapl(&stuff->center.x, n);
262705b261ecSmrg    swapl(&stuff->center.y, n);
262805b261ecSmrg    swapl(&stuff->angle, n);
262905b261ecSmrg    swapl(&stuff->nStops, n);
263005b261ecSmrg
263105b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
263205b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
263305b261ecSmrg	return BadLength;
263405b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
263505b261ecSmrg        return BadLength;
263605b261ecSmrg
263705b261ecSmrg    swapStops(stuff+1, stuff->nStops);
263805b261ecSmrg
263905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
264005b261ecSmrg}
264105b261ecSmrg
264205b261ecSmrgstatic int
264305b261ecSmrgSProcRenderDispatch (ClientPtr client)
264405b261ecSmrg{
264505b261ecSmrg    REQUEST(xReq);
264605b261ecSmrg
264705b261ecSmrg    if (stuff->data < RenderNumberRequests)
264805b261ecSmrg	return (*SProcRenderVector[stuff->data]) (client);
264905b261ecSmrg    else
265005b261ecSmrg	return BadRequest;
265105b261ecSmrg}
265205b261ecSmrg
265305b261ecSmrg#ifdef PANORAMIX
265405b261ecSmrg#include "panoramiX.h"
265505b261ecSmrg#include "panoramiXsrv.h"
265605b261ecSmrg
26576747b715Smrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\
26586747b715Smrg    int rc = dixLookupResourceByType((pointer *)&(pPicture), pid,\
26596747b715Smrg                                     XRT_PICTURE, client, mode);\
26606747b715Smrg    if (rc != Success)\
26616747b715Smrg	return rc;\
266205b261ecSmrg}
266305b261ecSmrg
26646747b715Smrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\
266505b261ecSmrg    if (pid == None) \
266605b261ecSmrg	pPicture = 0; \
266705b261ecSmrg    else { \
26686747b715Smrg	VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \
266905b261ecSmrg    } \
267005b261ecSmrg} \
267105b261ecSmrg
267205b261ecSmrgint	    (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr);
267305b261ecSmrg
267405b261ecSmrgstatic int
267505b261ecSmrgPanoramiXRenderCreatePicture (ClientPtr client)
267605b261ecSmrg{
267705b261ecSmrg    REQUEST(xRenderCreatePictureReq);
267805b261ecSmrg    PanoramiXRes    *refDraw, *newPict;
26796747b715Smrg    int		    result, j;
268005b261ecSmrg
268105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
26826747b715Smrg    result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
26836747b715Smrg				      XRC_DRAWABLE, client, DixWriteAccess);
26846747b715Smrg    if (result != Success)
26856747b715Smrg	return (result == BadValue) ? BadDrawable : result;
26866747b715Smrg    if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
268705b261ecSmrg	return BadAlloc;
268805b261ecSmrg    newPict->type = XRT_PICTURE;
268905b261ecSmrg    newPict->info[0].id = stuff->pid;
269005b261ecSmrg
269105b261ecSmrg    if (refDraw->type == XRT_WINDOW &&
26926747b715Smrg	stuff->drawable == screenInfo.screens[0]->root->drawable.id)
269305b261ecSmrg    {
269405b261ecSmrg	newPict->u.pict.root = TRUE;
269505b261ecSmrg    }
269605b261ecSmrg    else
269705b261ecSmrg	newPict->u.pict.root = FALSE;
269805b261ecSmrg
269905b261ecSmrg    for(j = 1; j < PanoramiXNumScreens; j++)
270005b261ecSmrg	newPict->info[j].id = FakeClientID(client->index);
270105b261ecSmrg
270205b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
270305b261ecSmrg	stuff->pid = newPict->info[j].id;
270405b261ecSmrg	stuff->drawable = refDraw->info[j].id;
270505b261ecSmrg	result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client);
270605b261ecSmrg	if(result != Success) break;
270705b261ecSmrg    }
270805b261ecSmrg
270905b261ecSmrg    if (result == Success)
271005b261ecSmrg	AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
271105b261ecSmrg    else
27126747b715Smrg	free(newPict);
271305b261ecSmrg
27146747b715Smrg    return result;
271505b261ecSmrg}
271605b261ecSmrg
271705b261ecSmrgstatic int
271805b261ecSmrgPanoramiXRenderChangePicture (ClientPtr client)
271905b261ecSmrg{
272005b261ecSmrg    PanoramiXRes    *pict;
272105b261ecSmrg    int		    result = Success, j;
272205b261ecSmrg    REQUEST(xRenderChangePictureReq);
272305b261ecSmrg
27246747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
272505b261ecSmrg
27266747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
272705b261ecSmrg
272805b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
272905b261ecSmrg        stuff->picture = pict->info[j].id;
273005b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client);
273105b261ecSmrg        if(result != Success) break;
273205b261ecSmrg    }
273305b261ecSmrg
27346747b715Smrg    return result;
273505b261ecSmrg}
273605b261ecSmrg
273705b261ecSmrgstatic int
273805b261ecSmrgPanoramiXRenderSetPictureClipRectangles (ClientPtr client)
273905b261ecSmrg{
274005b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
274105b261ecSmrg    int		    result = Success, j;
274205b261ecSmrg    PanoramiXRes    *pict;
274305b261ecSmrg
274405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
274505b261ecSmrg
27466747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
274705b261ecSmrg
274805b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
274905b261ecSmrg        stuff->picture = pict->info[j].id;
275005b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) (client);
275105b261ecSmrg        if(result != Success) break;
275205b261ecSmrg    }
275305b261ecSmrg
27546747b715Smrg    return result;
275505b261ecSmrg}
275605b261ecSmrg
275705b261ecSmrgstatic int
275805b261ecSmrgPanoramiXRenderSetPictureTransform (ClientPtr client)
275905b261ecSmrg{
276005b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
276105b261ecSmrg    int		    result = Success, j;
276205b261ecSmrg    PanoramiXRes    *pict;
276305b261ecSmrg
276405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
276505b261ecSmrg
27666747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
276705b261ecSmrg
276805b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
276905b261ecSmrg        stuff->picture = pict->info[j].id;
277005b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client);
277105b261ecSmrg        if(result != Success) break;
277205b261ecSmrg    }
277305b261ecSmrg
27746747b715Smrg    return result;
277505b261ecSmrg}
277605b261ecSmrg
277705b261ecSmrgstatic int
277805b261ecSmrgPanoramiXRenderSetPictureFilter (ClientPtr client)
277905b261ecSmrg{
278005b261ecSmrg    REQUEST(xRenderSetPictureFilterReq);
278105b261ecSmrg    int		    result = Success, j;
278205b261ecSmrg    PanoramiXRes    *pict;
278305b261ecSmrg
278405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
278505b261ecSmrg
27866747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
278705b261ecSmrg
278805b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
278905b261ecSmrg        stuff->picture = pict->info[j].id;
279005b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client);
279105b261ecSmrg        if(result != Success) break;
279205b261ecSmrg    }
279305b261ecSmrg
27946747b715Smrg    return result;
279505b261ecSmrg}
279605b261ecSmrg
279705b261ecSmrgstatic int
279805b261ecSmrgPanoramiXRenderFreePicture (ClientPtr client)
279905b261ecSmrg{
280005b261ecSmrg    PanoramiXRes *pict;
280105b261ecSmrg    int         result = Success, j;
280205b261ecSmrg    REQUEST(xRenderFreePictureReq);
280305b261ecSmrg
280405b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
280505b261ecSmrg
280605b261ecSmrg    client->errorValue = stuff->picture;
280705b261ecSmrg
28086747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess);
280905b261ecSmrg
281005b261ecSmrg
281105b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
281205b261ecSmrg	stuff->picture = pict->info[j].id;
281305b261ecSmrg	result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client);
281405b261ecSmrg	if(result != Success) break;
281505b261ecSmrg    }
281605b261ecSmrg
281705b261ecSmrg    /* Since ProcRenderFreePicture is using FreeResource, it will free
281805b261ecSmrg	our resource for us on the last pass through the loop above */
281905b261ecSmrg
28206747b715Smrg    return result;
282105b261ecSmrg}
282205b261ecSmrg
282305b261ecSmrgstatic int
282405b261ecSmrgPanoramiXRenderComposite (ClientPtr client)
282505b261ecSmrg{
282605b261ecSmrg    PanoramiXRes	*src, *msk, *dst;
282705b261ecSmrg    int			result = Success, j;
282805b261ecSmrg    xRenderCompositeReq	orig;
282905b261ecSmrg    REQUEST(xRenderCompositeReq);
283005b261ecSmrg
283105b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
283205b261ecSmrg
28336747b715Smrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
28346747b715Smrg    VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess);
28356747b715Smrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
283605b261ecSmrg
283705b261ecSmrg    orig = *stuff;
283805b261ecSmrg
283905b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
284005b261ecSmrg	stuff->src = src->info[j].id;
284105b261ecSmrg	if (src->u.pict.root)
284205b261ecSmrg	{
28436747b715Smrg	    stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x;
28446747b715Smrg	    stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y;
284505b261ecSmrg	}
284605b261ecSmrg	stuff->dst = dst->info[j].id;
284705b261ecSmrg	if (dst->u.pict.root)
284805b261ecSmrg	{
28496747b715Smrg	    stuff->xDst = orig.xDst - screenInfo.screens[j]->x;
28506747b715Smrg	    stuff->yDst = orig.yDst - screenInfo.screens[j]->y;
285105b261ecSmrg	}
285205b261ecSmrg	if (msk)
285305b261ecSmrg	{
285405b261ecSmrg	    stuff->mask = msk->info[j].id;
285505b261ecSmrg	    if (msk->u.pict.root)
285605b261ecSmrg	    {
28576747b715Smrg		stuff->xMask = orig.xMask - screenInfo.screens[j]->x;
28586747b715Smrg		stuff->yMask = orig.yMask - screenInfo.screens[j]->y;
285905b261ecSmrg	    }
286005b261ecSmrg	}
286105b261ecSmrg	result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client);
286205b261ecSmrg	if(result != Success) break;
286305b261ecSmrg    }
286405b261ecSmrg
286505b261ecSmrg    return result;
286605b261ecSmrg}
286705b261ecSmrg
286805b261ecSmrgstatic int
286905b261ecSmrgPanoramiXRenderCompositeGlyphs (ClientPtr client)
287005b261ecSmrg{
287105b261ecSmrg    PanoramiXRes    *src, *dst;
287205b261ecSmrg    int		    result = Success, j;
287305b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
287405b261ecSmrg    xGlyphElt	    origElt, *elt;
287505b261ecSmrg    INT16	    xSrc, ySrc;
287605b261ecSmrg
287705b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
28786747b715Smrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
28796747b715Smrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
288005b261ecSmrg
288105b261ecSmrg    if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) +
288205b261ecSmrg				 sizeof (xGlyphElt)))
288305b261ecSmrg    {
288405b261ecSmrg	elt = (xGlyphElt *) (stuff + 1);
288505b261ecSmrg	origElt = *elt;
288605b261ecSmrg	xSrc = stuff->xSrc;
288705b261ecSmrg	ySrc = stuff->ySrc;
288805b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
288905b261ecSmrg	    stuff->src = src->info[j].id;
289005b261ecSmrg	    if (src->u.pict.root)
289105b261ecSmrg	    {
28926747b715Smrg		stuff->xSrc = xSrc - screenInfo.screens[j]->x;
28936747b715Smrg		stuff->ySrc = ySrc - screenInfo.screens[j]->y;
289405b261ecSmrg	    }
289505b261ecSmrg	    stuff->dst = dst->info[j].id;
289605b261ecSmrg	    if (dst->u.pict.root)
289705b261ecSmrg	    {
28986747b715Smrg		elt->deltax = origElt.deltax - screenInfo.screens[j]->x;
28996747b715Smrg		elt->deltay = origElt.deltay - screenInfo.screens[j]->y;
290005b261ecSmrg	    }
290105b261ecSmrg	    result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client);
290205b261ecSmrg	    if(result != Success) break;
290305b261ecSmrg	}
290405b261ecSmrg    }
290505b261ecSmrg
290605b261ecSmrg    return result;
290705b261ecSmrg}
290805b261ecSmrg
290905b261ecSmrgstatic int
291005b261ecSmrgPanoramiXRenderFillRectangles (ClientPtr client)
291105b261ecSmrg{
291205b261ecSmrg    PanoramiXRes    *dst;
291305b261ecSmrg    int		    result = Success, j;
291405b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
291505b261ecSmrg    char	    *extra;
291605b261ecSmrg    int		    extra_len;
291705b261ecSmrg
291805b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
29196747b715Smrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
292005b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq);
292105b261ecSmrg    if (extra_len &&
29226747b715Smrg	(extra = (char *) malloc(extra_len)))
292305b261ecSmrg    {
292405b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
292505b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
292605b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
292705b261ecSmrg	    if (dst->u.pict.root)
292805b261ecSmrg	    {
29296747b715Smrg		int x_off = screenInfo.screens[j]->x;
29306747b715Smrg		int y_off = screenInfo.screens[j]->y;
293105b261ecSmrg
293205b261ecSmrg		if(x_off || y_off) {
293305b261ecSmrg		    xRectangle	*rects = (xRectangle *) (stuff + 1);
293405b261ecSmrg		    int		i = extra_len / sizeof (xRectangle);
293505b261ecSmrg
293605b261ecSmrg		    while (i--)
293705b261ecSmrg		    {
293805b261ecSmrg			rects->x -= x_off;
293905b261ecSmrg			rects->y -= y_off;
294005b261ecSmrg			rects++;
294105b261ecSmrg		    }
294205b261ecSmrg		}
294305b261ecSmrg	    }
294405b261ecSmrg	    stuff->dst = dst->info[j].id;
294505b261ecSmrg	    result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client);
294605b261ecSmrg	    if(result != Success) break;
294705b261ecSmrg	}
29486747b715Smrg	free(extra);
294905b261ecSmrg    }
295005b261ecSmrg
295105b261ecSmrg    return result;
295205b261ecSmrg}
295305b261ecSmrg
295405b261ecSmrgstatic int
295505b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client)
295605b261ecSmrg{
295705b261ecSmrg    PanoramiXRes        *src, *dst;
295805b261ecSmrg    int                 result = Success, j;
295905b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
296005b261ecSmrg    char		*extra;
296105b261ecSmrg    int			extra_len;
296205b261ecSmrg
296305b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq);
296405b261ecSmrg
29656747b715Smrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
29666747b715Smrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
296705b261ecSmrg
296805b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
296905b261ecSmrg
297005b261ecSmrg    if (extra_len &&
29716747b715Smrg	(extra = (char *) malloc(extra_len))) {
297205b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
297305b261ecSmrg
297405b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
297505b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
297605b261ecSmrg	    if (dst->u.pict.root) {
29776747b715Smrg		int x_off = screenInfo.screens[j]->x;
29786747b715Smrg		int y_off = screenInfo.screens[j]->y;
297905b261ecSmrg
298005b261ecSmrg		if(x_off || y_off) {
298105b261ecSmrg                    xTrapezoid  *trap = (xTrapezoid *) (stuff + 1);
298205b261ecSmrg		    int         i = extra_len / sizeof (xTrapezoid);
298305b261ecSmrg
298405b261ecSmrg		    while (i--) {
298505b261ecSmrg			trap->top -= y_off;
298605b261ecSmrg			trap->bottom -= y_off;
298705b261ecSmrg			trap->left.p1.x -= x_off;
298805b261ecSmrg			trap->left.p1.y -= y_off;
298905b261ecSmrg			trap->left.p2.x -= x_off;
299005b261ecSmrg			trap->left.p2.y -= y_off;
299105b261ecSmrg			trap->right.p1.x -= x_off;
299205b261ecSmrg			trap->right.p1.y -= y_off;
299305b261ecSmrg			trap->right.p2.x -= x_off;
299405b261ecSmrg			trap->right.p2.y -= y_off;
299505b261ecSmrg			trap++;
299605b261ecSmrg		    }
299705b261ecSmrg		}
299805b261ecSmrg	    }
299905b261ecSmrg
300005b261ecSmrg            stuff->src = src->info[j].id;
300105b261ecSmrg            stuff->dst = dst->info[j].id;
300205b261ecSmrg	    result =
300305b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client);
300405b261ecSmrg
300505b261ecSmrg	    if(result != Success) break;
300605b261ecSmrg	}
300705b261ecSmrg
30086747b715Smrg        free(extra);
300905b261ecSmrg    }
301005b261ecSmrg
301105b261ecSmrg    return result;
301205b261ecSmrg}
301305b261ecSmrg
301405b261ecSmrgstatic int
301505b261ecSmrgPanoramiXRenderTriangles(ClientPtr client)
301605b261ecSmrg{
301705b261ecSmrg    PanoramiXRes        *src, *dst;
301805b261ecSmrg    int                 result = Success, j;
301905b261ecSmrg    REQUEST(xRenderTrianglesReq);
302005b261ecSmrg    char		*extra;
302105b261ecSmrg    int			extra_len;
302205b261ecSmrg
302305b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq);
302405b261ecSmrg
30256747b715Smrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
30266747b715Smrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
302705b261ecSmrg
302805b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
302905b261ecSmrg
303005b261ecSmrg    if (extra_len &&
30316747b715Smrg	(extra = (char *) malloc(extra_len))) {
303205b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
303305b261ecSmrg
303405b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
303505b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
303605b261ecSmrg	    if (dst->u.pict.root) {
30376747b715Smrg		int x_off = screenInfo.screens[j]->x;
30386747b715Smrg		int y_off = screenInfo.screens[j]->y;
303905b261ecSmrg
304005b261ecSmrg		if(x_off || y_off) {
304105b261ecSmrg                    xTriangle  *tri = (xTriangle *) (stuff + 1);
304205b261ecSmrg		    int         i = extra_len / sizeof (xTriangle);
304305b261ecSmrg
304405b261ecSmrg		    while (i--) {
304505b261ecSmrg			tri->p1.x -= x_off;
304605b261ecSmrg			tri->p1.y -= y_off;
304705b261ecSmrg			tri->p2.x -= x_off;
304805b261ecSmrg			tri->p2.y -= y_off;
304905b261ecSmrg			tri->p3.x -= x_off;
305005b261ecSmrg			tri->p3.y -= y_off;
305105b261ecSmrg			tri++;
305205b261ecSmrg		    }
305305b261ecSmrg		}
305405b261ecSmrg	    }
305505b261ecSmrg
305605b261ecSmrg            stuff->src = src->info[j].id;
305705b261ecSmrg            stuff->dst = dst->info[j].id;
305805b261ecSmrg	    result =
305905b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTriangles]) (client);
306005b261ecSmrg
306105b261ecSmrg	    if(result != Success) break;
306205b261ecSmrg	}
306305b261ecSmrg
30646747b715Smrg        free(extra);
306505b261ecSmrg    }
306605b261ecSmrg
306705b261ecSmrg    return result;
306805b261ecSmrg}
306905b261ecSmrg
307005b261ecSmrgstatic int
307105b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client)
307205b261ecSmrg{
307305b261ecSmrg    PanoramiXRes        *src, *dst;
307405b261ecSmrg    int                 result = Success, j;
307505b261ecSmrg    REQUEST(xRenderTriStripReq);
307605b261ecSmrg    char		*extra;
307705b261ecSmrg    int			extra_len;
307805b261ecSmrg
307905b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTriStripReq);
308005b261ecSmrg
30816747b715Smrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
30826747b715Smrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
308305b261ecSmrg
308405b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq);
308505b261ecSmrg
308605b261ecSmrg    if (extra_len &&
30876747b715Smrg	(extra = (char *) malloc(extra_len))) {
308805b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
308905b261ecSmrg
309005b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
309105b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
309205b261ecSmrg	    if (dst->u.pict.root) {
30936747b715Smrg		int x_off = screenInfo.screens[j]->x;
30946747b715Smrg		int y_off = screenInfo.screens[j]->y;
309505b261ecSmrg
309605b261ecSmrg		if(x_off || y_off) {
309705b261ecSmrg                    xPointFixed  *fixed = (xPointFixed *) (stuff + 1);
309805b261ecSmrg		    int         i = extra_len / sizeof (xPointFixed);
309905b261ecSmrg
310005b261ecSmrg		    while (i--) {
310105b261ecSmrg			fixed->x -= x_off;
310205b261ecSmrg			fixed->y -= y_off;
310305b261ecSmrg			fixed++;
310405b261ecSmrg		    }
310505b261ecSmrg		}
310605b261ecSmrg	    }
310705b261ecSmrg
310805b261ecSmrg            stuff->src = src->info[j].id;
310905b261ecSmrg            stuff->dst = dst->info[j].id;
311005b261ecSmrg	    result =
311105b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client);
311205b261ecSmrg
311305b261ecSmrg	    if(result != Success) break;
311405b261ecSmrg	}
311505b261ecSmrg
31166747b715Smrg        free(extra);
311705b261ecSmrg    }
311805b261ecSmrg
311905b261ecSmrg    return result;
312005b261ecSmrg}
312105b261ecSmrg
312205b261ecSmrgstatic int
312305b261ecSmrgPanoramiXRenderTriFan(ClientPtr client)
312405b261ecSmrg{
312505b261ecSmrg    PanoramiXRes        *src, *dst;
312605b261ecSmrg    int                 result = Success, j;
312705b261ecSmrg    REQUEST(xRenderTriFanReq);
312805b261ecSmrg    char		*extra;
312905b261ecSmrg    int			extra_len;
313005b261ecSmrg
313105b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTriFanReq);
313205b261ecSmrg
31336747b715Smrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
31346747b715Smrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
313505b261ecSmrg
313605b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq);
313705b261ecSmrg
313805b261ecSmrg    if (extra_len &&
31396747b715Smrg	(extra = (char *) malloc(extra_len))) {
314005b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
314105b261ecSmrg
314205b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
314305b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
314405b261ecSmrg	    if (dst->u.pict.root) {
31456747b715Smrg		int x_off = screenInfo.screens[j]->x;
31466747b715Smrg		int y_off = screenInfo.screens[j]->y;
314705b261ecSmrg
314805b261ecSmrg		if(x_off || y_off) {
314905b261ecSmrg                    xPointFixed  *fixed = (xPointFixed *) (stuff + 1);
315005b261ecSmrg		    int         i = extra_len / sizeof (xPointFixed);
315105b261ecSmrg
315205b261ecSmrg		    while (i--) {
315305b261ecSmrg			fixed->x -= x_off;
315405b261ecSmrg			fixed->y -= y_off;
315505b261ecSmrg			fixed++;
315605b261ecSmrg		    }
315705b261ecSmrg		}
315805b261ecSmrg	    }
315905b261ecSmrg
316005b261ecSmrg            stuff->src = src->info[j].id;
316105b261ecSmrg            stuff->dst = dst->info[j].id;
316205b261ecSmrg	    result =
316305b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTriFan]) (client);
316405b261ecSmrg
316505b261ecSmrg	    if(result != Success) break;
316605b261ecSmrg	}
316705b261ecSmrg
31686747b715Smrg        free(extra);
316905b261ecSmrg    }
317005b261ecSmrg
317105b261ecSmrg    return result;
317205b261ecSmrg}
317305b261ecSmrg
317405b261ecSmrgstatic int
317505b261ecSmrgPanoramiXRenderAddTraps (ClientPtr client)
317605b261ecSmrg{
317705b261ecSmrg    PanoramiXRes    *picture;
317805b261ecSmrg    int		    result = Success, j;
317905b261ecSmrg    REQUEST(xRenderAddTrapsReq);
318005b261ecSmrg    char	    *extra;
318105b261ecSmrg    int		    extra_len;
318205b261ecSmrg    INT16    	    x_off, y_off;
318305b261ecSmrg
318405b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
31856747b715Smrg    VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess);
318605b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
318705b261ecSmrg    if (extra_len &&
31886747b715Smrg	(extra = (char *) malloc(extra_len)))
318905b261ecSmrg    {
319005b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
319105b261ecSmrg	x_off = stuff->xOff;
319205b261ecSmrg	y_off = stuff->yOff;
319305b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
319405b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
319505b261ecSmrg	    stuff->picture = picture->info[j].id;
319605b261ecSmrg
319705b261ecSmrg	    if (picture->u.pict.root)
319805b261ecSmrg	    {
31996747b715Smrg		stuff->xOff = x_off + screenInfo.screens[j]->x;
32006747b715Smrg		stuff->yOff = y_off + screenInfo.screens[j]->y;
320105b261ecSmrg	    }
320205b261ecSmrg	    result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client);
320305b261ecSmrg	    if(result != Success) break;
320405b261ecSmrg	}
32056747b715Smrg	free(extra);
32066747b715Smrg    }
32076747b715Smrg
32086747b715Smrg    return result;
32096747b715Smrg}
32106747b715Smrg
32116747b715Smrgstatic int
32126747b715SmrgPanoramiXRenderCreateSolidFill (ClientPtr client)
32136747b715Smrg{
32146747b715Smrg    REQUEST(xRenderCreateSolidFillReq);
32156747b715Smrg    PanoramiXRes    *newPict;
32166747b715Smrg    int		    result = Success, j;
32176747b715Smrg
32186747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
32196747b715Smrg
32206747b715Smrg    if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
32216747b715Smrg	return BadAlloc;
32226747b715Smrg
32236747b715Smrg    newPict->type = XRT_PICTURE;
32246747b715Smrg    newPict->info[0].id = stuff->pid;
32256747b715Smrg    newPict->u.pict.root = FALSE;
32266747b715Smrg
32276747b715Smrg    for(j = 1; j < PanoramiXNumScreens; j++)
32286747b715Smrg	newPict->info[j].id = FakeClientID(client->index);
32296747b715Smrg
32306747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
32316747b715Smrg	stuff->pid = newPict->info[j].id;
32326747b715Smrg	result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client);
32336747b715Smrg	if(result != Success) break;
32346747b715Smrg    }
32356747b715Smrg
32366747b715Smrg    if (result == Success)
32376747b715Smrg	AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
32386747b715Smrg    else
32396747b715Smrg	free(newPict);
32406747b715Smrg
32416747b715Smrg    return result;
32426747b715Smrg}
32436747b715Smrg
32446747b715Smrgstatic int
32456747b715SmrgPanoramiXRenderCreateLinearGradient (ClientPtr client)
32466747b715Smrg{
32476747b715Smrg    REQUEST(xRenderCreateLinearGradientReq);
32486747b715Smrg    PanoramiXRes    *newPict;
32496747b715Smrg    int		    result = Success, j;
32506747b715Smrg
32516747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
32526747b715Smrg
32536747b715Smrg    if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
32546747b715Smrg	return BadAlloc;
32556747b715Smrg
32566747b715Smrg    newPict->type = XRT_PICTURE;
32576747b715Smrg    newPict->info[0].id = stuff->pid;
32586747b715Smrg    newPict->u.pict.root = FALSE;
32596747b715Smrg
32606747b715Smrg    for(j = 1; j < PanoramiXNumScreens; j++)
32616747b715Smrg	newPict->info[j].id = FakeClientID(client->index);
32626747b715Smrg
32636747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
32646747b715Smrg	stuff->pid = newPict->info[j].id;
32656747b715Smrg	result = (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client);
32666747b715Smrg	if(result != Success) break;
326705b261ecSmrg    }
326805b261ecSmrg
32696747b715Smrg    if (result == Success)
32706747b715Smrg	AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
32716747b715Smrg    else
32726747b715Smrg	free(newPict);
32736747b715Smrg
32746747b715Smrg    return result;
32756747b715Smrg}
32766747b715Smrg
32776747b715Smrgstatic int
32786747b715SmrgPanoramiXRenderCreateRadialGradient (ClientPtr client)
32796747b715Smrg{
32806747b715Smrg    REQUEST(xRenderCreateRadialGradientReq);
32816747b715Smrg    PanoramiXRes    *newPict;
32826747b715Smrg    int		    result = Success, j;
32836747b715Smrg
32846747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
32856747b715Smrg
32866747b715Smrg    if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
32876747b715Smrg	return BadAlloc;
32886747b715Smrg
32896747b715Smrg    newPict->type = XRT_PICTURE;
32906747b715Smrg    newPict->info[0].id = stuff->pid;
32916747b715Smrg    newPict->u.pict.root = FALSE;
32926747b715Smrg
32936747b715Smrg    for(j = 1; j < PanoramiXNumScreens; j++)
32946747b715Smrg	newPict->info[j].id = FakeClientID(client->index);
32956747b715Smrg
32966747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
32976747b715Smrg	stuff->pid = newPict->info[j].id;
32986747b715Smrg	result = (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client);
32996747b715Smrg	if(result != Success) break;
33006747b715Smrg    }
33016747b715Smrg
33026747b715Smrg    if (result == Success)
33036747b715Smrg	AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
33046747b715Smrg    else
33056747b715Smrg	free(newPict);
33066747b715Smrg
33076747b715Smrg    return result;
33086747b715Smrg}
33096747b715Smrg
33106747b715Smrgstatic int
33116747b715SmrgPanoramiXRenderCreateConicalGradient (ClientPtr client)
33126747b715Smrg{
33136747b715Smrg    REQUEST(xRenderCreateConicalGradientReq);
33146747b715Smrg    PanoramiXRes    *newPict;
33156747b715Smrg    int		    result = Success, j;
33166747b715Smrg
33176747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
33186747b715Smrg
33196747b715Smrg    if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
33206747b715Smrg	return BadAlloc;
33216747b715Smrg
33226747b715Smrg    newPict->type = XRT_PICTURE;
33236747b715Smrg    newPict->info[0].id = stuff->pid;
33246747b715Smrg    newPict->u.pict.root = FALSE;
33256747b715Smrg
33266747b715Smrg    for(j = 1; j < PanoramiXNumScreens; j++)
33276747b715Smrg	newPict->info[j].id = FakeClientID(client->index);
33286747b715Smrg
33296747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
33306747b715Smrg	stuff->pid = newPict->info[j].id;
33316747b715Smrg	result = (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient]) (client);
33326747b715Smrg	if(result != Success) break;
33336747b715Smrg    }
33346747b715Smrg
33356747b715Smrg    if (result == Success)
33366747b715Smrg	AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
33376747b715Smrg    else
33386747b715Smrg	free(newPict);
33396747b715Smrg
334005b261ecSmrg    return result;
334105b261ecSmrg}
334205b261ecSmrg
334305b261ecSmrgvoid
334405b261ecSmrgPanoramiXRenderInit (void)
334505b261ecSmrg{
334605b261ecSmrg    int	    i;
334705b261ecSmrg
33486747b715Smrg    XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource,
33496747b715Smrg					 "XineramaPicture");
33506747b715Smrg    if (RenderErrBase)
33516747b715Smrg	SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
335205b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
335305b261ecSmrg	PanoramiXSaveRenderVector[i] = ProcRenderVector[i];
335405b261ecSmrg    /*
335505b261ecSmrg     * Stuff in Xinerama aware request processing hooks
335605b261ecSmrg     */
335705b261ecSmrg    ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture;
335805b261ecSmrg    ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture;
335905b261ecSmrg    ProcRenderVector[X_RenderSetPictureTransform] = PanoramiXRenderSetPictureTransform;
336005b261ecSmrg    ProcRenderVector[X_RenderSetPictureFilter] = PanoramiXRenderSetPictureFilter;
336105b261ecSmrg    ProcRenderVector[X_RenderSetPictureClipRectangles] = PanoramiXRenderSetPictureClipRectangles;
336205b261ecSmrg    ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture;
336305b261ecSmrg    ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite;
336405b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs;
336505b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs16] = PanoramiXRenderCompositeGlyphs;
336605b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs32] = PanoramiXRenderCompositeGlyphs;
336705b261ecSmrg    ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles;
336805b261ecSmrg
336905b261ecSmrg    ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids;
337005b261ecSmrg    ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles;
337105b261ecSmrg    ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip;
337205b261ecSmrg    ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan;
337305b261ecSmrg    ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps;
33746747b715Smrg
33756747b715Smrg    ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill;
33766747b715Smrg    ProcRenderVector[X_RenderCreateLinearGradient] = PanoramiXRenderCreateLinearGradient;
33776747b715Smrg    ProcRenderVector[X_RenderCreateRadialGradient] = PanoramiXRenderCreateRadialGradient;
33786747b715Smrg    ProcRenderVector[X_RenderCreateConicalGradient] = PanoramiXRenderCreateConicalGradient;
337905b261ecSmrg}
338005b261ecSmrg
338105b261ecSmrgvoid
338205b261ecSmrgPanoramiXRenderReset (void)
338305b261ecSmrg{
338405b261ecSmrg    int	    i;
338505b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
338605b261ecSmrg	ProcRenderVector[i] = PanoramiXSaveRenderVector[i];
33876747b715Smrg    RenderErrBase = 0;
338805b261ecSmrg}
338905b261ecSmrg
339005b261ecSmrg#endif	/* PANORAMIX */
3391