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