render.c revision 4642e01f
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#define NEED_REPLIES
2605b261ecSmrg#define NEED_EVENTS
2705b261ecSmrg#ifdef HAVE_DIX_CONFIG_H
2805b261ecSmrg#include <dix-config.h>
2905b261ecSmrg#endif
3005b261ecSmrg
3105b261ecSmrg#include <X11/X.h>
3205b261ecSmrg#include <X11/Xproto.h>
3305b261ecSmrg#include "misc.h"
3405b261ecSmrg#include "os.h"
3505b261ecSmrg#include "dixstruct.h"
3605b261ecSmrg#include "resource.h"
3705b261ecSmrg#include "scrnintstr.h"
3805b261ecSmrg#include "windowstr.h"
3905b261ecSmrg#include "pixmapstr.h"
4005b261ecSmrg#include "colormapst.h"
4105b261ecSmrg#include "extnsionst.h"
4205b261ecSmrg#include "servermd.h"
4305b261ecSmrg#include <X11/extensions/render.h>
4405b261ecSmrg#include <X11/extensions/renderproto.h>
4505b261ecSmrg#include "picturestr.h"
4605b261ecSmrg#include "glyphstr.h"
4705b261ecSmrg#include <X11/Xfuncproto.h>
4805b261ecSmrg#include "cursorstr.h"
494642e01fSmrg#include "xace.h"
5005b261ecSmrg
5105b261ecSmrg#if HAVE_STDINT_H
5205b261ecSmrg#include <stdint.h>
5305b261ecSmrg#elif !defined(UINT32_MAX)
5405b261ecSmrg#define UINT32_MAX 0xffffffffU
5505b261ecSmrg#endif
5605b261ecSmrg
5705b261ecSmrgstatic int ProcRenderQueryVersion (ClientPtr pClient);
5805b261ecSmrgstatic int ProcRenderQueryPictFormats (ClientPtr pClient);
5905b261ecSmrgstatic int ProcRenderQueryPictIndexValues (ClientPtr pClient);
6005b261ecSmrgstatic int ProcRenderQueryDithers (ClientPtr pClient);
6105b261ecSmrgstatic int ProcRenderCreatePicture (ClientPtr pClient);
6205b261ecSmrgstatic int ProcRenderChangePicture (ClientPtr pClient);
6305b261ecSmrgstatic int ProcRenderSetPictureClipRectangles (ClientPtr pClient);
6405b261ecSmrgstatic int ProcRenderFreePicture (ClientPtr pClient);
6505b261ecSmrgstatic int ProcRenderComposite (ClientPtr pClient);
6605b261ecSmrgstatic int ProcRenderScale (ClientPtr pClient);
6705b261ecSmrgstatic int ProcRenderTrapezoids (ClientPtr pClient);
6805b261ecSmrgstatic int ProcRenderTriangles (ClientPtr pClient);
6905b261ecSmrgstatic int ProcRenderTriStrip (ClientPtr pClient);
7005b261ecSmrgstatic int ProcRenderTriFan (ClientPtr pClient);
7105b261ecSmrgstatic int ProcRenderColorTrapezoids (ClientPtr pClient);
7205b261ecSmrgstatic int ProcRenderColorTriangles (ClientPtr pClient);
7305b261ecSmrgstatic int ProcRenderTransform (ClientPtr pClient);
7405b261ecSmrgstatic int ProcRenderCreateGlyphSet (ClientPtr pClient);
7505b261ecSmrgstatic int ProcRenderReferenceGlyphSet (ClientPtr pClient);
7605b261ecSmrgstatic int ProcRenderFreeGlyphSet (ClientPtr pClient);
7705b261ecSmrgstatic int ProcRenderAddGlyphs (ClientPtr pClient);
7805b261ecSmrgstatic int ProcRenderAddGlyphsFromPicture (ClientPtr pClient);
7905b261ecSmrgstatic int ProcRenderFreeGlyphs (ClientPtr pClient);
8005b261ecSmrgstatic int ProcRenderCompositeGlyphs (ClientPtr pClient);
8105b261ecSmrgstatic int ProcRenderFillRectangles (ClientPtr pClient);
8205b261ecSmrgstatic int ProcRenderCreateCursor (ClientPtr pClient);
8305b261ecSmrgstatic int ProcRenderSetPictureTransform (ClientPtr pClient);
8405b261ecSmrgstatic int ProcRenderQueryFilters (ClientPtr pClient);
8505b261ecSmrgstatic int ProcRenderSetPictureFilter (ClientPtr pClient);
8605b261ecSmrgstatic int ProcRenderCreateAnimCursor (ClientPtr pClient);
8705b261ecSmrgstatic int ProcRenderAddTraps (ClientPtr pClient);
8805b261ecSmrgstatic int ProcRenderCreateSolidFill (ClientPtr pClient);
8905b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr pClient);
9005b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr pClient);
9105b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr pClient);
9205b261ecSmrg
9305b261ecSmrgstatic int ProcRenderDispatch (ClientPtr pClient);
9405b261ecSmrg
9505b261ecSmrgstatic int SProcRenderQueryVersion (ClientPtr pClient);
9605b261ecSmrgstatic int SProcRenderQueryPictFormats (ClientPtr pClient);
9705b261ecSmrgstatic int SProcRenderQueryPictIndexValues (ClientPtr pClient);
9805b261ecSmrgstatic int SProcRenderQueryDithers (ClientPtr pClient);
9905b261ecSmrgstatic int SProcRenderCreatePicture (ClientPtr pClient);
10005b261ecSmrgstatic int SProcRenderChangePicture (ClientPtr pClient);
10105b261ecSmrgstatic int SProcRenderSetPictureClipRectangles (ClientPtr pClient);
10205b261ecSmrgstatic int SProcRenderFreePicture (ClientPtr pClient);
10305b261ecSmrgstatic int SProcRenderComposite (ClientPtr pClient);
10405b261ecSmrgstatic int SProcRenderScale (ClientPtr pClient);
10505b261ecSmrgstatic int SProcRenderTrapezoids (ClientPtr pClient);
10605b261ecSmrgstatic int SProcRenderTriangles (ClientPtr pClient);
10705b261ecSmrgstatic int SProcRenderTriStrip (ClientPtr pClient);
10805b261ecSmrgstatic int SProcRenderTriFan (ClientPtr pClient);
10905b261ecSmrgstatic int SProcRenderColorTrapezoids (ClientPtr pClient);
11005b261ecSmrgstatic int SProcRenderColorTriangles (ClientPtr pClient);
11105b261ecSmrgstatic int SProcRenderTransform (ClientPtr pClient);
11205b261ecSmrgstatic int SProcRenderCreateGlyphSet (ClientPtr pClient);
11305b261ecSmrgstatic int SProcRenderReferenceGlyphSet (ClientPtr pClient);
11405b261ecSmrgstatic int SProcRenderFreeGlyphSet (ClientPtr pClient);
11505b261ecSmrgstatic int SProcRenderAddGlyphs (ClientPtr pClient);
11605b261ecSmrgstatic int SProcRenderAddGlyphsFromPicture (ClientPtr pClient);
11705b261ecSmrgstatic int SProcRenderFreeGlyphs (ClientPtr pClient);
11805b261ecSmrgstatic int SProcRenderCompositeGlyphs (ClientPtr pClient);
11905b261ecSmrgstatic int SProcRenderFillRectangles (ClientPtr pClient);
12005b261ecSmrgstatic int SProcRenderCreateCursor (ClientPtr pClient);
12105b261ecSmrgstatic int SProcRenderSetPictureTransform (ClientPtr pClient);
12205b261ecSmrgstatic int SProcRenderQueryFilters (ClientPtr pClient);
12305b261ecSmrgstatic int SProcRenderSetPictureFilter (ClientPtr pClient);
12405b261ecSmrgstatic int SProcRenderCreateAnimCursor (ClientPtr pClient);
12505b261ecSmrgstatic int SProcRenderAddTraps (ClientPtr pClient);
12605b261ecSmrgstatic int SProcRenderCreateSolidFill (ClientPtr pClient);
12705b261ecSmrgstatic int SProcRenderCreateLinearGradient (ClientPtr pClient);
12805b261ecSmrgstatic int SProcRenderCreateRadialGradient (ClientPtr pClient);
12905b261ecSmrgstatic int SProcRenderCreateConicalGradient (ClientPtr pClient);
13005b261ecSmrg
13105b261ecSmrgstatic int SProcRenderDispatch (ClientPtr pClient);
13205b261ecSmrg
13305b261ecSmrgint	(*ProcRenderVector[RenderNumberRequests])(ClientPtr) = {
13405b261ecSmrg    ProcRenderQueryVersion,
13505b261ecSmrg    ProcRenderQueryPictFormats,
13605b261ecSmrg    ProcRenderQueryPictIndexValues,
13705b261ecSmrg    ProcRenderQueryDithers,
13805b261ecSmrg    ProcRenderCreatePicture,
13905b261ecSmrg    ProcRenderChangePicture,
14005b261ecSmrg    ProcRenderSetPictureClipRectangles,
14105b261ecSmrg    ProcRenderFreePicture,
14205b261ecSmrg    ProcRenderComposite,
14305b261ecSmrg    ProcRenderScale,
14405b261ecSmrg    ProcRenderTrapezoids,
14505b261ecSmrg    ProcRenderTriangles,
14605b261ecSmrg    ProcRenderTriStrip,
14705b261ecSmrg    ProcRenderTriFan,
14805b261ecSmrg    ProcRenderColorTrapezoids,
14905b261ecSmrg    ProcRenderColorTriangles,
15005b261ecSmrg    ProcRenderTransform,
15105b261ecSmrg    ProcRenderCreateGlyphSet,
15205b261ecSmrg    ProcRenderReferenceGlyphSet,
15305b261ecSmrg    ProcRenderFreeGlyphSet,
15405b261ecSmrg    ProcRenderAddGlyphs,
15505b261ecSmrg    ProcRenderAddGlyphsFromPicture,
15605b261ecSmrg    ProcRenderFreeGlyphs,
15705b261ecSmrg    ProcRenderCompositeGlyphs,
15805b261ecSmrg    ProcRenderCompositeGlyphs,
15905b261ecSmrg    ProcRenderCompositeGlyphs,
16005b261ecSmrg    ProcRenderFillRectangles,
16105b261ecSmrg    ProcRenderCreateCursor,
16205b261ecSmrg    ProcRenderSetPictureTransform,
16305b261ecSmrg    ProcRenderQueryFilters,
16405b261ecSmrg    ProcRenderSetPictureFilter,
16505b261ecSmrg    ProcRenderCreateAnimCursor,
16605b261ecSmrg    ProcRenderAddTraps,
16705b261ecSmrg    ProcRenderCreateSolidFill,
16805b261ecSmrg    ProcRenderCreateLinearGradient,
16905b261ecSmrg    ProcRenderCreateRadialGradient,
17005b261ecSmrg    ProcRenderCreateConicalGradient
17105b261ecSmrg};
17205b261ecSmrg
17305b261ecSmrgint	(*SProcRenderVector[RenderNumberRequests])(ClientPtr) = {
17405b261ecSmrg    SProcRenderQueryVersion,
17505b261ecSmrg    SProcRenderQueryPictFormats,
17605b261ecSmrg    SProcRenderQueryPictIndexValues,
17705b261ecSmrg    SProcRenderQueryDithers,
17805b261ecSmrg    SProcRenderCreatePicture,
17905b261ecSmrg    SProcRenderChangePicture,
18005b261ecSmrg    SProcRenderSetPictureClipRectangles,
18105b261ecSmrg    SProcRenderFreePicture,
18205b261ecSmrg    SProcRenderComposite,
18305b261ecSmrg    SProcRenderScale,
18405b261ecSmrg    SProcRenderTrapezoids,
18505b261ecSmrg    SProcRenderTriangles,
18605b261ecSmrg    SProcRenderTriStrip,
18705b261ecSmrg    SProcRenderTriFan,
18805b261ecSmrg    SProcRenderColorTrapezoids,
18905b261ecSmrg    SProcRenderColorTriangles,
19005b261ecSmrg    SProcRenderTransform,
19105b261ecSmrg    SProcRenderCreateGlyphSet,
19205b261ecSmrg    SProcRenderReferenceGlyphSet,
19305b261ecSmrg    SProcRenderFreeGlyphSet,
19405b261ecSmrg    SProcRenderAddGlyphs,
19505b261ecSmrg    SProcRenderAddGlyphsFromPicture,
19605b261ecSmrg    SProcRenderFreeGlyphs,
19705b261ecSmrg    SProcRenderCompositeGlyphs,
19805b261ecSmrg    SProcRenderCompositeGlyphs,
19905b261ecSmrg    SProcRenderCompositeGlyphs,
20005b261ecSmrg    SProcRenderFillRectangles,
20105b261ecSmrg    SProcRenderCreateCursor,
20205b261ecSmrg    SProcRenderSetPictureTransform,
20305b261ecSmrg    SProcRenderQueryFilters,
20405b261ecSmrg    SProcRenderSetPictureFilter,
20505b261ecSmrg    SProcRenderCreateAnimCursor,
20605b261ecSmrg    SProcRenderAddTraps,
20705b261ecSmrg    SProcRenderCreateSolidFill,
20805b261ecSmrg    SProcRenderCreateLinearGradient,
20905b261ecSmrg    SProcRenderCreateRadialGradient,
21005b261ecSmrg    SProcRenderCreateConicalGradient
21105b261ecSmrg};
21205b261ecSmrg
21305b261ecSmrgint	RenderErrBase;
2144642e01fSmrgstatic int RenderClientPrivateKeyIndex;
2154642e01fSmrgDevPrivateKey RenderClientPrivateKey = &RenderClientPrivateKeyIndex;
21605b261ecSmrg
21705b261ecSmrgtypedef struct _RenderClient {
21805b261ecSmrg    int	    major_version;
21905b261ecSmrg    int	    minor_version;
22005b261ecSmrg} RenderClientRec, *RenderClientPtr;
22105b261ecSmrg
2224642e01fSmrg#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey))
22305b261ecSmrg
22405b261ecSmrgstatic void
22505b261ecSmrgRenderClientCallback (CallbackListPtr	*list,
22605b261ecSmrg		      pointer		closure,
22705b261ecSmrg		      pointer		data)
22805b261ecSmrg{
22905b261ecSmrg    NewClientInfoRec	*clientinfo = (NewClientInfoRec *) data;
23005b261ecSmrg    ClientPtr		pClient = clientinfo->client;
23105b261ecSmrg    RenderClientPtr	pRenderClient = GetRenderClient (pClient);
23205b261ecSmrg
23305b261ecSmrg    pRenderClient->major_version = 0;
23405b261ecSmrg    pRenderClient->minor_version = 0;
23505b261ecSmrg}
23605b261ecSmrg
23705b261ecSmrgvoid
23805b261ecSmrgRenderExtensionInit (void)
23905b261ecSmrg{
24005b261ecSmrg    ExtensionEntry *extEntry;
24105b261ecSmrg
24205b261ecSmrg    if (!PictureType)
24305b261ecSmrg	return;
24405b261ecSmrg    if (!PictureFinishInit ())
24505b261ecSmrg	return;
2464642e01fSmrg    if (!dixRequestPrivate(RenderClientPrivateKey, sizeof(RenderClientRec)))
24705b261ecSmrg	return;
24805b261ecSmrg    if (!AddCallback (&ClientStateCallback, RenderClientCallback, 0))
24905b261ecSmrg	return;
25005b261ecSmrg
25105b261ecSmrg    extEntry = AddExtension (RENDER_NAME, 0, RenderNumberErrors,
25205b261ecSmrg			     ProcRenderDispatch, SProcRenderDispatch,
2534642e01fSmrg			     NULL, StandardMinorOpcode);
25405b261ecSmrg    if (!extEntry)
25505b261ecSmrg	return;
25605b261ecSmrg    RenderErrBase = extEntry->errorBase;
25705b261ecSmrg}
25805b261ecSmrg
25905b261ecSmrgstatic int
26005b261ecSmrgProcRenderQueryVersion (ClientPtr client)
26105b261ecSmrg{
26205b261ecSmrg    RenderClientPtr pRenderClient = GetRenderClient (client);
26305b261ecSmrg    xRenderQueryVersionReply rep;
26405b261ecSmrg    register int n;
26505b261ecSmrg    REQUEST(xRenderQueryVersionReq);
26605b261ecSmrg
26705b261ecSmrg    pRenderClient->major_version = stuff->majorVersion;
26805b261ecSmrg    pRenderClient->minor_version = stuff->minorVersion;
26905b261ecSmrg
27005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
27105b261ecSmrg    rep.type = X_Reply;
27205b261ecSmrg    rep.length = 0;
27305b261ecSmrg    rep.sequenceNumber = client->sequence;
27405b261ecSmrg    rep.majorVersion = RENDER_MAJOR;
27505b261ecSmrg    rep.minorVersion = RENDER_MINOR;
27605b261ecSmrg    if (client->swapped) {
27705b261ecSmrg    	swaps(&rep.sequenceNumber, n);
27805b261ecSmrg    	swapl(&rep.length, n);
27905b261ecSmrg	swapl(&rep.majorVersion, n);
28005b261ecSmrg	swapl(&rep.minorVersion, n);
28105b261ecSmrg    }
28205b261ecSmrg    WriteToClient(client, sizeof(xRenderQueryVersionReply), (char *)&rep);
28305b261ecSmrg    return (client->noClientException);
28405b261ecSmrg}
28505b261ecSmrg
28605b261ecSmrgstatic VisualPtr
28705b261ecSmrgfindVisual (ScreenPtr pScreen, VisualID vid)
28805b261ecSmrg{
28905b261ecSmrg    VisualPtr	pVisual;
29005b261ecSmrg    int		v;
29105b261ecSmrg
29205b261ecSmrg    for (v = 0; v < pScreen->numVisuals; v++)
29305b261ecSmrg    {
29405b261ecSmrg	pVisual = pScreen->visuals + v;
29505b261ecSmrg	if (pVisual->vid == vid)
29605b261ecSmrg	    return pVisual;
29705b261ecSmrg    }
29805b261ecSmrg    return 0;
29905b261ecSmrg}
30005b261ecSmrg
30105b261ecSmrgstatic int
30205b261ecSmrgProcRenderQueryPictFormats (ClientPtr client)
30305b261ecSmrg{
30405b261ecSmrg    RenderClientPtr		    pRenderClient = GetRenderClient (client);
30505b261ecSmrg    xRenderQueryPictFormatsReply    *reply;
30605b261ecSmrg    xPictScreen			    *pictScreen;
30705b261ecSmrg    xPictDepth			    *pictDepth;
30805b261ecSmrg    xPictVisual			    *pictVisual;
30905b261ecSmrg    xPictFormInfo		    *pictForm;
31005b261ecSmrg    CARD32			    *pictSubpixel;
31105b261ecSmrg    ScreenPtr			    pScreen;
31205b261ecSmrg    VisualPtr			    pVisual;
31305b261ecSmrg    DepthPtr			    pDepth;
31405b261ecSmrg    int				    v, d;
31505b261ecSmrg    PictureScreenPtr		    ps;
31605b261ecSmrg    PictFormatPtr		    pFormat;
31705b261ecSmrg    int				    nformat;
31805b261ecSmrg    int				    ndepth;
31905b261ecSmrg    int				    nvisual;
32005b261ecSmrg    int				    rlength;
32105b261ecSmrg    int				    s;
32205b261ecSmrg    int				    n;
32305b261ecSmrg    int				    numScreens;
32405b261ecSmrg    int				    numSubpixel;
32505b261ecSmrg/*    REQUEST(xRenderQueryPictFormatsReq); */
32605b261ecSmrg
32705b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
32805b261ecSmrg
32905b261ecSmrg#ifdef PANORAMIX
33005b261ecSmrg    if (noPanoramiXExtension)
33105b261ecSmrg	numScreens = screenInfo.numScreens;
33205b261ecSmrg    else
33305b261ecSmrg        numScreens = ((xConnSetup *)ConnectionInfo)->numRoots;
33405b261ecSmrg#else
33505b261ecSmrg    numScreens = screenInfo.numScreens;
33605b261ecSmrg#endif
33705b261ecSmrg    ndepth = nformat = nvisual = 0;
33805b261ecSmrg    for (s = 0; s < numScreens; s++)
33905b261ecSmrg    {
34005b261ecSmrg	pScreen = screenInfo.screens[s];
34105b261ecSmrg	for (d = 0; d < pScreen->numDepths; d++)
34205b261ecSmrg	{
34305b261ecSmrg	    pDepth = pScreen->allowedDepths + d;
34405b261ecSmrg	    ++ndepth;
34505b261ecSmrg
34605b261ecSmrg	    for (v = 0; v < pDepth->numVids; v++)
34705b261ecSmrg	    {
34805b261ecSmrg		pVisual = findVisual (pScreen, pDepth->vids[v]);
34905b261ecSmrg		if (pVisual && PictureMatchVisual (pScreen, pDepth->depth, pVisual))
35005b261ecSmrg		    ++nvisual;
35105b261ecSmrg	    }
35205b261ecSmrg	}
35305b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
35405b261ecSmrg	if (ps)
35505b261ecSmrg	    nformat += ps->nformats;
35605b261ecSmrg    }
35705b261ecSmrg    if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6)
35805b261ecSmrg	numSubpixel = 0;
35905b261ecSmrg    else
36005b261ecSmrg	numSubpixel = numScreens;
36105b261ecSmrg
36205b261ecSmrg    rlength = (sizeof (xRenderQueryPictFormatsReply) +
36305b261ecSmrg	       nformat * sizeof (xPictFormInfo) +
36405b261ecSmrg	       numScreens * sizeof (xPictScreen) +
36505b261ecSmrg	       ndepth * sizeof (xPictDepth) +
36605b261ecSmrg	       nvisual * sizeof (xPictVisual) +
36705b261ecSmrg	       numSubpixel * sizeof (CARD32));
36805b261ecSmrg    reply = (xRenderQueryPictFormatsReply *) xalloc (rlength);
36905b261ecSmrg    if (!reply)
37005b261ecSmrg	return BadAlloc;
37105b261ecSmrg    reply->type = X_Reply;
37205b261ecSmrg    reply->sequenceNumber = client->sequence;
37305b261ecSmrg    reply->length = (rlength - sizeof(xGenericReply)) >> 2;
37405b261ecSmrg    reply->numFormats = nformat;
37505b261ecSmrg    reply->numScreens = numScreens;
37605b261ecSmrg    reply->numDepths = ndepth;
37705b261ecSmrg    reply->numVisuals = nvisual;
37805b261ecSmrg    reply->numSubpixel = numSubpixel;
37905b261ecSmrg
38005b261ecSmrg    pictForm = (xPictFormInfo *) (reply + 1);
38105b261ecSmrg
38205b261ecSmrg    for (s = 0; s < numScreens; s++)
38305b261ecSmrg    {
38405b261ecSmrg	pScreen = screenInfo.screens[s];
38505b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
38605b261ecSmrg	if (ps)
38705b261ecSmrg	{
38805b261ecSmrg	    for (nformat = 0, pFormat = ps->formats;
38905b261ecSmrg		 nformat < ps->nformats;
39005b261ecSmrg		 nformat++, pFormat++)
39105b261ecSmrg	    {
39205b261ecSmrg		pictForm->id = pFormat->id;
39305b261ecSmrg		pictForm->type = pFormat->type;
39405b261ecSmrg		pictForm->depth = pFormat->depth;
39505b261ecSmrg		pictForm->direct.red = pFormat->direct.red;
39605b261ecSmrg		pictForm->direct.redMask = pFormat->direct.redMask;
39705b261ecSmrg		pictForm->direct.green = pFormat->direct.green;
39805b261ecSmrg		pictForm->direct.greenMask = pFormat->direct.greenMask;
39905b261ecSmrg		pictForm->direct.blue = pFormat->direct.blue;
40005b261ecSmrg		pictForm->direct.blueMask = pFormat->direct.blueMask;
40105b261ecSmrg		pictForm->direct.alpha = pFormat->direct.alpha;
40205b261ecSmrg		pictForm->direct.alphaMask = pFormat->direct.alphaMask;
40305b261ecSmrg		if (pFormat->type == PictTypeIndexed && pFormat->index.pColormap)
40405b261ecSmrg		    pictForm->colormap = pFormat->index.pColormap->mid;
40505b261ecSmrg		else
40605b261ecSmrg		    pictForm->colormap = None;
40705b261ecSmrg		if (client->swapped)
40805b261ecSmrg		{
40905b261ecSmrg		    swapl (&pictForm->id, n);
41005b261ecSmrg		    swaps (&pictForm->direct.red, n);
41105b261ecSmrg		    swaps (&pictForm->direct.redMask, n);
41205b261ecSmrg		    swaps (&pictForm->direct.green, n);
41305b261ecSmrg		    swaps (&pictForm->direct.greenMask, n);
41405b261ecSmrg		    swaps (&pictForm->direct.blue, n);
41505b261ecSmrg		    swaps (&pictForm->direct.blueMask, n);
41605b261ecSmrg		    swaps (&pictForm->direct.alpha, n);
41705b261ecSmrg		    swaps (&pictForm->direct.alphaMask, n);
41805b261ecSmrg		    swapl (&pictForm->colormap, n);
41905b261ecSmrg		}
42005b261ecSmrg		pictForm++;
42105b261ecSmrg	    }
42205b261ecSmrg	}
42305b261ecSmrg    }
42405b261ecSmrg
42505b261ecSmrg    pictScreen = (xPictScreen *) pictForm;
42605b261ecSmrg    for (s = 0; s < numScreens; s++)
42705b261ecSmrg    {
42805b261ecSmrg	pScreen = screenInfo.screens[s];
42905b261ecSmrg	pictDepth = (xPictDepth *) (pictScreen + 1);
43005b261ecSmrg	ndepth = 0;
43105b261ecSmrg	for (d = 0; d < pScreen->numDepths; d++)
43205b261ecSmrg	{
43305b261ecSmrg	    pictVisual = (xPictVisual *) (pictDepth + 1);
43405b261ecSmrg	    pDepth = pScreen->allowedDepths + d;
43505b261ecSmrg
43605b261ecSmrg	    nvisual = 0;
43705b261ecSmrg	    for (v = 0; v < pDepth->numVids; v++)
43805b261ecSmrg	    {
43905b261ecSmrg		pVisual = findVisual (pScreen, pDepth->vids[v]);
44005b261ecSmrg		if (pVisual && (pFormat = PictureMatchVisual (pScreen,
44105b261ecSmrg							      pDepth->depth,
44205b261ecSmrg							      pVisual)))
44305b261ecSmrg		{
44405b261ecSmrg		    pictVisual->visual = pVisual->vid;
44505b261ecSmrg		    pictVisual->format = pFormat->id;
44605b261ecSmrg		    if (client->swapped)
44705b261ecSmrg		    {
44805b261ecSmrg			swapl (&pictVisual->visual, n);
44905b261ecSmrg			swapl (&pictVisual->format, n);
45005b261ecSmrg		    }
45105b261ecSmrg		    pictVisual++;
45205b261ecSmrg		    nvisual++;
45305b261ecSmrg		}
45405b261ecSmrg	    }
45505b261ecSmrg	    pictDepth->depth = pDepth->depth;
45605b261ecSmrg	    pictDepth->nPictVisuals = nvisual;
45705b261ecSmrg	    if (client->swapped)
45805b261ecSmrg	    {
45905b261ecSmrg		swaps (&pictDepth->nPictVisuals, n);
46005b261ecSmrg	    }
46105b261ecSmrg	    ndepth++;
46205b261ecSmrg	    pictDepth = (xPictDepth *) pictVisual;
46305b261ecSmrg	}
46405b261ecSmrg	pictScreen->nDepth = ndepth;
46505b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
46605b261ecSmrg	if (ps)
46705b261ecSmrg	    pictScreen->fallback = ps->fallback->id;
46805b261ecSmrg	else
46905b261ecSmrg	    pictScreen->fallback = 0;
47005b261ecSmrg	if (client->swapped)
47105b261ecSmrg	{
47205b261ecSmrg	    swapl (&pictScreen->nDepth, n);
47305b261ecSmrg	    swapl (&pictScreen->fallback, n);
47405b261ecSmrg	}
47505b261ecSmrg	pictScreen = (xPictScreen *) pictDepth;
47605b261ecSmrg    }
47705b261ecSmrg    pictSubpixel = (CARD32 *) pictScreen;
47805b261ecSmrg
47905b261ecSmrg    for (s = 0; s < numSubpixel; s++)
48005b261ecSmrg    {
48105b261ecSmrg	pScreen = screenInfo.screens[s];
48205b261ecSmrg	ps = GetPictureScreenIfSet(pScreen);
48305b261ecSmrg	if (ps)
48405b261ecSmrg	    *pictSubpixel = ps->subpixel;
48505b261ecSmrg	else
48605b261ecSmrg	    *pictSubpixel = SubPixelUnknown;
48705b261ecSmrg	if (client->swapped)
48805b261ecSmrg	{
48905b261ecSmrg	    swapl (pictSubpixel, n);
49005b261ecSmrg	}
49105b261ecSmrg	++pictSubpixel;
49205b261ecSmrg    }
49305b261ecSmrg
49405b261ecSmrg    if (client->swapped)
49505b261ecSmrg    {
49605b261ecSmrg	swaps (&reply->sequenceNumber, n);
49705b261ecSmrg	swapl (&reply->length, n);
49805b261ecSmrg	swapl (&reply->numFormats, n);
49905b261ecSmrg	swapl (&reply->numScreens, n);
50005b261ecSmrg	swapl (&reply->numDepths, n);
50105b261ecSmrg	swapl (&reply->numVisuals, n);
50205b261ecSmrg	swapl (&reply->numSubpixel, n);
50305b261ecSmrg    }
50405b261ecSmrg    WriteToClient(client, rlength, (char *) reply);
50505b261ecSmrg    xfree (reply);
50605b261ecSmrg    return client->noClientException;
50705b261ecSmrg}
50805b261ecSmrg
50905b261ecSmrgstatic int
51005b261ecSmrgProcRenderQueryPictIndexValues (ClientPtr client)
51105b261ecSmrg{
51205b261ecSmrg    PictFormatPtr   pFormat;
51305b261ecSmrg    int		    num;
51405b261ecSmrg    int		    rlength;
51505b261ecSmrg    int		    i, n;
51605b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
51705b261ecSmrg    xRenderQueryPictIndexValuesReply *reply;
51805b261ecSmrg    xIndexValue	    *values;
51905b261ecSmrg
52005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
52105b261ecSmrg
52205b261ecSmrg    pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
52305b261ecSmrg						      stuff->format,
52405b261ecSmrg						      PictFormatType,
52505b261ecSmrg						      DixReadAccess);
52605b261ecSmrg
52705b261ecSmrg    if (!pFormat)
52805b261ecSmrg    {
52905b261ecSmrg	client->errorValue = stuff->format;
53005b261ecSmrg	return RenderErrBase + BadPictFormat;
53105b261ecSmrg    }
53205b261ecSmrg    if (pFormat->type != PictTypeIndexed)
53305b261ecSmrg    {
53405b261ecSmrg	client->errorValue = stuff->format;
53505b261ecSmrg	return BadMatch;
53605b261ecSmrg    }
53705b261ecSmrg    num = pFormat->index.nvalues;
53805b261ecSmrg    rlength = (sizeof (xRenderQueryPictIndexValuesReply) +
53905b261ecSmrg	       num * sizeof(xIndexValue));
54005b261ecSmrg    reply = (xRenderQueryPictIndexValuesReply *) xalloc (rlength);
54105b261ecSmrg    if (!reply)
54205b261ecSmrg	return BadAlloc;
54305b261ecSmrg
54405b261ecSmrg    reply->type = X_Reply;
54505b261ecSmrg    reply->sequenceNumber = client->sequence;
54605b261ecSmrg    reply->length = (rlength - sizeof(xGenericReply)) >> 2;
54705b261ecSmrg    reply->numIndexValues = num;
54805b261ecSmrg
54905b261ecSmrg    values = (xIndexValue *) (reply + 1);
55005b261ecSmrg
55105b261ecSmrg    memcpy (reply + 1, pFormat->index.pValues, num * sizeof (xIndexValue));
55205b261ecSmrg
55305b261ecSmrg    if (client->swapped)
55405b261ecSmrg    {
55505b261ecSmrg	for (i = 0; i < num; i++)
55605b261ecSmrg	{
55705b261ecSmrg	    swapl (&values[i].pixel, n);
55805b261ecSmrg	    swaps (&values[i].red, n);
55905b261ecSmrg	    swaps (&values[i].green, n);
56005b261ecSmrg	    swaps (&values[i].blue, n);
56105b261ecSmrg	    swaps (&values[i].alpha, n);
56205b261ecSmrg	}
56305b261ecSmrg	swaps (&reply->sequenceNumber, n);
56405b261ecSmrg	swapl (&reply->length, n);
56505b261ecSmrg	swapl (&reply->numIndexValues, n);
56605b261ecSmrg    }
56705b261ecSmrg
56805b261ecSmrg    WriteToClient(client, rlength, (char *) reply);
56905b261ecSmrg    xfree(reply);
57005b261ecSmrg    return (client->noClientException);
57105b261ecSmrg}
57205b261ecSmrg
57305b261ecSmrgstatic int
57405b261ecSmrgProcRenderQueryDithers (ClientPtr client)
57505b261ecSmrg{
57605b261ecSmrg    return BadImplementation;
57705b261ecSmrg}
57805b261ecSmrg
57905b261ecSmrgstatic int
58005b261ecSmrgProcRenderCreatePicture (ClientPtr client)
58105b261ecSmrg{
58205b261ecSmrg    PicturePtr	    pPicture;
58305b261ecSmrg    DrawablePtr	    pDrawable;
58405b261ecSmrg    PictFormatPtr   pFormat;
58505b261ecSmrg    int		    len, error, rc;
58605b261ecSmrg    REQUEST(xRenderCreatePictureReq);
58705b261ecSmrg
58805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
58905b261ecSmrg
59005b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
59105b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
5924642e01fSmrg			   DixReadAccess|DixAddAccess);
59305b261ecSmrg    if (rc != Success)
59405b261ecSmrg	return rc;
59505b261ecSmrg
59605b261ecSmrg    pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
59705b261ecSmrg						      stuff->format,
59805b261ecSmrg						      PictFormatType,
59905b261ecSmrg						      DixReadAccess);
60005b261ecSmrg    if (!pFormat)
60105b261ecSmrg    {
60205b261ecSmrg	client->errorValue = stuff->format;
60305b261ecSmrg	return RenderErrBase + BadPictFormat;
60405b261ecSmrg    }
60505b261ecSmrg    if (pFormat->depth != pDrawable->depth)
60605b261ecSmrg	return BadMatch;
60705b261ecSmrg    len = client->req_len - (sizeof(xRenderCreatePictureReq) >> 2);
60805b261ecSmrg    if (Ones(stuff->mask) != len)
60905b261ecSmrg	return BadLength;
61005b261ecSmrg
61105b261ecSmrg    pPicture = CreatePicture (stuff->pid,
61205b261ecSmrg			      pDrawable,
61305b261ecSmrg			      pFormat,
61405b261ecSmrg			      stuff->mask,
61505b261ecSmrg			      (XID *) (stuff + 1),
61605b261ecSmrg			      client,
61705b261ecSmrg			      &error);
61805b261ecSmrg    if (!pPicture)
61905b261ecSmrg	return error;
62005b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
62105b261ecSmrg	return BadAlloc;
62205b261ecSmrg    return Success;
62305b261ecSmrg}
62405b261ecSmrg
62505b261ecSmrgstatic int
62605b261ecSmrgProcRenderChangePicture (ClientPtr client)
62705b261ecSmrg{
62805b261ecSmrg    PicturePtr	    pPicture;
62905b261ecSmrg    REQUEST(xRenderChangePictureReq);
63005b261ecSmrg    int len;
63105b261ecSmrg
63205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
6334642e01fSmrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess,
63405b261ecSmrg		    RenderErrBase + BadPicture);
63505b261ecSmrg
63605b261ecSmrg    len = client->req_len - (sizeof(xRenderChangePictureReq) >> 2);
63705b261ecSmrg    if (Ones(stuff->mask) != len)
63805b261ecSmrg	return BadLength;
63905b261ecSmrg
64005b261ecSmrg    return ChangePicture (pPicture, stuff->mask, (XID *) (stuff + 1),
64105b261ecSmrg			  (DevUnion *) 0, client);
64205b261ecSmrg}
64305b261ecSmrg
64405b261ecSmrgstatic int
64505b261ecSmrgProcRenderSetPictureClipRectangles (ClientPtr client)
64605b261ecSmrg{
64705b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
64805b261ecSmrg    PicturePtr	    pPicture;
64905b261ecSmrg    int		    nr;
65005b261ecSmrg    int		    result;
65105b261ecSmrg
65205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
6534642e01fSmrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess,
65405b261ecSmrg		    RenderErrBase + BadPicture);
65505b261ecSmrg    if (!pPicture->pDrawable)
65605b261ecSmrg        return BadDrawable;
65705b261ecSmrg
65805b261ecSmrg    nr = (client->req_len << 2) - sizeof(xRenderChangePictureReq);
65905b261ecSmrg    if (nr & 4)
66005b261ecSmrg	return BadLength;
66105b261ecSmrg    nr >>= 3;
66205b261ecSmrg    result = SetPictureClipRects (pPicture,
66305b261ecSmrg				  stuff->xOrigin, stuff->yOrigin,
66405b261ecSmrg				  nr, (xRectangle *) &stuff[1]);
66505b261ecSmrg    if (client->noClientException != Success)
66605b261ecSmrg        return(client->noClientException);
66705b261ecSmrg    else
66805b261ecSmrg        return(result);
66905b261ecSmrg}
67005b261ecSmrg
67105b261ecSmrgstatic int
67205b261ecSmrgProcRenderFreePicture (ClientPtr client)
67305b261ecSmrg{
67405b261ecSmrg    PicturePtr	pPicture;
67505b261ecSmrg    REQUEST(xRenderFreePictureReq);
67605b261ecSmrg
67705b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
67805b261ecSmrg
67905b261ecSmrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess,
68005b261ecSmrg		    RenderErrBase + BadPicture);
68105b261ecSmrg    FreeResource (stuff->picture, RT_NONE);
68205b261ecSmrg    return(client->noClientException);
68305b261ecSmrg}
68405b261ecSmrg
68505b261ecSmrgstatic Bool
68605b261ecSmrgPictOpValid (CARD8 op)
68705b261ecSmrg{
68805b261ecSmrg    if (/*PictOpMinimum <= op && */ op <= PictOpMaximum)
68905b261ecSmrg	return TRUE;
69005b261ecSmrg    if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum)
69105b261ecSmrg	return TRUE;
69205b261ecSmrg    if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum)
69305b261ecSmrg	return TRUE;
69405b261ecSmrg    return FALSE;
69505b261ecSmrg}
69605b261ecSmrg
69705b261ecSmrgstatic int
69805b261ecSmrgProcRenderComposite (ClientPtr client)
69905b261ecSmrg{
70005b261ecSmrg    PicturePtr	pSrc, pMask, pDst;
70105b261ecSmrg    REQUEST(xRenderCompositeReq);
70205b261ecSmrg
70305b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
70405b261ecSmrg    if (!PictOpValid (stuff->op))
70505b261ecSmrg    {
70605b261ecSmrg	client->errorValue = stuff->op;
70705b261ecSmrg	return BadValue;
70805b261ecSmrg    }
70905b261ecSmrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
71005b261ecSmrg		    RenderErrBase + BadPicture);
71105b261ecSmrg    if (!pDst->pDrawable)
71205b261ecSmrg        return BadDrawable;
71305b261ecSmrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
71405b261ecSmrg		    RenderErrBase + BadPicture);
71505b261ecSmrg    VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess,
71605b261ecSmrg		  RenderErrBase + BadPicture);
71705b261ecSmrg    if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) ||
71805b261ecSmrg	(pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen))
71905b261ecSmrg	return BadMatch;
72005b261ecSmrg    CompositePicture (stuff->op,
72105b261ecSmrg		      pSrc,
72205b261ecSmrg		      pMask,
72305b261ecSmrg		      pDst,
72405b261ecSmrg		      stuff->xSrc,
72505b261ecSmrg		      stuff->ySrc,
72605b261ecSmrg		      stuff->xMask,
72705b261ecSmrg		      stuff->yMask,
72805b261ecSmrg		      stuff->xDst,
72905b261ecSmrg		      stuff->yDst,
73005b261ecSmrg		      stuff->width,
73105b261ecSmrg		      stuff->height);
73205b261ecSmrg    return Success;
73305b261ecSmrg}
73405b261ecSmrg
73505b261ecSmrgstatic int
73605b261ecSmrgProcRenderScale (ClientPtr client)
73705b261ecSmrg{
73805b261ecSmrg    return BadImplementation;
73905b261ecSmrg}
74005b261ecSmrg
74105b261ecSmrgstatic int
74205b261ecSmrgProcRenderTrapezoids (ClientPtr client)
74305b261ecSmrg{
74405b261ecSmrg    int		ntraps;
74505b261ecSmrg    PicturePtr	pSrc, pDst;
74605b261ecSmrg    PictFormatPtr   pFormat;
74705b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
74805b261ecSmrg
74905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
75005b261ecSmrg    if (!PictOpValid (stuff->op))
75105b261ecSmrg    {
75205b261ecSmrg	client->errorValue = stuff->op;
75305b261ecSmrg	return BadValue;
75405b261ecSmrg    }
75505b261ecSmrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
75605b261ecSmrg		    RenderErrBase + BadPicture);
75705b261ecSmrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
75805b261ecSmrg		    RenderErrBase + BadPicture);
75905b261ecSmrg    if (!pDst->pDrawable)
76005b261ecSmrg        return BadDrawable;
76105b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
76205b261ecSmrg	return BadMatch;
76305b261ecSmrg    if (stuff->maskFormat)
76405b261ecSmrg    {
76505b261ecSmrg	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
76605b261ecSmrg							  stuff->maskFormat,
76705b261ecSmrg							  PictFormatType,
76805b261ecSmrg							  DixReadAccess);
76905b261ecSmrg	if (!pFormat)
77005b261ecSmrg	{
77105b261ecSmrg	    client->errorValue = stuff->maskFormat;
77205b261ecSmrg	    return RenderErrBase + BadPictFormat;
77305b261ecSmrg	}
77405b261ecSmrg    }
77505b261ecSmrg    else
77605b261ecSmrg	pFormat = 0;
77705b261ecSmrg    ntraps = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
77805b261ecSmrg    if (ntraps % sizeof (xTrapezoid))
77905b261ecSmrg	return BadLength;
78005b261ecSmrg    ntraps /= sizeof (xTrapezoid);
78105b261ecSmrg    if (ntraps)
78205b261ecSmrg	CompositeTrapezoids (stuff->op, pSrc, pDst, pFormat,
78305b261ecSmrg			     stuff->xSrc, stuff->ySrc,
78405b261ecSmrg			     ntraps, (xTrapezoid *) &stuff[1]);
78505b261ecSmrg    return client->noClientException;
78605b261ecSmrg}
78705b261ecSmrg
78805b261ecSmrgstatic int
78905b261ecSmrgProcRenderTriangles (ClientPtr client)
79005b261ecSmrg{
79105b261ecSmrg    int		ntris;
79205b261ecSmrg    PicturePtr	pSrc, pDst;
79305b261ecSmrg    PictFormatPtr   pFormat;
79405b261ecSmrg    REQUEST(xRenderTrianglesReq);
79505b261ecSmrg
79605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
79705b261ecSmrg    if (!PictOpValid (stuff->op))
79805b261ecSmrg    {
79905b261ecSmrg	client->errorValue = stuff->op;
80005b261ecSmrg	return BadValue;
80105b261ecSmrg    }
80205b261ecSmrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
80305b261ecSmrg		    RenderErrBase + BadPicture);
80405b261ecSmrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
80505b261ecSmrg		    RenderErrBase + BadPicture);
80605b261ecSmrg    if (!pDst->pDrawable)
80705b261ecSmrg        return BadDrawable;
80805b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
80905b261ecSmrg	return BadMatch;
81005b261ecSmrg    if (stuff->maskFormat)
81105b261ecSmrg    {
81205b261ecSmrg	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
81305b261ecSmrg							  stuff->maskFormat,
81405b261ecSmrg							  PictFormatType,
81505b261ecSmrg							  DixReadAccess);
81605b261ecSmrg	if (!pFormat)
81705b261ecSmrg	{
81805b261ecSmrg	    client->errorValue = stuff->maskFormat;
81905b261ecSmrg	    return RenderErrBase + BadPictFormat;
82005b261ecSmrg	}
82105b261ecSmrg    }
82205b261ecSmrg    else
82305b261ecSmrg	pFormat = 0;
82405b261ecSmrg    ntris = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
82505b261ecSmrg    if (ntris % sizeof (xTriangle))
82605b261ecSmrg	return BadLength;
82705b261ecSmrg    ntris /= sizeof (xTriangle);
82805b261ecSmrg    if (ntris)
82905b261ecSmrg	CompositeTriangles (stuff->op, pSrc, pDst, pFormat,
83005b261ecSmrg			    stuff->xSrc, stuff->ySrc,
83105b261ecSmrg			    ntris, (xTriangle *) &stuff[1]);
83205b261ecSmrg    return client->noClientException;
83305b261ecSmrg}
83405b261ecSmrg
83505b261ecSmrgstatic int
83605b261ecSmrgProcRenderTriStrip (ClientPtr client)
83705b261ecSmrg{
83805b261ecSmrg    int		npoints;
83905b261ecSmrg    PicturePtr	pSrc, pDst;
84005b261ecSmrg    PictFormatPtr   pFormat;
84105b261ecSmrg    REQUEST(xRenderTrianglesReq);
84205b261ecSmrg
84305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
84405b261ecSmrg    if (!PictOpValid (stuff->op))
84505b261ecSmrg    {
84605b261ecSmrg	client->errorValue = stuff->op;
84705b261ecSmrg	return BadValue;
84805b261ecSmrg    }
84905b261ecSmrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
85005b261ecSmrg		    RenderErrBase + BadPicture);
85105b261ecSmrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
85205b261ecSmrg		    RenderErrBase + BadPicture);
85305b261ecSmrg    if (!pDst->pDrawable)
85405b261ecSmrg        return BadDrawable;
85505b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
85605b261ecSmrg	return BadMatch;
85705b261ecSmrg    if (stuff->maskFormat)
85805b261ecSmrg    {
85905b261ecSmrg	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
86005b261ecSmrg							  stuff->maskFormat,
86105b261ecSmrg							  PictFormatType,
86205b261ecSmrg							  DixReadAccess);
86305b261ecSmrg	if (!pFormat)
86405b261ecSmrg	{
86505b261ecSmrg	    client->errorValue = stuff->maskFormat;
86605b261ecSmrg	    return RenderErrBase + BadPictFormat;
86705b261ecSmrg	}
86805b261ecSmrg    }
86905b261ecSmrg    else
87005b261ecSmrg	pFormat = 0;
87105b261ecSmrg    npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
87205b261ecSmrg    if (npoints & 4)
87305b261ecSmrg	return(BadLength);
87405b261ecSmrg    npoints >>= 3;
87505b261ecSmrg    if (npoints >= 3)
87605b261ecSmrg	CompositeTriStrip (stuff->op, pSrc, pDst, pFormat,
87705b261ecSmrg			   stuff->xSrc, stuff->ySrc,
87805b261ecSmrg			   npoints, (xPointFixed *) &stuff[1]);
87905b261ecSmrg    return client->noClientException;
88005b261ecSmrg}
88105b261ecSmrg
88205b261ecSmrgstatic int
88305b261ecSmrgProcRenderTriFan (ClientPtr client)
88405b261ecSmrg{
88505b261ecSmrg    int		npoints;
88605b261ecSmrg    PicturePtr	pSrc, pDst;
88705b261ecSmrg    PictFormatPtr   pFormat;
88805b261ecSmrg    REQUEST(xRenderTrianglesReq);
88905b261ecSmrg
89005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
89105b261ecSmrg    if (!PictOpValid (stuff->op))
89205b261ecSmrg    {
89305b261ecSmrg	client->errorValue = stuff->op;
89405b261ecSmrg	return BadValue;
89505b261ecSmrg    }
89605b261ecSmrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
89705b261ecSmrg		    RenderErrBase + BadPicture);
89805b261ecSmrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
89905b261ecSmrg		    RenderErrBase + BadPicture);
90005b261ecSmrg    if (!pDst->pDrawable)
90105b261ecSmrg        return BadDrawable;
90205b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
90305b261ecSmrg	return BadMatch;
90405b261ecSmrg    if (stuff->maskFormat)
90505b261ecSmrg    {
90605b261ecSmrg	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
90705b261ecSmrg							  stuff->maskFormat,
90805b261ecSmrg							  PictFormatType,
90905b261ecSmrg							  DixReadAccess);
91005b261ecSmrg	if (!pFormat)
91105b261ecSmrg	{
91205b261ecSmrg	    client->errorValue = stuff->maskFormat;
91305b261ecSmrg	    return RenderErrBase + BadPictFormat;
91405b261ecSmrg	}
91505b261ecSmrg    }
91605b261ecSmrg    else
91705b261ecSmrg	pFormat = 0;
91805b261ecSmrg    npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
91905b261ecSmrg    if (npoints & 4)
92005b261ecSmrg	return(BadLength);
92105b261ecSmrg    npoints >>= 3;
92205b261ecSmrg    if (npoints >= 3)
92305b261ecSmrg	CompositeTriFan (stuff->op, pSrc, pDst, pFormat,
92405b261ecSmrg			 stuff->xSrc, stuff->ySrc,
92505b261ecSmrg			 npoints, (xPointFixed *) &stuff[1]);
92605b261ecSmrg    return client->noClientException;
92705b261ecSmrg}
92805b261ecSmrg
92905b261ecSmrgstatic int
93005b261ecSmrgProcRenderColorTrapezoids (ClientPtr client)
93105b261ecSmrg{
93205b261ecSmrg    return BadImplementation;
93305b261ecSmrg}
93405b261ecSmrg
93505b261ecSmrgstatic int
93605b261ecSmrgProcRenderColorTriangles (ClientPtr client)
93705b261ecSmrg{
93805b261ecSmrg    return BadImplementation;
93905b261ecSmrg}
94005b261ecSmrg
94105b261ecSmrgstatic int
94205b261ecSmrgProcRenderTransform (ClientPtr client)
94305b261ecSmrg{
94405b261ecSmrg    return BadImplementation;
94505b261ecSmrg}
94605b261ecSmrg
94705b261ecSmrgstatic int
94805b261ecSmrgProcRenderCreateGlyphSet (ClientPtr client)
94905b261ecSmrg{
95005b261ecSmrg    GlyphSetPtr	    glyphSet;
95105b261ecSmrg    PictFormatPtr   format;
9524642e01fSmrg    int		    rc, f;
95305b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
95405b261ecSmrg
95505b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
95605b261ecSmrg
95705b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
95805b261ecSmrg    format = (PictFormatPtr) SecurityLookupIDByType (client,
95905b261ecSmrg						     stuff->format,
96005b261ecSmrg						     PictFormatType,
96105b261ecSmrg						     DixReadAccess);
96205b261ecSmrg    if (!format)
96305b261ecSmrg    {
96405b261ecSmrg	client->errorValue = stuff->format;
96505b261ecSmrg	return RenderErrBase + BadPictFormat;
96605b261ecSmrg    }
96705b261ecSmrg    switch (format->depth) {
96805b261ecSmrg    case 1:
96905b261ecSmrg	f = GlyphFormat1;
97005b261ecSmrg	break;
97105b261ecSmrg    case 4:
97205b261ecSmrg	f = GlyphFormat4;
97305b261ecSmrg	break;
97405b261ecSmrg    case 8:
97505b261ecSmrg	f = GlyphFormat8;
97605b261ecSmrg	break;
97705b261ecSmrg    case 16:
97805b261ecSmrg	f = GlyphFormat16;
97905b261ecSmrg	break;
98005b261ecSmrg    case 32:
98105b261ecSmrg	f = GlyphFormat32;
98205b261ecSmrg	break;
98305b261ecSmrg    default:
98405b261ecSmrg	return BadMatch;
98505b261ecSmrg    }
98605b261ecSmrg    if (format->type != PictTypeDirect)
98705b261ecSmrg	return BadMatch;
98805b261ecSmrg    glyphSet = AllocateGlyphSet (f, format);
98905b261ecSmrg    if (!glyphSet)
99005b261ecSmrg	return BadAlloc;
9914642e01fSmrg    /* security creation/labeling check */
9924642e01fSmrg    rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType,
9934642e01fSmrg		  glyphSet, RT_NONE, NULL, DixCreateAccess);
9944642e01fSmrg    if (rc != Success)
9954642e01fSmrg	return rc;
99605b261ecSmrg    if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
99705b261ecSmrg	return BadAlloc;
99805b261ecSmrg    return Success;
99905b261ecSmrg}
100005b261ecSmrg
100105b261ecSmrgstatic int
100205b261ecSmrgProcRenderReferenceGlyphSet (ClientPtr client)
100305b261ecSmrg{
100405b261ecSmrg    GlyphSetPtr     glyphSet;
10054642e01fSmrg    int rc;
100605b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
100705b261ecSmrg
100805b261ecSmrg    REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
100905b261ecSmrg
101005b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
101105b261ecSmrg
10124642e01fSmrg    rc = dixLookupResource((pointer *)&glyphSet, stuff->existing, GlyphSetType,
10134642e01fSmrg			   client, DixGetAttrAccess);
10144642e01fSmrg    if (rc != Success)
101505b261ecSmrg    {
101605b261ecSmrg	client->errorValue = stuff->existing;
10174642e01fSmrg	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
101805b261ecSmrg    }
101905b261ecSmrg    glyphSet->refcnt++;
102005b261ecSmrg    if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
102105b261ecSmrg	return BadAlloc;
102205b261ecSmrg    return client->noClientException;
102305b261ecSmrg}
102405b261ecSmrg
102505b261ecSmrg#define NLOCALDELTA	64
102605b261ecSmrg#define NLOCALGLYPH	256
102705b261ecSmrg
102805b261ecSmrgstatic int
102905b261ecSmrgProcRenderFreeGlyphSet (ClientPtr client)
103005b261ecSmrg{
103105b261ecSmrg    GlyphSetPtr     glyphSet;
10324642e01fSmrg    int rc;
103305b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
103405b261ecSmrg
103505b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
10364642e01fSmrg    rc = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
10374642e01fSmrg			   client, DixDestroyAccess);
10384642e01fSmrg    if (rc != Success)
103905b261ecSmrg    {
104005b261ecSmrg	client->errorValue = stuff->glyphset;
10414642e01fSmrg	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
104205b261ecSmrg    }
104305b261ecSmrg    FreeResource (stuff->glyphset, RT_NONE);
104405b261ecSmrg    return client->noClientException;
104505b261ecSmrg}
104605b261ecSmrg
104705b261ecSmrgtypedef struct _GlyphNew {
10484642e01fSmrg    Glyph	    id;
10494642e01fSmrg    GlyphPtr        glyph;
10504642e01fSmrg    Bool	    found;
10514642e01fSmrg    unsigned char   sha1[20];
105205b261ecSmrg} GlyphNewRec, *GlyphNewPtr;
105305b261ecSmrg
10544642e01fSmrg#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
10554642e01fSmrg
105605b261ecSmrgstatic int
105705b261ecSmrgProcRenderAddGlyphs (ClientPtr client)
105805b261ecSmrg{
105905b261ecSmrg    GlyphSetPtr     glyphSet;
106005b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
106105b261ecSmrg    GlyphNewRec	    glyphsLocal[NLOCALGLYPH];
10624642e01fSmrg    GlyphNewPtr	    glyphsBase, glyphs, glyph_new;
106305b261ecSmrg    int		    remain, nglyphs;
106405b261ecSmrg    CARD32	    *gids;
106505b261ecSmrg    xGlyphInfo	    *gi;
106605b261ecSmrg    CARD8	    *bits;
106705b261ecSmrg    int		    size;
10684642e01fSmrg    int		    err;
10694642e01fSmrg    int		    i, screen;
10704642e01fSmrg    PicturePtr	    pSrc = NULL, pDst = NULL;
10714642e01fSmrg    PixmapPtr	    pSrcPix = NULL, pDstPix = NULL;
10724642e01fSmrg    CARD32	    component_alpha;
107305b261ecSmrg
107405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
10754642e01fSmrg    err = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
10764642e01fSmrg			    client, DixAddAccess);
10774642e01fSmrg    if (err != Success)
107805b261ecSmrg    {
107905b261ecSmrg	client->errorValue = stuff->glyphset;
10804642e01fSmrg	return (err == BadValue) ? RenderErrBase + BadGlyphSet : err;
108105b261ecSmrg    }
108205b261ecSmrg
10834642e01fSmrg    err = BadAlloc;
108405b261ecSmrg    nglyphs = stuff->nglyphs;
108505b261ecSmrg    if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec))
108605b261ecSmrg	    return BadAlloc;
108705b261ecSmrg
10884642e01fSmrg    component_alpha = NeedsComponent (glyphSet->format->format);
10894642e01fSmrg
10904642e01fSmrg    if (nglyphs <= NLOCALGLYPH) {
10914642e01fSmrg	memset (glyphsLocal, 0, sizeof (glyphsLocal));
109205b261ecSmrg	glyphsBase = glyphsLocal;
10934642e01fSmrg    }
109405b261ecSmrg    else
109505b261ecSmrg    {
10964642e01fSmrg	glyphsBase = (GlyphNewPtr) Xcalloc (nglyphs * sizeof (GlyphNewRec));
109705b261ecSmrg	if (!glyphsBase)
109805b261ecSmrg	    return BadAlloc;
109905b261ecSmrg    }
110005b261ecSmrg
110105b261ecSmrg    remain = (client->req_len << 2) - sizeof (xRenderAddGlyphsReq);
110205b261ecSmrg
110305b261ecSmrg    glyphs = glyphsBase;
110405b261ecSmrg
110505b261ecSmrg    gids = (CARD32 *) (stuff + 1);
110605b261ecSmrg    gi = (xGlyphInfo *) (gids + nglyphs);
110705b261ecSmrg    bits = (CARD8 *) (gi + nglyphs);
110805b261ecSmrg    remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs;
11094642e01fSmrg    for (i = 0; i < nglyphs; i++)
111005b261ecSmrg    {
11114642e01fSmrg	size_t padded_width;
11124642e01fSmrg	glyph_new = &glyphs[i];
11134642e01fSmrg
11144642e01fSmrg	padded_width = PixmapBytePad (gi[i].width,
11154642e01fSmrg				      glyphSet->format->depth);
11164642e01fSmrg
11174642e01fSmrg	if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height)
11184642e01fSmrg	    break;
111905b261ecSmrg
11204642e01fSmrg	size = gi[i].height * padded_width;
112105b261ecSmrg	if (remain < size)
112205b261ecSmrg	    break;
11234642e01fSmrg
11244642e01fSmrg	err = HashGlyph (&gi[i], bits, size, glyph_new->sha1);
11254642e01fSmrg	if (err)
11264642e01fSmrg	    goto bail;
11274642e01fSmrg
11284642e01fSmrg	glyph_new->glyph = FindGlyphByHash (glyph_new->sha1,
11294642e01fSmrg					    glyphSet->fdepth);
11304642e01fSmrg
11314642e01fSmrg	if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph)
11324642e01fSmrg	{
11334642e01fSmrg	    glyph_new->found = TRUE;
11344642e01fSmrg	}
11354642e01fSmrg	else
11364642e01fSmrg	{
11374642e01fSmrg	    GlyphPtr glyph;
11384642e01fSmrg
11394642e01fSmrg	    glyph_new->found = FALSE;
11404642e01fSmrg	    glyph_new->glyph = glyph = AllocateGlyph (&gi[i], glyphSet->fdepth);
11414642e01fSmrg	    if (! glyph)
11424642e01fSmrg	    {
11434642e01fSmrg		err = BadAlloc;
11444642e01fSmrg		goto bail;
11454642e01fSmrg	    }
11464642e01fSmrg
11474642e01fSmrg	    for (screen = 0; screen < screenInfo.numScreens; screen++)
11484642e01fSmrg	    {
11494642e01fSmrg		int	    width = gi[i].width;
11504642e01fSmrg		int	    height = gi[i].height;
11514642e01fSmrg		int	    depth = glyphSet->format->depth;
11524642e01fSmrg		ScreenPtr   pScreen;
11534642e01fSmrg		int	    error;
11544642e01fSmrg
11554642e01fSmrg		pScreen = screenInfo.screens[screen];
11564642e01fSmrg		pSrcPix = GetScratchPixmapHeader (pScreen,
11574642e01fSmrg						  width, height,
11584642e01fSmrg						  depth, depth,
11594642e01fSmrg						  -1, bits);
11604642e01fSmrg		if (! pSrcPix)
11614642e01fSmrg		{
11624642e01fSmrg		    err = BadAlloc;
11634642e01fSmrg		    goto bail;
11644642e01fSmrg		}
11654642e01fSmrg
11664642e01fSmrg		pSrc = CreatePicture (0, &pSrcPix->drawable,
11674642e01fSmrg				      glyphSet->format, 0, NULL,
11684642e01fSmrg				      serverClient, &error);
11694642e01fSmrg		if (! pSrc)
11704642e01fSmrg		{
11714642e01fSmrg		    err = BadAlloc;
11724642e01fSmrg		    goto bail;
11734642e01fSmrg		}
11744642e01fSmrg
11754642e01fSmrg		pDstPix = (pScreen->CreatePixmap) (pScreen,
11764642e01fSmrg						   width, height, depth,
11774642e01fSmrg						   CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
11784642e01fSmrg
11794642e01fSmrg		GlyphPicture (glyph)[screen] = pDst =
11804642e01fSmrg			CreatePicture (0, &pDstPix->drawable,
11814642e01fSmrg				       glyphSet->format,
11824642e01fSmrg				       CPComponentAlpha, &component_alpha,
11834642e01fSmrg				       serverClient, &error);
11844642e01fSmrg
11854642e01fSmrg		/* The picture takes a reference to the pixmap, so we
11864642e01fSmrg		   drop ours. */
11874642e01fSmrg		(pScreen->DestroyPixmap) (pDstPix);
11884642e01fSmrg
11894642e01fSmrg		if (! pDst)
11904642e01fSmrg		{
11914642e01fSmrg		    err = BadAlloc;
11924642e01fSmrg		    goto bail;
11934642e01fSmrg		}
11944642e01fSmrg
11954642e01fSmrg		CompositePicture (PictOpSrc,
11964642e01fSmrg				  pSrc,
11974642e01fSmrg				  None,
11984642e01fSmrg				  pDst,
11994642e01fSmrg				  0, 0,
12004642e01fSmrg				  0, 0,
12014642e01fSmrg				  0, 0,
12024642e01fSmrg				  width, height);
12034642e01fSmrg
12044642e01fSmrg		FreePicture ((pointer) pSrc, 0);
12054642e01fSmrg		pSrc = NULL;
12064642e01fSmrg		FreeScratchPixmapHeader (pSrcPix);
12074642e01fSmrg		pSrcPix = NULL;
12084642e01fSmrg	    }
12094642e01fSmrg
12104642e01fSmrg	    memcpy (glyph_new->glyph->sha1, glyph_new->sha1, 20);
12114642e01fSmrg	}
12124642e01fSmrg
12134642e01fSmrg	glyph_new->id = gids[i];
121405b261ecSmrg
121505b261ecSmrg	if (size & 3)
121605b261ecSmrg	    size += 4 - (size & 3);
121705b261ecSmrg	bits += size;
121805b261ecSmrg	remain -= size;
121905b261ecSmrg    }
12204642e01fSmrg    if (remain || i < nglyphs)
122105b261ecSmrg    {
122205b261ecSmrg	err = BadLength;
122305b261ecSmrg	goto bail;
122405b261ecSmrg    }
122505b261ecSmrg    if (!ResizeGlyphSet (glyphSet, nglyphs))
122605b261ecSmrg    {
122705b261ecSmrg	err = BadAlloc;
122805b261ecSmrg	goto bail;
122905b261ecSmrg    }
12304642e01fSmrg    for (i = 0; i < nglyphs; i++)
12314642e01fSmrg	AddGlyph (glyphSet, glyphs[i].glyph, glyphs[i].id);
123205b261ecSmrg
123305b261ecSmrg    if (glyphsBase != glyphsLocal)
123405b261ecSmrg	Xfree (glyphsBase);
123505b261ecSmrg    return client->noClientException;
123605b261ecSmrgbail:
12374642e01fSmrg    if (pSrc)
12384642e01fSmrg	FreePicture ((pointer) pSrc, 0);
12394642e01fSmrg    if (pSrcPix)
12404642e01fSmrg	FreeScratchPixmapHeader (pSrcPix);
12414642e01fSmrg    for (i = 0; i < nglyphs; i++)
12424642e01fSmrg	if (glyphs[i].glyph && ! glyphs[i].found)
12434642e01fSmrg	    xfree (glyphs[i].glyph);
124405b261ecSmrg    if (glyphsBase != glyphsLocal)
124505b261ecSmrg	Xfree (glyphsBase);
124605b261ecSmrg    return err;
124705b261ecSmrg}
124805b261ecSmrg
124905b261ecSmrgstatic int
125005b261ecSmrgProcRenderAddGlyphsFromPicture (ClientPtr client)
125105b261ecSmrg{
125205b261ecSmrg    return BadImplementation;
125305b261ecSmrg}
125405b261ecSmrg
125505b261ecSmrgstatic int
125605b261ecSmrgProcRenderFreeGlyphs (ClientPtr client)
125705b261ecSmrg{
125805b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
125905b261ecSmrg    GlyphSetPtr     glyphSet;
12604642e01fSmrg    int		    rc, nglyph;
126105b261ecSmrg    CARD32	    *gids;
126205b261ecSmrg    CARD32	    glyph;
126305b261ecSmrg
126405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
12654642e01fSmrg    rc = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
12664642e01fSmrg			   client, DixRemoveAccess);
12674642e01fSmrg    if (rc != Success)
126805b261ecSmrg    {
126905b261ecSmrg	client->errorValue = stuff->glyphset;
12704642e01fSmrg	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
127105b261ecSmrg    }
127205b261ecSmrg    nglyph = ((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq)) >> 2;
127305b261ecSmrg    gids = (CARD32 *) (stuff + 1);
127405b261ecSmrg    while (nglyph-- > 0)
127505b261ecSmrg    {
127605b261ecSmrg	glyph = *gids++;
127705b261ecSmrg	if (!DeleteGlyph (glyphSet, glyph))
127805b261ecSmrg	{
127905b261ecSmrg	    client->errorValue = glyph;
128005b261ecSmrg	    return RenderErrBase + BadGlyph;
128105b261ecSmrg	}
128205b261ecSmrg    }
128305b261ecSmrg    return client->noClientException;
128405b261ecSmrg}
128505b261ecSmrg
128605b261ecSmrgstatic int
128705b261ecSmrgProcRenderCompositeGlyphs (ClientPtr client)
128805b261ecSmrg{
128905b261ecSmrg    GlyphSetPtr     glyphSet;
129005b261ecSmrg    GlyphSet	    gs;
129105b261ecSmrg    PicturePtr      pSrc, pDst;
129205b261ecSmrg    PictFormatPtr   pFormat;
129305b261ecSmrg    GlyphListRec    listsLocal[NLOCALDELTA];
129405b261ecSmrg    GlyphListPtr    lists, listsBase;
129505b261ecSmrg    GlyphPtr	    glyphsLocal[NLOCALGLYPH];
129605b261ecSmrg    Glyph	    glyph;
129705b261ecSmrg    GlyphPtr	    *glyphs, *glyphsBase;
129805b261ecSmrg    xGlyphElt	    *elt;
129905b261ecSmrg    CARD8	    *buffer, *end;
130005b261ecSmrg    int		    nglyph;
130105b261ecSmrg    int		    nlist;
130205b261ecSmrg    int		    space;
130305b261ecSmrg    int		    size;
130405b261ecSmrg    int		    n;
130505b261ecSmrg
130605b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
130705b261ecSmrg
130805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
130905b261ecSmrg
131005b261ecSmrg    switch (stuff->renderReqType) {
131105b261ecSmrg    default:			    size = 1; break;
131205b261ecSmrg    case X_RenderCompositeGlyphs16: size = 2; break;
131305b261ecSmrg    case X_RenderCompositeGlyphs32: size = 4; break;
131405b261ecSmrg    }
131505b261ecSmrg
131605b261ecSmrg    if (!PictOpValid (stuff->op))
131705b261ecSmrg    {
131805b261ecSmrg	client->errorValue = stuff->op;
131905b261ecSmrg	return BadValue;
132005b261ecSmrg    }
132105b261ecSmrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
132205b261ecSmrg		    RenderErrBase + BadPicture);
132305b261ecSmrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
132405b261ecSmrg		    RenderErrBase + BadPicture);
132505b261ecSmrg    if (!pDst->pDrawable)
132605b261ecSmrg        return BadDrawable;
132705b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
132805b261ecSmrg	return BadMatch;
132905b261ecSmrg    if (stuff->maskFormat)
133005b261ecSmrg    {
133105b261ecSmrg	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
133205b261ecSmrg							  stuff->maskFormat,
133305b261ecSmrg							  PictFormatType,
133405b261ecSmrg							  DixReadAccess);
133505b261ecSmrg	if (!pFormat)
133605b261ecSmrg	{
133705b261ecSmrg	    client->errorValue = stuff->maskFormat;
133805b261ecSmrg	    return RenderErrBase + BadPictFormat;
133905b261ecSmrg	}
134005b261ecSmrg    }
134105b261ecSmrg    else
134205b261ecSmrg	pFormat = 0;
134305b261ecSmrg
134405b261ecSmrg    glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
134505b261ecSmrg						     stuff->glyphset,
134605b261ecSmrg						     GlyphSetType,
13474642e01fSmrg						     DixUseAccess);
134805b261ecSmrg    if (!glyphSet)
134905b261ecSmrg    {
135005b261ecSmrg	client->errorValue = stuff->glyphset;
135105b261ecSmrg	return RenderErrBase + BadGlyphSet;
135205b261ecSmrg    }
135305b261ecSmrg
135405b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
135505b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
135605b261ecSmrg    nglyph = 0;
135705b261ecSmrg    nlist = 0;
135805b261ecSmrg    while (buffer + sizeof (xGlyphElt) < end)
135905b261ecSmrg    {
136005b261ecSmrg	elt = (xGlyphElt *) buffer;
136105b261ecSmrg	buffer += sizeof (xGlyphElt);
136205b261ecSmrg
136305b261ecSmrg	if (elt->len == 0xff)
136405b261ecSmrg	{
136505b261ecSmrg	    buffer += 4;
136605b261ecSmrg	}
136705b261ecSmrg	else
136805b261ecSmrg	{
136905b261ecSmrg	    nlist++;
137005b261ecSmrg	    nglyph += elt->len;
137105b261ecSmrg	    space = size * elt->len;
137205b261ecSmrg	    if (space & 3)
137305b261ecSmrg		space += 4 - (space & 3);
137405b261ecSmrg	    buffer += space;
137505b261ecSmrg	}
137605b261ecSmrg    }
137705b261ecSmrg    if (nglyph <= NLOCALGLYPH)
137805b261ecSmrg	glyphsBase = glyphsLocal;
137905b261ecSmrg    else
138005b261ecSmrg    {
13814642e01fSmrg	glyphsBase = (GlyphPtr *) xalloc (nglyph * sizeof (GlyphPtr));
138205b261ecSmrg	if (!glyphsBase)
138305b261ecSmrg	    return BadAlloc;
138405b261ecSmrg    }
138505b261ecSmrg    if (nlist <= NLOCALDELTA)
138605b261ecSmrg	listsBase = listsLocal;
138705b261ecSmrg    else
138805b261ecSmrg    {
13894642e01fSmrg	listsBase = (GlyphListPtr) xalloc (nlist * sizeof (GlyphListRec));
139005b261ecSmrg	if (!listsBase)
139105b261ecSmrg	    return BadAlloc;
139205b261ecSmrg    }
139305b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
139405b261ecSmrg    glyphs = glyphsBase;
139505b261ecSmrg    lists = listsBase;
139605b261ecSmrg    while (buffer + sizeof (xGlyphElt) < end)
139705b261ecSmrg    {
139805b261ecSmrg	elt = (xGlyphElt *) buffer;
139905b261ecSmrg	buffer += sizeof (xGlyphElt);
140005b261ecSmrg
140105b261ecSmrg	if (elt->len == 0xff)
140205b261ecSmrg	{
140305b261ecSmrg	    if (buffer + sizeof (GlyphSet) < end)
140405b261ecSmrg	    {
140505b261ecSmrg                memcpy(&gs, buffer, sizeof(GlyphSet));
140605b261ecSmrg		glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
140705b261ecSmrg								 gs,
140805b261ecSmrg								 GlyphSetType,
14094642e01fSmrg								 DixUseAccess);
141005b261ecSmrg		if (!glyphSet)
141105b261ecSmrg		{
141205b261ecSmrg		    client->errorValue = gs;
141305b261ecSmrg		    if (glyphsBase != glyphsLocal)
14144642e01fSmrg			xfree (glyphsBase);
141505b261ecSmrg		    if (listsBase != listsLocal)
14164642e01fSmrg			xfree (listsBase);
141705b261ecSmrg		    return RenderErrBase + BadGlyphSet;
141805b261ecSmrg		}
141905b261ecSmrg	    }
142005b261ecSmrg	    buffer += 4;
142105b261ecSmrg	}
142205b261ecSmrg	else
142305b261ecSmrg	{
142405b261ecSmrg	    lists->xOff = elt->deltax;
142505b261ecSmrg	    lists->yOff = elt->deltay;
142605b261ecSmrg	    lists->format = glyphSet->format;
142705b261ecSmrg	    lists->len = 0;
142805b261ecSmrg	    n = elt->len;
142905b261ecSmrg	    while (n--)
143005b261ecSmrg	    {
143105b261ecSmrg		if (buffer + size <= end)
143205b261ecSmrg		{
143305b261ecSmrg		    switch (size) {
143405b261ecSmrg		    case 1:
143505b261ecSmrg			glyph = *((CARD8 *)buffer); break;
143605b261ecSmrg		    case 2:
143705b261ecSmrg			glyph = *((CARD16 *)buffer); break;
143805b261ecSmrg		    case 4:
143905b261ecSmrg		    default:
144005b261ecSmrg			glyph = *((CARD32 *)buffer); break;
144105b261ecSmrg		    }
144205b261ecSmrg		    if ((*glyphs = FindGlyph (glyphSet, glyph)))
144305b261ecSmrg		    {
144405b261ecSmrg			lists->len++;
144505b261ecSmrg			glyphs++;
144605b261ecSmrg		    }
144705b261ecSmrg		}
144805b261ecSmrg		buffer += size;
144905b261ecSmrg	    }
145005b261ecSmrg	    space = size * elt->len;
145105b261ecSmrg	    if (space & 3)
145205b261ecSmrg		buffer += 4 - (space & 3);
145305b261ecSmrg	    lists++;
145405b261ecSmrg	}
145505b261ecSmrg    }
145605b261ecSmrg    if (buffer > end)
145705b261ecSmrg	return BadLength;
145805b261ecSmrg
145905b261ecSmrg    CompositeGlyphs (stuff->op,
146005b261ecSmrg		     pSrc,
146105b261ecSmrg		     pDst,
146205b261ecSmrg		     pFormat,
146305b261ecSmrg		     stuff->xSrc,
146405b261ecSmrg		     stuff->ySrc,
146505b261ecSmrg		     nlist,
146605b261ecSmrg		     listsBase,
146705b261ecSmrg		     glyphsBase);
146805b261ecSmrg
146905b261ecSmrg    if (glyphsBase != glyphsLocal)
14704642e01fSmrg	xfree (glyphsBase);
147105b261ecSmrg    if (listsBase != listsLocal)
14724642e01fSmrg	xfree (listsBase);
147305b261ecSmrg
147405b261ecSmrg    return client->noClientException;
147505b261ecSmrg}
147605b261ecSmrg
147705b261ecSmrgstatic int
147805b261ecSmrgProcRenderFillRectangles (ClientPtr client)
147905b261ecSmrg{
148005b261ecSmrg    PicturePtr	    pDst;
148105b261ecSmrg    int             things;
148205b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
148305b261ecSmrg
148405b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
148505b261ecSmrg    if (!PictOpValid (stuff->op))
148605b261ecSmrg    {
148705b261ecSmrg	client->errorValue = stuff->op;
148805b261ecSmrg	return BadValue;
148905b261ecSmrg    }
149005b261ecSmrg    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
149105b261ecSmrg		    RenderErrBase + BadPicture);
149205b261ecSmrg    if (!pDst->pDrawable)
149305b261ecSmrg        return BadDrawable;
149405b261ecSmrg
149505b261ecSmrg    things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
149605b261ecSmrg    if (things & 4)
149705b261ecSmrg	return(BadLength);
149805b261ecSmrg    things >>= 3;
149905b261ecSmrg
150005b261ecSmrg    CompositeRects (stuff->op,
150105b261ecSmrg		    pDst,
150205b261ecSmrg		    &stuff->color,
150305b261ecSmrg		    things,
150405b261ecSmrg		    (xRectangle *) &stuff[1]);
150505b261ecSmrg
150605b261ecSmrg    return client->noClientException;
150705b261ecSmrg}
150805b261ecSmrg
150905b261ecSmrgstatic void
151005b261ecSmrgSetBit (unsigned char *line, int x, int bit)
151105b261ecSmrg{
151205b261ecSmrg    unsigned char   mask;
151305b261ecSmrg
151405b261ecSmrg    if (screenInfo.bitmapBitOrder == LSBFirst)
151505b261ecSmrg	mask = (1 << (x & 7));
151605b261ecSmrg    else
151705b261ecSmrg	mask = (0x80 >> (x & 7));
151805b261ecSmrg    /* XXX assumes byte order is host byte order */
151905b261ecSmrg    line += (x >> 3);
152005b261ecSmrg    if (bit)
152105b261ecSmrg	*line |= mask;
152205b261ecSmrg    else
152305b261ecSmrg	*line &= ~mask;
152405b261ecSmrg}
152505b261ecSmrg
152605b261ecSmrg#define DITHER_DIM 2
152705b261ecSmrg
152805b261ecSmrgstatic CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = {
152905b261ecSmrg    {  1,  3,  },
153005b261ecSmrg    {  4,  2,  },
153105b261ecSmrg};
153205b261ecSmrg
153305b261ecSmrg#define DITHER_SIZE  ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1)
153405b261ecSmrg
153505b261ecSmrgstatic int
153605b261ecSmrgProcRenderCreateCursor (ClientPtr client)
153705b261ecSmrg{
153805b261ecSmrg    REQUEST(xRenderCreateCursorReq);
153905b261ecSmrg    PicturePtr	    pSrc;
154005b261ecSmrg    ScreenPtr	    pScreen;
154105b261ecSmrg    unsigned short  width, height;
154205b261ecSmrg    CARD32	    *argbbits, *argb;
154305b261ecSmrg    unsigned char   *srcbits, *srcline;
154405b261ecSmrg    unsigned char   *mskbits, *mskline;
154505b261ecSmrg    int		    stride;
154605b261ecSmrg    int		    x, y;
154705b261ecSmrg    int		    nbytes_mono;
154805b261ecSmrg    CursorMetricRec cm;
154905b261ecSmrg    CursorPtr	    pCursor;
155005b261ecSmrg    CARD32	    twocolor[3];
15514642e01fSmrg    int		    rc, ncolor;
155205b261ecSmrg
155305b261ecSmrg    REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
155405b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
155505b261ecSmrg
155605b261ecSmrg    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
155705b261ecSmrg		    RenderErrBase + BadPicture);
155805b261ecSmrg    if (!pSrc->pDrawable)
155905b261ecSmrg        return BadDrawable;
156005b261ecSmrg    pScreen = pSrc->pDrawable->pScreen;
156105b261ecSmrg    width = pSrc->pDrawable->width;
156205b261ecSmrg    height = pSrc->pDrawable->height;
156305b261ecSmrg    if (height && width > UINT32_MAX/(height*sizeof(CARD32)))
156405b261ecSmrg	return BadAlloc;
156505b261ecSmrg    if ( stuff->x > width
156605b261ecSmrg      || stuff->y > height )
156705b261ecSmrg	return (BadMatch);
156805b261ecSmrg    argbbits = xalloc (width * height * sizeof (CARD32));
156905b261ecSmrg    if (!argbbits)
157005b261ecSmrg	return (BadAlloc);
157105b261ecSmrg
157205b261ecSmrg    stride = BitmapBytePad(width);
157305b261ecSmrg    nbytes_mono = stride*height;
15744642e01fSmrg    srcbits = xcalloc(1, nbytes_mono);
157505b261ecSmrg    if (!srcbits)
157605b261ecSmrg    {
157705b261ecSmrg	xfree (argbbits);
157805b261ecSmrg	return (BadAlloc);
157905b261ecSmrg    }
15804642e01fSmrg    mskbits = xcalloc(1, nbytes_mono);
158105b261ecSmrg    if (!mskbits)
158205b261ecSmrg    {
158305b261ecSmrg	xfree(argbbits);
158405b261ecSmrg	xfree(srcbits);
158505b261ecSmrg	return (BadAlloc);
158605b261ecSmrg    }
158705b261ecSmrg
158805b261ecSmrg    if (pSrc->format == PICT_a8r8g8b8)
158905b261ecSmrg    {
159005b261ecSmrg	(*pScreen->GetImage) (pSrc->pDrawable,
159105b261ecSmrg			      0, 0, width, height, ZPixmap,
159205b261ecSmrg			      0xffffffff, (pointer) argbbits);
159305b261ecSmrg    }
159405b261ecSmrg    else
159505b261ecSmrg    {
159605b261ecSmrg	PixmapPtr	pPixmap;
159705b261ecSmrg	PicturePtr	pPicture;
159805b261ecSmrg	PictFormatPtr	pFormat;
159905b261ecSmrg	int		error;
160005b261ecSmrg
160105b261ecSmrg	pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8);
160205b261ecSmrg	if (!pFormat)
160305b261ecSmrg	{
160405b261ecSmrg	    xfree (argbbits);
160505b261ecSmrg	    xfree (srcbits);
160605b261ecSmrg	    xfree (mskbits);
160705b261ecSmrg	    return (BadImplementation);
160805b261ecSmrg	}
16094642e01fSmrg	pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
16104642e01fSmrg					    CREATE_PIXMAP_USAGE_SCRATCH);
161105b261ecSmrg	if (!pPixmap)
161205b261ecSmrg	{
161305b261ecSmrg	    xfree (argbbits);
161405b261ecSmrg	    xfree (srcbits);
161505b261ecSmrg	    xfree (mskbits);
161605b261ecSmrg	    return (BadAlloc);
161705b261ecSmrg	}
161805b261ecSmrg	pPicture = CreatePicture (0, &pPixmap->drawable, pFormat, 0, 0,
161905b261ecSmrg				  client, &error);
162005b261ecSmrg	if (!pPicture)
162105b261ecSmrg	{
162205b261ecSmrg	    xfree (argbbits);
162305b261ecSmrg	    xfree (srcbits);
162405b261ecSmrg	    xfree (mskbits);
162505b261ecSmrg	    return error;
162605b261ecSmrg	}
162705b261ecSmrg	(*pScreen->DestroyPixmap) (pPixmap);
162805b261ecSmrg	CompositePicture (PictOpSrc,
162905b261ecSmrg			  pSrc, 0, pPicture,
163005b261ecSmrg			  0, 0, 0, 0, 0, 0, width, height);
163105b261ecSmrg	(*pScreen->GetImage) (pPicture->pDrawable,
163205b261ecSmrg			      0, 0, width, height, ZPixmap,
163305b261ecSmrg			      0xffffffff, (pointer) argbbits);
163405b261ecSmrg	FreePicture (pPicture, 0);
163505b261ecSmrg    }
163605b261ecSmrg    /*
163705b261ecSmrg     * Check whether the cursor can be directly supported by
163805b261ecSmrg     * the core cursor code
163905b261ecSmrg     */
164005b261ecSmrg    ncolor = 0;
164105b261ecSmrg    argb = argbbits;
164205b261ecSmrg    for (y = 0; ncolor <= 2 && y < height; y++)
164305b261ecSmrg    {
164405b261ecSmrg	for (x = 0; ncolor <= 2 && x < width; x++)
164505b261ecSmrg	{
164605b261ecSmrg	    CARD32  p = *argb++;
164705b261ecSmrg	    CARD32  a = (p >> 24);
164805b261ecSmrg
164905b261ecSmrg	    if (a == 0)	    /* transparent */
165005b261ecSmrg		continue;
165105b261ecSmrg	    if (a == 0xff)  /* opaque */
165205b261ecSmrg	    {
165305b261ecSmrg		int n;
165405b261ecSmrg		for (n = 0; n < ncolor; n++)
165505b261ecSmrg		    if (p == twocolor[n])
165605b261ecSmrg			break;
165705b261ecSmrg		if (n == ncolor)
165805b261ecSmrg		    twocolor[ncolor++] = p;
165905b261ecSmrg	    }
166005b261ecSmrg	    else
166105b261ecSmrg		ncolor = 3;
166205b261ecSmrg	}
166305b261ecSmrg    }
166405b261ecSmrg
166505b261ecSmrg    /*
166605b261ecSmrg     * Convert argb image to two plane cursor
166705b261ecSmrg     */
166805b261ecSmrg    srcline = srcbits;
166905b261ecSmrg    mskline = mskbits;
167005b261ecSmrg    argb = argbbits;
167105b261ecSmrg    for (y = 0; y < height; y++)
167205b261ecSmrg    {
167305b261ecSmrg	for (x = 0; x < width; x++)
167405b261ecSmrg	{
167505b261ecSmrg	    CARD32  p = *argb++;
167605b261ecSmrg
167705b261ecSmrg	    if (ncolor <= 2)
167805b261ecSmrg	    {
167905b261ecSmrg		CARD32	a = ((p >> 24));
168005b261ecSmrg
168105b261ecSmrg		SetBit (mskline, x, a != 0);
168205b261ecSmrg		SetBit (srcline, x, a != 0 && p == twocolor[0]);
168305b261ecSmrg	    }
168405b261ecSmrg	    else
168505b261ecSmrg	    {
168605b261ecSmrg		CARD32	a = ((p >> 24) * DITHER_SIZE + 127) / 255;
168705b261ecSmrg		CARD32	i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255;
168805b261ecSmrg		CARD32	d = orderedDither[y&(DITHER_DIM-1)][x&(DITHER_DIM-1)];
168905b261ecSmrg		/* Set mask from dithered alpha value */
169005b261ecSmrg		SetBit(mskline, x, a > d);
169105b261ecSmrg		/* Set src from dithered intensity value */
169205b261ecSmrg		SetBit(srcline, x, a > d && i <= d);
169305b261ecSmrg	    }
169405b261ecSmrg	}
169505b261ecSmrg	srcline += stride;
169605b261ecSmrg	mskline += stride;
169705b261ecSmrg    }
169805b261ecSmrg    /*
169905b261ecSmrg     * Dither to white and black if the cursor has more than two colors
170005b261ecSmrg     */
170105b261ecSmrg    if (ncolor > 2)
170205b261ecSmrg    {
170305b261ecSmrg	twocolor[0] = 0xff000000;
170405b261ecSmrg	twocolor[1] = 0xffffffff;
170505b261ecSmrg    }
170605b261ecSmrg    else
170705b261ecSmrg    {
170805b261ecSmrg	xfree (argbbits);
170905b261ecSmrg	argbbits = 0;
171005b261ecSmrg    }
171105b261ecSmrg
171205b261ecSmrg#define GetByte(p,s)	(((p) >> (s)) & 0xff)
171305b261ecSmrg#define GetColor(p,s)	(GetByte(p,s) | (GetByte(p,s) << 8))
171405b261ecSmrg
171505b261ecSmrg    cm.width = width;
171605b261ecSmrg    cm.height = height;
171705b261ecSmrg    cm.xhot = stuff->x;
171805b261ecSmrg    cm.yhot = stuff->y;
17194642e01fSmrg    rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm,
17204642e01fSmrg			 GetColor(twocolor[0], 16),
17214642e01fSmrg			 GetColor(twocolor[0], 8),
17224642e01fSmrg			 GetColor(twocolor[0], 0),
17234642e01fSmrg			 GetColor(twocolor[1], 16),
17244642e01fSmrg			 GetColor(twocolor[1], 8),
17254642e01fSmrg			 GetColor(twocolor[1], 0),
17264642e01fSmrg			 &pCursor, client, stuff->cid);
17274642e01fSmrg    if (rc != Success)
17284642e01fSmrg	return rc;
17294642e01fSmrg    if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor))
17304642e01fSmrg	return BadAlloc;
17314642e01fSmrg
17324642e01fSmrg    return client->noClientException;
173305b261ecSmrg}
173405b261ecSmrg
173505b261ecSmrgstatic int
173605b261ecSmrgProcRenderSetPictureTransform (ClientPtr client)
173705b261ecSmrg{
173805b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
173905b261ecSmrg    PicturePtr	pPicture;
174005b261ecSmrg    int		result;
174105b261ecSmrg
174205b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
17434642e01fSmrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess,
174405b261ecSmrg		    RenderErrBase + BadPicture);
174505b261ecSmrg    result = SetPictureTransform (pPicture, (PictTransform *) &stuff->transform);
174605b261ecSmrg    if (client->noClientException != Success)
174705b261ecSmrg        return(client->noClientException);
174805b261ecSmrg    else
174905b261ecSmrg        return(result);
175005b261ecSmrg}
175105b261ecSmrg
175205b261ecSmrgstatic int
175305b261ecSmrgProcRenderQueryFilters (ClientPtr client)
175405b261ecSmrg{
175505b261ecSmrg    REQUEST (xRenderQueryFiltersReq);
175605b261ecSmrg    DrawablePtr			pDrawable;
175705b261ecSmrg    xRenderQueryFiltersReply	*reply;
175805b261ecSmrg    int				nbytesName;
175905b261ecSmrg    int				nnames;
176005b261ecSmrg    ScreenPtr			pScreen;
176105b261ecSmrg    PictureScreenPtr		ps;
176205b261ecSmrg    int				i, j, len, total_bytes, rc;
176305b261ecSmrg    INT16			*aliases;
176405b261ecSmrg    char			*names;
176505b261ecSmrg
176605b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
176705b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
17684642e01fSmrg			   DixGetAttrAccess);
176905b261ecSmrg    if (rc != Success)
177005b261ecSmrg	return rc;
177105b261ecSmrg
177205b261ecSmrg    pScreen = pDrawable->pScreen;
177305b261ecSmrg    nbytesName = 0;
177405b261ecSmrg    nnames = 0;
177505b261ecSmrg    ps = GetPictureScreenIfSet(pScreen);
177605b261ecSmrg    if (ps)
177705b261ecSmrg    {
177805b261ecSmrg	for (i = 0; i < ps->nfilters; i++)
177905b261ecSmrg	    nbytesName += 1 + strlen (ps->filters[i].name);
178005b261ecSmrg	for (i = 0; i < ps->nfilterAliases; i++)
178105b261ecSmrg	    nbytesName += 1 + strlen (ps->filterAliases[i].alias);
178205b261ecSmrg	nnames = ps->nfilters + ps->nfilterAliases;
178305b261ecSmrg    }
178405b261ecSmrg    len = ((nnames + 1) >> 1) + ((nbytesName + 3) >> 2);
178505b261ecSmrg    total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2);
178605b261ecSmrg    reply = (xRenderQueryFiltersReply *) xalloc (total_bytes);
178705b261ecSmrg    if (!reply)
178805b261ecSmrg	return BadAlloc;
178905b261ecSmrg    aliases = (INT16 *) (reply + 1);
179005b261ecSmrg    names = (char *) (aliases + ((nnames + 1) & ~1));
179105b261ecSmrg
179205b261ecSmrg    reply->type = X_Reply;
179305b261ecSmrg    reply->sequenceNumber = client->sequence;
179405b261ecSmrg    reply->length = len;
179505b261ecSmrg    reply->numAliases = nnames;
179605b261ecSmrg    reply->numFilters = nnames;
179705b261ecSmrg    if (ps)
179805b261ecSmrg    {
179905b261ecSmrg
180005b261ecSmrg	/* fill in alias values */
180105b261ecSmrg	for (i = 0; i < ps->nfilters; i++)
180205b261ecSmrg	    aliases[i] = FilterAliasNone;
180305b261ecSmrg	for (i = 0; i < ps->nfilterAliases; i++)
180405b261ecSmrg	{
180505b261ecSmrg	    for (j = 0; j < ps->nfilters; j++)
180605b261ecSmrg		if (ps->filterAliases[i].filter_id == ps->filters[j].id)
180705b261ecSmrg		    break;
180805b261ecSmrg	    if (j == ps->nfilters)
180905b261ecSmrg	    {
181005b261ecSmrg		for (j = 0; j < ps->nfilterAliases; j++)
181105b261ecSmrg		    if (ps->filterAliases[i].filter_id ==
181205b261ecSmrg			ps->filterAliases[j].alias_id)
181305b261ecSmrg		    {
181405b261ecSmrg			break;
181505b261ecSmrg		    }
181605b261ecSmrg		if (j == ps->nfilterAliases)
181705b261ecSmrg		    j = FilterAliasNone;
181805b261ecSmrg		else
181905b261ecSmrg		    j = j + ps->nfilters;
182005b261ecSmrg	    }
182105b261ecSmrg	    aliases[i + ps->nfilters] = j;
182205b261ecSmrg	}
182305b261ecSmrg
182405b261ecSmrg	/* fill in filter names */
182505b261ecSmrg	for (i = 0; i < ps->nfilters; i++)
182605b261ecSmrg	{
182705b261ecSmrg	    j = strlen (ps->filters[i].name);
182805b261ecSmrg	    *names++ = j;
182905b261ecSmrg	    strncpy (names, ps->filters[i].name, j);
183005b261ecSmrg	    names += j;
183105b261ecSmrg	}
183205b261ecSmrg
183305b261ecSmrg	/* fill in filter alias names */
183405b261ecSmrg	for (i = 0; i < ps->nfilterAliases; i++)
183505b261ecSmrg	{
183605b261ecSmrg	    j = strlen (ps->filterAliases[i].alias);
183705b261ecSmrg	    *names++ = j;
183805b261ecSmrg	    strncpy (names, ps->filterAliases[i].alias, j);
183905b261ecSmrg	    names += j;
184005b261ecSmrg	}
184105b261ecSmrg    }
184205b261ecSmrg
184305b261ecSmrg    if (client->swapped)
184405b261ecSmrg    {
184505b261ecSmrg	register int n;
184605b261ecSmrg
184705b261ecSmrg	for (i = 0; i < reply->numAliases; i++)
184805b261ecSmrg	{
184905b261ecSmrg	    swaps (&aliases[i], n);
185005b261ecSmrg	}
185105b261ecSmrg    	swaps(&reply->sequenceNumber, n);
185205b261ecSmrg    	swapl(&reply->length, n);
185305b261ecSmrg	swapl(&reply->numAliases, n);
185405b261ecSmrg	swapl(&reply->numFilters, n);
185505b261ecSmrg    }
185605b261ecSmrg    WriteToClient(client, total_bytes, (char *) reply);
185705b261ecSmrg    xfree (reply);
185805b261ecSmrg
185905b261ecSmrg    return(client->noClientException);
186005b261ecSmrg}
186105b261ecSmrg
186205b261ecSmrgstatic int
186305b261ecSmrgProcRenderSetPictureFilter (ClientPtr client)
186405b261ecSmrg{
186505b261ecSmrg    REQUEST (xRenderSetPictureFilterReq);
186605b261ecSmrg    PicturePtr	pPicture;
186705b261ecSmrg    int		result;
186805b261ecSmrg    xFixed	*params;
186905b261ecSmrg    int		nparams;
187005b261ecSmrg    char	*name;
187105b261ecSmrg
187205b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
18734642e01fSmrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess,
187405b261ecSmrg		    RenderErrBase + BadPicture);
187505b261ecSmrg    name = (char *) (stuff + 1);
187605b261ecSmrg    params = (xFixed *) (name + ((stuff->nbytes + 3) & ~3));
187705b261ecSmrg    nparams = ((xFixed *) stuff + client->req_len) - params;
187805b261ecSmrg    result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams);
187905b261ecSmrg    return result;
188005b261ecSmrg}
188105b261ecSmrg
188205b261ecSmrgstatic int
188305b261ecSmrgProcRenderCreateAnimCursor (ClientPtr client)
188405b261ecSmrg{
188505b261ecSmrg    REQUEST(xRenderCreateAnimCursorReq);
188605b261ecSmrg    CursorPtr	    *cursors;
188705b261ecSmrg    CARD32	    *deltas;
188805b261ecSmrg    CursorPtr	    pCursor;
188905b261ecSmrg    int		    ncursor;
189005b261ecSmrg    xAnimCursorElt  *elt;
189105b261ecSmrg    int		    i;
189205b261ecSmrg    int		    ret;
189305b261ecSmrg
189405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
189505b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
189605b261ecSmrg    if (client->req_len & 1)
189705b261ecSmrg	return BadLength;
189805b261ecSmrg    ncursor = (client->req_len - (SIZEOF(xRenderCreateAnimCursorReq) >> 2)) >> 1;
189905b261ecSmrg    cursors = xalloc (ncursor * (sizeof (CursorPtr) + sizeof (CARD32)));
190005b261ecSmrg    if (!cursors)
190105b261ecSmrg	return BadAlloc;
190205b261ecSmrg    deltas = (CARD32 *) (cursors + ncursor);
190305b261ecSmrg    elt = (xAnimCursorElt *) (stuff + 1);
190405b261ecSmrg    for (i = 0; i < ncursor; i++)
190505b261ecSmrg    {
190605b261ecSmrg	cursors[i] = (CursorPtr)SecurityLookupIDByType(client, elt->cursor,
190705b261ecSmrg						       RT_CURSOR, DixReadAccess);
190805b261ecSmrg	if (!cursors[i])
190905b261ecSmrg	{
191005b261ecSmrg	    xfree (cursors);
191105b261ecSmrg	    client->errorValue = elt->cursor;
191205b261ecSmrg	    return BadCursor;
191305b261ecSmrg	}
191405b261ecSmrg	deltas[i] = elt->delay;
191505b261ecSmrg	elt++;
191605b261ecSmrg    }
19174642e01fSmrg    ret = AnimCursorCreate (cursors, deltas, ncursor, &pCursor, client,
19184642e01fSmrg			    stuff->cid);
191905b261ecSmrg    xfree (cursors);
192005b261ecSmrg    if (ret != Success)
192105b261ecSmrg	return ret;
192205b261ecSmrg
192305b261ecSmrg    if (AddResource (stuff->cid, RT_CURSOR, (pointer)pCursor))
192405b261ecSmrg	return client->noClientException;
192505b261ecSmrg    return BadAlloc;
192605b261ecSmrg}
192705b261ecSmrg
192805b261ecSmrgstatic int
192905b261ecSmrgProcRenderAddTraps (ClientPtr client)
193005b261ecSmrg{
193105b261ecSmrg    int		ntraps;
193205b261ecSmrg    PicturePtr	pPicture;
193305b261ecSmrg    REQUEST(xRenderAddTrapsReq);
193405b261ecSmrg
193505b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
193605b261ecSmrg    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
193705b261ecSmrg		    RenderErrBase + BadPicture);
193805b261ecSmrg    if (!pPicture->pDrawable)
193905b261ecSmrg        return BadDrawable;
194005b261ecSmrg    ntraps = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
194105b261ecSmrg    if (ntraps % sizeof (xTrap))
194205b261ecSmrg	return BadLength;
194305b261ecSmrg    ntraps /= sizeof (xTrap);
194405b261ecSmrg    if (ntraps)
194505b261ecSmrg	AddTraps (pPicture,
194605b261ecSmrg		  stuff->xOff, stuff->yOff,
194705b261ecSmrg		  ntraps, (xTrap *) &stuff[1]);
194805b261ecSmrg    return client->noClientException;
194905b261ecSmrg}
195005b261ecSmrg
195105b261ecSmrgstatic int ProcRenderCreateSolidFill(ClientPtr client)
195205b261ecSmrg{
195305b261ecSmrg    PicturePtr	    pPicture;
195405b261ecSmrg    int		    error = 0;
195505b261ecSmrg    REQUEST(xRenderCreateSolidFillReq);
195605b261ecSmrg
195705b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
195805b261ecSmrg
195905b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
196005b261ecSmrg
196105b261ecSmrg    pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error);
196205b261ecSmrg    if (!pPicture)
196305b261ecSmrg	return error;
19644642e01fSmrg    /* security creation/labeling check */
19654642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
19664642e01fSmrg		     pPicture, RT_NONE, NULL, DixCreateAccess);
19674642e01fSmrg    if (error != Success)
19684642e01fSmrg	return error;
196905b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
197005b261ecSmrg	return BadAlloc;
197105b261ecSmrg    return Success;
197205b261ecSmrg}
197305b261ecSmrg
197405b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr client)
197505b261ecSmrg{
197605b261ecSmrg    PicturePtr	    pPicture;
197705b261ecSmrg    int		    len;
197805b261ecSmrg    int		    error = 0;
197905b261ecSmrg    xFixed          *stops;
198005b261ecSmrg    xRenderColor   *colors;
198105b261ecSmrg    REQUEST(xRenderCreateLinearGradientReq);
198205b261ecSmrg
198305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
198405b261ecSmrg
198505b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
198605b261ecSmrg
198705b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
198805b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
198905b261ecSmrg	return BadLength;
199005b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
199105b261ecSmrg        return BadLength;
199205b261ecSmrg
199305b261ecSmrg    stops = (xFixed *)(stuff + 1);
199405b261ecSmrg    colors = (xRenderColor *)(stops + stuff->nStops);
199505b261ecSmrg
199605b261ecSmrg    pPicture = CreateLinearGradientPicture (stuff->pid, &stuff->p1, &stuff->p2,
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 ProcRenderCreateRadialGradient (ClientPtr client)
201105b261ecSmrg{
201205b261ecSmrg    PicturePtr	    pPicture;
201305b261ecSmrg    int		    len;
201405b261ecSmrg    int		    error = 0;
201505b261ecSmrg    xFixed          *stops;
201605b261ecSmrg    xRenderColor   *colors;
201705b261ecSmrg    REQUEST(xRenderCreateRadialGradientReq);
201805b261ecSmrg
201905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
202005b261ecSmrg
202105b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
202205b261ecSmrg
202305b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
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 = CreateRadialGradientPicture (stuff->pid, &stuff->inner, &stuff->outer,
203105b261ecSmrg                                            stuff->inner_radius, stuff->outer_radius,
203205b261ecSmrg                                            stuff->nStops, stops, colors, &error);
203305b261ecSmrg    if (!pPicture)
203405b261ecSmrg	return error;
20354642e01fSmrg    /* security creation/labeling check */
20364642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
20374642e01fSmrg		     pPicture, RT_NONE, NULL, DixCreateAccess);
20384642e01fSmrg    if (error != Success)
20394642e01fSmrg	return error;
204005b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
204105b261ecSmrg	return BadAlloc;
204205b261ecSmrg    return Success;
204305b261ecSmrg}
204405b261ecSmrg
204505b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr client)
204605b261ecSmrg{
204705b261ecSmrg    PicturePtr	    pPicture;
204805b261ecSmrg    int		    len;
204905b261ecSmrg    int		    error = 0;
205005b261ecSmrg    xFixed          *stops;
205105b261ecSmrg    xRenderColor   *colors;
205205b261ecSmrg    REQUEST(xRenderCreateConicalGradientReq);
205305b261ecSmrg
205405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
205505b261ecSmrg
205605b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
205705b261ecSmrg
205805b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
205905b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
206005b261ecSmrg        return BadLength;
206105b261ecSmrg
206205b261ecSmrg    stops = (xFixed *)(stuff + 1);
206305b261ecSmrg    colors = (xRenderColor *)(stops + stuff->nStops);
206405b261ecSmrg
206505b261ecSmrg    pPicture = CreateConicalGradientPicture (stuff->pid, &stuff->center, stuff->angle,
206605b261ecSmrg                                             stuff->nStops, stops, colors, &error);
206705b261ecSmrg    if (!pPicture)
206805b261ecSmrg	return error;
20694642e01fSmrg    /* security creation/labeling check */
20704642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
20714642e01fSmrg		     pPicture, RT_NONE, NULL, DixCreateAccess);
20724642e01fSmrg    if (error != Success)
20734642e01fSmrg	return error;
207405b261ecSmrg    if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
207505b261ecSmrg	return BadAlloc;
207605b261ecSmrg    return Success;
207705b261ecSmrg}
207805b261ecSmrg
207905b261ecSmrg
208005b261ecSmrgstatic int
208105b261ecSmrgProcRenderDispatch (ClientPtr client)
208205b261ecSmrg{
208305b261ecSmrg    REQUEST(xReq);
208405b261ecSmrg
208505b261ecSmrg    if (stuff->data < RenderNumberRequests)
208605b261ecSmrg	return (*ProcRenderVector[stuff->data]) (client);
208705b261ecSmrg    else
208805b261ecSmrg	return BadRequest;
208905b261ecSmrg}
209005b261ecSmrg
209105b261ecSmrgstatic int
209205b261ecSmrgSProcRenderQueryVersion (ClientPtr client)
209305b261ecSmrg{
209405b261ecSmrg    register int n;
209505b261ecSmrg    REQUEST(xRenderQueryVersionReq);
209605b261ecSmrg
209705b261ecSmrg    swaps(&stuff->length, n);
209805b261ecSmrg    swapl(&stuff->majorVersion, n);
209905b261ecSmrg    swapl(&stuff->minorVersion, n);
210005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType])(client);
210105b261ecSmrg}
210205b261ecSmrg
210305b261ecSmrgstatic int
210405b261ecSmrgSProcRenderQueryPictFormats (ClientPtr client)
210505b261ecSmrg{
210605b261ecSmrg    register int n;
210705b261ecSmrg    REQUEST(xRenderQueryPictFormatsReq);
210805b261ecSmrg    swaps(&stuff->length, n);
210905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
211005b261ecSmrg}
211105b261ecSmrg
211205b261ecSmrgstatic int
211305b261ecSmrgSProcRenderQueryPictIndexValues (ClientPtr client)
211405b261ecSmrg{
211505b261ecSmrg    register int n;
211605b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
211705b261ecSmrg    swaps(&stuff->length, n);
211805b261ecSmrg    swapl(&stuff->format, n);
211905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
212005b261ecSmrg}
212105b261ecSmrg
212205b261ecSmrgstatic int
212305b261ecSmrgSProcRenderQueryDithers (ClientPtr client)
212405b261ecSmrg{
212505b261ecSmrg    return BadImplementation;
212605b261ecSmrg}
212705b261ecSmrg
212805b261ecSmrgstatic int
212905b261ecSmrgSProcRenderCreatePicture (ClientPtr client)
213005b261ecSmrg{
213105b261ecSmrg    register int n;
213205b261ecSmrg    REQUEST(xRenderCreatePictureReq);
213305b261ecSmrg    swaps(&stuff->length, n);
213405b261ecSmrg    swapl(&stuff->pid, n);
213505b261ecSmrg    swapl(&stuff->drawable, n);
213605b261ecSmrg    swapl(&stuff->format, n);
213705b261ecSmrg    swapl(&stuff->mask, n);
213805b261ecSmrg    SwapRestL(stuff);
213905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
214005b261ecSmrg}
214105b261ecSmrg
214205b261ecSmrgstatic int
214305b261ecSmrgSProcRenderChangePicture (ClientPtr client)
214405b261ecSmrg{
214505b261ecSmrg    register int n;
214605b261ecSmrg    REQUEST(xRenderChangePictureReq);
214705b261ecSmrg    swaps(&stuff->length, n);
214805b261ecSmrg    swapl(&stuff->picture, n);
214905b261ecSmrg    swapl(&stuff->mask, n);
215005b261ecSmrg    SwapRestL(stuff);
215105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
215205b261ecSmrg}
215305b261ecSmrg
215405b261ecSmrgstatic int
215505b261ecSmrgSProcRenderSetPictureClipRectangles (ClientPtr client)
215605b261ecSmrg{
215705b261ecSmrg    register int n;
215805b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
215905b261ecSmrg    swaps(&stuff->length, n);
216005b261ecSmrg    swapl(&stuff->picture, n);
216105b261ecSmrg    swaps(&stuff->xOrigin, n);
216205b261ecSmrg    swaps(&stuff->yOrigin, n);
216305b261ecSmrg    SwapRestS(stuff);
216405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
216505b261ecSmrg}
216605b261ecSmrg
216705b261ecSmrgstatic int
216805b261ecSmrgSProcRenderFreePicture (ClientPtr client)
216905b261ecSmrg{
217005b261ecSmrg    register int n;
217105b261ecSmrg    REQUEST(xRenderFreePictureReq);
217205b261ecSmrg    swaps(&stuff->length, n);
217305b261ecSmrg    swapl(&stuff->picture, n);
217405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
217505b261ecSmrg}
217605b261ecSmrg
217705b261ecSmrgstatic int
217805b261ecSmrgSProcRenderComposite (ClientPtr client)
217905b261ecSmrg{
218005b261ecSmrg    register int n;
218105b261ecSmrg    REQUEST(xRenderCompositeReq);
218205b261ecSmrg    swaps(&stuff->length, n);
218305b261ecSmrg    swapl(&stuff->src, n);
218405b261ecSmrg    swapl(&stuff->mask, n);
218505b261ecSmrg    swapl(&stuff->dst, n);
218605b261ecSmrg    swaps(&stuff->xSrc, n);
218705b261ecSmrg    swaps(&stuff->ySrc, n);
218805b261ecSmrg    swaps(&stuff->xMask, n);
218905b261ecSmrg    swaps(&stuff->yMask, n);
219005b261ecSmrg    swaps(&stuff->xDst, n);
219105b261ecSmrg    swaps(&stuff->yDst, n);
219205b261ecSmrg    swaps(&stuff->width, n);
219305b261ecSmrg    swaps(&stuff->height, n);
219405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
219505b261ecSmrg}
219605b261ecSmrg
219705b261ecSmrgstatic int
219805b261ecSmrgSProcRenderScale (ClientPtr client)
219905b261ecSmrg{
220005b261ecSmrg    register int n;
220105b261ecSmrg    REQUEST(xRenderScaleReq);
220205b261ecSmrg    swaps(&stuff->length, n);
220305b261ecSmrg    swapl(&stuff->src, n);
220405b261ecSmrg    swapl(&stuff->dst, n);
220505b261ecSmrg    swapl(&stuff->colorScale, n);
220605b261ecSmrg    swapl(&stuff->alphaScale, n);
220705b261ecSmrg    swaps(&stuff->xSrc, n);
220805b261ecSmrg    swaps(&stuff->ySrc, n);
220905b261ecSmrg    swaps(&stuff->xDst, n);
221005b261ecSmrg    swaps(&stuff->yDst, n);
221105b261ecSmrg    swaps(&stuff->width, n);
221205b261ecSmrg    swaps(&stuff->height, n);
221305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
221405b261ecSmrg}
221505b261ecSmrg
221605b261ecSmrgstatic int
221705b261ecSmrgSProcRenderTrapezoids (ClientPtr client)
221805b261ecSmrg{
221905b261ecSmrg    register int n;
222005b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
222105b261ecSmrg
222205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
222305b261ecSmrg    swaps (&stuff->length, n);
222405b261ecSmrg    swapl (&stuff->src, n);
222505b261ecSmrg    swapl (&stuff->dst, n);
222605b261ecSmrg    swapl (&stuff->maskFormat, n);
222705b261ecSmrg    swaps (&stuff->xSrc, n);
222805b261ecSmrg    swaps (&stuff->ySrc, n);
222905b261ecSmrg    SwapRestL(stuff);
223005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
223105b261ecSmrg}
223205b261ecSmrg
223305b261ecSmrgstatic int
223405b261ecSmrgSProcRenderTriangles (ClientPtr client)
223505b261ecSmrg{
223605b261ecSmrg    register int n;
223705b261ecSmrg    REQUEST(xRenderTrianglesReq);
223805b261ecSmrg
223905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
224005b261ecSmrg    swaps (&stuff->length, n);
224105b261ecSmrg    swapl (&stuff->src, n);
224205b261ecSmrg    swapl (&stuff->dst, n);
224305b261ecSmrg    swapl (&stuff->maskFormat, n);
224405b261ecSmrg    swaps (&stuff->xSrc, n);
224505b261ecSmrg    swaps (&stuff->ySrc, n);
224605b261ecSmrg    SwapRestL(stuff);
224705b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
224805b261ecSmrg}
224905b261ecSmrg
225005b261ecSmrgstatic int
225105b261ecSmrgSProcRenderTriStrip (ClientPtr client)
225205b261ecSmrg{
225305b261ecSmrg    register int n;
225405b261ecSmrg    REQUEST(xRenderTriStripReq);
225505b261ecSmrg
225605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
225705b261ecSmrg    swaps (&stuff->length, n);
225805b261ecSmrg    swapl (&stuff->src, n);
225905b261ecSmrg    swapl (&stuff->dst, n);
226005b261ecSmrg    swapl (&stuff->maskFormat, n);
226105b261ecSmrg    swaps (&stuff->xSrc, n);
226205b261ecSmrg    swaps (&stuff->ySrc, n);
226305b261ecSmrg    SwapRestL(stuff);
226405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
226505b261ecSmrg}
226605b261ecSmrg
226705b261ecSmrgstatic int
226805b261ecSmrgSProcRenderTriFan (ClientPtr client)
226905b261ecSmrg{
227005b261ecSmrg    register int n;
227105b261ecSmrg    REQUEST(xRenderTriFanReq);
227205b261ecSmrg
227305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
227405b261ecSmrg    swaps (&stuff->length, n);
227505b261ecSmrg    swapl (&stuff->src, n);
227605b261ecSmrg    swapl (&stuff->dst, n);
227705b261ecSmrg    swapl (&stuff->maskFormat, n);
227805b261ecSmrg    swaps (&stuff->xSrc, n);
227905b261ecSmrg    swaps (&stuff->ySrc, n);
228005b261ecSmrg    SwapRestL(stuff);
228105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
228205b261ecSmrg}
228305b261ecSmrg
228405b261ecSmrgstatic int
228505b261ecSmrgSProcRenderColorTrapezoids (ClientPtr client)
228605b261ecSmrg{
228705b261ecSmrg    return BadImplementation;
228805b261ecSmrg}
228905b261ecSmrg
229005b261ecSmrgstatic int
229105b261ecSmrgSProcRenderColorTriangles (ClientPtr client)
229205b261ecSmrg{
229305b261ecSmrg    return BadImplementation;
229405b261ecSmrg}
229505b261ecSmrg
229605b261ecSmrgstatic int
229705b261ecSmrgSProcRenderTransform (ClientPtr client)
229805b261ecSmrg{
229905b261ecSmrg    return BadImplementation;
230005b261ecSmrg}
230105b261ecSmrg
230205b261ecSmrgstatic int
230305b261ecSmrgSProcRenderCreateGlyphSet (ClientPtr client)
230405b261ecSmrg{
230505b261ecSmrg    register int n;
230605b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
230705b261ecSmrg    swaps(&stuff->length, n);
230805b261ecSmrg    swapl(&stuff->gsid, n);
230905b261ecSmrg    swapl(&stuff->format, n);
231005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
231105b261ecSmrg}
231205b261ecSmrg
231305b261ecSmrgstatic int
231405b261ecSmrgSProcRenderReferenceGlyphSet (ClientPtr client)
231505b261ecSmrg{
231605b261ecSmrg    register int n;
231705b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
231805b261ecSmrg    swaps(&stuff->length, n);
231905b261ecSmrg    swapl(&stuff->gsid, n);
232005b261ecSmrg    swapl(&stuff->existing, n);
232105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType])  (client);
232205b261ecSmrg}
232305b261ecSmrg
232405b261ecSmrgstatic int
232505b261ecSmrgSProcRenderFreeGlyphSet (ClientPtr client)
232605b261ecSmrg{
232705b261ecSmrg    register int n;
232805b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
232905b261ecSmrg    swaps(&stuff->length, n);
233005b261ecSmrg    swapl(&stuff->glyphset, n);
233105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
233205b261ecSmrg}
233305b261ecSmrg
233405b261ecSmrgstatic int
233505b261ecSmrgSProcRenderAddGlyphs (ClientPtr client)
233605b261ecSmrg{
233705b261ecSmrg    register int n;
233805b261ecSmrg    register int i;
233905b261ecSmrg    CARD32  *gids;
234005b261ecSmrg    void    *end;
234105b261ecSmrg    xGlyphInfo *gi;
234205b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
234305b261ecSmrg    swaps(&stuff->length, n);
234405b261ecSmrg    swapl(&stuff->glyphset, n);
234505b261ecSmrg    swapl(&stuff->nglyphs, n);
234605b261ecSmrg    if (stuff->nglyphs & 0xe0000000)
234705b261ecSmrg	return BadLength;
234805b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
234905b261ecSmrg    gids = (CARD32 *) (stuff + 1);
235005b261ecSmrg    gi = (xGlyphInfo *) (gids + stuff->nglyphs);
235105b261ecSmrg    if ((char *) end - (char *) (gids + stuff->nglyphs) < 0)
235205b261ecSmrg	return BadLength;
235305b261ecSmrg    if ((char *) end - (char *) (gi + stuff->nglyphs) < 0)
235405b261ecSmrg	return BadLength;
235505b261ecSmrg    for (i = 0; i < stuff->nglyphs; i++)
235605b261ecSmrg    {
235705b261ecSmrg	swapl (&gids[i], n);
235805b261ecSmrg	swaps (&gi[i].width, n);
235905b261ecSmrg	swaps (&gi[i].height, n);
236005b261ecSmrg	swaps (&gi[i].x, n);
236105b261ecSmrg	swaps (&gi[i].y, n);
236205b261ecSmrg	swaps (&gi[i].xOff, n);
236305b261ecSmrg	swaps (&gi[i].yOff, n);
236405b261ecSmrg    }
236505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
236605b261ecSmrg}
236705b261ecSmrg
236805b261ecSmrgstatic int
236905b261ecSmrgSProcRenderAddGlyphsFromPicture (ClientPtr client)
237005b261ecSmrg{
237105b261ecSmrg    return BadImplementation;
237205b261ecSmrg}
237305b261ecSmrg
237405b261ecSmrgstatic int
237505b261ecSmrgSProcRenderFreeGlyphs (ClientPtr client)
237605b261ecSmrg{
237705b261ecSmrg    register int n;
237805b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
237905b261ecSmrg    swaps(&stuff->length, n);
238005b261ecSmrg    swapl(&stuff->glyphset, n);
238105b261ecSmrg    SwapRestL(stuff);
238205b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
238305b261ecSmrg}
238405b261ecSmrg
238505b261ecSmrgstatic int
238605b261ecSmrgSProcRenderCompositeGlyphs (ClientPtr client)
238705b261ecSmrg{
238805b261ecSmrg    register int n;
238905b261ecSmrg    xGlyphElt	*elt;
239005b261ecSmrg    CARD8	*buffer;
239105b261ecSmrg    CARD8	*end;
239205b261ecSmrg    int		space;
239305b261ecSmrg    int		i;
239405b261ecSmrg    int		size;
239505b261ecSmrg
239605b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
239705b261ecSmrg
239805b261ecSmrg    switch (stuff->renderReqType) {
239905b261ecSmrg    default:			    size = 1; break;
240005b261ecSmrg    case X_RenderCompositeGlyphs16: size = 2; break;
240105b261ecSmrg    case X_RenderCompositeGlyphs32: size = 4; break;
240205b261ecSmrg    }
240305b261ecSmrg
240405b261ecSmrg    swaps(&stuff->length, n);
240505b261ecSmrg    swapl(&stuff->src, n);
240605b261ecSmrg    swapl(&stuff->dst, n);
240705b261ecSmrg    swapl(&stuff->maskFormat, n);
240805b261ecSmrg    swapl(&stuff->glyphset, n);
240905b261ecSmrg    swaps(&stuff->xSrc, n);
241005b261ecSmrg    swaps(&stuff->ySrc, n);
241105b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
241205b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
241305b261ecSmrg    while (buffer + sizeof (xGlyphElt) < end)
241405b261ecSmrg    {
241505b261ecSmrg	elt = (xGlyphElt *) buffer;
241605b261ecSmrg	buffer += sizeof (xGlyphElt);
241705b261ecSmrg
241805b261ecSmrg	swaps (&elt->deltax, n);
241905b261ecSmrg	swaps (&elt->deltay, n);
242005b261ecSmrg
242105b261ecSmrg	i = elt->len;
242205b261ecSmrg	if (i == 0xff)
242305b261ecSmrg	{
242405b261ecSmrg	    swapl (buffer, n);
242505b261ecSmrg	    buffer += 4;
242605b261ecSmrg	}
242705b261ecSmrg	else
242805b261ecSmrg	{
242905b261ecSmrg	    space = size * i;
243005b261ecSmrg	    switch (size) {
243105b261ecSmrg	    case 1:
243205b261ecSmrg		buffer += i;
243305b261ecSmrg		break;
243405b261ecSmrg	    case 2:
243505b261ecSmrg		while (i--)
243605b261ecSmrg		{
243705b261ecSmrg		    swaps (buffer, n);
243805b261ecSmrg		    buffer += 2;
243905b261ecSmrg		}
244005b261ecSmrg		break;
244105b261ecSmrg	    case 4:
244205b261ecSmrg		while (i--)
244305b261ecSmrg		{
244405b261ecSmrg		    swapl (buffer, n);
244505b261ecSmrg		    buffer += 4;
244605b261ecSmrg		}
244705b261ecSmrg		break;
244805b261ecSmrg	    }
244905b261ecSmrg	    if (space & 3)
245005b261ecSmrg		buffer += 4 - (space & 3);
245105b261ecSmrg	}
245205b261ecSmrg    }
245305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
245405b261ecSmrg}
245505b261ecSmrg
245605b261ecSmrgstatic int
245705b261ecSmrgSProcRenderFillRectangles (ClientPtr client)
245805b261ecSmrg{
245905b261ecSmrg    register int n;
246005b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
246105b261ecSmrg
246205b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
246305b261ecSmrg    swaps(&stuff->length, n);
246405b261ecSmrg    swapl(&stuff->dst, n);
246505b261ecSmrg    swaps(&stuff->color.red, n);
246605b261ecSmrg    swaps(&stuff->color.green, n);
246705b261ecSmrg    swaps(&stuff->color.blue, n);
246805b261ecSmrg    swaps(&stuff->color.alpha, n);
246905b261ecSmrg    SwapRestS(stuff);
247005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
247105b261ecSmrg}
247205b261ecSmrg
247305b261ecSmrgstatic int
247405b261ecSmrgSProcRenderCreateCursor (ClientPtr client)
247505b261ecSmrg{
247605b261ecSmrg    register int n;
247705b261ecSmrg    REQUEST(xRenderCreateCursorReq);
247805b261ecSmrg    REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
247905b261ecSmrg
248005b261ecSmrg    swaps(&stuff->length, n);
248105b261ecSmrg    swapl(&stuff->cid, n);
248205b261ecSmrg    swapl(&stuff->src, n);
248305b261ecSmrg    swaps(&stuff->x, n);
248405b261ecSmrg    swaps(&stuff->y, n);
248505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
248605b261ecSmrg}
248705b261ecSmrg
248805b261ecSmrgstatic int
248905b261ecSmrgSProcRenderSetPictureTransform (ClientPtr client)
249005b261ecSmrg{
249105b261ecSmrg    register int n;
249205b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
249305b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
249405b261ecSmrg
249505b261ecSmrg    swaps(&stuff->length, n);
249605b261ecSmrg    swapl(&stuff->picture, n);
249705b261ecSmrg    swapl(&stuff->transform.matrix11, n);
249805b261ecSmrg    swapl(&stuff->transform.matrix12, n);
249905b261ecSmrg    swapl(&stuff->transform.matrix13, n);
250005b261ecSmrg    swapl(&stuff->transform.matrix21, n);
250105b261ecSmrg    swapl(&stuff->transform.matrix22, n);
250205b261ecSmrg    swapl(&stuff->transform.matrix23, n);
250305b261ecSmrg    swapl(&stuff->transform.matrix31, n);
250405b261ecSmrg    swapl(&stuff->transform.matrix32, n);
250505b261ecSmrg    swapl(&stuff->transform.matrix33, n);
250605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
250705b261ecSmrg}
250805b261ecSmrg
250905b261ecSmrgstatic int
251005b261ecSmrgSProcRenderQueryFilters (ClientPtr client)
251105b261ecSmrg{
251205b261ecSmrg    register int n;
251305b261ecSmrg    REQUEST (xRenderQueryFiltersReq);
251405b261ecSmrg    REQUEST_SIZE_MATCH (xRenderQueryFiltersReq);
251505b261ecSmrg
251605b261ecSmrg    swaps(&stuff->length, n);
251705b261ecSmrg    swapl(&stuff->drawable, n);
251805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
251905b261ecSmrg}
252005b261ecSmrg
252105b261ecSmrgstatic int
252205b261ecSmrgSProcRenderSetPictureFilter (ClientPtr client)
252305b261ecSmrg{
252405b261ecSmrg    register int n;
252505b261ecSmrg    REQUEST (xRenderSetPictureFilterReq);
252605b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
252705b261ecSmrg
252805b261ecSmrg    swaps(&stuff->length, n);
252905b261ecSmrg    swapl(&stuff->picture, n);
253005b261ecSmrg    swaps(&stuff->nbytes, n);
253105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
253205b261ecSmrg}
253305b261ecSmrg
253405b261ecSmrgstatic int
253505b261ecSmrgSProcRenderCreateAnimCursor (ClientPtr client)
253605b261ecSmrg{
253705b261ecSmrg    register int n;
253805b261ecSmrg    REQUEST (xRenderCreateAnimCursorReq);
253905b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateAnimCursorReq);
254005b261ecSmrg
254105b261ecSmrg    swaps(&stuff->length, n);
254205b261ecSmrg    swapl(&stuff->cid, n);
254305b261ecSmrg    SwapRestL(stuff);
254405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
254505b261ecSmrg}
254605b261ecSmrg
254705b261ecSmrgstatic int
254805b261ecSmrgSProcRenderAddTraps (ClientPtr client)
254905b261ecSmrg{
255005b261ecSmrg    register int n;
255105b261ecSmrg    REQUEST (xRenderAddTrapsReq);
255205b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
255305b261ecSmrg
255405b261ecSmrg    swaps(&stuff->length, n);
255505b261ecSmrg    swapl(&stuff->picture, n);
255605b261ecSmrg    swaps(&stuff->xOff, n);
255705b261ecSmrg    swaps(&stuff->yOff, n);
255805b261ecSmrg    SwapRestL(stuff);
255905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
256005b261ecSmrg}
256105b261ecSmrg
256205b261ecSmrgstatic int
256305b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client)
256405b261ecSmrg{
256505b261ecSmrg    register int n;
256605b261ecSmrg    REQUEST (xRenderCreateSolidFillReq);
256705b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateSolidFillReq);
256805b261ecSmrg
256905b261ecSmrg    swaps(&stuff->length, n);
257005b261ecSmrg    swapl(&stuff->pid, n);
257105b261ecSmrg    swaps(&stuff->color.alpha, n);
257205b261ecSmrg    swaps(&stuff->color.red, n);
257305b261ecSmrg    swaps(&stuff->color.green, n);
257405b261ecSmrg    swaps(&stuff->color.blue, n);
257505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
257605b261ecSmrg}
257705b261ecSmrg
257805b261ecSmrgstatic void swapStops(void *stuff, int num)
257905b261ecSmrg{
258005b261ecSmrg    int i, n;
258105b261ecSmrg    CARD32 *stops;
258205b261ecSmrg    CARD16 *colors;
258305b261ecSmrg    stops = (CARD32 *)(stuff);
258405b261ecSmrg    for (i = 0; i < num; ++i) {
258505b261ecSmrg        swapl(stops, n);
258605b261ecSmrg        ++stops;
258705b261ecSmrg    }
258805b261ecSmrg    colors = (CARD16 *)(stops);
258905b261ecSmrg    for (i = 0; i < 4*num; ++i) {
259005b261ecSmrg        swaps(stops, n);
259105b261ecSmrg        ++stops;
259205b261ecSmrg    }
259305b261ecSmrg}
259405b261ecSmrg
259505b261ecSmrgstatic int
259605b261ecSmrgSProcRenderCreateLinearGradient (ClientPtr client)
259705b261ecSmrg{
259805b261ecSmrg    register int n;
259905b261ecSmrg    int len;
260005b261ecSmrg    REQUEST (xRenderCreateLinearGradientReq);
260105b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateLinearGradientReq);
260205b261ecSmrg
260305b261ecSmrg    swaps(&stuff->length, n);
260405b261ecSmrg    swapl(&stuff->pid, n);
260505b261ecSmrg    swapl(&stuff->p1.x, n);
260605b261ecSmrg    swapl(&stuff->p1.y, n);
260705b261ecSmrg    swapl(&stuff->p2.x, n);
260805b261ecSmrg    swapl(&stuff->p2.y, n);
260905b261ecSmrg    swapl(&stuff->nStops, n);
261005b261ecSmrg
261105b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
261205b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
261305b261ecSmrg	return BadLength;
261405b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
261505b261ecSmrg        return BadLength;
261605b261ecSmrg
261705b261ecSmrg    swapStops(stuff+1, stuff->nStops);
261805b261ecSmrg
261905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
262005b261ecSmrg}
262105b261ecSmrg
262205b261ecSmrgstatic int
262305b261ecSmrgSProcRenderCreateRadialGradient (ClientPtr client)
262405b261ecSmrg{
262505b261ecSmrg    register int n;
262605b261ecSmrg    int len;
262705b261ecSmrg    REQUEST (xRenderCreateRadialGradientReq);
262805b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateRadialGradientReq);
262905b261ecSmrg
263005b261ecSmrg    swaps(&stuff->length, n);
263105b261ecSmrg    swapl(&stuff->pid, n);
263205b261ecSmrg    swapl(&stuff->inner.x, n);
263305b261ecSmrg    swapl(&stuff->inner.y, n);
263405b261ecSmrg    swapl(&stuff->outer.x, n);
263505b261ecSmrg    swapl(&stuff->outer.y, n);
263605b261ecSmrg    swapl(&stuff->inner_radius, n);
263705b261ecSmrg    swapl(&stuff->outer_radius, n);
263805b261ecSmrg    swapl(&stuff->nStops, n);
263905b261ecSmrg
264005b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
264105b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
264205b261ecSmrg	return BadLength;
264305b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
264405b261ecSmrg        return BadLength;
264505b261ecSmrg
264605b261ecSmrg    swapStops(stuff+1, stuff->nStops);
264705b261ecSmrg
264805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
264905b261ecSmrg}
265005b261ecSmrg
265105b261ecSmrgstatic int
265205b261ecSmrgSProcRenderCreateConicalGradient (ClientPtr client)
265305b261ecSmrg{
265405b261ecSmrg    register int n;
265505b261ecSmrg    int len;
265605b261ecSmrg    REQUEST (xRenderCreateConicalGradientReq);
265705b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderCreateConicalGradientReq);
265805b261ecSmrg
265905b261ecSmrg    swaps(&stuff->length, n);
266005b261ecSmrg    swapl(&stuff->pid, n);
266105b261ecSmrg    swapl(&stuff->center.x, n);
266205b261ecSmrg    swapl(&stuff->center.y, n);
266305b261ecSmrg    swapl(&stuff->angle, n);
266405b261ecSmrg    swapl(&stuff->nStops, n);
266505b261ecSmrg
266605b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
266705b261ecSmrg    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
266805b261ecSmrg	return BadLength;
266905b261ecSmrg    if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
267005b261ecSmrg        return BadLength;
267105b261ecSmrg
267205b261ecSmrg    swapStops(stuff+1, stuff->nStops);
267305b261ecSmrg
267405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
267505b261ecSmrg}
267605b261ecSmrg
267705b261ecSmrgstatic int
267805b261ecSmrgSProcRenderDispatch (ClientPtr client)
267905b261ecSmrg{
268005b261ecSmrg    REQUEST(xReq);
268105b261ecSmrg
268205b261ecSmrg    if (stuff->data < RenderNumberRequests)
268305b261ecSmrg	return (*SProcRenderVector[stuff->data]) (client);
268405b261ecSmrg    else
268505b261ecSmrg	return BadRequest;
268605b261ecSmrg}
268705b261ecSmrg
268805b261ecSmrg#ifdef PANORAMIX
268905b261ecSmrg#include "panoramiX.h"
269005b261ecSmrg#include "panoramiXsrv.h"
269105b261ecSmrg
269205b261ecSmrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode, err) {\
269305b261ecSmrg    pPicture = SecurityLookupIDByType(client, pid, XRT_PICTURE, mode);\
269405b261ecSmrg    if (!pPicture) { \
269505b261ecSmrg	client->errorValue = pid; \
269605b261ecSmrg	return err; \
269705b261ecSmrg    } \
269805b261ecSmrg}
269905b261ecSmrg
270005b261ecSmrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode, err) {\
270105b261ecSmrg    if (pid == None) \
270205b261ecSmrg	pPicture = 0; \
270305b261ecSmrg    else { \
270405b261ecSmrg	VERIFY_XIN_PICTURE(pPicture, pid, client, mode, err); \
270505b261ecSmrg    } \
270605b261ecSmrg} \
270705b261ecSmrg
270805b261ecSmrgint	    (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr);
270905b261ecSmrg
271005b261ecSmrgunsigned long	XRT_PICTURE;
271105b261ecSmrg
271205b261ecSmrgstatic int
271305b261ecSmrgPanoramiXRenderCreatePicture (ClientPtr client)
271405b261ecSmrg{
271505b261ecSmrg    REQUEST(xRenderCreatePictureReq);
271605b261ecSmrg    PanoramiXRes    *refDraw, *newPict;
271705b261ecSmrg    int		    result = Success, j;
271805b261ecSmrg
271905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
272005b261ecSmrg    if(!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass(
272105b261ecSmrg		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
272205b261ecSmrg	return BadDrawable;
272305b261ecSmrg    if(!(newPict = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
272405b261ecSmrg	return BadAlloc;
272505b261ecSmrg    newPict->type = XRT_PICTURE;
272605b261ecSmrg    newPict->info[0].id = stuff->pid;
272705b261ecSmrg
272805b261ecSmrg    if (refDraw->type == XRT_WINDOW &&
272905b261ecSmrg	stuff->drawable == WindowTable[0]->drawable.id)
273005b261ecSmrg    {
273105b261ecSmrg	newPict->u.pict.root = TRUE;
273205b261ecSmrg    }
273305b261ecSmrg    else
273405b261ecSmrg	newPict->u.pict.root = FALSE;
273505b261ecSmrg
273605b261ecSmrg    for(j = 1; j < PanoramiXNumScreens; j++)
273705b261ecSmrg	newPict->info[j].id = FakeClientID(client->index);
273805b261ecSmrg
273905b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
274005b261ecSmrg	stuff->pid = newPict->info[j].id;
274105b261ecSmrg	stuff->drawable = refDraw->info[j].id;
274205b261ecSmrg	result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client);
274305b261ecSmrg	if(result != Success) break;
274405b261ecSmrg    }
274505b261ecSmrg
274605b261ecSmrg    if (result == Success)
274705b261ecSmrg	AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
274805b261ecSmrg    else
274905b261ecSmrg	xfree(newPict);
275005b261ecSmrg
275105b261ecSmrg    return (result);
275205b261ecSmrg}
275305b261ecSmrg
275405b261ecSmrgstatic int
275505b261ecSmrgPanoramiXRenderChangePicture (ClientPtr client)
275605b261ecSmrg{
275705b261ecSmrg    PanoramiXRes    *pict;
275805b261ecSmrg    int		    result = Success, j;
275905b261ecSmrg    REQUEST(xRenderChangePictureReq);
276005b261ecSmrg
276105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
276205b261ecSmrg
276305b261ecSmrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
276405b261ecSmrg		       RenderErrBase + BadPicture);
276505b261ecSmrg
276605b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
276705b261ecSmrg        stuff->picture = pict->info[j].id;
276805b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client);
276905b261ecSmrg        if(result != Success) break;
277005b261ecSmrg    }
277105b261ecSmrg
277205b261ecSmrg    return (result);
277305b261ecSmrg}
277405b261ecSmrg
277505b261ecSmrgstatic int
277605b261ecSmrgPanoramiXRenderSetPictureClipRectangles (ClientPtr client)
277705b261ecSmrg{
277805b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
277905b261ecSmrg    int		    result = Success, j;
278005b261ecSmrg    PanoramiXRes    *pict;
278105b261ecSmrg
278205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
278305b261ecSmrg
278405b261ecSmrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
278505b261ecSmrg		       RenderErrBase + BadPicture);
278605b261ecSmrg
278705b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
278805b261ecSmrg        stuff->picture = pict->info[j].id;
278905b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) (client);
279005b261ecSmrg        if(result != Success) break;
279105b261ecSmrg    }
279205b261ecSmrg
279305b261ecSmrg    return (result);
279405b261ecSmrg}
279505b261ecSmrg
279605b261ecSmrgstatic int
279705b261ecSmrgPanoramiXRenderSetPictureTransform (ClientPtr client)
279805b261ecSmrg{
279905b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
280005b261ecSmrg    int		    result = Success, j;
280105b261ecSmrg    PanoramiXRes    *pict;
280205b261ecSmrg
280305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
280405b261ecSmrg
280505b261ecSmrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
280605b261ecSmrg		       RenderErrBase + BadPicture);
280705b261ecSmrg
280805b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
280905b261ecSmrg        stuff->picture = pict->info[j].id;
281005b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client);
281105b261ecSmrg        if(result != Success) break;
281205b261ecSmrg    }
281305b261ecSmrg
281405b261ecSmrg    return (result);
281505b261ecSmrg}
281605b261ecSmrg
281705b261ecSmrgstatic int
281805b261ecSmrgPanoramiXRenderSetPictureFilter (ClientPtr client)
281905b261ecSmrg{
282005b261ecSmrg    REQUEST(xRenderSetPictureFilterReq);
282105b261ecSmrg    int		    result = Success, j;
282205b261ecSmrg    PanoramiXRes    *pict;
282305b261ecSmrg
282405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
282505b261ecSmrg
282605b261ecSmrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
282705b261ecSmrg		       RenderErrBase + BadPicture);
282805b261ecSmrg
282905b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
283005b261ecSmrg        stuff->picture = pict->info[j].id;
283105b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client);
283205b261ecSmrg        if(result != Success) break;
283305b261ecSmrg    }
283405b261ecSmrg
283505b261ecSmrg    return (result);
283605b261ecSmrg}
283705b261ecSmrg
283805b261ecSmrgstatic int
283905b261ecSmrgPanoramiXRenderFreePicture (ClientPtr client)
284005b261ecSmrg{
284105b261ecSmrg    PanoramiXRes *pict;
284205b261ecSmrg    int         result = Success, j;
284305b261ecSmrg    REQUEST(xRenderFreePictureReq);
284405b261ecSmrg
284505b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
284605b261ecSmrg
284705b261ecSmrg    client->errorValue = stuff->picture;
284805b261ecSmrg
284905b261ecSmrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess,
285005b261ecSmrg		       RenderErrBase + BadPicture);
285105b261ecSmrg
285205b261ecSmrg
285305b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
285405b261ecSmrg	stuff->picture = pict->info[j].id;
285505b261ecSmrg	result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client);
285605b261ecSmrg	if(result != Success) break;
285705b261ecSmrg    }
285805b261ecSmrg
285905b261ecSmrg    /* Since ProcRenderFreePicture is using FreeResource, it will free
286005b261ecSmrg	our resource for us on the last pass through the loop above */
286105b261ecSmrg
286205b261ecSmrg    return (result);
286305b261ecSmrg}
286405b261ecSmrg
286505b261ecSmrgstatic int
286605b261ecSmrgPanoramiXRenderComposite (ClientPtr client)
286705b261ecSmrg{
286805b261ecSmrg    PanoramiXRes	*src, *msk, *dst;
286905b261ecSmrg    int			result = Success, j;
287005b261ecSmrg    xRenderCompositeReq	orig;
287105b261ecSmrg    REQUEST(xRenderCompositeReq);
287205b261ecSmrg
287305b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
287405b261ecSmrg
287505b261ecSmrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
287605b261ecSmrg			RenderErrBase + BadPicture);
287705b261ecSmrg    VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess,
287805b261ecSmrg		      RenderErrBase + BadPicture);
287905b261ecSmrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
288005b261ecSmrg			RenderErrBase + BadPicture);
288105b261ecSmrg
288205b261ecSmrg    orig = *stuff;
288305b261ecSmrg
288405b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
288505b261ecSmrg	stuff->src = src->info[j].id;
288605b261ecSmrg	if (src->u.pict.root)
288705b261ecSmrg	{
288805b261ecSmrg	    stuff->xSrc = orig.xSrc - panoramiXdataPtr[j].x;
288905b261ecSmrg	    stuff->ySrc = orig.ySrc - panoramiXdataPtr[j].y;
289005b261ecSmrg	}
289105b261ecSmrg	stuff->dst = dst->info[j].id;
289205b261ecSmrg	if (dst->u.pict.root)
289305b261ecSmrg	{
289405b261ecSmrg	    stuff->xDst = orig.xDst - panoramiXdataPtr[j].x;
289505b261ecSmrg	    stuff->yDst = orig.yDst - panoramiXdataPtr[j].y;
289605b261ecSmrg	}
289705b261ecSmrg	if (msk)
289805b261ecSmrg	{
289905b261ecSmrg	    stuff->mask = msk->info[j].id;
290005b261ecSmrg	    if (msk->u.pict.root)
290105b261ecSmrg	    {
290205b261ecSmrg		stuff->xMask = orig.xMask - panoramiXdataPtr[j].x;
290305b261ecSmrg		stuff->yMask = orig.yMask - panoramiXdataPtr[j].y;
290405b261ecSmrg	    }
290505b261ecSmrg	}
290605b261ecSmrg	result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client);
290705b261ecSmrg	if(result != Success) break;
290805b261ecSmrg    }
290905b261ecSmrg
291005b261ecSmrg    return result;
291105b261ecSmrg}
291205b261ecSmrg
291305b261ecSmrgstatic int
291405b261ecSmrgPanoramiXRenderCompositeGlyphs (ClientPtr client)
291505b261ecSmrg{
291605b261ecSmrg    PanoramiXRes    *src, *dst;
291705b261ecSmrg    int		    result = Success, j;
291805b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
291905b261ecSmrg    xGlyphElt	    origElt, *elt;
292005b261ecSmrg    INT16	    xSrc, ySrc;
292105b261ecSmrg
292205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
292305b261ecSmrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
292405b261ecSmrg			RenderErrBase + BadPicture);
292505b261ecSmrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
292605b261ecSmrg			RenderErrBase + BadPicture);
292705b261ecSmrg
292805b261ecSmrg    if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) +
292905b261ecSmrg				 sizeof (xGlyphElt)))
293005b261ecSmrg    {
293105b261ecSmrg	elt = (xGlyphElt *) (stuff + 1);
293205b261ecSmrg	origElt = *elt;
293305b261ecSmrg	xSrc = stuff->xSrc;
293405b261ecSmrg	ySrc = stuff->ySrc;
293505b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
293605b261ecSmrg	    stuff->src = src->info[j].id;
293705b261ecSmrg	    if (src->u.pict.root)
293805b261ecSmrg	    {
293905b261ecSmrg		stuff->xSrc = xSrc - panoramiXdataPtr[j].x;
294005b261ecSmrg		stuff->ySrc = ySrc - panoramiXdataPtr[j].y;
294105b261ecSmrg	    }
294205b261ecSmrg	    stuff->dst = dst->info[j].id;
294305b261ecSmrg	    if (dst->u.pict.root)
294405b261ecSmrg	    {
294505b261ecSmrg		elt->deltax = origElt.deltax - panoramiXdataPtr[j].x;
294605b261ecSmrg		elt->deltay = origElt.deltay - panoramiXdataPtr[j].y;
294705b261ecSmrg	    }
294805b261ecSmrg	    result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client);
294905b261ecSmrg	    if(result != Success) break;
295005b261ecSmrg	}
295105b261ecSmrg    }
295205b261ecSmrg
295305b261ecSmrg    return result;
295405b261ecSmrg}
295505b261ecSmrg
295605b261ecSmrgstatic int
295705b261ecSmrgPanoramiXRenderFillRectangles (ClientPtr client)
295805b261ecSmrg{
295905b261ecSmrg    PanoramiXRes    *dst;
296005b261ecSmrg    int		    result = Success, j;
296105b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
296205b261ecSmrg    char	    *extra;
296305b261ecSmrg    int		    extra_len;
296405b261ecSmrg
296505b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
296605b261ecSmrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
296705b261ecSmrg			RenderErrBase + BadPicture);
296805b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq);
296905b261ecSmrg    if (extra_len &&
29704642e01fSmrg	(extra = (char *) xalloc (extra_len)))
297105b261ecSmrg    {
297205b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
297305b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
297405b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
297505b261ecSmrg	    if (dst->u.pict.root)
297605b261ecSmrg	    {
297705b261ecSmrg		int x_off = panoramiXdataPtr[j].x;
297805b261ecSmrg		int y_off = panoramiXdataPtr[j].y;
297905b261ecSmrg
298005b261ecSmrg		if(x_off || y_off) {
298105b261ecSmrg		    xRectangle	*rects = (xRectangle *) (stuff + 1);
298205b261ecSmrg		    int		i = extra_len / sizeof (xRectangle);
298305b261ecSmrg
298405b261ecSmrg		    while (i--)
298505b261ecSmrg		    {
298605b261ecSmrg			rects->x -= x_off;
298705b261ecSmrg			rects->y -= y_off;
298805b261ecSmrg			rects++;
298905b261ecSmrg		    }
299005b261ecSmrg		}
299105b261ecSmrg	    }
299205b261ecSmrg	    stuff->dst = dst->info[j].id;
299305b261ecSmrg	    result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client);
299405b261ecSmrg	    if(result != Success) break;
299505b261ecSmrg	}
29964642e01fSmrg	xfree(extra);
299705b261ecSmrg    }
299805b261ecSmrg
299905b261ecSmrg    return result;
300005b261ecSmrg}
300105b261ecSmrg
300205b261ecSmrgstatic int
300305b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client)
300405b261ecSmrg{
300505b261ecSmrg    PanoramiXRes        *src, *dst;
300605b261ecSmrg    int                 result = Success, j;
300705b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
300805b261ecSmrg    char		*extra;
300905b261ecSmrg    int			extra_len;
301005b261ecSmrg
301105b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq);
301205b261ecSmrg
301305b261ecSmrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
301405b261ecSmrg			RenderErrBase + BadPicture);
301505b261ecSmrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
301605b261ecSmrg			RenderErrBase + BadPicture);
301705b261ecSmrg
301805b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
301905b261ecSmrg
302005b261ecSmrg    if (extra_len &&
30214642e01fSmrg	(extra = (char *) xalloc (extra_len))) {
302205b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
302305b261ecSmrg
302405b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
302505b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
302605b261ecSmrg	    if (dst->u.pict.root) {
302705b261ecSmrg                int x_off = panoramiXdataPtr[j].x;
302805b261ecSmrg		int y_off = panoramiXdataPtr[j].y;
302905b261ecSmrg
303005b261ecSmrg		if(x_off || y_off) {
303105b261ecSmrg                    xTrapezoid  *trap = (xTrapezoid *) (stuff + 1);
303205b261ecSmrg		    int         i = extra_len / sizeof (xTrapezoid);
303305b261ecSmrg
303405b261ecSmrg		    while (i--) {
303505b261ecSmrg			trap->top -= y_off;
303605b261ecSmrg			trap->bottom -= y_off;
303705b261ecSmrg			trap->left.p1.x -= x_off;
303805b261ecSmrg			trap->left.p1.y -= y_off;
303905b261ecSmrg			trap->left.p2.x -= x_off;
304005b261ecSmrg			trap->left.p2.y -= y_off;
304105b261ecSmrg			trap->right.p1.x -= x_off;
304205b261ecSmrg			trap->right.p1.y -= y_off;
304305b261ecSmrg			trap->right.p2.x -= x_off;
304405b261ecSmrg			trap->right.p2.y -= y_off;
304505b261ecSmrg			trap++;
304605b261ecSmrg		    }
304705b261ecSmrg		}
304805b261ecSmrg	    }
304905b261ecSmrg
305005b261ecSmrg            stuff->src = src->info[j].id;
305105b261ecSmrg            stuff->dst = dst->info[j].id;
305205b261ecSmrg	    result =
305305b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client);
305405b261ecSmrg
305505b261ecSmrg	    if(result != Success) break;
305605b261ecSmrg	}
305705b261ecSmrg
30584642e01fSmrg        xfree(extra);
305905b261ecSmrg    }
306005b261ecSmrg
306105b261ecSmrg    return result;
306205b261ecSmrg}
306305b261ecSmrg
306405b261ecSmrgstatic int
306505b261ecSmrgPanoramiXRenderTriangles(ClientPtr client)
306605b261ecSmrg{
306705b261ecSmrg    PanoramiXRes        *src, *dst;
306805b261ecSmrg    int                 result = Success, j;
306905b261ecSmrg    REQUEST(xRenderTrianglesReq);
307005b261ecSmrg    char		*extra;
307105b261ecSmrg    int			extra_len;
307205b261ecSmrg
307305b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq);
307405b261ecSmrg
307505b261ecSmrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
307605b261ecSmrg			RenderErrBase + BadPicture);
307705b261ecSmrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
307805b261ecSmrg			RenderErrBase + BadPicture);
307905b261ecSmrg
308005b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
308105b261ecSmrg
308205b261ecSmrg    if (extra_len &&
30834642e01fSmrg	(extra = (char *) xalloc (extra_len))) {
308405b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
308505b261ecSmrg
308605b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
308705b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
308805b261ecSmrg	    if (dst->u.pict.root) {
308905b261ecSmrg                int x_off = panoramiXdataPtr[j].x;
309005b261ecSmrg		int y_off = panoramiXdataPtr[j].y;
309105b261ecSmrg
309205b261ecSmrg		if(x_off || y_off) {
309305b261ecSmrg                    xTriangle  *tri = (xTriangle *) (stuff + 1);
309405b261ecSmrg		    int         i = extra_len / sizeof (xTriangle);
309505b261ecSmrg
309605b261ecSmrg		    while (i--) {
309705b261ecSmrg			tri->p1.x -= x_off;
309805b261ecSmrg			tri->p1.y -= y_off;
309905b261ecSmrg			tri->p2.x -= x_off;
310005b261ecSmrg			tri->p2.y -= y_off;
310105b261ecSmrg			tri->p3.x -= x_off;
310205b261ecSmrg			tri->p3.y -= y_off;
310305b261ecSmrg			tri++;
310405b261ecSmrg		    }
310505b261ecSmrg		}
310605b261ecSmrg	    }
310705b261ecSmrg
310805b261ecSmrg            stuff->src = src->info[j].id;
310905b261ecSmrg            stuff->dst = dst->info[j].id;
311005b261ecSmrg	    result =
311105b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTriangles]) (client);
311205b261ecSmrg
311305b261ecSmrg	    if(result != Success) break;
311405b261ecSmrg	}
311505b261ecSmrg
31164642e01fSmrg        xfree(extra);
311705b261ecSmrg    }
311805b261ecSmrg
311905b261ecSmrg    return result;
312005b261ecSmrg}
312105b261ecSmrg
312205b261ecSmrgstatic int
312305b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client)
312405b261ecSmrg{
312505b261ecSmrg    PanoramiXRes        *src, *dst;
312605b261ecSmrg    int                 result = Success, j;
312705b261ecSmrg    REQUEST(xRenderTriStripReq);
312805b261ecSmrg    char		*extra;
312905b261ecSmrg    int			extra_len;
313005b261ecSmrg
313105b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTriStripReq);
313205b261ecSmrg
313305b261ecSmrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
313405b261ecSmrg			RenderErrBase + BadPicture);
313505b261ecSmrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
313605b261ecSmrg			RenderErrBase + BadPicture);
313705b261ecSmrg
313805b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq);
313905b261ecSmrg
314005b261ecSmrg    if (extra_len &&
31414642e01fSmrg	(extra = (char *) xalloc (extra_len))) {
314205b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
314305b261ecSmrg
314405b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
314505b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
314605b261ecSmrg	    if (dst->u.pict.root) {
314705b261ecSmrg                int x_off = panoramiXdataPtr[j].x;
314805b261ecSmrg		int y_off = panoramiXdataPtr[j].y;
314905b261ecSmrg
315005b261ecSmrg		if(x_off || y_off) {
315105b261ecSmrg                    xPointFixed  *fixed = (xPointFixed *) (stuff + 1);
315205b261ecSmrg		    int         i = extra_len / sizeof (xPointFixed);
315305b261ecSmrg
315405b261ecSmrg		    while (i--) {
315505b261ecSmrg			fixed->x -= x_off;
315605b261ecSmrg			fixed->y -= y_off;
315705b261ecSmrg			fixed++;
315805b261ecSmrg		    }
315905b261ecSmrg		}
316005b261ecSmrg	    }
316105b261ecSmrg
316205b261ecSmrg            stuff->src = src->info[j].id;
316305b261ecSmrg            stuff->dst = dst->info[j].id;
316405b261ecSmrg	    result =
316505b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client);
316605b261ecSmrg
316705b261ecSmrg	    if(result != Success) break;
316805b261ecSmrg	}
316905b261ecSmrg
31704642e01fSmrg        xfree(extra);
317105b261ecSmrg    }
317205b261ecSmrg
317305b261ecSmrg    return result;
317405b261ecSmrg}
317505b261ecSmrg
317605b261ecSmrgstatic int
317705b261ecSmrgPanoramiXRenderTriFan(ClientPtr client)
317805b261ecSmrg{
317905b261ecSmrg    PanoramiXRes        *src, *dst;
318005b261ecSmrg    int                 result = Success, j;
318105b261ecSmrg    REQUEST(xRenderTriFanReq);
318205b261ecSmrg    char		*extra;
318305b261ecSmrg    int			extra_len;
318405b261ecSmrg
318505b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderTriFanReq);
318605b261ecSmrg
318705b261ecSmrg    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
318805b261ecSmrg			RenderErrBase + BadPicture);
318905b261ecSmrg    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
319005b261ecSmrg			RenderErrBase + BadPicture);
319105b261ecSmrg
319205b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq);
319305b261ecSmrg
319405b261ecSmrg    if (extra_len &&
31954642e01fSmrg	(extra = (char *) xalloc (extra_len))) {
319605b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
319705b261ecSmrg
319805b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
319905b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
320005b261ecSmrg	    if (dst->u.pict.root) {
320105b261ecSmrg                int x_off = panoramiXdataPtr[j].x;
320205b261ecSmrg		int y_off = panoramiXdataPtr[j].y;
320305b261ecSmrg
320405b261ecSmrg		if(x_off || y_off) {
320505b261ecSmrg                    xPointFixed  *fixed = (xPointFixed *) (stuff + 1);
320605b261ecSmrg		    int         i = extra_len / sizeof (xPointFixed);
320705b261ecSmrg
320805b261ecSmrg		    while (i--) {
320905b261ecSmrg			fixed->x -= x_off;
321005b261ecSmrg			fixed->y -= y_off;
321105b261ecSmrg			fixed++;
321205b261ecSmrg		    }
321305b261ecSmrg		}
321405b261ecSmrg	    }
321505b261ecSmrg
321605b261ecSmrg            stuff->src = src->info[j].id;
321705b261ecSmrg            stuff->dst = dst->info[j].id;
321805b261ecSmrg	    result =
321905b261ecSmrg		(*PanoramiXSaveRenderVector[X_RenderTriFan]) (client);
322005b261ecSmrg
322105b261ecSmrg	    if(result != Success) break;
322205b261ecSmrg	}
322305b261ecSmrg
32244642e01fSmrg        xfree(extra);
322505b261ecSmrg    }
322605b261ecSmrg
322705b261ecSmrg    return result;
322805b261ecSmrg}
322905b261ecSmrg
323005b261ecSmrgstatic int
323105b261ecSmrgPanoramiXRenderAddTraps (ClientPtr client)
323205b261ecSmrg{
323305b261ecSmrg    PanoramiXRes    *picture;
323405b261ecSmrg    int		    result = Success, j;
323505b261ecSmrg    REQUEST(xRenderAddTrapsReq);
323605b261ecSmrg    char	    *extra;
323705b261ecSmrg    int		    extra_len;
323805b261ecSmrg    INT16    	    x_off, y_off;
323905b261ecSmrg
324005b261ecSmrg    REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
324105b261ecSmrg    VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess,
324205b261ecSmrg			RenderErrBase + BadPicture);
324305b261ecSmrg    extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
324405b261ecSmrg    if (extra_len &&
32454642e01fSmrg	(extra = (char *) xalloc (extra_len)))
324605b261ecSmrg    {
324705b261ecSmrg	memcpy (extra, stuff + 1, extra_len);
324805b261ecSmrg	x_off = stuff->xOff;
324905b261ecSmrg	y_off = stuff->yOff;
325005b261ecSmrg	FOR_NSCREENS_FORWARD(j) {
325105b261ecSmrg	    if (j) memcpy (stuff + 1, extra, extra_len);
325205b261ecSmrg	    stuff->picture = picture->info[j].id;
325305b261ecSmrg
325405b261ecSmrg	    if (picture->u.pict.root)
325505b261ecSmrg	    {
325605b261ecSmrg		stuff->xOff = x_off + panoramiXdataPtr[j].x;
325705b261ecSmrg		stuff->yOff = y_off + panoramiXdataPtr[j].y;
325805b261ecSmrg	    }
325905b261ecSmrg	    result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client);
326005b261ecSmrg	    if(result != Success) break;
326105b261ecSmrg	}
32624642e01fSmrg	xfree(extra);
326305b261ecSmrg    }
326405b261ecSmrg
326505b261ecSmrg    return result;
326605b261ecSmrg}
326705b261ecSmrg
326805b261ecSmrgvoid
326905b261ecSmrgPanoramiXRenderInit (void)
327005b261ecSmrg{
327105b261ecSmrg    int	    i;
327205b261ecSmrg
327305b261ecSmrg    XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource);
327405b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
327505b261ecSmrg	PanoramiXSaveRenderVector[i] = ProcRenderVector[i];
327605b261ecSmrg    /*
327705b261ecSmrg     * Stuff in Xinerama aware request processing hooks
327805b261ecSmrg     */
327905b261ecSmrg    ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture;
328005b261ecSmrg    ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture;
328105b261ecSmrg    ProcRenderVector[X_RenderSetPictureTransform] = PanoramiXRenderSetPictureTransform;
328205b261ecSmrg    ProcRenderVector[X_RenderSetPictureFilter] = PanoramiXRenderSetPictureFilter;
328305b261ecSmrg    ProcRenderVector[X_RenderSetPictureClipRectangles] = PanoramiXRenderSetPictureClipRectangles;
328405b261ecSmrg    ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture;
328505b261ecSmrg    ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite;
328605b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs;
328705b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs16] = PanoramiXRenderCompositeGlyphs;
328805b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs32] = PanoramiXRenderCompositeGlyphs;
328905b261ecSmrg    ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles;
329005b261ecSmrg
329105b261ecSmrg    ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids;
329205b261ecSmrg    ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles;
329305b261ecSmrg    ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip;
329405b261ecSmrg    ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan;
329505b261ecSmrg    ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps;
329605b261ecSmrg}
329705b261ecSmrg
329805b261ecSmrgvoid
329905b261ecSmrgPanoramiXRenderReset (void)
330005b261ecSmrg{
330105b261ecSmrg    int	    i;
330205b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
330305b261ecSmrg	ProcRenderVector[i] = PanoramiXSaveRenderVector[i];
330405b261ecSmrg}
330505b261ecSmrg
330605b261ecSmrg#endif	/* PANORAMIX */
3307