render.c revision 6e78d31f
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
19f7df2e56Smrg * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
2005b261ecSmrg * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2105b261ecSmrg *
2205b261ecSmrg * Author:  Keith Packard, SuSE, Inc.
2305b261ecSmrg */
2405b261ecSmrg
2505b261ecSmrg#ifdef HAVE_DIX_CONFIG_H
2605b261ecSmrg#include <dix-config.h>
2705b261ecSmrg#endif
2805b261ecSmrg
2905b261ecSmrg#include <X11/X.h>
3005b261ecSmrg#include <X11/Xproto.h>
3105b261ecSmrg#include "misc.h"
3205b261ecSmrg#include "os.h"
3305b261ecSmrg#include "dixstruct.h"
3405b261ecSmrg#include "resource.h"
3505b261ecSmrg#include "scrnintstr.h"
3605b261ecSmrg#include "windowstr.h"
3705b261ecSmrg#include "pixmapstr.h"
3805b261ecSmrg#include "colormapst.h"
3905b261ecSmrg#include "extnsionst.h"
40f7df2e56Smrg#include "extinit.h"
4105b261ecSmrg#include "servermd.h"
4205b261ecSmrg#include <X11/extensions/render.h>
4305b261ecSmrg#include <X11/extensions/renderproto.h>
4405b261ecSmrg#include "picturestr.h"
4505b261ecSmrg#include "glyphstr.h"
4605b261ecSmrg#include <X11/Xfuncproto.h>
4705b261ecSmrg#include "cursorstr.h"
484642e01fSmrg#include "xace.h"
496747b715Smrg#include "protocol-versions.h"
5005b261ecSmrg
519ace9065Smrg#ifdef PANORAMIX
529ace9065Smrg#include "panoramiX.h"
539ace9065Smrg#include "panoramiXsrv.h"
549ace9065Smrg#endif
559ace9065Smrg
5605b261ecSmrg#include <stdint.h>
5705b261ecSmrg
58f7df2e56Smrgstatic int ProcRenderQueryVersion(ClientPtr pClient);
59f7df2e56Smrgstatic int ProcRenderQueryPictFormats(ClientPtr pClient);
60f7df2e56Smrgstatic int ProcRenderQueryPictIndexValues(ClientPtr pClient);
61f7df2e56Smrgstatic int ProcRenderQueryDithers(ClientPtr pClient);
62f7df2e56Smrgstatic int ProcRenderCreatePicture(ClientPtr pClient);
63f7df2e56Smrgstatic int ProcRenderChangePicture(ClientPtr pClient);
64f7df2e56Smrgstatic int ProcRenderSetPictureClipRectangles(ClientPtr pClient);
65f7df2e56Smrgstatic int ProcRenderFreePicture(ClientPtr pClient);
66f7df2e56Smrgstatic int ProcRenderComposite(ClientPtr pClient);
67f7df2e56Smrgstatic int ProcRenderScale(ClientPtr pClient);
68f7df2e56Smrgstatic int ProcRenderTrapezoids(ClientPtr pClient);
69f7df2e56Smrgstatic int ProcRenderTriangles(ClientPtr pClient);
70f7df2e56Smrgstatic int ProcRenderTriStrip(ClientPtr pClient);
71f7df2e56Smrgstatic int ProcRenderTriFan(ClientPtr pClient);
72f7df2e56Smrgstatic int ProcRenderColorTrapezoids(ClientPtr pClient);
73f7df2e56Smrgstatic int ProcRenderColorTriangles(ClientPtr pClient);
74f7df2e56Smrgstatic int ProcRenderTransform(ClientPtr pClient);
75f7df2e56Smrgstatic int ProcRenderCreateGlyphSet(ClientPtr pClient);
76f7df2e56Smrgstatic int ProcRenderReferenceGlyphSet(ClientPtr pClient);
77f7df2e56Smrgstatic int ProcRenderFreeGlyphSet(ClientPtr pClient);
78f7df2e56Smrgstatic int ProcRenderAddGlyphs(ClientPtr pClient);
79f7df2e56Smrgstatic int ProcRenderAddGlyphsFromPicture(ClientPtr pClient);
80f7df2e56Smrgstatic int ProcRenderFreeGlyphs(ClientPtr pClient);
81f7df2e56Smrgstatic int ProcRenderCompositeGlyphs(ClientPtr pClient);
82f7df2e56Smrgstatic int ProcRenderFillRectangles(ClientPtr pClient);
83f7df2e56Smrgstatic int ProcRenderCreateCursor(ClientPtr pClient);
84f7df2e56Smrgstatic int ProcRenderSetPictureTransform(ClientPtr pClient);
85f7df2e56Smrgstatic int ProcRenderQueryFilters(ClientPtr pClient);
86f7df2e56Smrgstatic int ProcRenderSetPictureFilter(ClientPtr pClient);
87f7df2e56Smrgstatic int ProcRenderCreateAnimCursor(ClientPtr pClient);
88f7df2e56Smrgstatic int ProcRenderAddTraps(ClientPtr pClient);
89f7df2e56Smrgstatic int ProcRenderCreateSolidFill(ClientPtr pClient);
90f7df2e56Smrgstatic int ProcRenderCreateLinearGradient(ClientPtr pClient);
91f7df2e56Smrgstatic int ProcRenderCreateRadialGradient(ClientPtr pClient);
92f7df2e56Smrgstatic int ProcRenderCreateConicalGradient(ClientPtr pClient);
93f7df2e56Smrg
94f7df2e56Smrgstatic int ProcRenderDispatch(ClientPtr pClient);
95f7df2e56Smrg
96f7df2e56Smrgstatic int SProcRenderQueryVersion(ClientPtr pClient);
97f7df2e56Smrgstatic int SProcRenderQueryPictFormats(ClientPtr pClient);
98f7df2e56Smrgstatic int SProcRenderQueryPictIndexValues(ClientPtr pClient);
99f7df2e56Smrgstatic int SProcRenderQueryDithers(ClientPtr pClient);
100f7df2e56Smrgstatic int SProcRenderCreatePicture(ClientPtr pClient);
101f7df2e56Smrgstatic int SProcRenderChangePicture(ClientPtr pClient);
102f7df2e56Smrgstatic int SProcRenderSetPictureClipRectangles(ClientPtr pClient);
103f7df2e56Smrgstatic int SProcRenderFreePicture(ClientPtr pClient);
104f7df2e56Smrgstatic int SProcRenderComposite(ClientPtr pClient);
105f7df2e56Smrgstatic int SProcRenderScale(ClientPtr pClient);
106f7df2e56Smrgstatic int SProcRenderTrapezoids(ClientPtr pClient);
107f7df2e56Smrgstatic int SProcRenderTriangles(ClientPtr pClient);
108f7df2e56Smrgstatic int SProcRenderTriStrip(ClientPtr pClient);
109f7df2e56Smrgstatic int SProcRenderTriFan(ClientPtr pClient);
110f7df2e56Smrgstatic int SProcRenderColorTrapezoids(ClientPtr pClient);
111f7df2e56Smrgstatic int SProcRenderColorTriangles(ClientPtr pClient);
112f7df2e56Smrgstatic int SProcRenderTransform(ClientPtr pClient);
113f7df2e56Smrgstatic int SProcRenderCreateGlyphSet(ClientPtr pClient);
114f7df2e56Smrgstatic int SProcRenderReferenceGlyphSet(ClientPtr pClient);
115f7df2e56Smrgstatic int SProcRenderFreeGlyphSet(ClientPtr pClient);
116f7df2e56Smrgstatic int SProcRenderAddGlyphs(ClientPtr pClient);
117f7df2e56Smrgstatic int SProcRenderAddGlyphsFromPicture(ClientPtr pClient);
118f7df2e56Smrgstatic int SProcRenderFreeGlyphs(ClientPtr pClient);
119f7df2e56Smrgstatic int SProcRenderCompositeGlyphs(ClientPtr pClient);
120f7df2e56Smrgstatic int SProcRenderFillRectangles(ClientPtr pClient);
121f7df2e56Smrgstatic int SProcRenderCreateCursor(ClientPtr pClient);
122f7df2e56Smrgstatic int SProcRenderSetPictureTransform(ClientPtr pClient);
123f7df2e56Smrgstatic int SProcRenderQueryFilters(ClientPtr pClient);
124f7df2e56Smrgstatic int SProcRenderSetPictureFilter(ClientPtr pClient);
125f7df2e56Smrgstatic int SProcRenderCreateAnimCursor(ClientPtr pClient);
126f7df2e56Smrgstatic int SProcRenderAddTraps(ClientPtr pClient);
127f7df2e56Smrgstatic int SProcRenderCreateSolidFill(ClientPtr pClient);
128f7df2e56Smrgstatic int SProcRenderCreateLinearGradient(ClientPtr pClient);
129f7df2e56Smrgstatic int SProcRenderCreateRadialGradient(ClientPtr pClient);
130f7df2e56Smrgstatic int SProcRenderCreateConicalGradient(ClientPtr pClient);
131f7df2e56Smrg
132f7df2e56Smrgstatic int SProcRenderDispatch(ClientPtr pClient);
133f7df2e56Smrg
134f7df2e56Smrgint (*ProcRenderVector[RenderNumberRequests]) (ClientPtr) = {
135f7df2e56SmrgProcRenderQueryVersion,
136f7df2e56Smrg        ProcRenderQueryPictFormats,
137f7df2e56Smrg        ProcRenderQueryPictIndexValues,
138f7df2e56Smrg        ProcRenderQueryDithers,
139f7df2e56Smrg        ProcRenderCreatePicture,
140f7df2e56Smrg        ProcRenderChangePicture,
141f7df2e56Smrg        ProcRenderSetPictureClipRectangles,
142f7df2e56Smrg        ProcRenderFreePicture,
143f7df2e56Smrg        ProcRenderComposite,
144f7df2e56Smrg        ProcRenderScale,
145f7df2e56Smrg        ProcRenderTrapezoids,
146f7df2e56Smrg        ProcRenderTriangles,
147f7df2e56Smrg        ProcRenderTriStrip,
148f7df2e56Smrg        ProcRenderTriFan,
149f7df2e56Smrg        ProcRenderColorTrapezoids,
150f7df2e56Smrg        ProcRenderColorTriangles,
151f7df2e56Smrg        ProcRenderTransform,
152f7df2e56Smrg        ProcRenderCreateGlyphSet,
153f7df2e56Smrg        ProcRenderReferenceGlyphSet,
154f7df2e56Smrg        ProcRenderFreeGlyphSet,
155f7df2e56Smrg        ProcRenderAddGlyphs,
156f7df2e56Smrg        ProcRenderAddGlyphsFromPicture,
157f7df2e56Smrg        ProcRenderFreeGlyphs,
158f7df2e56Smrg        ProcRenderCompositeGlyphs,
159f7df2e56Smrg        ProcRenderCompositeGlyphs,
160f7df2e56Smrg        ProcRenderCompositeGlyphs,
161f7df2e56Smrg        ProcRenderFillRectangles,
162f7df2e56Smrg        ProcRenderCreateCursor,
163f7df2e56Smrg        ProcRenderSetPictureTransform,
164f7df2e56Smrg        ProcRenderQueryFilters,
165f7df2e56Smrg        ProcRenderSetPictureFilter,
166f7df2e56Smrg        ProcRenderCreateAnimCursor,
167f7df2e56Smrg        ProcRenderAddTraps,
168f7df2e56Smrg        ProcRenderCreateSolidFill,
169f7df2e56Smrg        ProcRenderCreateLinearGradient,
170f7df2e56Smrg        ProcRenderCreateRadialGradient, ProcRenderCreateConicalGradient};
171f7df2e56Smrg
172f7df2e56Smrgint (*SProcRenderVector[RenderNumberRequests]) (ClientPtr) = {
173f7df2e56SmrgSProcRenderQueryVersion,
174f7df2e56Smrg        SProcRenderQueryPictFormats,
175f7df2e56Smrg        SProcRenderQueryPictIndexValues,
176f7df2e56Smrg        SProcRenderQueryDithers,
177f7df2e56Smrg        SProcRenderCreatePicture,
178f7df2e56Smrg        SProcRenderChangePicture,
179f7df2e56Smrg        SProcRenderSetPictureClipRectangles,
180f7df2e56Smrg        SProcRenderFreePicture,
181f7df2e56Smrg        SProcRenderComposite,
182f7df2e56Smrg        SProcRenderScale,
183f7df2e56Smrg        SProcRenderTrapezoids,
184f7df2e56Smrg        SProcRenderTriangles,
185f7df2e56Smrg        SProcRenderTriStrip,
186f7df2e56Smrg        SProcRenderTriFan,
187f7df2e56Smrg        SProcRenderColorTrapezoids,
188f7df2e56Smrg        SProcRenderColorTriangles,
189f7df2e56Smrg        SProcRenderTransform,
190f7df2e56Smrg        SProcRenderCreateGlyphSet,
191f7df2e56Smrg        SProcRenderReferenceGlyphSet,
192f7df2e56Smrg        SProcRenderFreeGlyphSet,
193f7df2e56Smrg        SProcRenderAddGlyphs,
194f7df2e56Smrg        SProcRenderAddGlyphsFromPicture,
195f7df2e56Smrg        SProcRenderFreeGlyphs,
196f7df2e56Smrg        SProcRenderCompositeGlyphs,
197f7df2e56Smrg        SProcRenderCompositeGlyphs,
198f7df2e56Smrg        SProcRenderCompositeGlyphs,
199f7df2e56Smrg        SProcRenderFillRectangles,
200f7df2e56Smrg        SProcRenderCreateCursor,
201f7df2e56Smrg        SProcRenderSetPictureTransform,
202f7df2e56Smrg        SProcRenderQueryFilters,
203f7df2e56Smrg        SProcRenderSetPictureFilter,
204f7df2e56Smrg        SProcRenderCreateAnimCursor,
205f7df2e56Smrg        SProcRenderAddTraps,
206f7df2e56Smrg        SProcRenderCreateSolidFill,
207f7df2e56Smrg        SProcRenderCreateLinearGradient,
208f7df2e56Smrg        SProcRenderCreateRadialGradient, SProcRenderCreateConicalGradient};
209f7df2e56Smrg
210f7df2e56Smrgint RenderErrBase;
2116747b715Smrgstatic DevPrivateKeyRec RenderClientPrivateKeyRec;
212f7df2e56Smrg
2136747b715Smrg#define RenderClientPrivateKey (&RenderClientPrivateKeyRec )
21405b261ecSmrg
21505b261ecSmrgtypedef struct _RenderClient {
216f7df2e56Smrg    int major_version;
217f7df2e56Smrg    int minor_version;
21805b261ecSmrg} RenderClientRec, *RenderClientPtr;
21905b261ecSmrg
2204642e01fSmrg#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey))
22105b261ecSmrg
22205b261ecSmrgstatic void
223f7df2e56SmrgRenderClientCallback(CallbackListPtr *list, void *closure, void *data)
22405b261ecSmrg{
225f7df2e56Smrg    NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
226f7df2e56Smrg    ClientPtr pClient = clientinfo->client;
227f7df2e56Smrg    RenderClientPtr pRenderClient = GetRenderClient(pClient);
22805b261ecSmrg
22905b261ecSmrg    pRenderClient->major_version = 0;
23005b261ecSmrg    pRenderClient->minor_version = 0;
23105b261ecSmrg}
23205b261ecSmrg
2336747b715Smrg#ifdef PANORAMIX
234f7df2e56SmrgRESTYPE XRT_PICTURE;
2356747b715Smrg#endif
2366747b715Smrg
23705b261ecSmrgvoid
238f7df2e56SmrgRenderExtensionInit(void)
23905b261ecSmrg{
24005b261ecSmrg    ExtensionEntry *extEntry;
24105b261ecSmrg
24205b261ecSmrg    if (!PictureType)
243f7df2e56Smrg        return;
244f7df2e56Smrg    if (!PictureFinishInit())
245f7df2e56Smrg        return;
246f7df2e56Smrg    if (!dixRegisterPrivateKey
247f7df2e56Smrg        (&RenderClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(RenderClientRec)))
248f7df2e56Smrg        return;
249f7df2e56Smrg    if (!AddCallback(&ClientStateCallback, RenderClientCallback, 0))
250f7df2e56Smrg        return;
251f7df2e56Smrg
252f7df2e56Smrg    extEntry = AddExtension(RENDER_NAME, 0, RenderNumberErrors,
253f7df2e56Smrg                            ProcRenderDispatch, SProcRenderDispatch,
254f7df2e56Smrg                            NULL, StandardMinorOpcode);
25505b261ecSmrg    if (!extEntry)
256f7df2e56Smrg        return;
25705b261ecSmrg    RenderErrBase = extEntry->errorBase;
2586747b715Smrg#ifdef PANORAMIX
2596747b715Smrg    if (XRT_PICTURE)
260f7df2e56Smrg        SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
2616747b715Smrg#endif
2626747b715Smrg    SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture);
2636747b715Smrg    SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat);
2646747b715Smrg    SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet);
26505b261ecSmrg}
26605b261ecSmrg
26705b261ecSmrgstatic int
268f7df2e56SmrgProcRenderQueryVersion(ClientPtr client)
26905b261ecSmrg{
270f7df2e56Smrg    RenderClientPtr pRenderClient = GetRenderClient(client);
271f7df2e56Smrg    xRenderQueryVersionReply rep = {
272f7df2e56Smrg        .type = X_Reply,
273f7df2e56Smrg        .sequenceNumber = client->sequence,
274f7df2e56Smrg        .length = 0
275f7df2e56Smrg    };
276f7df2e56Smrg
27705b261ecSmrg    REQUEST(xRenderQueryVersionReq);
2780b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
27905b261ecSmrg
280f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
281f7df2e56Smrg
28205b261ecSmrg    pRenderClient->major_version = stuff->majorVersion;
28305b261ecSmrg    pRenderClient->minor_version = stuff->minorVersion;
28405b261ecSmrg
2856747b715Smrg    if ((stuff->majorVersion * 1000 + stuff->minorVersion) <
286f7df2e56Smrg        (SERVER_RENDER_MAJOR_VERSION * 1000 + SERVER_RENDER_MINOR_VERSION)) {
287f7df2e56Smrg        rep.majorVersion = stuff->majorVersion;
288f7df2e56Smrg        rep.minorVersion = stuff->minorVersion;
289f7df2e56Smrg    }
290f7df2e56Smrg    else {
291f7df2e56Smrg        rep.majorVersion = SERVER_RENDER_MAJOR_VERSION;
292f7df2e56Smrg        rep.minorVersion = SERVER_RENDER_MINOR_VERSION;
2936747b715Smrg    }
2946747b715Smrg
29505b261ecSmrg    if (client->swapped) {
296f7df2e56Smrg        swaps(&rep.sequenceNumber);
297f7df2e56Smrg        swapl(&rep.length);
298f7df2e56Smrg        swapl(&rep.majorVersion);
299f7df2e56Smrg        swapl(&rep.minorVersion);
30005b261ecSmrg    }
301f7df2e56Smrg    WriteToClient(client, sizeof(xRenderQueryVersionReply), &rep);
3026747b715Smrg    return Success;
30305b261ecSmrg}
30405b261ecSmrg
30505b261ecSmrgstatic VisualPtr
306f7df2e56SmrgfindVisual(ScreenPtr pScreen, VisualID vid)
30705b261ecSmrg{
308f7df2e56Smrg    VisualPtr pVisual;
309f7df2e56Smrg    int v;
31005b261ecSmrg
311f7df2e56Smrg    for (v = 0; v < pScreen->numVisuals; v++) {
312f7df2e56Smrg        pVisual = pScreen->visuals + v;
313f7df2e56Smrg        if (pVisual->vid == vid)
314f7df2e56Smrg            return pVisual;
31505b261ecSmrg    }
31605b261ecSmrg    return 0;
31705b261ecSmrg}
31805b261ecSmrg
31905b261ecSmrgstatic int
320f7df2e56SmrgProcRenderQueryPictFormats(ClientPtr client)
321f7df2e56Smrg{
322f7df2e56Smrg    RenderClientPtr pRenderClient = GetRenderClient(client);
323f7df2e56Smrg    xRenderQueryPictFormatsReply *reply;
324f7df2e56Smrg    xPictScreen *pictScreen;
325f7df2e56Smrg    xPictDepth *pictDepth;
326f7df2e56Smrg    xPictVisual *pictVisual;
327f7df2e56Smrg    xPictFormInfo *pictForm;
328f7df2e56Smrg    CARD32 *pictSubpixel;
329f7df2e56Smrg    ScreenPtr pScreen;
330f7df2e56Smrg    VisualPtr pVisual;
331f7df2e56Smrg    DepthPtr pDepth;
332f7df2e56Smrg    int v, d;
333f7df2e56Smrg    PictureScreenPtr ps;
334f7df2e56Smrg    PictFormatPtr pFormat;
335f7df2e56Smrg    int nformat;
336f7df2e56Smrg    int ndepth;
337f7df2e56Smrg    int nvisual;
338f7df2e56Smrg    int rlength;
339f7df2e56Smrg    int s;
340f7df2e56Smrg    int numScreens;
341f7df2e56Smrg    int numSubpixel;
342f7df2e56Smrg
34305b261ecSmrg/*    REQUEST(xRenderQueryPictFormatsReq); */
34405b261ecSmrg
34505b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
34605b261ecSmrg
34705b261ecSmrg#ifdef PANORAMIX
34805b261ecSmrg    if (noPanoramiXExtension)
349f7df2e56Smrg        numScreens = screenInfo.numScreens;
350f7df2e56Smrg    else
351f7df2e56Smrg        numScreens = ((xConnSetup *) ConnectionInfo)->numRoots;
35205b261ecSmrg#else
35305b261ecSmrg    numScreens = screenInfo.numScreens;
35405b261ecSmrg#endif
35505b261ecSmrg    ndepth = nformat = nvisual = 0;
356f7df2e56Smrg    for (s = 0; s < numScreens; s++) {
357f7df2e56Smrg        pScreen = screenInfo.screens[s];
358f7df2e56Smrg        for (d = 0; d < pScreen->numDepths; d++) {
359f7df2e56Smrg            pDepth = pScreen->allowedDepths + d;
360f7df2e56Smrg            ++ndepth;
361f7df2e56Smrg
362f7df2e56Smrg            for (v = 0; v < pDepth->numVids; v++) {
363f7df2e56Smrg                pVisual = findVisual(pScreen, pDepth->vids[v]);
364f7df2e56Smrg                if (pVisual &&
365f7df2e56Smrg                    PictureMatchVisual(pScreen, pDepth->depth, pVisual))
366f7df2e56Smrg                    ++nvisual;
367f7df2e56Smrg            }
368f7df2e56Smrg        }
369f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
370f7df2e56Smrg        if (ps)
371f7df2e56Smrg            nformat += ps->nformats;
37205b261ecSmrg    }
37305b261ecSmrg    if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6)
374f7df2e56Smrg        numSubpixel = 0;
37505b261ecSmrg    else
376f7df2e56Smrg        numSubpixel = numScreens;
377f7df2e56Smrg
378f7df2e56Smrg    rlength = (sizeof(xRenderQueryPictFormatsReply) +
379f7df2e56Smrg               nformat * sizeof(xPictFormInfo) +
380f7df2e56Smrg               numScreens * sizeof(xPictScreen) +
381f7df2e56Smrg               ndepth * sizeof(xPictDepth) +
382f7df2e56Smrg               nvisual * sizeof(xPictVisual) + numSubpixel * sizeof(CARD32));
3836747b715Smrg    reply = (xRenderQueryPictFormatsReply *) calloc(1, rlength);
38405b261ecSmrg    if (!reply)
385f7df2e56Smrg        return BadAlloc;
38605b261ecSmrg    reply->type = X_Reply;
38705b261ecSmrg    reply->sequenceNumber = client->sequence;
3886747b715Smrg    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
38905b261ecSmrg    reply->numFormats = nformat;
39005b261ecSmrg    reply->numScreens = numScreens;
39105b261ecSmrg    reply->numDepths = ndepth;
39205b261ecSmrg    reply->numVisuals = nvisual;
39305b261ecSmrg    reply->numSubpixel = numSubpixel;
394f7df2e56Smrg
39505b261ecSmrg    pictForm = (xPictFormInfo *) (reply + 1);
396f7df2e56Smrg
397f7df2e56Smrg    for (s = 0; s < numScreens; s++) {
398f7df2e56Smrg        pScreen = screenInfo.screens[s];
399f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
400f7df2e56Smrg        if (ps) {
401f7df2e56Smrg            for (nformat = 0, pFormat = ps->formats;
402f7df2e56Smrg                 nformat < ps->nformats; nformat++, pFormat++) {
403f7df2e56Smrg                pictForm->id = pFormat->id;
404f7df2e56Smrg                pictForm->type = pFormat->type;
405f7df2e56Smrg                pictForm->depth = pFormat->depth;
406f7df2e56Smrg                pictForm->direct.red = pFormat->direct.red;
407f7df2e56Smrg                pictForm->direct.redMask = pFormat->direct.redMask;
408f7df2e56Smrg                pictForm->direct.green = pFormat->direct.green;
409f7df2e56Smrg                pictForm->direct.greenMask = pFormat->direct.greenMask;
410f7df2e56Smrg                pictForm->direct.blue = pFormat->direct.blue;
411f7df2e56Smrg                pictForm->direct.blueMask = pFormat->direct.blueMask;
412f7df2e56Smrg                pictForm->direct.alpha = pFormat->direct.alpha;
413f7df2e56Smrg                pictForm->direct.alphaMask = pFormat->direct.alphaMask;
414f7df2e56Smrg                if (pFormat->type == PictTypeIndexed &&
415f7df2e56Smrg                    pFormat->index.pColormap)
416f7df2e56Smrg                    pictForm->colormap = pFormat->index.pColormap->mid;
417f7df2e56Smrg                else
418f7df2e56Smrg                    pictForm->colormap = None;
419f7df2e56Smrg                if (client->swapped) {
420f7df2e56Smrg                    swapl(&pictForm->id);
421f7df2e56Smrg                    swaps(&pictForm->direct.red);
422f7df2e56Smrg                    swaps(&pictForm->direct.redMask);
423f7df2e56Smrg                    swaps(&pictForm->direct.green);
424f7df2e56Smrg                    swaps(&pictForm->direct.greenMask);
425f7df2e56Smrg                    swaps(&pictForm->direct.blue);
426f7df2e56Smrg                    swaps(&pictForm->direct.blueMask);
427f7df2e56Smrg                    swaps(&pictForm->direct.alpha);
428f7df2e56Smrg                    swaps(&pictForm->direct.alphaMask);
429f7df2e56Smrg                    swapl(&pictForm->colormap);
430f7df2e56Smrg                }
431f7df2e56Smrg                pictForm++;
432f7df2e56Smrg            }
433f7df2e56Smrg        }
434f7df2e56Smrg    }
435f7df2e56Smrg
43605b261ecSmrg    pictScreen = (xPictScreen *) pictForm;
437f7df2e56Smrg    for (s = 0; s < numScreens; s++) {
438f7df2e56Smrg        pScreen = screenInfo.screens[s];
439f7df2e56Smrg        pictDepth = (xPictDepth *) (pictScreen + 1);
440f7df2e56Smrg        ndepth = 0;
441f7df2e56Smrg        for (d = 0; d < pScreen->numDepths; d++) {
442f7df2e56Smrg            pictVisual = (xPictVisual *) (pictDepth + 1);
443f7df2e56Smrg            pDepth = pScreen->allowedDepths + d;
444f7df2e56Smrg
445f7df2e56Smrg            nvisual = 0;
446f7df2e56Smrg            for (v = 0; v < pDepth->numVids; v++) {
447f7df2e56Smrg                pVisual = findVisual(pScreen, pDepth->vids[v]);
448f7df2e56Smrg                if (pVisual && (pFormat = PictureMatchVisual(pScreen,
449f7df2e56Smrg                                                             pDepth->depth,
450f7df2e56Smrg                                                             pVisual))) {
451f7df2e56Smrg                    pictVisual->visual = pVisual->vid;
452f7df2e56Smrg                    pictVisual->format = pFormat->id;
453f7df2e56Smrg                    if (client->swapped) {
454f7df2e56Smrg                        swapl(&pictVisual->visual);
455f7df2e56Smrg                        swapl(&pictVisual->format);
456f7df2e56Smrg                    }
457f7df2e56Smrg                    pictVisual++;
458f7df2e56Smrg                    nvisual++;
459f7df2e56Smrg                }
460f7df2e56Smrg            }
461f7df2e56Smrg            pictDepth->depth = pDepth->depth;
462f7df2e56Smrg            pictDepth->nPictVisuals = nvisual;
463f7df2e56Smrg            if (client->swapped) {
464f7df2e56Smrg                swaps(&pictDepth->nPictVisuals);
465f7df2e56Smrg            }
466f7df2e56Smrg            ndepth++;
467f7df2e56Smrg            pictDepth = (xPictDepth *) pictVisual;
468f7df2e56Smrg        }
469f7df2e56Smrg        pictScreen->nDepth = ndepth;
470f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
471f7df2e56Smrg        if (ps)
472f7df2e56Smrg            pictScreen->fallback = ps->fallback->id;
473f7df2e56Smrg        else
474f7df2e56Smrg            pictScreen->fallback = 0;
475f7df2e56Smrg        if (client->swapped) {
476f7df2e56Smrg            swapl(&pictScreen->nDepth);
477f7df2e56Smrg            swapl(&pictScreen->fallback);
478f7df2e56Smrg        }
479f7df2e56Smrg        pictScreen = (xPictScreen *) pictDepth;
48005b261ecSmrg    }
48105b261ecSmrg    pictSubpixel = (CARD32 *) pictScreen;
482f7df2e56Smrg
483f7df2e56Smrg    for (s = 0; s < numSubpixel; s++) {
484f7df2e56Smrg        pScreen = screenInfo.screens[s];
485f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
486f7df2e56Smrg        if (ps)
487f7df2e56Smrg            *pictSubpixel = ps->subpixel;
488f7df2e56Smrg        else
489f7df2e56Smrg            *pictSubpixel = SubPixelUnknown;
490f7df2e56Smrg        if (client->swapped) {
491f7df2e56Smrg            swapl(pictSubpixel);
492f7df2e56Smrg        }
493f7df2e56Smrg        ++pictSubpixel;
494f7df2e56Smrg    }
495f7df2e56Smrg
496f7df2e56Smrg    if (client->swapped) {
497f7df2e56Smrg        swaps(&reply->sequenceNumber);
498f7df2e56Smrg        swapl(&reply->length);
499f7df2e56Smrg        swapl(&reply->numFormats);
500f7df2e56Smrg        swapl(&reply->numScreens);
501f7df2e56Smrg        swapl(&reply->numDepths);
502f7df2e56Smrg        swapl(&reply->numVisuals);
503f7df2e56Smrg        swapl(&reply->numSubpixel);
504f7df2e56Smrg    }
505f7df2e56Smrg    WriteToClient(client, rlength, reply);
5066747b715Smrg    free(reply);
5076747b715Smrg    return Success;
50805b261ecSmrg}
50905b261ecSmrg
51005b261ecSmrgstatic int
511f7df2e56SmrgProcRenderQueryPictIndexValues(ClientPtr client)
51205b261ecSmrg{
513f7df2e56Smrg    PictFormatPtr pFormat;
514f7df2e56Smrg    int rc, num;
515f7df2e56Smrg    int rlength;
516f7df2e56Smrg    int i;
517f7df2e56Smrg
51805b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
51905b261ecSmrg    xRenderQueryPictIndexValuesReply *reply;
520f7df2e56Smrg    xIndexValue *values;
52105b261ecSmrg
52205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
52305b261ecSmrg
524f7df2e56Smrg    rc = dixLookupResourceByType((void **) &pFormat, stuff->format,
525f7df2e56Smrg                                 PictFormatType, client, DixReadAccess);
5266747b715Smrg    if (rc != Success)
527f7df2e56Smrg        return rc;
52805b261ecSmrg
529f7df2e56Smrg    if (pFormat->type != PictTypeIndexed) {
530f7df2e56Smrg        client->errorValue = stuff->format;
531f7df2e56Smrg        return BadMatch;
53205b261ecSmrg    }
53305b261ecSmrg    num = pFormat->index.nvalues;
534f7df2e56Smrg    rlength = (sizeof(xRenderQueryPictIndexValuesReply) +
535f7df2e56Smrg               num * sizeof(xIndexValue));
536f7df2e56Smrg    reply = (xRenderQueryPictIndexValuesReply *) calloc(1, rlength);
53705b261ecSmrg    if (!reply)
538f7df2e56Smrg        return BadAlloc;
53905b261ecSmrg
54005b261ecSmrg    reply->type = X_Reply;
54105b261ecSmrg    reply->sequenceNumber = client->sequence;
5426747b715Smrg    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
54305b261ecSmrg    reply->numIndexValues = num;
54405b261ecSmrg
54505b261ecSmrg    values = (xIndexValue *) (reply + 1);
546f7df2e56Smrg
547f7df2e56Smrg    memcpy(reply + 1, pFormat->index.pValues, num * sizeof(xIndexValue));
548f7df2e56Smrg
549f7df2e56Smrg    if (client->swapped) {
550f7df2e56Smrg        for (i = 0; i < num; i++) {
551f7df2e56Smrg            swapl(&values[i].pixel);
552f7df2e56Smrg            swaps(&values[i].red);
553f7df2e56Smrg            swaps(&values[i].green);
554f7df2e56Smrg            swaps(&values[i].blue);
555f7df2e56Smrg            swaps(&values[i].alpha);
556f7df2e56Smrg        }
557f7df2e56Smrg        swaps(&reply->sequenceNumber);
558f7df2e56Smrg        swapl(&reply->length);
559f7df2e56Smrg        swapl(&reply->numIndexValues);
560f7df2e56Smrg    }
561f7df2e56Smrg
562f7df2e56Smrg    WriteToClient(client, rlength, reply);
5636747b715Smrg    free(reply);
5646747b715Smrg    return Success;
56505b261ecSmrg}
56605b261ecSmrg
56705b261ecSmrgstatic int
568f7df2e56SmrgProcRenderQueryDithers(ClientPtr client)
56905b261ecSmrg{
57005b261ecSmrg    return BadImplementation;
57105b261ecSmrg}
57205b261ecSmrg
57305b261ecSmrgstatic int
574f7df2e56SmrgProcRenderCreatePicture(ClientPtr client)
57505b261ecSmrg{
576f7df2e56Smrg    PicturePtr pPicture;
577f7df2e56Smrg    DrawablePtr pDrawable;
578f7df2e56Smrg    PictFormatPtr pFormat;
579f7df2e56Smrg    int len, error, rc;
580f7df2e56Smrg
58105b261ecSmrg    REQUEST(xRenderCreatePictureReq);
58205b261ecSmrg
58305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
58405b261ecSmrg
58505b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
58605b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
587f7df2e56Smrg                           DixReadAccess | DixAddAccess);
58805b261ecSmrg    if (rc != Success)
589f7df2e56Smrg        return rc;
59005b261ecSmrg
591f7df2e56Smrg    rc = dixLookupResourceByType((void **) &pFormat, stuff->format,
592f7df2e56Smrg                                 PictFormatType, client, DixReadAccess);
5936747b715Smrg    if (rc != Success)
594f7df2e56Smrg        return rc;
5956747b715Smrg
59605b261ecSmrg    if (pFormat->depth != pDrawable->depth)
597f7df2e56Smrg        return BadMatch;
5986747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq));
59905b261ecSmrg    if (Ones(stuff->mask) != len)
600f7df2e56Smrg        return BadLength;
601f7df2e56Smrg
602f7df2e56Smrg    pPicture = CreatePicture(stuff->pid,
603f7df2e56Smrg                             pDrawable,
604f7df2e56Smrg                             pFormat,
605f7df2e56Smrg                             stuff->mask, (XID *) (stuff + 1), client, &error);
60605b261ecSmrg    if (!pPicture)
607f7df2e56Smrg        return error;
608f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
609f7df2e56Smrg        return BadAlloc;
61005b261ecSmrg    return Success;
61105b261ecSmrg}
61205b261ecSmrg
61305b261ecSmrgstatic int
614f7df2e56SmrgProcRenderChangePicture(ClientPtr client)
61505b261ecSmrg{
616f7df2e56Smrg    PicturePtr pPicture;
617f7df2e56Smrg
61805b261ecSmrg    REQUEST(xRenderChangePictureReq);
61905b261ecSmrg    int len;
62005b261ecSmrg
62105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
622f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
62305b261ecSmrg
6246747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq));
62505b261ecSmrg    if (Ones(stuff->mask) != len)
626f7df2e56Smrg        return BadLength;
627f7df2e56Smrg
628f7df2e56Smrg    return ChangePicture(pPicture, stuff->mask, (XID *) (stuff + 1),
629f7df2e56Smrg                         (DevUnion *) 0, client);
63005b261ecSmrg}
63105b261ecSmrg
63205b261ecSmrgstatic int
633f7df2e56SmrgProcRenderSetPictureClipRectangles(ClientPtr client)
63405b261ecSmrg{
63505b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
636f7df2e56Smrg    PicturePtr pPicture;
637f7df2e56Smrg    int nr;
63805b261ecSmrg
63905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
640f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
64105b261ecSmrg    if (!pPicture->pDrawable)
642f7df2e56Smrg        return RenderErrBase + BadPicture;
64305b261ecSmrg
6446747b715Smrg    nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq);
64505b261ecSmrg    if (nr & 4)
646f7df2e56Smrg        return BadLength;
64705b261ecSmrg    nr >>= 3;
648f7df2e56Smrg    return SetPictureClipRects(pPicture,
649f7df2e56Smrg                               stuff->xOrigin, stuff->yOrigin,
650f7df2e56Smrg                               nr, (xRectangle *) &stuff[1]);
65105b261ecSmrg}
65205b261ecSmrg
65305b261ecSmrgstatic int
654f7df2e56SmrgProcRenderFreePicture(ClientPtr client)
65505b261ecSmrg{
656f7df2e56Smrg    PicturePtr pPicture;
657f7df2e56Smrg
65805b261ecSmrg    REQUEST(xRenderFreePictureReq);
65905b261ecSmrg
66005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
66105b261ecSmrg
662f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixDestroyAccess);
663f7df2e56Smrg    FreeResource(stuff->picture, RT_NONE);
6646747b715Smrg    return Success;
66505b261ecSmrg}
66605b261ecSmrg
66705b261ecSmrgstatic Bool
668f7df2e56SmrgPictOpValid(CARD8 op)
66905b261ecSmrg{
670f7df2e56Smrg    if ( /*PictOpMinimum <= op && */ op <= PictOpMaximum)
671f7df2e56Smrg        return TRUE;
67205b261ecSmrg    if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum)
673f7df2e56Smrg        return TRUE;
67405b261ecSmrg    if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum)
675f7df2e56Smrg        return TRUE;
6766747b715Smrg    if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum)
677f7df2e56Smrg        return TRUE;
67805b261ecSmrg    return FALSE;
67905b261ecSmrg}
68005b261ecSmrg
68105b261ecSmrgstatic int
682f7df2e56SmrgProcRenderComposite(ClientPtr client)
68305b261ecSmrg{
684f7df2e56Smrg    PicturePtr pSrc, pMask, pDst;
685f7df2e56Smrg
68605b261ecSmrg    REQUEST(xRenderCompositeReq);
68705b261ecSmrg
68805b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
689f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
690f7df2e56Smrg        client->errorValue = stuff->op;
691f7df2e56Smrg        return BadValue;
69205b261ecSmrg    }
693f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
69405b261ecSmrg    if (!pDst->pDrawable)
69505b261ecSmrg        return BadDrawable;
696f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
697f7df2e56Smrg    VERIFY_ALPHA(pMask, stuff->mask, client, DixReadAccess);
698f7df2e56Smrg    if ((pSrc->pDrawable &&
699f7df2e56Smrg         pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) || (pMask &&
700f7df2e56Smrg                                                                   pMask->
701f7df2e56Smrg                                                                   pDrawable &&
702f7df2e56Smrg                                                                   pDst->
703f7df2e56Smrg                                                                   pDrawable->
704f7df2e56Smrg                                                                   pScreen !=
705f7df2e56Smrg                                                                   pMask->
706f7df2e56Smrg                                                                   pDrawable->
707f7df2e56Smrg                                                                   pScreen))
708f7df2e56Smrg        return BadMatch;
709f7df2e56Smrg    CompositePicture(stuff->op,
710f7df2e56Smrg                     pSrc,
711f7df2e56Smrg                     pMask,
712f7df2e56Smrg                     pDst,
713f7df2e56Smrg                     stuff->xSrc,
714f7df2e56Smrg                     stuff->ySrc,
715f7df2e56Smrg                     stuff->xMask,
716f7df2e56Smrg                     stuff->yMask,
717f7df2e56Smrg                     stuff->xDst, stuff->yDst, stuff->width, stuff->height);
71805b261ecSmrg    return Success;
71905b261ecSmrg}
72005b261ecSmrg
72105b261ecSmrgstatic int
722f7df2e56SmrgProcRenderScale(ClientPtr client)
72305b261ecSmrg{
72405b261ecSmrg    return BadImplementation;
72505b261ecSmrg}
72605b261ecSmrg
72705b261ecSmrgstatic int
728f7df2e56SmrgProcRenderTrapezoids(ClientPtr client)
72905b261ecSmrg{
730f7df2e56Smrg    int rc, ntraps;
731f7df2e56Smrg    PicturePtr pSrc, pDst;
732f7df2e56Smrg    PictFormatPtr pFormat;
733f7df2e56Smrg
73405b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
73505b261ecSmrg
73605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
737f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
738f7df2e56Smrg        client->errorValue = stuff->op;
739f7df2e56Smrg        return BadValue;
74005b261ecSmrg    }
741f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
742f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
74305b261ecSmrg    if (!pDst->pDrawable)
74405b261ecSmrg        return BadDrawable;
74505b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
746f7df2e56Smrg        return BadMatch;
747f7df2e56Smrg    if (stuff->maskFormat) {
748f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
749f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
750f7df2e56Smrg        if (rc != Success)
751f7df2e56Smrg            return rc;
75205b261ecSmrg    }
75305b261ecSmrg    else
754f7df2e56Smrg        pFormat = 0;
755f7df2e56Smrg    ntraps = (client->req_len << 2) - sizeof(xRenderTrapezoidsReq);
756f7df2e56Smrg    if (ntraps % sizeof(xTrapezoid))
757f7df2e56Smrg        return BadLength;
758f7df2e56Smrg    ntraps /= sizeof(xTrapezoid);
75905b261ecSmrg    if (ntraps)
760f7df2e56Smrg        CompositeTrapezoids(stuff->op, pSrc, pDst, pFormat,
761f7df2e56Smrg                            stuff->xSrc, stuff->ySrc,
762f7df2e56Smrg                            ntraps, (xTrapezoid *) &stuff[1]);
7636747b715Smrg    return Success;
76405b261ecSmrg}
76505b261ecSmrg
76605b261ecSmrgstatic int
767f7df2e56SmrgProcRenderTriangles(ClientPtr client)
76805b261ecSmrg{
769f7df2e56Smrg    int rc, ntris;
770f7df2e56Smrg    PicturePtr pSrc, pDst;
771f7df2e56Smrg    PictFormatPtr pFormat;
772f7df2e56Smrg
77305b261ecSmrg    REQUEST(xRenderTrianglesReq);
77405b261ecSmrg
77505b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
776f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
777f7df2e56Smrg        client->errorValue = stuff->op;
778f7df2e56Smrg        return BadValue;
77905b261ecSmrg    }
780f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
781f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
78205b261ecSmrg    if (!pDst->pDrawable)
78305b261ecSmrg        return BadDrawable;
78405b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
785f7df2e56Smrg        return BadMatch;
786f7df2e56Smrg    if (stuff->maskFormat) {
787f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
788f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
789f7df2e56Smrg        if (rc != Success)
790f7df2e56Smrg            return rc;
79105b261ecSmrg    }
79205b261ecSmrg    else
793f7df2e56Smrg        pFormat = 0;
794f7df2e56Smrg    ntris = (client->req_len << 2) - sizeof(xRenderTrianglesReq);
795f7df2e56Smrg    if (ntris % sizeof(xTriangle))
796f7df2e56Smrg        return BadLength;
797f7df2e56Smrg    ntris /= sizeof(xTriangle);
79805b261ecSmrg    if (ntris)
799f7df2e56Smrg        CompositeTriangles(stuff->op, pSrc, pDst, pFormat,
800f7df2e56Smrg                           stuff->xSrc, stuff->ySrc,
801f7df2e56Smrg                           ntris, (xTriangle *) &stuff[1]);
8026747b715Smrg    return Success;
80305b261ecSmrg}
80405b261ecSmrg
80505b261ecSmrgstatic int
806f7df2e56SmrgProcRenderTriStrip(ClientPtr client)
80705b261ecSmrg{
808f7df2e56Smrg    int rc, npoints;
809f7df2e56Smrg    PicturePtr pSrc, pDst;
810f7df2e56Smrg    PictFormatPtr pFormat;
811f7df2e56Smrg
81205b261ecSmrg    REQUEST(xRenderTrianglesReq);
81305b261ecSmrg
81405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
815f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
816f7df2e56Smrg        client->errorValue = stuff->op;
817f7df2e56Smrg        return BadValue;
81805b261ecSmrg    }
819f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
820f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
82105b261ecSmrg    if (!pDst->pDrawable)
82205b261ecSmrg        return BadDrawable;
82305b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
824f7df2e56Smrg        return BadMatch;
825f7df2e56Smrg    if (stuff->maskFormat) {
826f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
827f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
828f7df2e56Smrg        if (rc != Success)
829f7df2e56Smrg            return rc;
83005b261ecSmrg    }
83105b261ecSmrg    else
832f7df2e56Smrg        pFormat = 0;
833f7df2e56Smrg    npoints = ((client->req_len << 2) - sizeof(xRenderTriStripReq));
83405b261ecSmrg    if (npoints & 4)
835f7df2e56Smrg        return BadLength;
83605b261ecSmrg    npoints >>= 3;
83705b261ecSmrg    if (npoints >= 3)
838f7df2e56Smrg        CompositeTriStrip(stuff->op, pSrc, pDst, pFormat,
839f7df2e56Smrg                          stuff->xSrc, stuff->ySrc,
840f7df2e56Smrg                          npoints, (xPointFixed *) &stuff[1]);
8416747b715Smrg    return Success;
84205b261ecSmrg}
84305b261ecSmrg
84405b261ecSmrgstatic int
845f7df2e56SmrgProcRenderTriFan(ClientPtr client)
84605b261ecSmrg{
847f7df2e56Smrg    int rc, npoints;
848f7df2e56Smrg    PicturePtr pSrc, pDst;
849f7df2e56Smrg    PictFormatPtr pFormat;
850f7df2e56Smrg
85105b261ecSmrg    REQUEST(xRenderTrianglesReq);
85205b261ecSmrg
85305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
854f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
855f7df2e56Smrg        client->errorValue = stuff->op;
856f7df2e56Smrg        return BadValue;
85705b261ecSmrg    }
858f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
859f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
86005b261ecSmrg    if (!pDst->pDrawable)
86105b261ecSmrg        return BadDrawable;
86205b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
863f7df2e56Smrg        return BadMatch;
864f7df2e56Smrg    if (stuff->maskFormat) {
865f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
866f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
867f7df2e56Smrg        if (rc != Success)
868f7df2e56Smrg            return rc;
86905b261ecSmrg    }
87005b261ecSmrg    else
871f7df2e56Smrg        pFormat = 0;
872f7df2e56Smrg    npoints = ((client->req_len << 2) - sizeof(xRenderTriStripReq));
87305b261ecSmrg    if (npoints & 4)
874f7df2e56Smrg        return BadLength;
87505b261ecSmrg    npoints >>= 3;
87605b261ecSmrg    if (npoints >= 3)
877f7df2e56Smrg        CompositeTriFan(stuff->op, pSrc, pDst, pFormat,
878f7df2e56Smrg                        stuff->xSrc, stuff->ySrc,
879f7df2e56Smrg                        npoints, (xPointFixed *) &stuff[1]);
8806747b715Smrg    return Success;
88105b261ecSmrg}
88205b261ecSmrg
88305b261ecSmrgstatic int
884f7df2e56SmrgProcRenderColorTrapezoids(ClientPtr client)
88505b261ecSmrg{
88605b261ecSmrg    return BadImplementation;
88705b261ecSmrg}
88805b261ecSmrg
88905b261ecSmrgstatic int
890f7df2e56SmrgProcRenderColorTriangles(ClientPtr client)
89105b261ecSmrg{
89205b261ecSmrg    return BadImplementation;
89305b261ecSmrg}
89405b261ecSmrg
89505b261ecSmrgstatic int
896f7df2e56SmrgProcRenderTransform(ClientPtr client)
89705b261ecSmrg{
89805b261ecSmrg    return BadImplementation;
89905b261ecSmrg}
90005b261ecSmrg
90105b261ecSmrgstatic int
902f7df2e56SmrgProcRenderCreateGlyphSet(ClientPtr client)
90305b261ecSmrg{
904f7df2e56Smrg    GlyphSetPtr glyphSet;
905f7df2e56Smrg    PictFormatPtr format;
906f7df2e56Smrg    int rc, f;
907f7df2e56Smrg
90805b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
90905b261ecSmrg
91005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
91105b261ecSmrg
91205b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
913f7df2e56Smrg    rc = dixLookupResourceByType((void **) &format, stuff->format,
914f7df2e56Smrg                                 PictFormatType, client, DixReadAccess);
9156747b715Smrg    if (rc != Success)
916f7df2e56Smrg        return rc;
9176747b715Smrg
91805b261ecSmrg    switch (format->depth) {
91905b261ecSmrg    case 1:
920f7df2e56Smrg        f = GlyphFormat1;
921f7df2e56Smrg        break;
92205b261ecSmrg    case 4:
923f7df2e56Smrg        f = GlyphFormat4;
924f7df2e56Smrg        break;
92505b261ecSmrg    case 8:
926f7df2e56Smrg        f = GlyphFormat8;
927f7df2e56Smrg        break;
92805b261ecSmrg    case 16:
929f7df2e56Smrg        f = GlyphFormat16;
930f7df2e56Smrg        break;
93105b261ecSmrg    case 32:
932f7df2e56Smrg        f = GlyphFormat32;
933f7df2e56Smrg        break;
93405b261ecSmrg    default:
935f7df2e56Smrg        return BadMatch;
93605b261ecSmrg    }
93705b261ecSmrg    if (format->type != PictTypeDirect)
938f7df2e56Smrg        return BadMatch;
939f7df2e56Smrg    glyphSet = AllocateGlyphSet(f, format);
94005b261ecSmrg    if (!glyphSet)
941f7df2e56Smrg        return BadAlloc;
9424642e01fSmrg    /* security creation/labeling check */
9434642e01fSmrg    rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType,
944f7df2e56Smrg                  glyphSet, RT_NONE, NULL, DixCreateAccess);
9454642e01fSmrg    if (rc != Success)
946f7df2e56Smrg        return rc;
947f7df2e56Smrg    if (!AddResource(stuff->gsid, GlyphSetType, (void *) glyphSet))
948f7df2e56Smrg        return BadAlloc;
94905b261ecSmrg    return Success;
95005b261ecSmrg}
95105b261ecSmrg
95205b261ecSmrgstatic int
953f7df2e56SmrgProcRenderReferenceGlyphSet(ClientPtr client)
95405b261ecSmrg{
955f7df2e56Smrg    GlyphSetPtr glyphSet;
9564642e01fSmrg    int rc;
957f7df2e56Smrg
95805b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
95905b261ecSmrg
96005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
96105b261ecSmrg
96205b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
96305b261ecSmrg
964f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->existing,
965f7df2e56Smrg                                 GlyphSetType, client, DixGetAttrAccess);
966f7df2e56Smrg    if (rc != Success) {
967f7df2e56Smrg        client->errorValue = stuff->existing;
968f7df2e56Smrg        return rc;
96905b261ecSmrg    }
97005b261ecSmrg    glyphSet->refcnt++;
971f7df2e56Smrg    if (!AddResource(stuff->gsid, GlyphSetType, (void *) glyphSet))
972f7df2e56Smrg        return BadAlloc;
9736747b715Smrg    return Success;
97405b261ecSmrg}
97505b261ecSmrg
97605b261ecSmrg#define NLOCALDELTA	64
97705b261ecSmrg#define NLOCALGLYPH	256
97805b261ecSmrg
97905b261ecSmrgstatic int
980f7df2e56SmrgProcRenderFreeGlyphSet(ClientPtr client)
98105b261ecSmrg{
982f7df2e56Smrg    GlyphSetPtr glyphSet;
9834642e01fSmrg    int rc;
984f7df2e56Smrg
98505b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
98605b261ecSmrg
98705b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
988f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
989f7df2e56Smrg                                 GlyphSetType, client, DixDestroyAccess);
990f7df2e56Smrg    if (rc != Success) {
991f7df2e56Smrg        client->errorValue = stuff->glyphset;
992f7df2e56Smrg        return rc;
99305b261ecSmrg    }
994f7df2e56Smrg    FreeResource(stuff->glyphset, RT_NONE);
9956747b715Smrg    return Success;
99605b261ecSmrg}
99705b261ecSmrg
99805b261ecSmrgtypedef struct _GlyphNew {
999f7df2e56Smrg    Glyph id;
1000f7df2e56Smrg    GlyphPtr glyph;
1001f7df2e56Smrg    Bool found;
1002f7df2e56Smrg    unsigned char sha1[20];
100305b261ecSmrg} GlyphNewRec, *GlyphNewPtr;
100405b261ecSmrg
10054642e01fSmrg#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
10064642e01fSmrg
100705b261ecSmrgstatic int
1008f7df2e56SmrgProcRenderAddGlyphs(ClientPtr client)
100905b261ecSmrg{
1010f7df2e56Smrg    GlyphSetPtr glyphSet;
1011f7df2e56Smrg
101205b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
1013f7df2e56Smrg    GlyphNewRec glyphsLocal[NLOCALGLYPH];
1014f7df2e56Smrg    GlyphNewPtr glyphsBase, glyphs, glyph_new;
1015f7df2e56Smrg    int remain, nglyphs;
1016f7df2e56Smrg    CARD32 *gids;
1017f7df2e56Smrg    xGlyphInfo *gi;
1018f7df2e56Smrg    CARD8 *bits;
1019f7df2e56Smrg    unsigned int size;
1020f7df2e56Smrg    int err;
1021f7df2e56Smrg    int i, screen;
1022f7df2e56Smrg    PicturePtr pSrc = NULL, pDst = NULL;
1023f7df2e56Smrg    PixmapPtr pSrcPix = NULL, pDstPix = NULL;
1024f7df2e56Smrg    CARD32 component_alpha;
102505b261ecSmrg
102605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
1027f7df2e56Smrg    err =
1028f7df2e56Smrg        dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
1029f7df2e56Smrg                                GlyphSetType, client, DixAddAccess);
1030f7df2e56Smrg    if (err != Success) {
1031f7df2e56Smrg        client->errorValue = stuff->glyphset;
1032f7df2e56Smrg        return err;
103305b261ecSmrg    }
103405b261ecSmrg
10354642e01fSmrg    err = BadAlloc;
103605b261ecSmrg    nglyphs = stuff->nglyphs;
103705b261ecSmrg    if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec))
1038f7df2e56Smrg        return BadAlloc;
103905b261ecSmrg
1040f7df2e56Smrg    component_alpha = NeedsComponent(glyphSet->format->format);
10414642e01fSmrg
10424642e01fSmrg    if (nglyphs <= NLOCALGLYPH) {
1043f7df2e56Smrg        memset(glyphsLocal, 0, sizeof(glyphsLocal));
1044f7df2e56Smrg        glyphsBase = glyphsLocal;
10454642e01fSmrg    }
1046f7df2e56Smrg    else {
1047f7df2e56Smrg        glyphsBase = (GlyphNewPtr) calloc(nglyphs, sizeof(GlyphNewRec));
1048f7df2e56Smrg        if (!glyphsBase)
1049f7df2e56Smrg            return BadAlloc;
105005b261ecSmrg    }
105105b261ecSmrg
1052f7df2e56Smrg    remain = (client->req_len << 2) - sizeof(xRenderAddGlyphsReq);
105305b261ecSmrg
105405b261ecSmrg    glyphs = glyphsBase;
105505b261ecSmrg
105605b261ecSmrg    gids = (CARD32 *) (stuff + 1);
105705b261ecSmrg    gi = (xGlyphInfo *) (gids + nglyphs);
105805b261ecSmrg    bits = (CARD8 *) (gi + nglyphs);
1059f7df2e56Smrg    remain -= (sizeof(CARD32) + sizeof(xGlyphInfo)) * nglyphs;
10606747b715Smrg
10616747b715Smrg    /* protect against bad nglyphs */
1062f7df2e56Smrg    if (gi < ((xGlyphInfo *) stuff) ||
1063f7df2e56Smrg        gi > ((xGlyphInfo *) ((CARD32 *) stuff + client->req_len)) ||
1064f7df2e56Smrg        bits < ((CARD8 *) stuff) ||
1065f7df2e56Smrg        bits > ((CARD8 *) ((CARD32 *) stuff + client->req_len))) {
10666747b715Smrg        err = BadLength;
10676747b715Smrg        goto bail;
10686747b715Smrg    }
10696747b715Smrg
1070f7df2e56Smrg    for (i = 0; i < nglyphs; i++) {
1071f7df2e56Smrg        size_t padded_width;
1072f7df2e56Smrg
1073f7df2e56Smrg        glyph_new = &glyphs[i];
1074f7df2e56Smrg
1075f7df2e56Smrg        padded_width = PixmapBytePad(gi[i].width, glyphSet->format->depth);
1076f7df2e56Smrg
1077f7df2e56Smrg        if (gi[i].height &&
1078f7df2e56Smrg            padded_width > (UINT32_MAX - sizeof(GlyphRec)) / gi[i].height)
1079f7df2e56Smrg            break;
1080f7df2e56Smrg
1081f7df2e56Smrg        size = gi[i].height * padded_width;
1082f7df2e56Smrg        if (remain < size)
1083f7df2e56Smrg            break;
1084f7df2e56Smrg
1085f7df2e56Smrg        err = HashGlyph(&gi[i], bits, size, glyph_new->sha1);
1086f7df2e56Smrg        if (err)
1087f7df2e56Smrg            goto bail;
1088f7df2e56Smrg
1089f7df2e56Smrg        glyph_new->glyph = FindGlyphByHash(glyph_new->sha1, glyphSet->fdepth);
1090f7df2e56Smrg
1091f7df2e56Smrg        if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph) {
1092f7df2e56Smrg            glyph_new->found = TRUE;
1093f7df2e56Smrg        }
1094f7df2e56Smrg        else {
1095f7df2e56Smrg            GlyphPtr glyph;
1096f7df2e56Smrg
1097f7df2e56Smrg            glyph_new->found = FALSE;
1098f7df2e56Smrg            glyph_new->glyph = glyph = AllocateGlyph(&gi[i], glyphSet->fdepth);
1099f7df2e56Smrg            if (!glyph) {
1100f7df2e56Smrg                err = BadAlloc;
1101f7df2e56Smrg                goto bail;
1102f7df2e56Smrg            }
1103f7df2e56Smrg
1104f7df2e56Smrg            for (screen = 0; screen < screenInfo.numScreens; screen++) {
1105f7df2e56Smrg                int width = gi[i].width;
1106f7df2e56Smrg                int height = gi[i].height;
1107f7df2e56Smrg                int depth = glyphSet->format->depth;
1108f7df2e56Smrg                ScreenPtr pScreen;
1109f7df2e56Smrg                int error;
1110f7df2e56Smrg
1111f7df2e56Smrg                /* Skip work if it's invisibly small anyway */
1112f7df2e56Smrg                if (!width || !height)
1113f7df2e56Smrg                    break;
1114f7df2e56Smrg
1115f7df2e56Smrg                pScreen = screenInfo.screens[screen];
1116f7df2e56Smrg                pSrcPix = GetScratchPixmapHeader(pScreen,
1117f7df2e56Smrg                                                 width, height,
1118f7df2e56Smrg                                                 depth, depth, -1, bits);
1119f7df2e56Smrg                if (!pSrcPix) {
1120f7df2e56Smrg                    err = BadAlloc;
1121f7df2e56Smrg                    goto bail;
1122f7df2e56Smrg                }
1123f7df2e56Smrg
1124f7df2e56Smrg                pSrc = CreatePicture(0, &pSrcPix->drawable,
1125f7df2e56Smrg                                     glyphSet->format, 0, NULL,
1126f7df2e56Smrg                                     serverClient, &error);
1127f7df2e56Smrg                if (!pSrc) {
1128f7df2e56Smrg                    err = BadAlloc;
1129f7df2e56Smrg                    goto bail;
1130f7df2e56Smrg                }
1131f7df2e56Smrg
1132f7df2e56Smrg                pDstPix = (pScreen->CreatePixmap) (pScreen,
1133f7df2e56Smrg                                                   width, height, depth,
1134f7df2e56Smrg                                                   CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
1135f7df2e56Smrg
1136f7df2e56Smrg                if (!pDstPix) {
1137f7df2e56Smrg                    err = BadAlloc;
1138f7df2e56Smrg                    goto bail;
1139f7df2e56Smrg                }
1140f7df2e56Smrg
1141f7df2e56Smrg                pDst = CreatePicture(0, &pDstPix->drawable,
1142f7df2e56Smrg                                  glyphSet->format,
1143f7df2e56Smrg                                  CPComponentAlpha, &component_alpha,
1144f7df2e56Smrg                                  serverClient, &error);
1145f7df2e56Smrg                SetGlyphPicture(glyph, pScreen, pDst);
1146f7df2e56Smrg
1147f7df2e56Smrg                /* The picture takes a reference to the pixmap, so we
1148f7df2e56Smrg                   drop ours. */
1149f7df2e56Smrg                (pScreen->DestroyPixmap) (pDstPix);
1150f7df2e56Smrg                pDstPix = NULL;
1151f7df2e56Smrg
1152f7df2e56Smrg                if (!pDst) {
1153f7df2e56Smrg                    err = BadAlloc;
1154f7df2e56Smrg                    goto bail;
1155f7df2e56Smrg                }
1156f7df2e56Smrg
1157f7df2e56Smrg                CompositePicture(PictOpSrc,
1158f7df2e56Smrg                                 pSrc,
1159f7df2e56Smrg                                 None, pDst, 0, 0, 0, 0, 0, 0, width, height);
1160f7df2e56Smrg
1161f7df2e56Smrg                FreePicture((void *) pSrc, 0);
1162f7df2e56Smrg                pSrc = NULL;
1163f7df2e56Smrg                FreeScratchPixmapHeader(pSrcPix);
1164f7df2e56Smrg                pSrcPix = NULL;
1165f7df2e56Smrg            }
1166f7df2e56Smrg
1167f7df2e56Smrg            memcpy(glyph_new->glyph->sha1, glyph_new->sha1, 20);
1168f7df2e56Smrg        }
1169f7df2e56Smrg
1170f7df2e56Smrg        glyph_new->id = gids[i];
1171f7df2e56Smrg
1172f7df2e56Smrg        if (size & 3)
1173f7df2e56Smrg            size += 4 - (size & 3);
1174f7df2e56Smrg        bits += size;
1175f7df2e56Smrg        remain -= size;
1176f7df2e56Smrg    }
1177f7df2e56Smrg    if (remain || i < nglyphs) {
1178f7df2e56Smrg        err = BadLength;
1179f7df2e56Smrg        goto bail;
1180f7df2e56Smrg    }
1181f7df2e56Smrg    if (!ResizeGlyphSet(glyphSet, nglyphs)) {
1182f7df2e56Smrg        err = BadAlloc;
1183f7df2e56Smrg        goto bail;
118405b261ecSmrg    }
11854642e01fSmrg    for (i = 0; i < nglyphs; i++)
1186f7df2e56Smrg        AddGlyph(glyphSet, glyphs[i].glyph, glyphs[i].id);
118705b261ecSmrg
118805b261ecSmrg    if (glyphsBase != glyphsLocal)
1189f7df2e56Smrg        free(glyphsBase);
11906747b715Smrg    return Success;
1191f7df2e56Smrg bail:
11924642e01fSmrg    if (pSrc)
1193f7df2e56Smrg        FreePicture((void *) pSrc, 0);
11944642e01fSmrg    if (pSrcPix)
1195f7df2e56Smrg        FreeScratchPixmapHeader(pSrcPix);
11964642e01fSmrg    for (i = 0; i < nglyphs; i++)
1197f7df2e56Smrg        if (glyphs[i].glyph && !glyphs[i].found)
1198f7df2e56Smrg            free(glyphs[i].glyph);
119905b261ecSmrg    if (glyphsBase != glyphsLocal)
1200f7df2e56Smrg        free(glyphsBase);
120105b261ecSmrg    return err;
120205b261ecSmrg}
120305b261ecSmrg
120405b261ecSmrgstatic int
1205f7df2e56SmrgProcRenderAddGlyphsFromPicture(ClientPtr client)
120605b261ecSmrg{
120705b261ecSmrg    return BadImplementation;
120805b261ecSmrg}
120905b261ecSmrg
121005b261ecSmrgstatic int
1211f7df2e56SmrgProcRenderFreeGlyphs(ClientPtr client)
121205b261ecSmrg{
121305b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
1214f7df2e56Smrg    GlyphSetPtr glyphSet;
1215f7df2e56Smrg    int rc, nglyph;
1216f7df2e56Smrg    CARD32 *gids;
1217f7df2e56Smrg    CARD32 glyph;
121805b261ecSmrg
121905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
1220f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
1221f7df2e56Smrg                                 GlyphSetType, client, DixRemoveAccess);
1222f7df2e56Smrg    if (rc != Success) {
1223f7df2e56Smrg        client->errorValue = stuff->glyphset;
1224f7df2e56Smrg        return rc;
1225f7df2e56Smrg    }
1226f7df2e56Smrg    nglyph =
1227f7df2e56Smrg        bytes_to_int32((client->req_len << 2) - sizeof(xRenderFreeGlyphsReq));
122805b261ecSmrg    gids = (CARD32 *) (stuff + 1);
1229f7df2e56Smrg    while (nglyph-- > 0) {
1230f7df2e56Smrg        glyph = *gids++;
1231f7df2e56Smrg        if (!DeleteGlyph(glyphSet, glyph)) {
1232f7df2e56Smrg            client->errorValue = glyph;
1233f7df2e56Smrg            return RenderErrBase + BadGlyph;
1234f7df2e56Smrg        }
123505b261ecSmrg    }
12366747b715Smrg    return Success;
123705b261ecSmrg}
123805b261ecSmrg
123905b261ecSmrgstatic int
1240f7df2e56SmrgProcRenderCompositeGlyphs(ClientPtr client)
1241f7df2e56Smrg{
1242f7df2e56Smrg    GlyphSetPtr glyphSet;
1243f7df2e56Smrg    GlyphSet gs;
1244f7df2e56Smrg    PicturePtr pSrc, pDst;
1245f7df2e56Smrg    PictFormatPtr pFormat;
1246f7df2e56Smrg    GlyphListRec listsLocal[NLOCALDELTA];
1247f7df2e56Smrg    GlyphListPtr lists, listsBase;
1248f7df2e56Smrg    GlyphPtr glyphsLocal[NLOCALGLYPH];
1249f7df2e56Smrg    Glyph glyph;
1250f7df2e56Smrg    GlyphPtr *glyphs, *glyphsBase;
1251f7df2e56Smrg    xGlyphElt *elt;
1252f7df2e56Smrg    CARD8 *buffer, *end;
1253f7df2e56Smrg    int nglyph;
1254f7df2e56Smrg    int nlist;
1255f7df2e56Smrg    int space;
1256f7df2e56Smrg    int size;
1257f7df2e56Smrg    int rc, n;
1258f7df2e56Smrg
125905b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
126005b261ecSmrg
126105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
126205b261ecSmrg
126305b261ecSmrg    switch (stuff->renderReqType) {
1264f7df2e56Smrg    default:
1265f7df2e56Smrg        size = 1;
1266f7df2e56Smrg        break;
1267f7df2e56Smrg    case X_RenderCompositeGlyphs16:
1268f7df2e56Smrg        size = 2;
1269f7df2e56Smrg        break;
1270f7df2e56Smrg    case X_RenderCompositeGlyphs32:
1271f7df2e56Smrg        size = 4;
1272f7df2e56Smrg        break;
1273f7df2e56Smrg    }
1274f7df2e56Smrg
1275f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
1276f7df2e56Smrg        client->errorValue = stuff->op;
1277f7df2e56Smrg        return BadValue;
1278f7df2e56Smrg    }
1279f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
1280f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
128105b261ecSmrg    if (!pDst->pDrawable)
128205b261ecSmrg        return BadDrawable;
128305b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
1284f7df2e56Smrg        return BadMatch;
1285f7df2e56Smrg    if (stuff->maskFormat) {
1286f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
1287f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
1288f7df2e56Smrg        if (rc != Success)
1289f7df2e56Smrg            return rc;
129005b261ecSmrg    }
129105b261ecSmrg    else
1292f7df2e56Smrg        pFormat = 0;
129305b261ecSmrg
1294f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
1295f7df2e56Smrg                                 GlyphSetType, client, DixUseAccess);
12966747b715Smrg    if (rc != Success)
1297f7df2e56Smrg        return rc;
129805b261ecSmrg
129905b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
130005b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
130105b261ecSmrg    nglyph = 0;
130205b261ecSmrg    nlist = 0;
1303f7df2e56Smrg    while (buffer + sizeof(xGlyphElt) < end) {
1304f7df2e56Smrg        elt = (xGlyphElt *) buffer;
1305f7df2e56Smrg        buffer += sizeof(xGlyphElt);
1306f7df2e56Smrg
1307f7df2e56Smrg        if (elt->len == 0xff) {
1308f7df2e56Smrg            buffer += 4;
1309f7df2e56Smrg        }
1310f7df2e56Smrg        else {
1311f7df2e56Smrg            nlist++;
1312f7df2e56Smrg            nglyph += elt->len;
1313f7df2e56Smrg            space = size * elt->len;
1314f7df2e56Smrg            if (space & 3)
1315f7df2e56Smrg                space += 4 - (space & 3);
1316f7df2e56Smrg            buffer += space;
1317f7df2e56Smrg        }
131805b261ecSmrg    }
131905b261ecSmrg    if (nglyph <= NLOCALGLYPH)
1320f7df2e56Smrg        glyphsBase = glyphsLocal;
1321f7df2e56Smrg    else {
1322f7df2e56Smrg        glyphsBase = xallocarray(nglyph, sizeof(GlyphPtr));
1323f7df2e56Smrg        if (!glyphsBase)
1324f7df2e56Smrg            return BadAlloc;
132505b261ecSmrg    }
132605b261ecSmrg    if (nlist <= NLOCALDELTA)
1327f7df2e56Smrg        listsBase = listsLocal;
1328f7df2e56Smrg    else {
1329f7df2e56Smrg        listsBase = xallocarray(nlist, sizeof(GlyphListRec));
1330f7df2e56Smrg        if (!listsBase) {
1331f7df2e56Smrg            rc = BadAlloc;
1332f7df2e56Smrg            goto bail;
1333f7df2e56Smrg        }
133405b261ecSmrg    }
133505b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
133605b261ecSmrg    glyphs = glyphsBase;
133705b261ecSmrg    lists = listsBase;
1338f7df2e56Smrg    while (buffer + sizeof(xGlyphElt) < end) {
1339f7df2e56Smrg        elt = (xGlyphElt *) buffer;
1340f7df2e56Smrg        buffer += sizeof(xGlyphElt);
1341f7df2e56Smrg
1342f7df2e56Smrg        if (elt->len == 0xff) {
1343f7df2e56Smrg            if (buffer + sizeof(GlyphSet) < end) {
134405b261ecSmrg                memcpy(&gs, buffer, sizeof(GlyphSet));
1345f7df2e56Smrg                rc = dixLookupResourceByType((void **) &glyphSet, gs,
1346f7df2e56Smrg                                             GlyphSetType, client,
1347f7df2e56Smrg                                             DixUseAccess);
1348f7df2e56Smrg                if (rc != Success)
1349f7df2e56Smrg                    goto bail;
1350f7df2e56Smrg            }
1351f7df2e56Smrg            buffer += 4;
1352f7df2e56Smrg        }
1353f7df2e56Smrg        else {
1354f7df2e56Smrg            lists->xOff = elt->deltax;
1355f7df2e56Smrg            lists->yOff = elt->deltay;
1356f7df2e56Smrg            lists->format = glyphSet->format;
1357f7df2e56Smrg            lists->len = 0;
1358f7df2e56Smrg            n = elt->len;
1359f7df2e56Smrg            while (n--) {
1360f7df2e56Smrg                if (buffer + size <= end) {
1361f7df2e56Smrg                    switch (size) {
1362f7df2e56Smrg                    case 1:
1363f7df2e56Smrg                        glyph = *((CARD8 *) buffer);
1364f7df2e56Smrg                        break;
1365f7df2e56Smrg                    case 2:
1366f7df2e56Smrg                        glyph = *((CARD16 *) buffer);
1367f7df2e56Smrg                        break;
1368f7df2e56Smrg                    case 4:
1369f7df2e56Smrg                    default:
1370f7df2e56Smrg                        glyph = *((CARD32 *) buffer);
1371f7df2e56Smrg                        break;
1372f7df2e56Smrg                    }
1373f7df2e56Smrg                    if ((*glyphs = FindGlyph(glyphSet, glyph))) {
1374f7df2e56Smrg                        lists->len++;
1375f7df2e56Smrg                        glyphs++;
1376f7df2e56Smrg                    }
1377f7df2e56Smrg                }
1378f7df2e56Smrg                buffer += size;
1379f7df2e56Smrg            }
1380f7df2e56Smrg            space = size * elt->len;
1381f7df2e56Smrg            if (space & 3)
1382f7df2e56Smrg                buffer += 4 - (space & 3);
1383f7df2e56Smrg            lists++;
1384f7df2e56Smrg        }
138505b261ecSmrg    }
13869ace9065Smrg    if (buffer > end) {
1387f7df2e56Smrg        rc = BadLength;
1388f7df2e56Smrg        goto bail;
1389f7df2e56Smrg    }
1390f7df2e56Smrg
1391f7df2e56Smrg    CompositeGlyphs(stuff->op,
1392f7df2e56Smrg                    pSrc,
1393f7df2e56Smrg                    pDst,
1394f7df2e56Smrg                    pFormat,
1395f7df2e56Smrg                    stuff->xSrc, stuff->ySrc, nlist, listsBase, glyphsBase);
13969ace9065Smrg    rc = Success;
139705b261ecSmrg
1398f7df2e56Smrg bail:
139905b261ecSmrg    if (glyphsBase != glyphsLocal)
1400f7df2e56Smrg        free(glyphsBase);
140105b261ecSmrg    if (listsBase != listsLocal)
1402f7df2e56Smrg        free(listsBase);
14039ace9065Smrg    return rc;
140405b261ecSmrg}
140505b261ecSmrg
140605b261ecSmrgstatic int
1407f7df2e56SmrgProcRenderFillRectangles(ClientPtr client)
140805b261ecSmrg{
1409f7df2e56Smrg    PicturePtr pDst;
1410f7df2e56Smrg    int things;
1411f7df2e56Smrg
141205b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
1413f7df2e56Smrg
1414f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq);
1415f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
1416f7df2e56Smrg        client->errorValue = stuff->op;
1417f7df2e56Smrg        return BadValue;
1418f7df2e56Smrg    }
1419f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
142005b261ecSmrg    if (!pDst->pDrawable)
142105b261ecSmrg        return BadDrawable;
1422f7df2e56Smrg
142305b261ecSmrg    things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
142405b261ecSmrg    if (things & 4)
1425f7df2e56Smrg        return BadLength;
142605b261ecSmrg    things >>= 3;
1427f7df2e56Smrg
1428f7df2e56Smrg    CompositeRects(stuff->op,
1429f7df2e56Smrg                   pDst, &stuff->color, things, (xRectangle *) &stuff[1]);
1430f7df2e56Smrg
14316747b715Smrg    return Success;
143205b261ecSmrg}
143305b261ecSmrg
143405b261ecSmrgstatic void
1435f7df2e56SmrgRenderSetBit(unsigned char *line, int x, int bit)
143605b261ecSmrg{
1437f7df2e56Smrg    unsigned char mask;
1438f7df2e56Smrg
143905b261ecSmrg    if (screenInfo.bitmapBitOrder == LSBFirst)
1440f7df2e56Smrg        mask = (1 << (x & 7));
144105b261ecSmrg    else
1442f7df2e56Smrg        mask = (0x80 >> (x & 7));
144305b261ecSmrg    /* XXX assumes byte order is host byte order */
144405b261ecSmrg    line += (x >> 3);
144505b261ecSmrg    if (bit)
1446f7df2e56Smrg        *line |= mask;
144705b261ecSmrg    else
1448f7df2e56Smrg        *line &= ~mask;
144905b261ecSmrg}
145005b261ecSmrg
145105b261ecSmrg#define DITHER_DIM 2
145205b261ecSmrg
145305b261ecSmrgstatic CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = {
1454f7df2e56Smrg    {1, 3,},
1455f7df2e56Smrg    {4, 2,},
145605b261ecSmrg};
145705b261ecSmrg
145805b261ecSmrg#define DITHER_SIZE  ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1)
145905b261ecSmrg
146005b261ecSmrgstatic int
1461f7df2e56SmrgProcRenderCreateCursor(ClientPtr client)
146205b261ecSmrg{
146305b261ecSmrg    REQUEST(xRenderCreateCursorReq);
1464f7df2e56Smrg    PicturePtr pSrc;
1465f7df2e56Smrg    ScreenPtr pScreen;
1466f7df2e56Smrg    unsigned short width, height;
1467f7df2e56Smrg    CARD32 *argbbits, *argb;
1468f7df2e56Smrg    unsigned char *srcbits, *srcline;
1469f7df2e56Smrg    unsigned char *mskbits, *mskline;
1470f7df2e56Smrg    int stride;
1471f7df2e56Smrg    int x, y;
1472f7df2e56Smrg    int nbytes_mono;
147305b261ecSmrg    CursorMetricRec cm;
1474f7df2e56Smrg    CursorPtr pCursor;
1475f7df2e56Smrg    CARD32 twocolor[3];
1476f7df2e56Smrg    int rc, ncolor;
147705b261ecSmrg
1478f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderCreateCursorReq);
147905b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
1480f7df2e56Smrg
1481f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
148205b261ecSmrg    if (!pSrc->pDrawable)
148305b261ecSmrg        return BadDrawable;
148405b261ecSmrg    pScreen = pSrc->pDrawable->pScreen;
148505b261ecSmrg    width = pSrc->pDrawable->width;
148605b261ecSmrg    height = pSrc->pDrawable->height;
1487f7df2e56Smrg    if (height && width > UINT32_MAX / (height * sizeof(CARD32)))
1488f7df2e56Smrg        return BadAlloc;
1489f7df2e56Smrg    if (stuff->x > width || stuff->y > height)
1490f7df2e56Smrg        return BadMatch;
1491f7df2e56Smrg    argbbits = malloc(width * height * sizeof(CARD32));
149205b261ecSmrg    if (!argbbits)
1493f7df2e56Smrg        return BadAlloc;
1494f7df2e56Smrg
149505b261ecSmrg    stride = BitmapBytePad(width);
1496f7df2e56Smrg    nbytes_mono = stride * height;
14976747b715Smrg    srcbits = calloc(1, nbytes_mono);
1498f7df2e56Smrg    if (!srcbits) {
1499f7df2e56Smrg        free(argbbits);
1500f7df2e56Smrg        return BadAlloc;
150105b261ecSmrg    }
15026747b715Smrg    mskbits = calloc(1, nbytes_mono);
1503f7df2e56Smrg    if (!mskbits) {
1504f7df2e56Smrg        free(argbbits);
1505f7df2e56Smrg        free(srcbits);
1506f7df2e56Smrg        return BadAlloc;
1507f7df2e56Smrg    }
1508f7df2e56Smrg
1509f7df2e56Smrg    if (pSrc->format == PICT_a8r8g8b8) {
1510f7df2e56Smrg        (*pScreen->GetImage) (pSrc->pDrawable,
1511f7df2e56Smrg                              0, 0, width, height, ZPixmap,
1512f7df2e56Smrg                              0xffffffff, (void *) argbbits);
1513f7df2e56Smrg    }
1514f7df2e56Smrg    else {
1515f7df2e56Smrg        PixmapPtr pPixmap;
1516f7df2e56Smrg        PicturePtr pPicture;
1517f7df2e56Smrg        PictFormatPtr pFormat;
1518f7df2e56Smrg        int error;
1519f7df2e56Smrg
1520f7df2e56Smrg        pFormat = PictureMatchFormat(pScreen, 32, PICT_a8r8g8b8);
1521f7df2e56Smrg        if (!pFormat) {
1522f7df2e56Smrg            free(argbbits);
1523f7df2e56Smrg            free(srcbits);
1524f7df2e56Smrg            free(mskbits);
1525f7df2e56Smrg            return BadImplementation;
1526f7df2e56Smrg        }
1527f7df2e56Smrg        pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
1528f7df2e56Smrg                                            CREATE_PIXMAP_USAGE_SCRATCH);
1529f7df2e56Smrg        if (!pPixmap) {
1530f7df2e56Smrg            free(argbbits);
1531f7df2e56Smrg            free(srcbits);
1532f7df2e56Smrg            free(mskbits);
1533f7df2e56Smrg            return BadAlloc;
1534f7df2e56Smrg        }
1535f7df2e56Smrg        pPicture = CreatePicture(0, &pPixmap->drawable, pFormat, 0, 0,
1536f7df2e56Smrg                                 client, &error);
1537f7df2e56Smrg        if (!pPicture) {
1538f7df2e56Smrg            free(argbbits);
1539f7df2e56Smrg            free(srcbits);
1540f7df2e56Smrg            free(mskbits);
1541f7df2e56Smrg            return error;
1542f7df2e56Smrg        }
1543f7df2e56Smrg        (*pScreen->DestroyPixmap) (pPixmap);
1544f7df2e56Smrg        CompositePicture(PictOpSrc,
1545f7df2e56Smrg                         pSrc, 0, pPicture, 0, 0, 0, 0, 0, 0, width, height);
1546f7df2e56Smrg        (*pScreen->GetImage) (pPicture->pDrawable,
1547f7df2e56Smrg                              0, 0, width, height, ZPixmap,
1548f7df2e56Smrg                              0xffffffff, (void *) argbbits);
1549f7df2e56Smrg        FreePicture(pPicture, 0);
155005b261ecSmrg    }
155105b261ecSmrg    /*
1552f7df2e56Smrg     * Check whether the cursor can be directly supported by
155305b261ecSmrg     * the core cursor code
155405b261ecSmrg     */
155505b261ecSmrg    ncolor = 0;
155605b261ecSmrg    argb = argbbits;
1557f7df2e56Smrg    for (y = 0; ncolor <= 2 && y < height; y++) {
1558f7df2e56Smrg        for (x = 0; ncolor <= 2 && x < width; x++) {
1559f7df2e56Smrg            CARD32 p = *argb++;
1560f7df2e56Smrg            CARD32 a = (p >> 24);
1561f7df2e56Smrg
1562f7df2e56Smrg            if (a == 0)         /* transparent */
1563f7df2e56Smrg                continue;
1564f7df2e56Smrg            if (a == 0xff) {    /* opaque */
1565f7df2e56Smrg                int n;
1566f7df2e56Smrg
1567f7df2e56Smrg                for (n = 0; n < ncolor; n++)
1568f7df2e56Smrg                    if (p == twocolor[n])
1569f7df2e56Smrg                        break;
1570f7df2e56Smrg                if (n == ncolor)
1571f7df2e56Smrg                    twocolor[ncolor++] = p;
1572f7df2e56Smrg            }
1573f7df2e56Smrg            else
1574f7df2e56Smrg                ncolor = 3;
1575f7df2e56Smrg        }
1576f7df2e56Smrg    }
1577f7df2e56Smrg
157805b261ecSmrg    /*
157905b261ecSmrg     * Convert argb image to two plane cursor
158005b261ecSmrg     */
158105b261ecSmrg    srcline = srcbits;
158205b261ecSmrg    mskline = mskbits;
158305b261ecSmrg    argb = argbbits;
1584f7df2e56Smrg    for (y = 0; y < height; y++) {
1585f7df2e56Smrg        for (x = 0; x < width; x++) {
1586f7df2e56Smrg            CARD32 p = *argb++;
1587f7df2e56Smrg
1588f7df2e56Smrg            if (ncolor <= 2) {
1589f7df2e56Smrg                CARD32 a = ((p >> 24));
1590f7df2e56Smrg
1591f7df2e56Smrg                RenderSetBit(mskline, x, a != 0);
1592f7df2e56Smrg                RenderSetBit(srcline, x, a != 0 && p == twocolor[0]);
1593f7df2e56Smrg            }
1594f7df2e56Smrg            else {
1595f7df2e56Smrg                CARD32 a = ((p >> 24) * DITHER_SIZE + 127) / 255;
1596f7df2e56Smrg                CARD32 i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255;
1597f7df2e56Smrg                CARD32 d =
1598f7df2e56Smrg                    orderedDither[y & (DITHER_DIM - 1)][x & (DITHER_DIM - 1)];
1599f7df2e56Smrg                /* Set mask from dithered alpha value */
1600f7df2e56Smrg                RenderSetBit(mskline, x, a > d);
1601f7df2e56Smrg                /* Set src from dithered intensity value */
1602f7df2e56Smrg                RenderSetBit(srcline, x, a > d && i <= d);
1603f7df2e56Smrg            }
1604f7df2e56Smrg        }
1605f7df2e56Smrg        srcline += stride;
1606f7df2e56Smrg        mskline += stride;
160705b261ecSmrg    }
160805b261ecSmrg    /*
160905b261ecSmrg     * Dither to white and black if the cursor has more than two colors
161005b261ecSmrg     */
1611f7df2e56Smrg    if (ncolor > 2) {
1612f7df2e56Smrg        twocolor[0] = 0xff000000;
1613f7df2e56Smrg        twocolor[1] = 0xffffffff;
161405b261ecSmrg    }
1615f7df2e56Smrg    else {
1616f7df2e56Smrg        free(argbbits);
1617f7df2e56Smrg        argbbits = 0;
161805b261ecSmrg    }
1619f7df2e56Smrg
162005b261ecSmrg#define GetByte(p,s)	(((p) >> (s)) & 0xff)
162105b261ecSmrg#define GetColor(p,s)	(GetByte(p,s) | (GetByte(p,s) << 8))
1622f7df2e56Smrg
162305b261ecSmrg    cm.width = width;
162405b261ecSmrg    cm.height = height;
162505b261ecSmrg    cm.xhot = stuff->x;
162605b261ecSmrg    cm.yhot = stuff->y;
16274642e01fSmrg    rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm,
1628f7df2e56Smrg                         GetColor(twocolor[0], 16),
1629f7df2e56Smrg                         GetColor(twocolor[0], 8),
1630f7df2e56Smrg                         GetColor(twocolor[0], 0),
1631f7df2e56Smrg                         GetColor(twocolor[1], 16),
1632f7df2e56Smrg                         GetColor(twocolor[1], 8),
1633f7df2e56Smrg                         GetColor(twocolor[1], 0),
1634f7df2e56Smrg                         &pCursor, client, stuff->cid);
16354642e01fSmrg    if (rc != Success)
1636f7df2e56Smrg        goto bail;
1637f7df2e56Smrg    if (!AddResource(stuff->cid, RT_CURSOR, (void *) pCursor)) {
1638f7df2e56Smrg        rc = BadAlloc;
1639f7df2e56Smrg        goto bail;
1640f7df2e56Smrg    }
16414642e01fSmrg
16426747b715Smrg    return Success;
1643f7df2e56Smrg bail:
1644f7df2e56Smrg    free(srcbits);
1645f7df2e56Smrg    free(mskbits);
1646f7df2e56Smrg    return rc;
164705b261ecSmrg}
164805b261ecSmrg
164905b261ecSmrgstatic int
1650f7df2e56SmrgProcRenderSetPictureTransform(ClientPtr client)
165105b261ecSmrg{
165205b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
1653f7df2e56Smrg    PicturePtr pPicture;
165405b261ecSmrg
165505b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
1656f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
1657f7df2e56Smrg    return SetPictureTransform(pPicture, (PictTransform *) &stuff->transform);
165805b261ecSmrg}
165905b261ecSmrg
166005b261ecSmrgstatic int
1661f7df2e56SmrgProcRenderQueryFilters(ClientPtr client)
166205b261ecSmrg{
1663f7df2e56Smrg    REQUEST(xRenderQueryFiltersReq);
1664f7df2e56Smrg    DrawablePtr pDrawable;
1665f7df2e56Smrg    xRenderQueryFiltersReply *reply;
1666f7df2e56Smrg    int nbytesName;
1667f7df2e56Smrg    int nnames;
1668f7df2e56Smrg    ScreenPtr pScreen;
1669f7df2e56Smrg    PictureScreenPtr ps;
1670f7df2e56Smrg    int i, j, len, total_bytes, rc;
1671f7df2e56Smrg    INT16 *aliases;
1672f7df2e56Smrg    char *names;
167305b261ecSmrg
167405b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
167505b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
1676f7df2e56Smrg                           DixGetAttrAccess);
167705b261ecSmrg    if (rc != Success)
1678f7df2e56Smrg        return rc;
1679f7df2e56Smrg
168005b261ecSmrg    pScreen = pDrawable->pScreen;
168105b261ecSmrg    nbytesName = 0;
168205b261ecSmrg    nnames = 0;
168305b261ecSmrg    ps = GetPictureScreenIfSet(pScreen);
1684f7df2e56Smrg    if (ps) {
1685f7df2e56Smrg        for (i = 0; i < ps->nfilters; i++)
1686f7df2e56Smrg            nbytesName += 1 + strlen(ps->filters[i].name);
1687f7df2e56Smrg        for (i = 0; i < ps->nfilterAliases; i++)
1688f7df2e56Smrg            nbytesName += 1 + strlen(ps->filterAliases[i].alias);
1689f7df2e56Smrg        nnames = ps->nfilters + ps->nfilterAliases;
169005b261ecSmrg    }
16916747b715Smrg    len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName);
1692f7df2e56Smrg    total_bytes = sizeof(xRenderQueryFiltersReply) + (len << 2);
1693f7df2e56Smrg    reply = (xRenderQueryFiltersReply *) calloc(1, total_bytes);
169405b261ecSmrg    if (!reply)
1695f7df2e56Smrg        return BadAlloc;
169605b261ecSmrg    aliases = (INT16 *) (reply + 1);
169705b261ecSmrg    names = (char *) (aliases + ((nnames + 1) & ~1));
1698f7df2e56Smrg
169905b261ecSmrg    reply->type = X_Reply;
170005b261ecSmrg    reply->sequenceNumber = client->sequence;
170105b261ecSmrg    reply->length = len;
170205b261ecSmrg    reply->numAliases = nnames;
170305b261ecSmrg    reply->numFilters = nnames;
1704f7df2e56Smrg    if (ps) {
1705f7df2e56Smrg
1706f7df2e56Smrg        /* fill in alias values */
1707f7df2e56Smrg        for (i = 0; i < ps->nfilters; i++)
1708f7df2e56Smrg            aliases[i] = FilterAliasNone;
1709f7df2e56Smrg        for (i = 0; i < ps->nfilterAliases; i++) {
1710f7df2e56Smrg            for (j = 0; j < ps->nfilters; j++)
1711f7df2e56Smrg                if (ps->filterAliases[i].filter_id == ps->filters[j].id)
1712f7df2e56Smrg                    break;
1713f7df2e56Smrg            if (j == ps->nfilters) {
1714f7df2e56Smrg                for (j = 0; j < ps->nfilterAliases; j++)
1715f7df2e56Smrg                    if (ps->filterAliases[i].filter_id ==
1716f7df2e56Smrg                        ps->filterAliases[j].alias_id) {
1717f7df2e56Smrg                        break;
1718f7df2e56Smrg                    }
1719f7df2e56Smrg                if (j == ps->nfilterAliases)
1720f7df2e56Smrg                    j = FilterAliasNone;
1721f7df2e56Smrg                else
1722f7df2e56Smrg                    j = j + ps->nfilters;
1723f7df2e56Smrg            }
1724f7df2e56Smrg            aliases[i + ps->nfilters] = j;
1725f7df2e56Smrg        }
1726f7df2e56Smrg
1727f7df2e56Smrg        /* fill in filter names */
1728f7df2e56Smrg        for (i = 0; i < ps->nfilters; i++) {
1729f7df2e56Smrg            j = strlen(ps->filters[i].name);
1730f7df2e56Smrg            *names++ = j;
1731f7df2e56Smrg            memcpy(names, ps->filters[i].name, j);
1732f7df2e56Smrg            names += j;
1733f7df2e56Smrg        }
1734f7df2e56Smrg
1735f7df2e56Smrg        /* fill in filter alias names */
1736f7df2e56Smrg        for (i = 0; i < ps->nfilterAliases; i++) {
1737f7df2e56Smrg            j = strlen(ps->filterAliases[i].alias);
1738f7df2e56Smrg            *names++ = j;
1739f7df2e56Smrg            memcpy(names, ps->filterAliases[i].alias, j);
1740f7df2e56Smrg            names += j;
1741f7df2e56Smrg        }
1742f7df2e56Smrg    }
1743f7df2e56Smrg
1744f7df2e56Smrg    if (client->swapped) {
1745f7df2e56Smrg        for (i = 0; i < reply->numAliases; i++) {
1746f7df2e56Smrg            swaps(&aliases[i]);
1747f7df2e56Smrg        }
1748f7df2e56Smrg        swaps(&reply->sequenceNumber);
1749f7df2e56Smrg        swapl(&reply->length);
1750f7df2e56Smrg        swapl(&reply->numAliases);
1751f7df2e56Smrg        swapl(&reply->numFilters);
1752f7df2e56Smrg    }
1753f7df2e56Smrg    WriteToClient(client, total_bytes, reply);
17546747b715Smrg    free(reply);
1755f7df2e56Smrg
17566747b715Smrg    return Success;
175705b261ecSmrg}
175805b261ecSmrg
175905b261ecSmrgstatic int
1760f7df2e56SmrgProcRenderSetPictureFilter(ClientPtr client)
176105b261ecSmrg{
1762f7df2e56Smrg    REQUEST(xRenderSetPictureFilterReq);
1763f7df2e56Smrg    PicturePtr pPicture;
1764f7df2e56Smrg    int result;
1765f7df2e56Smrg    xFixed *params;
1766f7df2e56Smrg    int nparams;
1767f7df2e56Smrg    char *name;
1768f7df2e56Smrg
1769f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
1770f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
177105b261ecSmrg    name = (char *) (stuff + 1);
17726747b715Smrg    params = (xFixed *) (name + pad_to_int32(stuff->nbytes));
177305b261ecSmrg    nparams = ((xFixed *) stuff + client->req_len) - params;
17746e78d31fSmrg    if (nparams < 0)
17756e78d31fSmrg	return BadLength;
17766e78d31fSmrg
1777f7df2e56Smrg    result = SetPictureFilter(pPicture, name, stuff->nbytes, params, nparams);
177805b261ecSmrg    return result;
177905b261ecSmrg}
178005b261ecSmrg
178105b261ecSmrgstatic int
1782f7df2e56SmrgProcRenderCreateAnimCursor(ClientPtr client)
178305b261ecSmrg{
178405b261ecSmrg    REQUEST(xRenderCreateAnimCursorReq);
1785f7df2e56Smrg    CursorPtr *cursors;
1786f7df2e56Smrg    CARD32 *deltas;
1787f7df2e56Smrg    CursorPtr pCursor;
1788f7df2e56Smrg    int ncursor;
1789f7df2e56Smrg    xAnimCursorElt *elt;
1790f7df2e56Smrg    int i;
1791f7df2e56Smrg    int ret;
179205b261ecSmrg
179305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
179405b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
179505b261ecSmrg    if (client->req_len & 1)
1796f7df2e56Smrg        return BadLength;
1797f7df2e56Smrg    ncursor =
1798f7df2e56Smrg        (client->req_len -
1799f7df2e56Smrg         (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1;
1800f7df2e56Smrg    cursors = xallocarray(ncursor, sizeof(CursorPtr) + sizeof(CARD32));
180105b261ecSmrg    if (!cursors)
1802f7df2e56Smrg        return BadAlloc;
180305b261ecSmrg    deltas = (CARD32 *) (cursors + ncursor);
180405b261ecSmrg    elt = (xAnimCursorElt *) (stuff + 1);
1805f7df2e56Smrg    for (i = 0; i < ncursor; i++) {
1806f7df2e56Smrg        ret = dixLookupResourceByType((void **) (cursors + i), elt->cursor,
1807f7df2e56Smrg                                      RT_CURSOR, client, DixReadAccess);
1808f7df2e56Smrg        if (ret != Success) {
1809f7df2e56Smrg            free(cursors);
1810f7df2e56Smrg            return ret;
1811f7df2e56Smrg        }
1812f7df2e56Smrg        deltas[i] = elt->delay;
1813f7df2e56Smrg        elt++;
1814f7df2e56Smrg    }
1815f7df2e56Smrg    ret = AnimCursorCreate(cursors, deltas, ncursor, &pCursor, client,
1816f7df2e56Smrg                           stuff->cid);
18176747b715Smrg    free(cursors);
181805b261ecSmrg    if (ret != Success)
1819f7df2e56Smrg        return ret;
1820f7df2e56Smrg
1821f7df2e56Smrg    if (AddResource(stuff->cid, RT_CURSOR, (void *) pCursor))
1822f7df2e56Smrg        return Success;
182305b261ecSmrg    return BadAlloc;
182405b261ecSmrg}
182505b261ecSmrg
182605b261ecSmrgstatic int
1827f7df2e56SmrgProcRenderAddTraps(ClientPtr client)
182805b261ecSmrg{
1829f7df2e56Smrg    int ntraps;
1830f7df2e56Smrg    PicturePtr pPicture;
1831f7df2e56Smrg
183205b261ecSmrg    REQUEST(xRenderAddTrapsReq);
183305b261ecSmrg
183405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
1835f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixWriteAccess);
183605b261ecSmrg    if (!pPicture->pDrawable)
183705b261ecSmrg        return BadDrawable;
1838f7df2e56Smrg    ntraps = (client->req_len << 2) - sizeof(xRenderAddTrapsReq);
1839f7df2e56Smrg    if (ntraps % sizeof(xTrap))
1840f7df2e56Smrg        return BadLength;
1841f7df2e56Smrg    ntraps /= sizeof(xTrap);
184205b261ecSmrg    if (ntraps)
1843f7df2e56Smrg        AddTraps(pPicture,
1844f7df2e56Smrg                 stuff->xOff, stuff->yOff, ntraps, (xTrap *) &stuff[1]);
18456747b715Smrg    return Success;
184605b261ecSmrg}
184705b261ecSmrg
1848f7df2e56Smrgstatic int
1849f7df2e56SmrgProcRenderCreateSolidFill(ClientPtr client)
185005b261ecSmrg{
1851f7df2e56Smrg    PicturePtr pPicture;
1852f7df2e56Smrg    int error = 0;
1853f7df2e56Smrg
185405b261ecSmrg    REQUEST(xRenderCreateSolidFillReq);
185505b261ecSmrg
185605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
185705b261ecSmrg
185805b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
185905b261ecSmrg
186005b261ecSmrg    pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error);
186105b261ecSmrg    if (!pPicture)
1862f7df2e56Smrg        return error;
18634642e01fSmrg    /* security creation/labeling check */
18644642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
1865f7df2e56Smrg                     pPicture, RT_NONE, NULL, DixCreateAccess);
18664642e01fSmrg    if (error != Success)
1867f7df2e56Smrg        return error;
1868f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
1869f7df2e56Smrg        return BadAlloc;
187005b261ecSmrg    return Success;
187105b261ecSmrg}
187205b261ecSmrg
1873f7df2e56Smrgstatic int
1874f7df2e56SmrgProcRenderCreateLinearGradient(ClientPtr client)
187505b261ecSmrg{
1876f7df2e56Smrg    PicturePtr pPicture;
1877f7df2e56Smrg    int len;
1878f7df2e56Smrg    int error = 0;
1879f7df2e56Smrg    xFixed *stops;
1880f7df2e56Smrg    xRenderColor *colors;
1881f7df2e56Smrg
188205b261ecSmrg    REQUEST(xRenderCreateLinearGradientReq);
188305b261ecSmrg
188405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
188505b261ecSmrg
188605b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
188705b261ecSmrg
188805b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
1889f7df2e56Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
1890f7df2e56Smrg        return BadLength;
1891f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
189205b261ecSmrg        return BadLength;
189305b261ecSmrg
1894f7df2e56Smrg    stops = (xFixed *) (stuff + 1);
1895f7df2e56Smrg    colors = (xRenderColor *) (stops + stuff->nStops);
189605b261ecSmrg
1897f7df2e56Smrg    pPicture = CreateLinearGradientPicture(stuff->pid, &stuff->p1, &stuff->p2,
1898f7df2e56Smrg                                           stuff->nStops, stops, colors,
1899f7df2e56Smrg                                           &error);
190005b261ecSmrg    if (!pPicture)
1901f7df2e56Smrg        return error;
19024642e01fSmrg    /* security creation/labeling check */
19034642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
1904f7df2e56Smrg                     pPicture, RT_NONE, NULL, DixCreateAccess);
19054642e01fSmrg    if (error != Success)
1906f7df2e56Smrg        return error;
1907f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
1908f7df2e56Smrg        return BadAlloc;
190905b261ecSmrg    return Success;
191005b261ecSmrg}
191105b261ecSmrg
1912f7df2e56Smrgstatic int
1913f7df2e56SmrgProcRenderCreateRadialGradient(ClientPtr client)
191405b261ecSmrg{
1915f7df2e56Smrg    PicturePtr pPicture;
1916f7df2e56Smrg    int len;
1917f7df2e56Smrg    int error = 0;
1918f7df2e56Smrg    xFixed *stops;
1919f7df2e56Smrg    xRenderColor *colors;
1920f7df2e56Smrg
192105b261ecSmrg    REQUEST(xRenderCreateRadialGradientReq);
192205b261ecSmrg
192305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
192405b261ecSmrg
192505b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
192605b261ecSmrg
192705b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
1928f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
192905b261ecSmrg        return BadLength;
193005b261ecSmrg
1931f7df2e56Smrg    stops = (xFixed *) (stuff + 1);
1932f7df2e56Smrg    colors = (xRenderColor *) (stops + stuff->nStops);
193305b261ecSmrg
1934f7df2e56Smrg    pPicture =
1935f7df2e56Smrg        CreateRadialGradientPicture(stuff->pid, &stuff->inner, &stuff->outer,
1936f7df2e56Smrg                                    stuff->inner_radius, stuff->outer_radius,
1937f7df2e56Smrg                                    stuff->nStops, stops, colors, &error);
193805b261ecSmrg    if (!pPicture)
1939f7df2e56Smrg        return error;
19404642e01fSmrg    /* security creation/labeling check */
19414642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
1942f7df2e56Smrg                     pPicture, RT_NONE, NULL, DixCreateAccess);
19434642e01fSmrg    if (error != Success)
1944f7df2e56Smrg        return error;
1945f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
1946f7df2e56Smrg        return BadAlloc;
194705b261ecSmrg    return Success;
194805b261ecSmrg}
194905b261ecSmrg
1950f7df2e56Smrgstatic int
1951f7df2e56SmrgProcRenderCreateConicalGradient(ClientPtr client)
195205b261ecSmrg{
1953f7df2e56Smrg    PicturePtr pPicture;
1954f7df2e56Smrg    int len;
1955f7df2e56Smrg    int error = 0;
1956f7df2e56Smrg    xFixed *stops;
1957f7df2e56Smrg    xRenderColor *colors;
1958f7df2e56Smrg
195905b261ecSmrg    REQUEST(xRenderCreateConicalGradientReq);
196005b261ecSmrg
196105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
196205b261ecSmrg
196305b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
196405b261ecSmrg
196505b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
1966f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
196705b261ecSmrg        return BadLength;
196805b261ecSmrg
1969f7df2e56Smrg    stops = (xFixed *) (stuff + 1);
1970f7df2e56Smrg    colors = (xRenderColor *) (stops + stuff->nStops);
197105b261ecSmrg
1972f7df2e56Smrg    pPicture =
1973f7df2e56Smrg        CreateConicalGradientPicture(stuff->pid, &stuff->center, stuff->angle,
1974f7df2e56Smrg                                     stuff->nStops, stops, colors, &error);
197505b261ecSmrg    if (!pPicture)
1976f7df2e56Smrg        return error;
19774642e01fSmrg    /* security creation/labeling check */
19784642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
1979f7df2e56Smrg                     pPicture, RT_NONE, NULL, DixCreateAccess);
19804642e01fSmrg    if (error != Success)
1981f7df2e56Smrg        return error;
1982f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
1983f7df2e56Smrg        return BadAlloc;
198405b261ecSmrg    return Success;
198505b261ecSmrg}
198605b261ecSmrg
198705b261ecSmrgstatic int
1988f7df2e56SmrgProcRenderDispatch(ClientPtr client)
198905b261ecSmrg{
199005b261ecSmrg    REQUEST(xReq);
1991f7df2e56Smrg
199205b261ecSmrg    if (stuff->data < RenderNumberRequests)
1993f7df2e56Smrg        return (*ProcRenderVector[stuff->data]) (client);
199405b261ecSmrg    else
1995f7df2e56Smrg        return BadRequest;
199605b261ecSmrg}
199705b261ecSmrg
199805b261ecSmrgstatic int
1999f7df2e56SmrgSProcRenderQueryVersion(ClientPtr client)
200005b261ecSmrg{
200105b261ecSmrg    REQUEST(xRenderQueryVersionReq);
20020b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
2003f7df2e56Smrg    swaps(&stuff->length);
2004f7df2e56Smrg    swapl(&stuff->majorVersion);
2005f7df2e56Smrg    swapl(&stuff->minorVersion);
2006f7df2e56Smrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
200705b261ecSmrg}
200805b261ecSmrg
200905b261ecSmrgstatic int
2010f7df2e56SmrgSProcRenderQueryPictFormats(ClientPtr client)
201105b261ecSmrg{
201205b261ecSmrg    REQUEST(xRenderQueryPictFormatsReq);
20130b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
2014f7df2e56Smrg    swaps(&stuff->length);
201505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
201605b261ecSmrg}
201705b261ecSmrg
201805b261ecSmrgstatic int
2019f7df2e56SmrgSProcRenderQueryPictIndexValues(ClientPtr client)
202005b261ecSmrg{
202105b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
20220b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
2023f7df2e56Smrg    swaps(&stuff->length);
2024f7df2e56Smrg    swapl(&stuff->format);
202505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
202605b261ecSmrg}
202705b261ecSmrg
202805b261ecSmrgstatic int
2029f7df2e56SmrgSProcRenderQueryDithers(ClientPtr client)
203005b261ecSmrg{
203105b261ecSmrg    return BadImplementation;
203205b261ecSmrg}
203305b261ecSmrg
203405b261ecSmrgstatic int
2035f7df2e56SmrgSProcRenderCreatePicture(ClientPtr client)
203605b261ecSmrg{
203705b261ecSmrg    REQUEST(xRenderCreatePictureReq);
20380b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
2039f7df2e56Smrg    swaps(&stuff->length);
2040f7df2e56Smrg    swapl(&stuff->pid);
2041f7df2e56Smrg    swapl(&stuff->drawable);
2042f7df2e56Smrg    swapl(&stuff->format);
2043f7df2e56Smrg    swapl(&stuff->mask);
204405b261ecSmrg    SwapRestL(stuff);
204505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
204605b261ecSmrg}
204705b261ecSmrg
204805b261ecSmrgstatic int
2049f7df2e56SmrgSProcRenderChangePicture(ClientPtr client)
205005b261ecSmrg{
205105b261ecSmrg    REQUEST(xRenderChangePictureReq);
20520b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
2053f7df2e56Smrg    swaps(&stuff->length);
2054f7df2e56Smrg    swapl(&stuff->picture);
2055f7df2e56Smrg    swapl(&stuff->mask);
205605b261ecSmrg    SwapRestL(stuff);
205705b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
205805b261ecSmrg}
205905b261ecSmrg
206005b261ecSmrgstatic int
2061f7df2e56SmrgSProcRenderSetPictureClipRectangles(ClientPtr client)
206205b261ecSmrg{
206305b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
20640b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
2065f7df2e56Smrg    swaps(&stuff->length);
2066f7df2e56Smrg    swapl(&stuff->picture);
2067f7df2e56Smrg    swaps(&stuff->xOrigin);
2068f7df2e56Smrg    swaps(&stuff->yOrigin);
206905b261ecSmrg    SwapRestS(stuff);
207005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
207105b261ecSmrg}
207205b261ecSmrg
207305b261ecSmrgstatic int
2074f7df2e56SmrgSProcRenderFreePicture(ClientPtr client)
207505b261ecSmrg{
207605b261ecSmrg    REQUEST(xRenderFreePictureReq);
20770b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
2078f7df2e56Smrg    swaps(&stuff->length);
2079f7df2e56Smrg    swapl(&stuff->picture);
208005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
208105b261ecSmrg}
208205b261ecSmrg
208305b261ecSmrgstatic int
2084f7df2e56SmrgSProcRenderComposite(ClientPtr client)
208505b261ecSmrg{
208605b261ecSmrg    REQUEST(xRenderCompositeReq);
20870b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
2088f7df2e56Smrg    swaps(&stuff->length);
2089f7df2e56Smrg    swapl(&stuff->src);
2090f7df2e56Smrg    swapl(&stuff->mask);
2091f7df2e56Smrg    swapl(&stuff->dst);
2092f7df2e56Smrg    swaps(&stuff->xSrc);
2093f7df2e56Smrg    swaps(&stuff->ySrc);
2094f7df2e56Smrg    swaps(&stuff->xMask);
2095f7df2e56Smrg    swaps(&stuff->yMask);
2096f7df2e56Smrg    swaps(&stuff->xDst);
2097f7df2e56Smrg    swaps(&stuff->yDst);
2098f7df2e56Smrg    swaps(&stuff->width);
2099f7df2e56Smrg    swaps(&stuff->height);
210005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
210105b261ecSmrg}
210205b261ecSmrg
210305b261ecSmrgstatic int
2104f7df2e56SmrgSProcRenderScale(ClientPtr client)
210505b261ecSmrg{
2106f7df2e56Smrg    return BadImplementation;
210705b261ecSmrg}
210805b261ecSmrg
210905b261ecSmrgstatic int
2110f7df2e56SmrgSProcRenderTrapezoids(ClientPtr client)
211105b261ecSmrg{
211205b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
211305b261ecSmrg
211405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
2115f7df2e56Smrg    swaps(&stuff->length);
2116f7df2e56Smrg    swapl(&stuff->src);
2117f7df2e56Smrg    swapl(&stuff->dst);
2118f7df2e56Smrg    swapl(&stuff->maskFormat);
2119f7df2e56Smrg    swaps(&stuff->xSrc);
2120f7df2e56Smrg    swaps(&stuff->ySrc);
212105b261ecSmrg    SwapRestL(stuff);
212205b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
212305b261ecSmrg}
212405b261ecSmrg
212505b261ecSmrgstatic int
2126f7df2e56SmrgSProcRenderTriangles(ClientPtr client)
212705b261ecSmrg{
212805b261ecSmrg    REQUEST(xRenderTrianglesReq);
212905b261ecSmrg
213005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
2131f7df2e56Smrg    swaps(&stuff->length);
2132f7df2e56Smrg    swapl(&stuff->src);
2133f7df2e56Smrg    swapl(&stuff->dst);
2134f7df2e56Smrg    swapl(&stuff->maskFormat);
2135f7df2e56Smrg    swaps(&stuff->xSrc);
2136f7df2e56Smrg    swaps(&stuff->ySrc);
213705b261ecSmrg    SwapRestL(stuff);
213805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
213905b261ecSmrg}
214005b261ecSmrg
214105b261ecSmrgstatic int
2142f7df2e56SmrgSProcRenderTriStrip(ClientPtr client)
214305b261ecSmrg{
214405b261ecSmrg    REQUEST(xRenderTriStripReq);
214505b261ecSmrg
214605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
2147f7df2e56Smrg    swaps(&stuff->length);
2148f7df2e56Smrg    swapl(&stuff->src);
2149f7df2e56Smrg    swapl(&stuff->dst);
2150f7df2e56Smrg    swapl(&stuff->maskFormat);
2151f7df2e56Smrg    swaps(&stuff->xSrc);
2152f7df2e56Smrg    swaps(&stuff->ySrc);
215305b261ecSmrg    SwapRestL(stuff);
215405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
215505b261ecSmrg}
215605b261ecSmrg
215705b261ecSmrgstatic int
2158f7df2e56SmrgSProcRenderTriFan(ClientPtr client)
215905b261ecSmrg{
216005b261ecSmrg    REQUEST(xRenderTriFanReq);
216105b261ecSmrg
216205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
2163f7df2e56Smrg    swaps(&stuff->length);
2164f7df2e56Smrg    swapl(&stuff->src);
2165f7df2e56Smrg    swapl(&stuff->dst);
2166f7df2e56Smrg    swapl(&stuff->maskFormat);
2167f7df2e56Smrg    swaps(&stuff->xSrc);
2168f7df2e56Smrg    swaps(&stuff->ySrc);
216905b261ecSmrg    SwapRestL(stuff);
217005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
217105b261ecSmrg}
217205b261ecSmrg
217305b261ecSmrgstatic int
2174f7df2e56SmrgSProcRenderColorTrapezoids(ClientPtr client)
217505b261ecSmrg{
217605b261ecSmrg    return BadImplementation;
217705b261ecSmrg}
217805b261ecSmrg
217905b261ecSmrgstatic int
2180f7df2e56SmrgSProcRenderColorTriangles(ClientPtr client)
218105b261ecSmrg{
218205b261ecSmrg    return BadImplementation;
218305b261ecSmrg}
218405b261ecSmrg
218505b261ecSmrgstatic int
2186f7df2e56SmrgSProcRenderTransform(ClientPtr client)
218705b261ecSmrg{
218805b261ecSmrg    return BadImplementation;
218905b261ecSmrg}
219005b261ecSmrg
219105b261ecSmrgstatic int
2192f7df2e56SmrgSProcRenderCreateGlyphSet(ClientPtr client)
219305b261ecSmrg{
219405b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
21950b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
2196f7df2e56Smrg    swaps(&stuff->length);
2197f7df2e56Smrg    swapl(&stuff->gsid);
2198f7df2e56Smrg    swapl(&stuff->format);
219905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
220005b261ecSmrg}
220105b261ecSmrg
220205b261ecSmrgstatic int
2203f7df2e56SmrgSProcRenderReferenceGlyphSet(ClientPtr client)
220405b261ecSmrg{
220505b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
22060b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
2207f7df2e56Smrg    swaps(&stuff->length);
2208f7df2e56Smrg    swapl(&stuff->gsid);
2209f7df2e56Smrg    swapl(&stuff->existing);
2210f7df2e56Smrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
221105b261ecSmrg}
221205b261ecSmrg
221305b261ecSmrgstatic int
2214f7df2e56SmrgSProcRenderFreeGlyphSet(ClientPtr client)
221505b261ecSmrg{
221605b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
22170b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
2218f7df2e56Smrg    swaps(&stuff->length);
2219f7df2e56Smrg    swapl(&stuff->glyphset);
222005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
222105b261ecSmrg}
222205b261ecSmrg
222305b261ecSmrgstatic int
2224f7df2e56SmrgSProcRenderAddGlyphs(ClientPtr client)
222505b261ecSmrg{
222605b261ecSmrg    register int i;
2227f7df2e56Smrg    CARD32 *gids;
2228f7df2e56Smrg    void *end;
222905b261ecSmrg    xGlyphInfo *gi;
2230f7df2e56Smrg
223105b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
22320b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
2233f7df2e56Smrg    swaps(&stuff->length);
2234f7df2e56Smrg    swapl(&stuff->glyphset);
2235f7df2e56Smrg    swapl(&stuff->nglyphs);
223605b261ecSmrg    if (stuff->nglyphs & 0xe0000000)
2237f7df2e56Smrg        return BadLength;
223805b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
223905b261ecSmrg    gids = (CARD32 *) (stuff + 1);
224005b261ecSmrg    gi = (xGlyphInfo *) (gids + stuff->nglyphs);
224105b261ecSmrg    if ((char *) end - (char *) (gids + stuff->nglyphs) < 0)
2242f7df2e56Smrg        return BadLength;
224305b261ecSmrg    if ((char *) end - (char *) (gi + stuff->nglyphs) < 0)
2244f7df2e56Smrg        return BadLength;
2245f7df2e56Smrg    for (i = 0; i < stuff->nglyphs; i++) {
2246f7df2e56Smrg        swapl(&gids[i]);
2247f7df2e56Smrg        swaps(&gi[i].width);
2248f7df2e56Smrg        swaps(&gi[i].height);
2249f7df2e56Smrg        swaps(&gi[i].x);
2250f7df2e56Smrg        swaps(&gi[i].y);
2251f7df2e56Smrg        swaps(&gi[i].xOff);
2252f7df2e56Smrg        swaps(&gi[i].yOff);
225305b261ecSmrg    }
225405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
225505b261ecSmrg}
225605b261ecSmrg
225705b261ecSmrgstatic int
2258f7df2e56SmrgSProcRenderAddGlyphsFromPicture(ClientPtr client)
225905b261ecSmrg{
226005b261ecSmrg    return BadImplementation;
226105b261ecSmrg}
226205b261ecSmrg
226305b261ecSmrgstatic int
2264f7df2e56SmrgSProcRenderFreeGlyphs(ClientPtr client)
226505b261ecSmrg{
226605b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
22670b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
2268f7df2e56Smrg    swaps(&stuff->length);
2269f7df2e56Smrg    swapl(&stuff->glyphset);
227005b261ecSmrg    SwapRestL(stuff);
227105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
227205b261ecSmrg}
227305b261ecSmrg
227405b261ecSmrgstatic int
2275f7df2e56SmrgSProcRenderCompositeGlyphs(ClientPtr client)
227605b261ecSmrg{
2277f7df2e56Smrg    xGlyphElt *elt;
2278f7df2e56Smrg    CARD8 *buffer;
2279f7df2e56Smrg    CARD8 *end;
2280f7df2e56Smrg    int space;
2281f7df2e56Smrg    int i;
2282f7df2e56Smrg    int size;
2283f7df2e56Smrg
228405b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
22850b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
2286f7df2e56Smrg
228705b261ecSmrg    switch (stuff->renderReqType) {
2288f7df2e56Smrg    default:
2289f7df2e56Smrg        size = 1;
2290f7df2e56Smrg        break;
2291f7df2e56Smrg    case X_RenderCompositeGlyphs16:
2292f7df2e56Smrg        size = 2;
2293f7df2e56Smrg        break;
2294f7df2e56Smrg    case X_RenderCompositeGlyphs32:
2295f7df2e56Smrg        size = 4;
2296f7df2e56Smrg        break;
2297f7df2e56Smrg    }
2298f7df2e56Smrg
2299f7df2e56Smrg    swaps(&stuff->length);
2300f7df2e56Smrg    swapl(&stuff->src);
2301f7df2e56Smrg    swapl(&stuff->dst);
2302f7df2e56Smrg    swapl(&stuff->maskFormat);
2303f7df2e56Smrg    swapl(&stuff->glyphset);
2304f7df2e56Smrg    swaps(&stuff->xSrc);
2305f7df2e56Smrg    swaps(&stuff->ySrc);
230605b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
230705b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
2308f7df2e56Smrg    while (buffer + sizeof(xGlyphElt) < end) {
2309f7df2e56Smrg        elt = (xGlyphElt *) buffer;
2310f7df2e56Smrg        buffer += sizeof(xGlyphElt);
2311f7df2e56Smrg
2312f7df2e56Smrg        swaps(&elt->deltax);
2313f7df2e56Smrg        swaps(&elt->deltay);
2314f7df2e56Smrg
2315f7df2e56Smrg        i = elt->len;
2316f7df2e56Smrg        if (i == 0xff) {
2317f7df2e56Smrg            swapl((int *) buffer);
2318f7df2e56Smrg            buffer += 4;
2319f7df2e56Smrg        }
2320f7df2e56Smrg        else {
2321f7df2e56Smrg            space = size * i;
2322f7df2e56Smrg            switch (size) {
2323f7df2e56Smrg            case 1:
2324f7df2e56Smrg                buffer += i;
2325f7df2e56Smrg                break;
2326f7df2e56Smrg            case 2:
2327f7df2e56Smrg                while (i--) {
2328f7df2e56Smrg                    swaps((short *) buffer);
2329f7df2e56Smrg                    buffer += 2;
2330f7df2e56Smrg                }
2331f7df2e56Smrg                break;
2332f7df2e56Smrg            case 4:
2333f7df2e56Smrg                while (i--) {
2334f7df2e56Smrg                    swapl((int *) buffer);
2335f7df2e56Smrg                    buffer += 4;
2336f7df2e56Smrg                }
2337f7df2e56Smrg                break;
2338f7df2e56Smrg            }
2339f7df2e56Smrg            if (space & 3)
2340f7df2e56Smrg                buffer += 4 - (space & 3);
2341f7df2e56Smrg        }
234205b261ecSmrg    }
234305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
234405b261ecSmrg}
234505b261ecSmrg
234605b261ecSmrgstatic int
2347f7df2e56SmrgSProcRenderFillRectangles(ClientPtr client)
234805b261ecSmrg{
234905b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
235005b261ecSmrg
2351f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq);
2352f7df2e56Smrg    swaps(&stuff->length);
2353f7df2e56Smrg    swapl(&stuff->dst);
2354f7df2e56Smrg    swaps(&stuff->color.red);
2355f7df2e56Smrg    swaps(&stuff->color.green);
2356f7df2e56Smrg    swaps(&stuff->color.blue);
2357f7df2e56Smrg    swaps(&stuff->color.alpha);
235805b261ecSmrg    SwapRestS(stuff);
235905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
236005b261ecSmrg}
2361f7df2e56Smrg
236205b261ecSmrgstatic int
2363f7df2e56SmrgSProcRenderCreateCursor(ClientPtr client)
236405b261ecSmrg{
236505b261ecSmrg    REQUEST(xRenderCreateCursorReq);
2366f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderCreateCursorReq);
2367f7df2e56Smrg
2368f7df2e56Smrg    swaps(&stuff->length);
2369f7df2e56Smrg    swapl(&stuff->cid);
2370f7df2e56Smrg    swapl(&stuff->src);
2371f7df2e56Smrg    swaps(&stuff->x);
2372f7df2e56Smrg    swaps(&stuff->y);
237305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
237405b261ecSmrg}
2375f7df2e56Smrg
237605b261ecSmrgstatic int
2377f7df2e56SmrgSProcRenderSetPictureTransform(ClientPtr client)
237805b261ecSmrg{
237905b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
238005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
238105b261ecSmrg
2382f7df2e56Smrg    swaps(&stuff->length);
2383f7df2e56Smrg    swapl(&stuff->picture);
2384f7df2e56Smrg    swapl(&stuff->transform.matrix11);
2385f7df2e56Smrg    swapl(&stuff->transform.matrix12);
2386f7df2e56Smrg    swapl(&stuff->transform.matrix13);
2387f7df2e56Smrg    swapl(&stuff->transform.matrix21);
2388f7df2e56Smrg    swapl(&stuff->transform.matrix22);
2389f7df2e56Smrg    swapl(&stuff->transform.matrix23);
2390f7df2e56Smrg    swapl(&stuff->transform.matrix31);
2391f7df2e56Smrg    swapl(&stuff->transform.matrix32);
2392f7df2e56Smrg    swapl(&stuff->transform.matrix33);
239305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
239405b261ecSmrg}
239505b261ecSmrg
239605b261ecSmrgstatic int
2397f7df2e56SmrgSProcRenderQueryFilters(ClientPtr client)
239805b261ecSmrg{
2399f7df2e56Smrg    REQUEST(xRenderQueryFiltersReq);
2400f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
240105b261ecSmrg
2402f7df2e56Smrg    swaps(&stuff->length);
2403f7df2e56Smrg    swapl(&stuff->drawable);
240405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
240505b261ecSmrg}
2406f7df2e56Smrg
240705b261ecSmrgstatic int
2408f7df2e56SmrgSProcRenderSetPictureFilter(ClientPtr client)
240905b261ecSmrg{
2410f7df2e56Smrg    REQUEST(xRenderSetPictureFilterReq);
2411f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
241205b261ecSmrg
2413f7df2e56Smrg    swaps(&stuff->length);
2414f7df2e56Smrg    swapl(&stuff->picture);
2415f7df2e56Smrg    swaps(&stuff->nbytes);
241605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
241705b261ecSmrg}
2418f7df2e56Smrg
241905b261ecSmrgstatic int
2420f7df2e56SmrgSProcRenderCreateAnimCursor(ClientPtr client)
242105b261ecSmrg{
2422f7df2e56Smrg    REQUEST(xRenderCreateAnimCursorReq);
2423f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
242405b261ecSmrg
2425f7df2e56Smrg    swaps(&stuff->length);
2426f7df2e56Smrg    swapl(&stuff->cid);
242705b261ecSmrg    SwapRestL(stuff);
242805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
242905b261ecSmrg}
243005b261ecSmrg
243105b261ecSmrgstatic int
2432f7df2e56SmrgSProcRenderAddTraps(ClientPtr client)
243305b261ecSmrg{
2434f7df2e56Smrg    REQUEST(xRenderAddTrapsReq);
2435f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
243605b261ecSmrg
2437f7df2e56Smrg    swaps(&stuff->length);
2438f7df2e56Smrg    swapl(&stuff->picture);
2439f7df2e56Smrg    swaps(&stuff->xOff);
2440f7df2e56Smrg    swaps(&stuff->yOff);
244105b261ecSmrg    SwapRestL(stuff);
244205b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
244305b261ecSmrg}
244405b261ecSmrg
244505b261ecSmrgstatic int
244605b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client)
244705b261ecSmrg{
2448f7df2e56Smrg    REQUEST(xRenderCreateSolidFillReq);
2449f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
245005b261ecSmrg
2451f7df2e56Smrg    swaps(&stuff->length);
2452f7df2e56Smrg    swapl(&stuff->pid);
2453f7df2e56Smrg    swaps(&stuff->color.alpha);
2454f7df2e56Smrg    swaps(&stuff->color.red);
2455f7df2e56Smrg    swaps(&stuff->color.green);
2456f7df2e56Smrg    swaps(&stuff->color.blue);
245705b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
245805b261ecSmrg}
245905b261ecSmrg
2460f7df2e56Smrgstatic void
2461f7df2e56SmrgswapStops(void *stuff, int num)
246205b261ecSmrg{
2463f7df2e56Smrg    int i;
246405b261ecSmrg    CARD32 *stops;
246505b261ecSmrg    CARD16 *colors;
2466f7df2e56Smrg
2467f7df2e56Smrg    stops = (CARD32 *) (stuff);
246805b261ecSmrg    for (i = 0; i < num; ++i) {
2469f7df2e56Smrg        swapl(stops);
247005b261ecSmrg        ++stops;
247105b261ecSmrg    }
2472f7df2e56Smrg    colors = (CARD16 *) (stops);
2473f7df2e56Smrg    for (i = 0; i < 4 * num; ++i) {
2474f7df2e56Smrg        swaps(colors);
24758223e2f2Smrg        ++colors;
247605b261ecSmrg    }
247705b261ecSmrg}
247805b261ecSmrg
247905b261ecSmrgstatic int
2480f7df2e56SmrgSProcRenderCreateLinearGradient(ClientPtr client)
248105b261ecSmrg{
248205b261ecSmrg    int len;
248305b261ecSmrg
2484f7df2e56Smrg    REQUEST(xRenderCreateLinearGradientReq);
2485f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
2486f7df2e56Smrg
2487f7df2e56Smrg    swaps(&stuff->length);
2488f7df2e56Smrg    swapl(&stuff->pid);
2489f7df2e56Smrg    swapl(&stuff->p1.x);
2490f7df2e56Smrg    swapl(&stuff->p1.y);
2491f7df2e56Smrg    swapl(&stuff->p2.x);
2492f7df2e56Smrg    swapl(&stuff->p2.y);
2493f7df2e56Smrg    swapl(&stuff->nStops);
249405b261ecSmrg
249505b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
2496f7df2e56Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
2497f7df2e56Smrg        return BadLength;
2498f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
249905b261ecSmrg        return BadLength;
250005b261ecSmrg
2501f7df2e56Smrg    swapStops(stuff + 1, stuff->nStops);
250205b261ecSmrg
250305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
250405b261ecSmrg}
250505b261ecSmrg
250605b261ecSmrgstatic int
2507f7df2e56SmrgSProcRenderCreateRadialGradient(ClientPtr client)
250805b261ecSmrg{
250905b261ecSmrg    int len;
2510f7df2e56Smrg
2511f7df2e56Smrg    REQUEST(xRenderCreateRadialGradientReq);
2512f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
2513f7df2e56Smrg
2514f7df2e56Smrg    swaps(&stuff->length);
2515f7df2e56Smrg    swapl(&stuff->pid);
2516f7df2e56Smrg    swapl(&stuff->inner.x);
2517f7df2e56Smrg    swapl(&stuff->inner.y);
2518f7df2e56Smrg    swapl(&stuff->outer.x);
2519f7df2e56Smrg    swapl(&stuff->outer.y);
2520f7df2e56Smrg    swapl(&stuff->inner_radius);
2521f7df2e56Smrg    swapl(&stuff->outer_radius);
2522f7df2e56Smrg    swapl(&stuff->nStops);
252305b261ecSmrg
252405b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
2525f7df2e56Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
2526f7df2e56Smrg        return BadLength;
2527f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
252805b261ecSmrg        return BadLength;
252905b261ecSmrg
2530f7df2e56Smrg    swapStops(stuff + 1, stuff->nStops);
253105b261ecSmrg
253205b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
253305b261ecSmrg}
253405b261ecSmrg
253505b261ecSmrgstatic int
2536f7df2e56SmrgSProcRenderCreateConicalGradient(ClientPtr client)
253705b261ecSmrg{
253805b261ecSmrg    int len;
253905b261ecSmrg
2540f7df2e56Smrg    REQUEST(xRenderCreateConicalGradientReq);
2541f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
2542f7df2e56Smrg
2543f7df2e56Smrg    swaps(&stuff->length);
2544f7df2e56Smrg    swapl(&stuff->pid);
2545f7df2e56Smrg    swapl(&stuff->center.x);
2546f7df2e56Smrg    swapl(&stuff->center.y);
2547f7df2e56Smrg    swapl(&stuff->angle);
2548f7df2e56Smrg    swapl(&stuff->nStops);
254905b261ecSmrg
255005b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
2551f7df2e56Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
2552f7df2e56Smrg        return BadLength;
2553f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
255405b261ecSmrg        return BadLength;
255505b261ecSmrg
2556f7df2e56Smrg    swapStops(stuff + 1, stuff->nStops);
255705b261ecSmrg
255805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
255905b261ecSmrg}
256005b261ecSmrg
256105b261ecSmrgstatic int
2562f7df2e56SmrgSProcRenderDispatch(ClientPtr client)
256305b261ecSmrg{
256405b261ecSmrg    REQUEST(xReq);
2565f7df2e56Smrg
256605b261ecSmrg    if (stuff->data < RenderNumberRequests)
2567f7df2e56Smrg        return (*SProcRenderVector[stuff->data]) (client);
256805b261ecSmrg    else
2569f7df2e56Smrg        return BadRequest;
257005b261ecSmrg}
257105b261ecSmrg
257205b261ecSmrg#ifdef PANORAMIX
25736747b715Smrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\
2574f7df2e56Smrg    int rc = dixLookupResourceByType((void **)&(pPicture), pid,\
25756747b715Smrg                                     XRT_PICTURE, client, mode);\
25766747b715Smrg    if (rc != Success)\
25776747b715Smrg	return rc;\
257805b261ecSmrg}
257905b261ecSmrg
25806747b715Smrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\
258105b261ecSmrg    if (pid == None) \
258205b261ecSmrg	pPicture = 0; \
258305b261ecSmrg    else { \
25846747b715Smrg	VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \
258505b261ecSmrg    } \
258605b261ecSmrg} \
258705b261ecSmrg
2588f7df2e56Smrgint (*PanoramiXSaveRenderVector[RenderNumberRequests]) (ClientPtr);
258905b261ecSmrg
259005b261ecSmrgstatic int
2591f7df2e56SmrgPanoramiXRenderCreatePicture(ClientPtr client)
259205b261ecSmrg{
259305b261ecSmrg    REQUEST(xRenderCreatePictureReq);
2594f7df2e56Smrg    PanoramiXRes *refDraw, *newPict;
2595f7df2e56Smrg    int result, j;
259605b261ecSmrg
259705b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
2598f7df2e56Smrg    result = dixLookupResourceByClass((void **) &refDraw, stuff->drawable,
2599f7df2e56Smrg                                      XRC_DRAWABLE, client, DixWriteAccess);
26006747b715Smrg    if (result != Success)
2601f7df2e56Smrg        return (result == BadValue) ? BadDrawable : result;
2602f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
2603f7df2e56Smrg        return BadAlloc;
260405b261ecSmrg    newPict->type = XRT_PICTURE;
2605f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
2606f7df2e56Smrg
260705b261ecSmrg    if (refDraw->type == XRT_WINDOW &&
2608f7df2e56Smrg        stuff->drawable == screenInfo.screens[0]->root->drawable.id) {
2609f7df2e56Smrg        newPict->u.pict.root = TRUE;
261005b261ecSmrg    }
261105b261ecSmrg    else
2612f7df2e56Smrg        newPict->u.pict.root = FALSE;
261305b261ecSmrg
261405b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
2615f7df2e56Smrg        stuff->pid = newPict->info[j].id;
2616f7df2e56Smrg        stuff->drawable = refDraw->info[j].id;
2617f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client);
2618f7df2e56Smrg        if (result != Success)
2619f7df2e56Smrg            break;
262005b261ecSmrg    }
262105b261ecSmrg
262205b261ecSmrg    if (result == Success)
2623f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
2624f7df2e56Smrg    else
2625f7df2e56Smrg        free(newPict);
262605b261ecSmrg
26276747b715Smrg    return result;
262805b261ecSmrg}
262905b261ecSmrg
263005b261ecSmrgstatic int
2631f7df2e56SmrgPanoramiXRenderChangePicture(ClientPtr client)
263205b261ecSmrg{
2633f7df2e56Smrg    PanoramiXRes *pict;
2634f7df2e56Smrg    int result = Success, j;
2635f7df2e56Smrg
263605b261ecSmrg    REQUEST(xRenderChangePictureReq);
263705b261ecSmrg
26386747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
2639f7df2e56Smrg
26406747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2641f7df2e56Smrg
264205b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
264305b261ecSmrg        stuff->picture = pict->info[j].id;
264405b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client);
2645f7df2e56Smrg        if (result != Success)
2646f7df2e56Smrg            break;
264705b261ecSmrg    }
264805b261ecSmrg
26496747b715Smrg    return result;
265005b261ecSmrg}
265105b261ecSmrg
265205b261ecSmrgstatic int
2653f7df2e56SmrgPanoramiXRenderSetPictureClipRectangles(ClientPtr client)
265405b261ecSmrg{
265505b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
2656f7df2e56Smrg    int result = Success, j;
2657f7df2e56Smrg    PanoramiXRes *pict;
265805b261ecSmrg
265905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
2660f7df2e56Smrg
26616747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2662f7df2e56Smrg
266305b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
266405b261ecSmrg        stuff->picture = pict->info[j].id;
2665f7df2e56Smrg        result =
2666f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles])
2667f7df2e56Smrg            (client);
2668f7df2e56Smrg        if (result != Success)
2669f7df2e56Smrg            break;
267005b261ecSmrg    }
267105b261ecSmrg
26726747b715Smrg    return result;
267305b261ecSmrg}
267405b261ecSmrg
267505b261ecSmrgstatic int
2676f7df2e56SmrgPanoramiXRenderSetPictureTransform(ClientPtr client)
267705b261ecSmrg{
267805b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
2679f7df2e56Smrg    int result = Success, j;
2680f7df2e56Smrg    PanoramiXRes *pict;
268105b261ecSmrg
268205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
2683f7df2e56Smrg
26846747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2685f7df2e56Smrg
268605b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
268705b261ecSmrg        stuff->picture = pict->info[j].id;
2688f7df2e56Smrg        result =
2689f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client);
2690f7df2e56Smrg        if (result != Success)
2691f7df2e56Smrg            break;
269205b261ecSmrg    }
269305b261ecSmrg
26946747b715Smrg    return result;
269505b261ecSmrg}
269605b261ecSmrg
269705b261ecSmrgstatic int
2698f7df2e56SmrgPanoramiXRenderSetPictureFilter(ClientPtr client)
269905b261ecSmrg{
270005b261ecSmrg    REQUEST(xRenderSetPictureFilterReq);
2701f7df2e56Smrg    int result = Success, j;
2702f7df2e56Smrg    PanoramiXRes *pict;
270305b261ecSmrg
270405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
2705f7df2e56Smrg
27066747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2707f7df2e56Smrg
270805b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
270905b261ecSmrg        stuff->picture = pict->info[j].id;
2710f7df2e56Smrg        result =
2711f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client);
2712f7df2e56Smrg        if (result != Success)
2713f7df2e56Smrg            break;
271405b261ecSmrg    }
271505b261ecSmrg
27166747b715Smrg    return result;
271705b261ecSmrg}
271805b261ecSmrg
271905b261ecSmrgstatic int
2720f7df2e56SmrgPanoramiXRenderFreePicture(ClientPtr client)
272105b261ecSmrg{
272205b261ecSmrg    PanoramiXRes *pict;
2723f7df2e56Smrg    int result = Success, j;
2724f7df2e56Smrg
272505b261ecSmrg    REQUEST(xRenderFreePictureReq);
272605b261ecSmrg
272705b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
272805b261ecSmrg
272905b261ecSmrg    client->errorValue = stuff->picture;
273005b261ecSmrg
27316747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess);
273205b261ecSmrg
273305b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
2734f7df2e56Smrg        stuff->picture = pict->info[j].id;
2735f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client);
2736f7df2e56Smrg        if (result != Success)
2737f7df2e56Smrg            break;
273805b261ecSmrg    }
273905b261ecSmrg
274005b261ecSmrg    /* Since ProcRenderFreePicture is using FreeResource, it will free
2741f7df2e56Smrg       our resource for us on the last pass through the loop above */
2742f7df2e56Smrg
27436747b715Smrg    return result;
274405b261ecSmrg}
274505b261ecSmrg
274605b261ecSmrgstatic int
2747f7df2e56SmrgPanoramiXRenderComposite(ClientPtr client)
274805b261ecSmrg{
2749f7df2e56Smrg    PanoramiXRes *src, *msk, *dst;
2750f7df2e56Smrg    int result = Success, j;
2751f7df2e56Smrg    xRenderCompositeReq orig;
2752f7df2e56Smrg
275305b261ecSmrg    REQUEST(xRenderCompositeReq);
275405b261ecSmrg
275505b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
2756f7df2e56Smrg
2757f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2758f7df2e56Smrg    VERIFY_XIN_ALPHA(msk, stuff->mask, client, DixReadAccess);
2759f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2760f7df2e56Smrg
276105b261ecSmrg    orig = *stuff;
2762f7df2e56Smrg
276305b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
2764f7df2e56Smrg        stuff->src = src->info[j].id;
2765f7df2e56Smrg        if (src->u.pict.root) {
2766f7df2e56Smrg            stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x;
2767f7df2e56Smrg            stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y;
2768f7df2e56Smrg        }
2769f7df2e56Smrg        stuff->dst = dst->info[j].id;
2770f7df2e56Smrg        if (dst->u.pict.root) {
2771f7df2e56Smrg            stuff->xDst = orig.xDst - screenInfo.screens[j]->x;
2772f7df2e56Smrg            stuff->yDst = orig.yDst - screenInfo.screens[j]->y;
2773f7df2e56Smrg        }
2774f7df2e56Smrg        if (msk) {
2775f7df2e56Smrg            stuff->mask = msk->info[j].id;
2776f7df2e56Smrg            if (msk->u.pict.root) {
2777f7df2e56Smrg                stuff->xMask = orig.xMask - screenInfo.screens[j]->x;
2778f7df2e56Smrg                stuff->yMask = orig.yMask - screenInfo.screens[j]->y;
2779f7df2e56Smrg            }
2780f7df2e56Smrg        }
2781f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client);
2782f7df2e56Smrg        if (result != Success)
2783f7df2e56Smrg            break;
278405b261ecSmrg    }
278505b261ecSmrg
278605b261ecSmrg    return result;
278705b261ecSmrg}
278805b261ecSmrg
278905b261ecSmrgstatic int
2790f7df2e56SmrgPanoramiXRenderCompositeGlyphs(ClientPtr client)
279105b261ecSmrg{
2792f7df2e56Smrg    PanoramiXRes *src, *dst;
2793f7df2e56Smrg    int result = Success, j;
2794f7df2e56Smrg
279505b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
2796f7df2e56Smrg    xGlyphElt origElt, *elt;
2797f7df2e56Smrg    INT16 xSrc, ySrc;
279805b261ecSmrg
279905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
2800f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2801f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2802f7df2e56Smrg
2803f7df2e56Smrg    if (client->req_len << 2 >= (sizeof(xRenderCompositeGlyphsReq) +
2804f7df2e56Smrg                                 sizeof(xGlyphElt))) {
2805f7df2e56Smrg        elt = (xGlyphElt *) (stuff + 1);
2806f7df2e56Smrg        origElt = *elt;
2807f7df2e56Smrg        xSrc = stuff->xSrc;
2808f7df2e56Smrg        ySrc = stuff->ySrc;
2809f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2810f7df2e56Smrg            stuff->src = src->info[j].id;
2811f7df2e56Smrg            if (src->u.pict.root) {
2812f7df2e56Smrg                stuff->xSrc = xSrc - screenInfo.screens[j]->x;
2813f7df2e56Smrg                stuff->ySrc = ySrc - screenInfo.screens[j]->y;
2814f7df2e56Smrg            }
2815f7df2e56Smrg            stuff->dst = dst->info[j].id;
2816f7df2e56Smrg            if (dst->u.pict.root) {
2817f7df2e56Smrg                elt->deltax = origElt.deltax - screenInfo.screens[j]->x;
2818f7df2e56Smrg                elt->deltay = origElt.deltay - screenInfo.screens[j]->y;
2819f7df2e56Smrg            }
2820f7df2e56Smrg            result =
2821f7df2e56Smrg                (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client);
2822f7df2e56Smrg            if (result != Success)
2823f7df2e56Smrg                break;
2824f7df2e56Smrg        }
282505b261ecSmrg    }
282605b261ecSmrg
282705b261ecSmrg    return result;
282805b261ecSmrg}
282905b261ecSmrg
283005b261ecSmrgstatic int
2831f7df2e56SmrgPanoramiXRenderFillRectangles(ClientPtr client)
283205b261ecSmrg{
2833f7df2e56Smrg    PanoramiXRes *dst;
2834f7df2e56Smrg    int result = Success, j;
2835f7df2e56Smrg
283605b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
2837f7df2e56Smrg    char *extra;
2838f7df2e56Smrg    int extra_len;
2839f7df2e56Smrg
2840f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq);
2841f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2842f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
2843f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
2844f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
2845f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2846f7df2e56Smrg            if (j)
2847f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
2848f7df2e56Smrg            if (dst->u.pict.root) {
2849f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
2850f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
2851f7df2e56Smrg
2852f7df2e56Smrg                if (x_off || y_off) {
2853f7df2e56Smrg                    xRectangle *rects = (xRectangle *) (stuff + 1);
2854f7df2e56Smrg                    int i = extra_len / sizeof(xRectangle);
2855f7df2e56Smrg
2856f7df2e56Smrg                    while (i--) {
2857f7df2e56Smrg                        rects->x -= x_off;
2858f7df2e56Smrg                        rects->y -= y_off;
2859f7df2e56Smrg                        rects++;
2860f7df2e56Smrg                    }
2861f7df2e56Smrg                }
2862f7df2e56Smrg            }
2863f7df2e56Smrg            stuff->dst = dst->info[j].id;
2864f7df2e56Smrg            result =
2865f7df2e56Smrg                (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client);
2866f7df2e56Smrg            if (result != Success)
2867f7df2e56Smrg                break;
2868f7df2e56Smrg        }
2869f7df2e56Smrg        free(extra);
287005b261ecSmrg    }
287105b261ecSmrg
287205b261ecSmrg    return result;
287305b261ecSmrg}
287405b261ecSmrg
287505b261ecSmrgstatic int
287605b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client)
287705b261ecSmrg{
2878f7df2e56Smrg    PanoramiXRes *src, *dst;
2879f7df2e56Smrg    int result = Success, j;
2880f7df2e56Smrg
288105b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
2882f7df2e56Smrg    char *extra;
2883f7df2e56Smrg    int extra_len;
2884f7df2e56Smrg
2885f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
2886f7df2e56Smrg
2887f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2888f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2889f7df2e56Smrg
2890f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTrapezoidsReq);
2891f7df2e56Smrg
2892f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
2893f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
2894f7df2e56Smrg
2895f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2896f7df2e56Smrg            if (j)
2897f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
2898f7df2e56Smrg            if (dst->u.pict.root) {
2899f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
2900f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
2901f7df2e56Smrg
2902f7df2e56Smrg                if (x_off || y_off) {
2903f7df2e56Smrg                    xTrapezoid *trap = (xTrapezoid *) (stuff + 1);
2904f7df2e56Smrg                    int i = extra_len / sizeof(xTrapezoid);
2905f7df2e56Smrg
2906f7df2e56Smrg                    while (i--) {
2907f7df2e56Smrg                        trap->top -= y_off;
2908f7df2e56Smrg                        trap->bottom -= y_off;
2909f7df2e56Smrg                        trap->left.p1.x -= x_off;
2910f7df2e56Smrg                        trap->left.p1.y -= y_off;
2911f7df2e56Smrg                        trap->left.p2.x -= x_off;
2912f7df2e56Smrg                        trap->left.p2.y -= y_off;
2913f7df2e56Smrg                        trap->right.p1.x -= x_off;
2914f7df2e56Smrg                        trap->right.p1.y -= y_off;
2915f7df2e56Smrg                        trap->right.p2.x -= x_off;
2916f7df2e56Smrg                        trap->right.p2.y -= y_off;
2917f7df2e56Smrg                        trap++;
2918f7df2e56Smrg                    }
2919f7df2e56Smrg                }
2920f7df2e56Smrg            }
2921f7df2e56Smrg
292205b261ecSmrg            stuff->src = src->info[j].id;
292305b261ecSmrg            stuff->dst = dst->info[j].id;
2924f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client);
2925f7df2e56Smrg
2926f7df2e56Smrg            if (result != Success)
2927f7df2e56Smrg                break;
2928f7df2e56Smrg        }
292905b261ecSmrg
29306747b715Smrg        free(extra);
293105b261ecSmrg    }
293205b261ecSmrg
293305b261ecSmrg    return result;
293405b261ecSmrg}
293505b261ecSmrg
293605b261ecSmrgstatic int
293705b261ecSmrgPanoramiXRenderTriangles(ClientPtr client)
293805b261ecSmrg{
2939f7df2e56Smrg    PanoramiXRes *src, *dst;
2940f7df2e56Smrg    int result = Success, j;
2941f7df2e56Smrg
294205b261ecSmrg    REQUEST(xRenderTrianglesReq);
2943f7df2e56Smrg    char *extra;
2944f7df2e56Smrg    int extra_len;
2945f7df2e56Smrg
2946f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
2947f7df2e56Smrg
2948f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2949f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2950f7df2e56Smrg
2951f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTrianglesReq);
2952f7df2e56Smrg
2953f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
2954f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
2955f7df2e56Smrg
2956f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2957f7df2e56Smrg            if (j)
2958f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
2959f7df2e56Smrg            if (dst->u.pict.root) {
2960f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
2961f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
2962f7df2e56Smrg
2963f7df2e56Smrg                if (x_off || y_off) {
2964f7df2e56Smrg                    xTriangle *tri = (xTriangle *) (stuff + 1);
2965f7df2e56Smrg                    int i = extra_len / sizeof(xTriangle);
2966f7df2e56Smrg
2967f7df2e56Smrg                    while (i--) {
2968f7df2e56Smrg                        tri->p1.x -= x_off;
2969f7df2e56Smrg                        tri->p1.y -= y_off;
2970f7df2e56Smrg                        tri->p2.x -= x_off;
2971f7df2e56Smrg                        tri->p2.y -= y_off;
2972f7df2e56Smrg                        tri->p3.x -= x_off;
2973f7df2e56Smrg                        tri->p3.y -= y_off;
2974f7df2e56Smrg                        tri++;
2975f7df2e56Smrg                    }
2976f7df2e56Smrg                }
2977f7df2e56Smrg            }
2978f7df2e56Smrg
297905b261ecSmrg            stuff->src = src->info[j].id;
298005b261ecSmrg            stuff->dst = dst->info[j].id;
2981f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client);
2982f7df2e56Smrg
2983f7df2e56Smrg            if (result != Success)
2984f7df2e56Smrg                break;
2985f7df2e56Smrg        }
298605b261ecSmrg
29876747b715Smrg        free(extra);
298805b261ecSmrg    }
298905b261ecSmrg
299005b261ecSmrg    return result;
299105b261ecSmrg}
299205b261ecSmrg
299305b261ecSmrgstatic int
299405b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client)
299505b261ecSmrg{
2996f7df2e56Smrg    PanoramiXRes *src, *dst;
2997f7df2e56Smrg    int result = Success, j;
2998f7df2e56Smrg
299905b261ecSmrg    REQUEST(xRenderTriStripReq);
3000f7df2e56Smrg    char *extra;
3001f7df2e56Smrg    int extra_len;
3002f7df2e56Smrg
3003f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
3004f7df2e56Smrg
3005f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
3006f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
3007f7df2e56Smrg
3008f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTriStripReq);
3009f7df2e56Smrg
3010f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
3011f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
3012f7df2e56Smrg
3013f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
3014f7df2e56Smrg            if (j)
3015f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
3016f7df2e56Smrg            if (dst->u.pict.root) {
3017f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
3018f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
3019f7df2e56Smrg
3020f7df2e56Smrg                if (x_off || y_off) {
3021f7df2e56Smrg                    xPointFixed *fixed = (xPointFixed *) (stuff + 1);
3022f7df2e56Smrg                    int i = extra_len / sizeof(xPointFixed);
3023f7df2e56Smrg
3024f7df2e56Smrg                    while (i--) {
3025f7df2e56Smrg                        fixed->x -= x_off;
3026f7df2e56Smrg                        fixed->y -= y_off;
3027f7df2e56Smrg                        fixed++;
3028f7df2e56Smrg                    }
3029f7df2e56Smrg                }
3030f7df2e56Smrg            }
3031f7df2e56Smrg
303205b261ecSmrg            stuff->src = src->info[j].id;
303305b261ecSmrg            stuff->dst = dst->info[j].id;
3034f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client);
3035f7df2e56Smrg
3036f7df2e56Smrg            if (result != Success)
3037f7df2e56Smrg                break;
3038f7df2e56Smrg        }
303905b261ecSmrg
30406747b715Smrg        free(extra);
304105b261ecSmrg    }
304205b261ecSmrg
304305b261ecSmrg    return result;
304405b261ecSmrg}
304505b261ecSmrg
304605b261ecSmrgstatic int
304705b261ecSmrgPanoramiXRenderTriFan(ClientPtr client)
304805b261ecSmrg{
3049f7df2e56Smrg    PanoramiXRes *src, *dst;
3050f7df2e56Smrg    int result = Success, j;
3051f7df2e56Smrg
305205b261ecSmrg    REQUEST(xRenderTriFanReq);
3053f7df2e56Smrg    char *extra;
3054f7df2e56Smrg    int extra_len;
3055f7df2e56Smrg
3056f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
3057f7df2e56Smrg
3058f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
3059f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
3060f7df2e56Smrg
3061f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTriFanReq);
3062f7df2e56Smrg
3063f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
3064f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
3065f7df2e56Smrg
3066f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
3067f7df2e56Smrg            if (j)
3068f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
3069f7df2e56Smrg            if (dst->u.pict.root) {
3070f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
3071f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
3072f7df2e56Smrg
3073f7df2e56Smrg                if (x_off || y_off) {
3074f7df2e56Smrg                    xPointFixed *fixed = (xPointFixed *) (stuff + 1);
3075f7df2e56Smrg                    int i = extra_len / sizeof(xPointFixed);
3076f7df2e56Smrg
3077f7df2e56Smrg                    while (i--) {
3078f7df2e56Smrg                        fixed->x -= x_off;
3079f7df2e56Smrg                        fixed->y -= y_off;
3080f7df2e56Smrg                        fixed++;
3081f7df2e56Smrg                    }
3082f7df2e56Smrg                }
3083f7df2e56Smrg            }
3084f7df2e56Smrg
308505b261ecSmrg            stuff->src = src->info[j].id;
308605b261ecSmrg            stuff->dst = dst->info[j].id;
3087f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client);
3088f7df2e56Smrg
3089f7df2e56Smrg            if (result != Success)
3090f7df2e56Smrg                break;
3091f7df2e56Smrg        }
309205b261ecSmrg
30936747b715Smrg        free(extra);
309405b261ecSmrg    }
309505b261ecSmrg
309605b261ecSmrg    return result;
309705b261ecSmrg}
309805b261ecSmrg
309905b261ecSmrgstatic int
3100f7df2e56SmrgPanoramiXRenderAddTraps(ClientPtr client)
310105b261ecSmrg{
3102f7df2e56Smrg    PanoramiXRes *picture;
3103f7df2e56Smrg    int result = Success, j;
3104f7df2e56Smrg
310505b261ecSmrg    REQUEST(xRenderAddTrapsReq);
3106f7df2e56Smrg    char *extra;
3107f7df2e56Smrg    int extra_len;
3108f7df2e56Smrg    INT16 x_off, y_off;
3109f7df2e56Smrg
3110f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
3111f7df2e56Smrg    VERIFY_XIN_PICTURE(picture, stuff->picture, client, DixWriteAccess);
3112f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderAddTrapsReq);
3113f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
3114f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
3115f7df2e56Smrg        x_off = stuff->xOff;
3116f7df2e56Smrg        y_off = stuff->yOff;
3117f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
3118f7df2e56Smrg            if (j)
3119f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
3120f7df2e56Smrg            stuff->picture = picture->info[j].id;
3121f7df2e56Smrg
3122f7df2e56Smrg            if (picture->u.pict.root) {
3123f7df2e56Smrg                stuff->xOff = x_off + screenInfo.screens[j]->x;
3124f7df2e56Smrg                stuff->yOff = y_off + screenInfo.screens[j]->y;
3125f7df2e56Smrg            }
3126f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client);
3127f7df2e56Smrg            if (result != Success)
3128f7df2e56Smrg                break;
3129f7df2e56Smrg        }
3130f7df2e56Smrg        free(extra);
31316747b715Smrg    }
31326747b715Smrg
31336747b715Smrg    return result;
31346747b715Smrg}
31356747b715Smrg
31366747b715Smrgstatic int
3137f7df2e56SmrgPanoramiXRenderCreateSolidFill(ClientPtr client)
31386747b715Smrg{
31396747b715Smrg    REQUEST(xRenderCreateSolidFillReq);
3140f7df2e56Smrg    PanoramiXRes *newPict;
3141f7df2e56Smrg    int result = Success, j;
31426747b715Smrg
31436747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
31446747b715Smrg
3145f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3146f7df2e56Smrg        return BadAlloc;
31476747b715Smrg
31486747b715Smrg    newPict->type = XRT_PICTURE;
3149f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
31506747b715Smrg    newPict->u.pict.root = FALSE;
31516747b715Smrg
31526747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3153f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3154f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client);
3155f7df2e56Smrg        if (result != Success)
3156f7df2e56Smrg            break;
31576747b715Smrg    }
31586747b715Smrg
31596747b715Smrg    if (result == Success)
3160f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
31616747b715Smrg    else
3162f7df2e56Smrg        free(newPict);
31636747b715Smrg
31646747b715Smrg    return result;
31656747b715Smrg}
31666747b715Smrg
31676747b715Smrgstatic int
3168f7df2e56SmrgPanoramiXRenderCreateLinearGradient(ClientPtr client)
31696747b715Smrg{
31706747b715Smrg    REQUEST(xRenderCreateLinearGradientReq);
3171f7df2e56Smrg    PanoramiXRes *newPict;
3172f7df2e56Smrg    int result = Success, j;
31736747b715Smrg
31746747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
31756747b715Smrg
3176f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3177f7df2e56Smrg        return BadAlloc;
31786747b715Smrg
31796747b715Smrg    newPict->type = XRT_PICTURE;
3180f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
31816747b715Smrg    newPict->u.pict.root = FALSE;
31826747b715Smrg
31836747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3184f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3185f7df2e56Smrg        result =
3186f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client);
3187f7df2e56Smrg        if (result != Success)
3188f7df2e56Smrg            break;
318905b261ecSmrg    }
319005b261ecSmrg
31916747b715Smrg    if (result == Success)
3192f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
31936747b715Smrg    else
3194f7df2e56Smrg        free(newPict);
31956747b715Smrg
31966747b715Smrg    return result;
31976747b715Smrg}
31986747b715Smrg
31996747b715Smrgstatic int
3200f7df2e56SmrgPanoramiXRenderCreateRadialGradient(ClientPtr client)
32016747b715Smrg{
32026747b715Smrg    REQUEST(xRenderCreateRadialGradientReq);
3203f7df2e56Smrg    PanoramiXRes *newPict;
3204f7df2e56Smrg    int result = Success, j;
32056747b715Smrg
32066747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
32076747b715Smrg
3208f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3209f7df2e56Smrg        return BadAlloc;
32106747b715Smrg
32116747b715Smrg    newPict->type = XRT_PICTURE;
3212f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
32136747b715Smrg    newPict->u.pict.root = FALSE;
32146747b715Smrg
32156747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3216f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3217f7df2e56Smrg        result =
3218f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client);
3219f7df2e56Smrg        if (result != Success)
3220f7df2e56Smrg            break;
32216747b715Smrg    }
32226747b715Smrg
32236747b715Smrg    if (result == Success)
3224f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
32256747b715Smrg    else
3226f7df2e56Smrg        free(newPict);
32276747b715Smrg
32286747b715Smrg    return result;
32296747b715Smrg}
32306747b715Smrg
32316747b715Smrgstatic int
3232f7df2e56SmrgPanoramiXRenderCreateConicalGradient(ClientPtr client)
32336747b715Smrg{
32346747b715Smrg    REQUEST(xRenderCreateConicalGradientReq);
3235f7df2e56Smrg    PanoramiXRes *newPict;
3236f7df2e56Smrg    int result = Success, j;
32376747b715Smrg
32386747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
32396747b715Smrg
3240f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3241f7df2e56Smrg        return BadAlloc;
32426747b715Smrg
32436747b715Smrg    newPict->type = XRT_PICTURE;
3244f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
32456747b715Smrg    newPict->u.pict.root = FALSE;
32466747b715Smrg
32476747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3248f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3249f7df2e56Smrg        result =
3250f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient])
3251f7df2e56Smrg            (client);
3252f7df2e56Smrg        if (result != Success)
3253f7df2e56Smrg            break;
32546747b715Smrg    }
32556747b715Smrg
32566747b715Smrg    if (result == Success)
3257f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
32586747b715Smrg    else
3259f7df2e56Smrg        free(newPict);
32606747b715Smrg
326105b261ecSmrg    return result;
326205b261ecSmrg}
326305b261ecSmrg
326405b261ecSmrgvoid
3265f7df2e56SmrgPanoramiXRenderInit(void)
326605b261ecSmrg{
3267f7df2e56Smrg    int i;
3268f7df2e56Smrg
3269f7df2e56Smrg    XRT_PICTURE = CreateNewResourceType(XineramaDeleteResource,
3270f7df2e56Smrg                                        "XineramaPicture");
32716747b715Smrg    if (RenderErrBase)
3272f7df2e56Smrg        SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
327305b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
3274f7df2e56Smrg        PanoramiXSaveRenderVector[i] = ProcRenderVector[i];
327505b261ecSmrg    /*
327605b261ecSmrg     * Stuff in Xinerama aware request processing hooks
327705b261ecSmrg     */
327805b261ecSmrg    ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture;
327905b261ecSmrg    ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture;
3280f7df2e56Smrg    ProcRenderVector[X_RenderSetPictureTransform] =
3281f7df2e56Smrg        PanoramiXRenderSetPictureTransform;
3282f7df2e56Smrg    ProcRenderVector[X_RenderSetPictureFilter] =
3283f7df2e56Smrg        PanoramiXRenderSetPictureFilter;
3284f7df2e56Smrg    ProcRenderVector[X_RenderSetPictureClipRectangles] =
3285f7df2e56Smrg        PanoramiXRenderSetPictureClipRectangles;
328605b261ecSmrg    ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture;
328705b261ecSmrg    ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite;
328805b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs;
3289f7df2e56Smrg    ProcRenderVector[X_RenderCompositeGlyphs16] =
3290f7df2e56Smrg        PanoramiXRenderCompositeGlyphs;
3291f7df2e56Smrg    ProcRenderVector[X_RenderCompositeGlyphs32] =
3292f7df2e56Smrg        PanoramiXRenderCompositeGlyphs;
329305b261ecSmrg    ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles;
329405b261ecSmrg
329505b261ecSmrg    ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids;
329605b261ecSmrg    ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles;
329705b261ecSmrg    ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip;
329805b261ecSmrg    ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan;
329905b261ecSmrg    ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps;
33006747b715Smrg
33016747b715Smrg    ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill;
3302f7df2e56Smrg    ProcRenderVector[X_RenderCreateLinearGradient] =
3303f7df2e56Smrg        PanoramiXRenderCreateLinearGradient;
3304f7df2e56Smrg    ProcRenderVector[X_RenderCreateRadialGradient] =
3305f7df2e56Smrg        PanoramiXRenderCreateRadialGradient;
3306f7df2e56Smrg    ProcRenderVector[X_RenderCreateConicalGradient] =
3307f7df2e56Smrg        PanoramiXRenderCreateConicalGradient;
330805b261ecSmrg}
330905b261ecSmrg
331005b261ecSmrgvoid
3311f7df2e56SmrgPanoramiXRenderReset(void)
331205b261ecSmrg{
3313f7df2e56Smrg    int i;
3314f7df2e56Smrg
331505b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
3316f7df2e56Smrg        ProcRenderVector[i] = PanoramiXSaveRenderVector[i];
33176747b715Smrg    RenderErrBase = 0;
331805b261ecSmrg}
331905b261ecSmrg
3320f7df2e56Smrg#endif                          /* PANORAMIX */
3321