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
2226747b715Smrg#ifdef PANORAMIX
223f7df2e56SmrgRESTYPE XRT_PICTURE;
2246747b715Smrg#endif
2256747b715Smrg
22605b261ecSmrgvoid
227f7df2e56SmrgRenderExtensionInit(void)
22805b261ecSmrg{
22905b261ecSmrg    ExtensionEntry *extEntry;
23005b261ecSmrg
23105b261ecSmrg    if (!PictureType)
232f7df2e56Smrg        return;
233f7df2e56Smrg    if (!PictureFinishInit())
234f7df2e56Smrg        return;
235f7df2e56Smrg    if (!dixRegisterPrivateKey
236f7df2e56Smrg        (&RenderClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(RenderClientRec)))
237f7df2e56Smrg        return;
238f7df2e56Smrg
239f7df2e56Smrg    extEntry = AddExtension(RENDER_NAME, 0, RenderNumberErrors,
240f7df2e56Smrg                            ProcRenderDispatch, SProcRenderDispatch,
241f7df2e56Smrg                            NULL, StandardMinorOpcode);
24205b261ecSmrg    if (!extEntry)
243f7df2e56Smrg        return;
24405b261ecSmrg    RenderErrBase = extEntry->errorBase;
2456747b715Smrg#ifdef PANORAMIX
2466747b715Smrg    if (XRT_PICTURE)
247f7df2e56Smrg        SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
2486747b715Smrg#endif
2496747b715Smrg    SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture);
2506747b715Smrg    SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat);
2516747b715Smrg    SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet);
25205b261ecSmrg}
25305b261ecSmrg
25405b261ecSmrgstatic int
255f7df2e56SmrgProcRenderQueryVersion(ClientPtr client)
25605b261ecSmrg{
257f7df2e56Smrg    RenderClientPtr pRenderClient = GetRenderClient(client);
258f7df2e56Smrg    xRenderQueryVersionReply rep = {
259f7df2e56Smrg        .type = X_Reply,
260f7df2e56Smrg        .sequenceNumber = client->sequence,
261f7df2e56Smrg        .length = 0
262f7df2e56Smrg    };
263f7df2e56Smrg
26405b261ecSmrg    REQUEST(xRenderQueryVersionReq);
26505b261ecSmrg
266f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
267f7df2e56Smrg
26805b261ecSmrg    pRenderClient->major_version = stuff->majorVersion;
26905b261ecSmrg    pRenderClient->minor_version = stuff->minorVersion;
27005b261ecSmrg
2716747b715Smrg    if ((stuff->majorVersion * 1000 + stuff->minorVersion) <
272f7df2e56Smrg        (SERVER_RENDER_MAJOR_VERSION * 1000 + SERVER_RENDER_MINOR_VERSION)) {
273f7df2e56Smrg        rep.majorVersion = stuff->majorVersion;
274f7df2e56Smrg        rep.minorVersion = stuff->minorVersion;
275f7df2e56Smrg    }
276f7df2e56Smrg    else {
277f7df2e56Smrg        rep.majorVersion = SERVER_RENDER_MAJOR_VERSION;
278f7df2e56Smrg        rep.minorVersion = SERVER_RENDER_MINOR_VERSION;
2796747b715Smrg    }
2806747b715Smrg
28105b261ecSmrg    if (client->swapped) {
282f7df2e56Smrg        swaps(&rep.sequenceNumber);
283f7df2e56Smrg        swapl(&rep.length);
284f7df2e56Smrg        swapl(&rep.majorVersion);
285f7df2e56Smrg        swapl(&rep.minorVersion);
28605b261ecSmrg    }
287f7df2e56Smrg    WriteToClient(client, sizeof(xRenderQueryVersionReply), &rep);
2886747b715Smrg    return Success;
28905b261ecSmrg}
29005b261ecSmrg
29105b261ecSmrgstatic VisualPtr
292f7df2e56SmrgfindVisual(ScreenPtr pScreen, VisualID vid)
29305b261ecSmrg{
294f7df2e56Smrg    VisualPtr pVisual;
295f7df2e56Smrg    int v;
29605b261ecSmrg
297f7df2e56Smrg    for (v = 0; v < pScreen->numVisuals; v++) {
298f7df2e56Smrg        pVisual = pScreen->visuals + v;
299f7df2e56Smrg        if (pVisual->vid == vid)
300f7df2e56Smrg            return pVisual;
30105b261ecSmrg    }
30205b261ecSmrg    return 0;
30305b261ecSmrg}
30405b261ecSmrg
30505b261ecSmrgstatic int
306f7df2e56SmrgProcRenderQueryPictFormats(ClientPtr client)
307f7df2e56Smrg{
308f7df2e56Smrg    RenderClientPtr pRenderClient = GetRenderClient(client);
309f7df2e56Smrg    xRenderQueryPictFormatsReply *reply;
310f7df2e56Smrg    xPictScreen *pictScreen;
311f7df2e56Smrg    xPictDepth *pictDepth;
312f7df2e56Smrg    xPictVisual *pictVisual;
313f7df2e56Smrg    xPictFormInfo *pictForm;
314f7df2e56Smrg    CARD32 *pictSubpixel;
315f7df2e56Smrg    ScreenPtr pScreen;
316f7df2e56Smrg    VisualPtr pVisual;
317f7df2e56Smrg    DepthPtr pDepth;
318f7df2e56Smrg    int v, d;
319f7df2e56Smrg    PictureScreenPtr ps;
320f7df2e56Smrg    PictFormatPtr pFormat;
321f7df2e56Smrg    int nformat;
322f7df2e56Smrg    int ndepth;
323f7df2e56Smrg    int nvisual;
324f7df2e56Smrg    int rlength;
325f7df2e56Smrg    int s;
326f7df2e56Smrg    int numScreens;
327f7df2e56Smrg    int numSubpixel;
328f7df2e56Smrg
32905b261ecSmrg/*    REQUEST(xRenderQueryPictFormatsReq); */
33005b261ecSmrg
33105b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
33205b261ecSmrg
33305b261ecSmrg#ifdef PANORAMIX
33405b261ecSmrg    if (noPanoramiXExtension)
335f7df2e56Smrg        numScreens = screenInfo.numScreens;
336f7df2e56Smrg    else
337f7df2e56Smrg        numScreens = ((xConnSetup *) ConnectionInfo)->numRoots;
33805b261ecSmrg#else
33905b261ecSmrg    numScreens = screenInfo.numScreens;
34005b261ecSmrg#endif
34105b261ecSmrg    ndepth = nformat = nvisual = 0;
342f7df2e56Smrg    for (s = 0; s < numScreens; s++) {
343f7df2e56Smrg        pScreen = screenInfo.screens[s];
344f7df2e56Smrg        for (d = 0; d < pScreen->numDepths; d++) {
345f7df2e56Smrg            pDepth = pScreen->allowedDepths + d;
346f7df2e56Smrg            ++ndepth;
347f7df2e56Smrg
348f7df2e56Smrg            for (v = 0; v < pDepth->numVids; v++) {
349f7df2e56Smrg                pVisual = findVisual(pScreen, pDepth->vids[v]);
350f7df2e56Smrg                if (pVisual &&
351f7df2e56Smrg                    PictureMatchVisual(pScreen, pDepth->depth, pVisual))
352f7df2e56Smrg                    ++nvisual;
353f7df2e56Smrg            }
354f7df2e56Smrg        }
355f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
356f7df2e56Smrg        if (ps)
357f7df2e56Smrg            nformat += ps->nformats;
35805b261ecSmrg    }
35905b261ecSmrg    if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6)
360f7df2e56Smrg        numSubpixel = 0;
36105b261ecSmrg    else
362f7df2e56Smrg        numSubpixel = numScreens;
363f7df2e56Smrg
364f7df2e56Smrg    rlength = (sizeof(xRenderQueryPictFormatsReply) +
365f7df2e56Smrg               nformat * sizeof(xPictFormInfo) +
366f7df2e56Smrg               numScreens * sizeof(xPictScreen) +
367f7df2e56Smrg               ndepth * sizeof(xPictDepth) +
368f7df2e56Smrg               nvisual * sizeof(xPictVisual) + numSubpixel * sizeof(CARD32));
3696747b715Smrg    reply = (xRenderQueryPictFormatsReply *) calloc(1, rlength);
37005b261ecSmrg    if (!reply)
371f7df2e56Smrg        return BadAlloc;
37205b261ecSmrg    reply->type = X_Reply;
37305b261ecSmrg    reply->sequenceNumber = client->sequence;
3746747b715Smrg    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
37505b261ecSmrg    reply->numFormats = nformat;
37605b261ecSmrg    reply->numScreens = numScreens;
37705b261ecSmrg    reply->numDepths = ndepth;
37805b261ecSmrg    reply->numVisuals = nvisual;
37905b261ecSmrg    reply->numSubpixel = numSubpixel;
380f7df2e56Smrg
38105b261ecSmrg    pictForm = (xPictFormInfo *) (reply + 1);
382f7df2e56Smrg
383f7df2e56Smrg    for (s = 0; s < numScreens; s++) {
384f7df2e56Smrg        pScreen = screenInfo.screens[s];
385f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
386f7df2e56Smrg        if (ps) {
387f7df2e56Smrg            for (nformat = 0, pFormat = ps->formats;
388f7df2e56Smrg                 nformat < ps->nformats; nformat++, pFormat++) {
389f7df2e56Smrg                pictForm->id = pFormat->id;
390f7df2e56Smrg                pictForm->type = pFormat->type;
391f7df2e56Smrg                pictForm->depth = pFormat->depth;
392f7df2e56Smrg                pictForm->direct.red = pFormat->direct.red;
393f7df2e56Smrg                pictForm->direct.redMask = pFormat->direct.redMask;
394f7df2e56Smrg                pictForm->direct.green = pFormat->direct.green;
395f7df2e56Smrg                pictForm->direct.greenMask = pFormat->direct.greenMask;
396f7df2e56Smrg                pictForm->direct.blue = pFormat->direct.blue;
397f7df2e56Smrg                pictForm->direct.blueMask = pFormat->direct.blueMask;
398f7df2e56Smrg                pictForm->direct.alpha = pFormat->direct.alpha;
399f7df2e56Smrg                pictForm->direct.alphaMask = pFormat->direct.alphaMask;
400f7df2e56Smrg                if (pFormat->type == PictTypeIndexed &&
401f7df2e56Smrg                    pFormat->index.pColormap)
402f7df2e56Smrg                    pictForm->colormap = pFormat->index.pColormap->mid;
403f7df2e56Smrg                else
404f7df2e56Smrg                    pictForm->colormap = None;
405f7df2e56Smrg                if (client->swapped) {
406f7df2e56Smrg                    swapl(&pictForm->id);
407f7df2e56Smrg                    swaps(&pictForm->direct.red);
408f7df2e56Smrg                    swaps(&pictForm->direct.redMask);
409f7df2e56Smrg                    swaps(&pictForm->direct.green);
410f7df2e56Smrg                    swaps(&pictForm->direct.greenMask);
411f7df2e56Smrg                    swaps(&pictForm->direct.blue);
412f7df2e56Smrg                    swaps(&pictForm->direct.blueMask);
413f7df2e56Smrg                    swaps(&pictForm->direct.alpha);
414f7df2e56Smrg                    swaps(&pictForm->direct.alphaMask);
415f7df2e56Smrg                    swapl(&pictForm->colormap);
416f7df2e56Smrg                }
417f7df2e56Smrg                pictForm++;
418f7df2e56Smrg            }
419f7df2e56Smrg        }
420f7df2e56Smrg    }
421f7df2e56Smrg
42205b261ecSmrg    pictScreen = (xPictScreen *) pictForm;
423f7df2e56Smrg    for (s = 0; s < numScreens; s++) {
424f7df2e56Smrg        pScreen = screenInfo.screens[s];
425f7df2e56Smrg        pictDepth = (xPictDepth *) (pictScreen + 1);
426f7df2e56Smrg        ndepth = 0;
427f7df2e56Smrg        for (d = 0; d < pScreen->numDepths; d++) {
428f7df2e56Smrg            pictVisual = (xPictVisual *) (pictDepth + 1);
429f7df2e56Smrg            pDepth = pScreen->allowedDepths + d;
430f7df2e56Smrg
431f7df2e56Smrg            nvisual = 0;
432f7df2e56Smrg            for (v = 0; v < pDepth->numVids; v++) {
433f7df2e56Smrg                pVisual = findVisual(pScreen, pDepth->vids[v]);
434f7df2e56Smrg                if (pVisual && (pFormat = PictureMatchVisual(pScreen,
435f7df2e56Smrg                                                             pDepth->depth,
436f7df2e56Smrg                                                             pVisual))) {
437f7df2e56Smrg                    pictVisual->visual = pVisual->vid;
438f7df2e56Smrg                    pictVisual->format = pFormat->id;
439f7df2e56Smrg                    if (client->swapped) {
440f7df2e56Smrg                        swapl(&pictVisual->visual);
441f7df2e56Smrg                        swapl(&pictVisual->format);
442f7df2e56Smrg                    }
443f7df2e56Smrg                    pictVisual++;
444f7df2e56Smrg                    nvisual++;
445f7df2e56Smrg                }
446f7df2e56Smrg            }
447f7df2e56Smrg            pictDepth->depth = pDepth->depth;
448f7df2e56Smrg            pictDepth->nPictVisuals = nvisual;
449f7df2e56Smrg            if (client->swapped) {
450f7df2e56Smrg                swaps(&pictDepth->nPictVisuals);
451f7df2e56Smrg            }
452f7df2e56Smrg            ndepth++;
453f7df2e56Smrg            pictDepth = (xPictDepth *) pictVisual;
454f7df2e56Smrg        }
455f7df2e56Smrg        pictScreen->nDepth = ndepth;
456f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
457f7df2e56Smrg        if (ps)
458f7df2e56Smrg            pictScreen->fallback = ps->fallback->id;
459f7df2e56Smrg        else
460f7df2e56Smrg            pictScreen->fallback = 0;
461f7df2e56Smrg        if (client->swapped) {
462f7df2e56Smrg            swapl(&pictScreen->nDepth);
463f7df2e56Smrg            swapl(&pictScreen->fallback);
464f7df2e56Smrg        }
465f7df2e56Smrg        pictScreen = (xPictScreen *) pictDepth;
46605b261ecSmrg    }
46705b261ecSmrg    pictSubpixel = (CARD32 *) pictScreen;
468f7df2e56Smrg
469f7df2e56Smrg    for (s = 0; s < numSubpixel; s++) {
470f7df2e56Smrg        pScreen = screenInfo.screens[s];
471f7df2e56Smrg        ps = GetPictureScreenIfSet(pScreen);
472f7df2e56Smrg        if (ps)
473f7df2e56Smrg            *pictSubpixel = ps->subpixel;
474f7df2e56Smrg        else
475f7df2e56Smrg            *pictSubpixel = SubPixelUnknown;
476f7df2e56Smrg        if (client->swapped) {
477f7df2e56Smrg            swapl(pictSubpixel);
478f7df2e56Smrg        }
479f7df2e56Smrg        ++pictSubpixel;
480f7df2e56Smrg    }
481f7df2e56Smrg
482f7df2e56Smrg    if (client->swapped) {
483f7df2e56Smrg        swaps(&reply->sequenceNumber);
484f7df2e56Smrg        swapl(&reply->length);
485f7df2e56Smrg        swapl(&reply->numFormats);
486f7df2e56Smrg        swapl(&reply->numScreens);
487f7df2e56Smrg        swapl(&reply->numDepths);
488f7df2e56Smrg        swapl(&reply->numVisuals);
489f7df2e56Smrg        swapl(&reply->numSubpixel);
490f7df2e56Smrg    }
491f7df2e56Smrg    WriteToClient(client, rlength, reply);
4926747b715Smrg    free(reply);
4936747b715Smrg    return Success;
49405b261ecSmrg}
49505b261ecSmrg
49605b261ecSmrgstatic int
497f7df2e56SmrgProcRenderQueryPictIndexValues(ClientPtr client)
49805b261ecSmrg{
499f7df2e56Smrg    PictFormatPtr pFormat;
500f7df2e56Smrg    int rc, num;
501f7df2e56Smrg    int rlength;
502f7df2e56Smrg    int i;
503f7df2e56Smrg
50405b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
50505b261ecSmrg    xRenderQueryPictIndexValuesReply *reply;
506f7df2e56Smrg    xIndexValue *values;
50705b261ecSmrg
50805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
50905b261ecSmrg
510f7df2e56Smrg    rc = dixLookupResourceByType((void **) &pFormat, stuff->format,
511f7df2e56Smrg                                 PictFormatType, client, DixReadAccess);
5126747b715Smrg    if (rc != Success)
513f7df2e56Smrg        return rc;
51405b261ecSmrg
515f7df2e56Smrg    if (pFormat->type != PictTypeIndexed) {
516f7df2e56Smrg        client->errorValue = stuff->format;
517f7df2e56Smrg        return BadMatch;
51805b261ecSmrg    }
51905b261ecSmrg    num = pFormat->index.nvalues;
520f7df2e56Smrg    rlength = (sizeof(xRenderQueryPictIndexValuesReply) +
521f7df2e56Smrg               num * sizeof(xIndexValue));
522f7df2e56Smrg    reply = (xRenderQueryPictIndexValuesReply *) calloc(1, rlength);
52305b261ecSmrg    if (!reply)
524f7df2e56Smrg        return BadAlloc;
52505b261ecSmrg
52605b261ecSmrg    reply->type = X_Reply;
52705b261ecSmrg    reply->sequenceNumber = client->sequence;
5286747b715Smrg    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
52905b261ecSmrg    reply->numIndexValues = num;
53005b261ecSmrg
53105b261ecSmrg    values = (xIndexValue *) (reply + 1);
532f7df2e56Smrg
533f7df2e56Smrg    memcpy(reply + 1, pFormat->index.pValues, num * sizeof(xIndexValue));
534f7df2e56Smrg
535f7df2e56Smrg    if (client->swapped) {
536f7df2e56Smrg        for (i = 0; i < num; i++) {
537f7df2e56Smrg            swapl(&values[i].pixel);
538f7df2e56Smrg            swaps(&values[i].red);
539f7df2e56Smrg            swaps(&values[i].green);
540f7df2e56Smrg            swaps(&values[i].blue);
541f7df2e56Smrg            swaps(&values[i].alpha);
542f7df2e56Smrg        }
543f7df2e56Smrg        swaps(&reply->sequenceNumber);
544f7df2e56Smrg        swapl(&reply->length);
545f7df2e56Smrg        swapl(&reply->numIndexValues);
546f7df2e56Smrg    }
547f7df2e56Smrg
548f7df2e56Smrg    WriteToClient(client, rlength, reply);
5496747b715Smrg    free(reply);
5506747b715Smrg    return Success;
55105b261ecSmrg}
55205b261ecSmrg
55305b261ecSmrgstatic int
554f7df2e56SmrgProcRenderQueryDithers(ClientPtr client)
55505b261ecSmrg{
55605b261ecSmrg    return BadImplementation;
55705b261ecSmrg}
55805b261ecSmrg
55905b261ecSmrgstatic int
560f7df2e56SmrgProcRenderCreatePicture(ClientPtr client)
56105b261ecSmrg{
562f7df2e56Smrg    PicturePtr pPicture;
563f7df2e56Smrg    DrawablePtr pDrawable;
564f7df2e56Smrg    PictFormatPtr pFormat;
565f7df2e56Smrg    int len, error, rc;
566f7df2e56Smrg
56705b261ecSmrg    REQUEST(xRenderCreatePictureReq);
56805b261ecSmrg
56905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
57005b261ecSmrg
57105b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
57205b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
573f7df2e56Smrg                           DixReadAccess | DixAddAccess);
57405b261ecSmrg    if (rc != Success)
575f7df2e56Smrg        return rc;
57605b261ecSmrg
577f7df2e56Smrg    rc = dixLookupResourceByType((void **) &pFormat, stuff->format,
578f7df2e56Smrg                                 PictFormatType, client, DixReadAccess);
5796747b715Smrg    if (rc != Success)
580f7df2e56Smrg        return rc;
5816747b715Smrg
58205b261ecSmrg    if (pFormat->depth != pDrawable->depth)
583f7df2e56Smrg        return BadMatch;
5846747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq));
58505b261ecSmrg    if (Ones(stuff->mask) != len)
586f7df2e56Smrg        return BadLength;
587f7df2e56Smrg
588f7df2e56Smrg    pPicture = CreatePicture(stuff->pid,
589f7df2e56Smrg                             pDrawable,
590f7df2e56Smrg                             pFormat,
591f7df2e56Smrg                             stuff->mask, (XID *) (stuff + 1), client, &error);
59205b261ecSmrg    if (!pPicture)
593f7df2e56Smrg        return error;
594f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
595f7df2e56Smrg        return BadAlloc;
59605b261ecSmrg    return Success;
59705b261ecSmrg}
59805b261ecSmrg
59905b261ecSmrgstatic int
600f7df2e56SmrgProcRenderChangePicture(ClientPtr client)
60105b261ecSmrg{
602f7df2e56Smrg    PicturePtr pPicture;
603f7df2e56Smrg
60405b261ecSmrg    REQUEST(xRenderChangePictureReq);
60505b261ecSmrg    int len;
60605b261ecSmrg
60705b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
608f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
60905b261ecSmrg
6106747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq));
61105b261ecSmrg    if (Ones(stuff->mask) != len)
612f7df2e56Smrg        return BadLength;
613f7df2e56Smrg
614f7df2e56Smrg    return ChangePicture(pPicture, stuff->mask, (XID *) (stuff + 1),
615f7df2e56Smrg                         (DevUnion *) 0, client);
61605b261ecSmrg}
61705b261ecSmrg
61805b261ecSmrgstatic int
619f7df2e56SmrgProcRenderSetPictureClipRectangles(ClientPtr client)
62005b261ecSmrg{
62105b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
622f7df2e56Smrg    PicturePtr pPicture;
623f7df2e56Smrg    int nr;
62405b261ecSmrg
62505b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
626f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
62705b261ecSmrg    if (!pPicture->pDrawable)
628f7df2e56Smrg        return RenderErrBase + BadPicture;
62905b261ecSmrg
6306747b715Smrg    nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq);
63105b261ecSmrg    if (nr & 4)
632f7df2e56Smrg        return BadLength;
63305b261ecSmrg    nr >>= 3;
634f7df2e56Smrg    return SetPictureClipRects(pPicture,
635f7df2e56Smrg                               stuff->xOrigin, stuff->yOrigin,
636f7df2e56Smrg                               nr, (xRectangle *) &stuff[1]);
63705b261ecSmrg}
63805b261ecSmrg
63905b261ecSmrgstatic int
640f7df2e56SmrgProcRenderFreePicture(ClientPtr client)
64105b261ecSmrg{
642f7df2e56Smrg    PicturePtr pPicture;
643f7df2e56Smrg
64405b261ecSmrg    REQUEST(xRenderFreePictureReq);
64505b261ecSmrg
64605b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
64705b261ecSmrg
648f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixDestroyAccess);
649f7df2e56Smrg    FreeResource(stuff->picture, RT_NONE);
6506747b715Smrg    return Success;
65105b261ecSmrg}
65205b261ecSmrg
65305b261ecSmrgstatic Bool
654f7df2e56SmrgPictOpValid(CARD8 op)
65505b261ecSmrg{
656f7df2e56Smrg    if ( /*PictOpMinimum <= op && */ op <= PictOpMaximum)
657f7df2e56Smrg        return TRUE;
65805b261ecSmrg    if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum)
659f7df2e56Smrg        return TRUE;
66005b261ecSmrg    if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum)
661f7df2e56Smrg        return TRUE;
6626747b715Smrg    if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum)
663f7df2e56Smrg        return TRUE;
66405b261ecSmrg    return FALSE;
66505b261ecSmrg}
66605b261ecSmrg
66705b261ecSmrgstatic int
668f7df2e56SmrgProcRenderComposite(ClientPtr client)
66905b261ecSmrg{
670f7df2e56Smrg    PicturePtr pSrc, pMask, pDst;
671f7df2e56Smrg
67205b261ecSmrg    REQUEST(xRenderCompositeReq);
67305b261ecSmrg
67405b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
675f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
676f7df2e56Smrg        client->errorValue = stuff->op;
677f7df2e56Smrg        return BadValue;
67805b261ecSmrg    }
679f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
68005b261ecSmrg    if (!pDst->pDrawable)
68105b261ecSmrg        return BadDrawable;
682f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
683f7df2e56Smrg    VERIFY_ALPHA(pMask, stuff->mask, client, DixReadAccess);
684f7df2e56Smrg    if ((pSrc->pDrawable &&
685f7df2e56Smrg         pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) || (pMask &&
686f7df2e56Smrg                                                                   pMask->
687f7df2e56Smrg                                                                   pDrawable &&
688f7df2e56Smrg                                                                   pDst->
689f7df2e56Smrg                                                                   pDrawable->
690f7df2e56Smrg                                                                   pScreen !=
691f7df2e56Smrg                                                                   pMask->
692f7df2e56Smrg                                                                   pDrawable->
693f7df2e56Smrg                                                                   pScreen))
694f7df2e56Smrg        return BadMatch;
695f7df2e56Smrg    CompositePicture(stuff->op,
696f7df2e56Smrg                     pSrc,
697f7df2e56Smrg                     pMask,
698f7df2e56Smrg                     pDst,
699f7df2e56Smrg                     stuff->xSrc,
700f7df2e56Smrg                     stuff->ySrc,
701f7df2e56Smrg                     stuff->xMask,
702f7df2e56Smrg                     stuff->yMask,
703f7df2e56Smrg                     stuff->xDst, stuff->yDst, stuff->width, stuff->height);
70405b261ecSmrg    return Success;
70505b261ecSmrg}
70605b261ecSmrg
70705b261ecSmrgstatic int
708f7df2e56SmrgProcRenderScale(ClientPtr client)
70905b261ecSmrg{
71005b261ecSmrg    return BadImplementation;
71105b261ecSmrg}
71205b261ecSmrg
71305b261ecSmrgstatic int
714f7df2e56SmrgProcRenderTrapezoids(ClientPtr client)
71505b261ecSmrg{
716f7df2e56Smrg    int rc, ntraps;
717f7df2e56Smrg    PicturePtr pSrc, pDst;
718f7df2e56Smrg    PictFormatPtr pFormat;
719f7df2e56Smrg
72005b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
72105b261ecSmrg
72205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
723f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
724f7df2e56Smrg        client->errorValue = stuff->op;
725f7df2e56Smrg        return BadValue;
72605b261ecSmrg    }
727f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
728f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
72905b261ecSmrg    if (!pDst->pDrawable)
73005b261ecSmrg        return BadDrawable;
73105b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
732f7df2e56Smrg        return BadMatch;
733f7df2e56Smrg    if (stuff->maskFormat) {
734f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
735f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
736f7df2e56Smrg        if (rc != Success)
737f7df2e56Smrg            return rc;
73805b261ecSmrg    }
73905b261ecSmrg    else
740f7df2e56Smrg        pFormat = 0;
741f7df2e56Smrg    ntraps = (client->req_len << 2) - sizeof(xRenderTrapezoidsReq);
742f7df2e56Smrg    if (ntraps % sizeof(xTrapezoid))
743f7df2e56Smrg        return BadLength;
744f7df2e56Smrg    ntraps /= sizeof(xTrapezoid);
74505b261ecSmrg    if (ntraps)
746f7df2e56Smrg        CompositeTrapezoids(stuff->op, pSrc, pDst, pFormat,
747f7df2e56Smrg                            stuff->xSrc, stuff->ySrc,
748f7df2e56Smrg                            ntraps, (xTrapezoid *) &stuff[1]);
7496747b715Smrg    return Success;
75005b261ecSmrg}
75105b261ecSmrg
75205b261ecSmrgstatic int
753f7df2e56SmrgProcRenderTriangles(ClientPtr client)
75405b261ecSmrg{
755f7df2e56Smrg    int rc, ntris;
756f7df2e56Smrg    PicturePtr pSrc, pDst;
757f7df2e56Smrg    PictFormatPtr pFormat;
758f7df2e56Smrg
75905b261ecSmrg    REQUEST(xRenderTrianglesReq);
76005b261ecSmrg
76105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
762f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
763f7df2e56Smrg        client->errorValue = stuff->op;
764f7df2e56Smrg        return BadValue;
76505b261ecSmrg    }
766f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
767f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
76805b261ecSmrg    if (!pDst->pDrawable)
76905b261ecSmrg        return BadDrawable;
77005b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
771f7df2e56Smrg        return BadMatch;
772f7df2e56Smrg    if (stuff->maskFormat) {
773f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
774f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
775f7df2e56Smrg        if (rc != Success)
776f7df2e56Smrg            return rc;
77705b261ecSmrg    }
77805b261ecSmrg    else
779f7df2e56Smrg        pFormat = 0;
780f7df2e56Smrg    ntris = (client->req_len << 2) - sizeof(xRenderTrianglesReq);
781f7df2e56Smrg    if (ntris % sizeof(xTriangle))
782f7df2e56Smrg        return BadLength;
783f7df2e56Smrg    ntris /= sizeof(xTriangle);
78405b261ecSmrg    if (ntris)
785f7df2e56Smrg        CompositeTriangles(stuff->op, pSrc, pDst, pFormat,
786f7df2e56Smrg                           stuff->xSrc, stuff->ySrc,
787f7df2e56Smrg                           ntris, (xTriangle *) &stuff[1]);
7886747b715Smrg    return Success;
78905b261ecSmrg}
79005b261ecSmrg
79105b261ecSmrgstatic int
792f7df2e56SmrgProcRenderTriStrip(ClientPtr client)
79305b261ecSmrg{
794f7df2e56Smrg    int rc, npoints;
795f7df2e56Smrg    PicturePtr pSrc, pDst;
796f7df2e56Smrg    PictFormatPtr pFormat;
797f7df2e56Smrg
79805b261ecSmrg    REQUEST(xRenderTrianglesReq);
79905b261ecSmrg
80005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
801f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
802f7df2e56Smrg        client->errorValue = stuff->op;
803f7df2e56Smrg        return BadValue;
80405b261ecSmrg    }
805f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
806f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
80705b261ecSmrg    if (!pDst->pDrawable)
80805b261ecSmrg        return BadDrawable;
80905b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
810f7df2e56Smrg        return BadMatch;
811f7df2e56Smrg    if (stuff->maskFormat) {
812f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
813f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
814f7df2e56Smrg        if (rc != Success)
815f7df2e56Smrg            return rc;
81605b261ecSmrg    }
81705b261ecSmrg    else
818f7df2e56Smrg        pFormat = 0;
819f7df2e56Smrg    npoints = ((client->req_len << 2) - sizeof(xRenderTriStripReq));
82005b261ecSmrg    if (npoints & 4)
821f7df2e56Smrg        return BadLength;
82205b261ecSmrg    npoints >>= 3;
82305b261ecSmrg    if (npoints >= 3)
824f7df2e56Smrg        CompositeTriStrip(stuff->op, pSrc, pDst, pFormat,
825f7df2e56Smrg                          stuff->xSrc, stuff->ySrc,
826f7df2e56Smrg                          npoints, (xPointFixed *) &stuff[1]);
8276747b715Smrg    return Success;
82805b261ecSmrg}
82905b261ecSmrg
83005b261ecSmrgstatic int
831f7df2e56SmrgProcRenderTriFan(ClientPtr client)
83205b261ecSmrg{
833f7df2e56Smrg    int rc, npoints;
834f7df2e56Smrg    PicturePtr pSrc, pDst;
835f7df2e56Smrg    PictFormatPtr pFormat;
836f7df2e56Smrg
83705b261ecSmrg    REQUEST(xRenderTrianglesReq);
83805b261ecSmrg
83905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
840f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
841f7df2e56Smrg        client->errorValue = stuff->op;
842f7df2e56Smrg        return BadValue;
84305b261ecSmrg    }
844f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
845f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
84605b261ecSmrg    if (!pDst->pDrawable)
84705b261ecSmrg        return BadDrawable;
84805b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
849f7df2e56Smrg        return BadMatch;
850f7df2e56Smrg    if (stuff->maskFormat) {
851f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
852f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
853f7df2e56Smrg        if (rc != Success)
854f7df2e56Smrg            return rc;
85505b261ecSmrg    }
85605b261ecSmrg    else
857f7df2e56Smrg        pFormat = 0;
858f7df2e56Smrg    npoints = ((client->req_len << 2) - sizeof(xRenderTriStripReq));
85905b261ecSmrg    if (npoints & 4)
860f7df2e56Smrg        return BadLength;
86105b261ecSmrg    npoints >>= 3;
86205b261ecSmrg    if (npoints >= 3)
863f7df2e56Smrg        CompositeTriFan(stuff->op, pSrc, pDst, pFormat,
864f7df2e56Smrg                        stuff->xSrc, stuff->ySrc,
865f7df2e56Smrg                        npoints, (xPointFixed *) &stuff[1]);
8666747b715Smrg    return Success;
86705b261ecSmrg}
86805b261ecSmrg
86905b261ecSmrgstatic int
870f7df2e56SmrgProcRenderColorTrapezoids(ClientPtr client)
87105b261ecSmrg{
87205b261ecSmrg    return BadImplementation;
87305b261ecSmrg}
87405b261ecSmrg
87505b261ecSmrgstatic int
876f7df2e56SmrgProcRenderColorTriangles(ClientPtr client)
87705b261ecSmrg{
87805b261ecSmrg    return BadImplementation;
87905b261ecSmrg}
88005b261ecSmrg
88105b261ecSmrgstatic int
882f7df2e56SmrgProcRenderTransform(ClientPtr client)
88305b261ecSmrg{
88405b261ecSmrg    return BadImplementation;
88505b261ecSmrg}
88605b261ecSmrg
88705b261ecSmrgstatic int
888f7df2e56SmrgProcRenderCreateGlyphSet(ClientPtr client)
88905b261ecSmrg{
890f7df2e56Smrg    GlyphSetPtr glyphSet;
891f7df2e56Smrg    PictFormatPtr format;
892f7df2e56Smrg    int rc, f;
893f7df2e56Smrg
89405b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
89505b261ecSmrg
89605b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
89705b261ecSmrg
89805b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
899f7df2e56Smrg    rc = dixLookupResourceByType((void **) &format, stuff->format,
900f7df2e56Smrg                                 PictFormatType, client, DixReadAccess);
9016747b715Smrg    if (rc != Success)
902f7df2e56Smrg        return rc;
9036747b715Smrg
90405b261ecSmrg    switch (format->depth) {
90505b261ecSmrg    case 1:
906f7df2e56Smrg        f = GlyphFormat1;
907f7df2e56Smrg        break;
90805b261ecSmrg    case 4:
909f7df2e56Smrg        f = GlyphFormat4;
910f7df2e56Smrg        break;
91105b261ecSmrg    case 8:
912f7df2e56Smrg        f = GlyphFormat8;
913f7df2e56Smrg        break;
91405b261ecSmrg    case 16:
915f7df2e56Smrg        f = GlyphFormat16;
916f7df2e56Smrg        break;
91705b261ecSmrg    case 32:
918f7df2e56Smrg        f = GlyphFormat32;
919f7df2e56Smrg        break;
92005b261ecSmrg    default:
921f7df2e56Smrg        return BadMatch;
92205b261ecSmrg    }
92305b261ecSmrg    if (format->type != PictTypeDirect)
924f7df2e56Smrg        return BadMatch;
925f7df2e56Smrg    glyphSet = AllocateGlyphSet(f, format);
92605b261ecSmrg    if (!glyphSet)
927f7df2e56Smrg        return BadAlloc;
9284642e01fSmrg    /* security creation/labeling check */
9294642e01fSmrg    rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType,
930f7df2e56Smrg                  glyphSet, RT_NONE, NULL, DixCreateAccess);
9314642e01fSmrg    if (rc != Success)
932f7df2e56Smrg        return rc;
933f7df2e56Smrg    if (!AddResource(stuff->gsid, GlyphSetType, (void *) glyphSet))
934f7df2e56Smrg        return BadAlloc;
93505b261ecSmrg    return Success;
93605b261ecSmrg}
93705b261ecSmrg
93805b261ecSmrgstatic int
939f7df2e56SmrgProcRenderReferenceGlyphSet(ClientPtr client)
94005b261ecSmrg{
941f7df2e56Smrg    GlyphSetPtr glyphSet;
9424642e01fSmrg    int rc;
943f7df2e56Smrg
94405b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
94505b261ecSmrg
94605b261ecSmrg    REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
94705b261ecSmrg
94805b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->gsid, client);
94905b261ecSmrg
950f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->existing,
951f7df2e56Smrg                                 GlyphSetType, client, DixGetAttrAccess);
952f7df2e56Smrg    if (rc != Success) {
953f7df2e56Smrg        client->errorValue = stuff->existing;
954f7df2e56Smrg        return rc;
95505b261ecSmrg    }
95605b261ecSmrg    glyphSet->refcnt++;
957f7df2e56Smrg    if (!AddResource(stuff->gsid, GlyphSetType, (void *) glyphSet))
958f7df2e56Smrg        return BadAlloc;
9596747b715Smrg    return Success;
96005b261ecSmrg}
96105b261ecSmrg
96205b261ecSmrg#define NLOCALDELTA	64
96305b261ecSmrg#define NLOCALGLYPH	256
96405b261ecSmrg
96505b261ecSmrgstatic int
966f7df2e56SmrgProcRenderFreeGlyphSet(ClientPtr client)
96705b261ecSmrg{
968f7df2e56Smrg    GlyphSetPtr glyphSet;
9694642e01fSmrg    int rc;
970f7df2e56Smrg
97105b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
97205b261ecSmrg
97305b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
974f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
975f7df2e56Smrg                                 GlyphSetType, client, DixDestroyAccess);
976f7df2e56Smrg    if (rc != Success) {
977f7df2e56Smrg        client->errorValue = stuff->glyphset;
978f7df2e56Smrg        return rc;
97905b261ecSmrg    }
980f7df2e56Smrg    FreeResource(stuff->glyphset, RT_NONE);
9816747b715Smrg    return Success;
98205b261ecSmrg}
98305b261ecSmrg
98405b261ecSmrgtypedef struct _GlyphNew {
985f7df2e56Smrg    Glyph id;
986f7df2e56Smrg    GlyphPtr glyph;
987f7df2e56Smrg    Bool found;
988f7df2e56Smrg    unsigned char sha1[20];
98905b261ecSmrg} GlyphNewRec, *GlyphNewPtr;
99005b261ecSmrg
9914642e01fSmrg#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
9924642e01fSmrg
99305b261ecSmrgstatic int
994f7df2e56SmrgProcRenderAddGlyphs(ClientPtr client)
99505b261ecSmrg{
996f7df2e56Smrg    GlyphSetPtr glyphSet;
997f7df2e56Smrg
99805b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
999f7df2e56Smrg    GlyphNewRec glyphsLocal[NLOCALGLYPH];
1000f7df2e56Smrg    GlyphNewPtr glyphsBase, glyphs, glyph_new;
1001f7df2e56Smrg    int remain, nglyphs;
1002f7df2e56Smrg    CARD32 *gids;
1003f7df2e56Smrg    xGlyphInfo *gi;
1004f7df2e56Smrg    CARD8 *bits;
1005f7df2e56Smrg    unsigned int size;
1006f7df2e56Smrg    int err;
1007f7df2e56Smrg    int i, screen;
1008f7df2e56Smrg    PicturePtr pSrc = NULL, pDst = NULL;
1009f7df2e56Smrg    PixmapPtr pSrcPix = NULL, pDstPix = NULL;
1010f7df2e56Smrg    CARD32 component_alpha;
101105b261ecSmrg
101205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
1013f7df2e56Smrg    err =
1014f7df2e56Smrg        dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
1015f7df2e56Smrg                                GlyphSetType, client, DixAddAccess);
1016f7df2e56Smrg    if (err != Success) {
1017f7df2e56Smrg        client->errorValue = stuff->glyphset;
1018f7df2e56Smrg        return err;
101905b261ecSmrg    }
102005b261ecSmrg
10214642e01fSmrg    err = BadAlloc;
102205b261ecSmrg    nglyphs = stuff->nglyphs;
102305b261ecSmrg    if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec))
1024f7df2e56Smrg        return BadAlloc;
102505b261ecSmrg
1026f7df2e56Smrg    component_alpha = NeedsComponent(glyphSet->format->format);
10274642e01fSmrg
10284642e01fSmrg    if (nglyphs <= NLOCALGLYPH) {
1029f7df2e56Smrg        memset(glyphsLocal, 0, sizeof(glyphsLocal));
1030f7df2e56Smrg        glyphsBase = glyphsLocal;
10314642e01fSmrg    }
1032f7df2e56Smrg    else {
1033f7df2e56Smrg        glyphsBase = (GlyphNewPtr) calloc(nglyphs, sizeof(GlyphNewRec));
1034f7df2e56Smrg        if (!glyphsBase)
1035f7df2e56Smrg            return BadAlloc;
103605b261ecSmrg    }
103705b261ecSmrg
1038f7df2e56Smrg    remain = (client->req_len << 2) - sizeof(xRenderAddGlyphsReq);
103905b261ecSmrg
104005b261ecSmrg    glyphs = glyphsBase;
104105b261ecSmrg
104205b261ecSmrg    gids = (CARD32 *) (stuff + 1);
104305b261ecSmrg    gi = (xGlyphInfo *) (gids + nglyphs);
104405b261ecSmrg    bits = (CARD8 *) (gi + nglyphs);
1045f7df2e56Smrg    remain -= (sizeof(CARD32) + sizeof(xGlyphInfo)) * nglyphs;
10466747b715Smrg
10476747b715Smrg    /* protect against bad nglyphs */
1048f7df2e56Smrg    if (gi < ((xGlyphInfo *) stuff) ||
1049f7df2e56Smrg        gi > ((xGlyphInfo *) ((CARD32 *) stuff + client->req_len)) ||
1050f7df2e56Smrg        bits < ((CARD8 *) stuff) ||
1051f7df2e56Smrg        bits > ((CARD8 *) ((CARD32 *) stuff + client->req_len))) {
10526747b715Smrg        err = BadLength;
10536747b715Smrg        goto bail;
10546747b715Smrg    }
10556747b715Smrg
1056f7df2e56Smrg    for (i = 0; i < nglyphs; i++) {
1057f7df2e56Smrg        size_t padded_width;
1058f7df2e56Smrg
1059f7df2e56Smrg        glyph_new = &glyphs[i];
1060f7df2e56Smrg
1061f7df2e56Smrg        padded_width = PixmapBytePad(gi[i].width, glyphSet->format->depth);
1062f7df2e56Smrg
1063f7df2e56Smrg        if (gi[i].height &&
1064f7df2e56Smrg            padded_width > (UINT32_MAX - sizeof(GlyphRec)) / gi[i].height)
1065f7df2e56Smrg            break;
1066f7df2e56Smrg
1067f7df2e56Smrg        size = gi[i].height * padded_width;
1068f7df2e56Smrg        if (remain < size)
1069f7df2e56Smrg            break;
1070f7df2e56Smrg
1071f7df2e56Smrg        err = HashGlyph(&gi[i], bits, size, glyph_new->sha1);
1072f7df2e56Smrg        if (err)
1073f7df2e56Smrg            goto bail;
1074f7df2e56Smrg
1075f7df2e56Smrg        glyph_new->glyph = FindGlyphByHash(glyph_new->sha1, glyphSet->fdepth);
1076f7df2e56Smrg
1077f7df2e56Smrg        if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph) {
1078f7df2e56Smrg            glyph_new->found = TRUE;
1079875c6e4fSmrg            ++glyph_new->glyph->refcnt;
1080f7df2e56Smrg        }
1081f7df2e56Smrg        else {
1082f7df2e56Smrg            GlyphPtr glyph;
1083f7df2e56Smrg
1084f7df2e56Smrg            glyph_new->found = FALSE;
1085f7df2e56Smrg            glyph_new->glyph = glyph = AllocateGlyph(&gi[i], glyphSet->fdepth);
1086f7df2e56Smrg            if (!glyph) {
1087f7df2e56Smrg                err = BadAlloc;
1088f7df2e56Smrg                goto bail;
1089f7df2e56Smrg            }
1090f7df2e56Smrg
1091f7df2e56Smrg            for (screen = 0; screen < screenInfo.numScreens; screen++) {
1092f7df2e56Smrg                int width = gi[i].width;
1093f7df2e56Smrg                int height = gi[i].height;
1094f7df2e56Smrg                int depth = glyphSet->format->depth;
1095f7df2e56Smrg                ScreenPtr pScreen;
1096f7df2e56Smrg                int error;
1097f7df2e56Smrg
1098f7df2e56Smrg                /* Skip work if it's invisibly small anyway */
1099f7df2e56Smrg                if (!width || !height)
1100f7df2e56Smrg                    break;
1101f7df2e56Smrg
1102f7df2e56Smrg                pScreen = screenInfo.screens[screen];
1103f7df2e56Smrg                pSrcPix = GetScratchPixmapHeader(pScreen,
1104f7df2e56Smrg                                                 width, height,
1105f7df2e56Smrg                                                 depth, depth, -1, bits);
1106f7df2e56Smrg                if (!pSrcPix) {
1107f7df2e56Smrg                    err = BadAlloc;
1108f7df2e56Smrg                    goto bail;
1109f7df2e56Smrg                }
1110f7df2e56Smrg
1111f7df2e56Smrg                pSrc = CreatePicture(0, &pSrcPix->drawable,
1112f7df2e56Smrg                                     glyphSet->format, 0, NULL,
1113f7df2e56Smrg                                     serverClient, &error);
1114f7df2e56Smrg                if (!pSrc) {
1115f7df2e56Smrg                    err = BadAlloc;
1116f7df2e56Smrg                    goto bail;
1117f7df2e56Smrg                }
1118f7df2e56Smrg
1119f7df2e56Smrg                pDstPix = (pScreen->CreatePixmap) (pScreen,
1120f7df2e56Smrg                                                   width, height, depth,
1121f7df2e56Smrg                                                   CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
1122f7df2e56Smrg
1123f7df2e56Smrg                if (!pDstPix) {
1124f7df2e56Smrg                    err = BadAlloc;
1125f7df2e56Smrg                    goto bail;
1126f7df2e56Smrg                }
1127f7df2e56Smrg
1128f7df2e56Smrg                pDst = CreatePicture(0, &pDstPix->drawable,
1129f7df2e56Smrg                                  glyphSet->format,
1130f7df2e56Smrg                                  CPComponentAlpha, &component_alpha,
1131f7df2e56Smrg                                  serverClient, &error);
1132f7df2e56Smrg                SetGlyphPicture(glyph, pScreen, pDst);
1133f7df2e56Smrg
1134f7df2e56Smrg                /* The picture takes a reference to the pixmap, so we
1135f7df2e56Smrg                   drop ours. */
1136f7df2e56Smrg                (pScreen->DestroyPixmap) (pDstPix);
1137f7df2e56Smrg                pDstPix = NULL;
1138f7df2e56Smrg
1139f7df2e56Smrg                if (!pDst) {
1140f7df2e56Smrg                    err = BadAlloc;
1141f7df2e56Smrg                    goto bail;
1142f7df2e56Smrg                }
1143f7df2e56Smrg
1144f7df2e56Smrg                CompositePicture(PictOpSrc,
1145f7df2e56Smrg                                 pSrc,
1146f7df2e56Smrg                                 None, pDst, 0, 0, 0, 0, 0, 0, width, height);
1147f7df2e56Smrg
1148f7df2e56Smrg                FreePicture((void *) pSrc, 0);
1149f7df2e56Smrg                pSrc = NULL;
1150f7df2e56Smrg                FreeScratchPixmapHeader(pSrcPix);
1151f7df2e56Smrg                pSrcPix = NULL;
1152f7df2e56Smrg            }
1153f7df2e56Smrg
1154f7df2e56Smrg            memcpy(glyph_new->glyph->sha1, glyph_new->sha1, 20);
1155f7df2e56Smrg        }
1156f7df2e56Smrg
1157f7df2e56Smrg        glyph_new->id = gids[i];
1158f7df2e56Smrg
1159f7df2e56Smrg        if (size & 3)
1160f7df2e56Smrg            size += 4 - (size & 3);
1161f7df2e56Smrg        bits += size;
1162f7df2e56Smrg        remain -= size;
1163f7df2e56Smrg    }
1164f7df2e56Smrg    if (remain || i < nglyphs) {
1165f7df2e56Smrg        err = BadLength;
1166f7df2e56Smrg        goto bail;
1167f7df2e56Smrg    }
1168f7df2e56Smrg    if (!ResizeGlyphSet(glyphSet, nglyphs)) {
1169f7df2e56Smrg        err = BadAlloc;
1170f7df2e56Smrg        goto bail;
117105b261ecSmrg    }
1172875c6e4fSmrg    for (i = 0; i < nglyphs; i++) {
1173f7df2e56Smrg        AddGlyph(glyphSet, glyphs[i].glyph, glyphs[i].id);
1174875c6e4fSmrg        FreeGlyph(glyphs[i].glyph, glyphSet->fdepth);
1175875c6e4fSmrg    }
117605b261ecSmrg
117705b261ecSmrg    if (glyphsBase != glyphsLocal)
1178f7df2e56Smrg        free(glyphsBase);
11796747b715Smrg    return Success;
1180f7df2e56Smrg bail:
11814642e01fSmrg    if (pSrc)
1182f7df2e56Smrg        FreePicture((void *) pSrc, 0);
11834642e01fSmrg    if (pSrcPix)
1184f7df2e56Smrg        FreeScratchPixmapHeader(pSrcPix);
1185875c6e4fSmrg    for (i = 0; i < nglyphs; i++) {
1186875c6e4fSmrg        if (glyphs[i].glyph) {
1187875c6e4fSmrg            --glyphs[i].glyph->refcnt;
1188875c6e4fSmrg            if (!glyphs[i].found)
1189875c6e4fSmrg                free(glyphs[i].glyph);
1190875c6e4fSmrg        }
1191875c6e4fSmrg    }
119205b261ecSmrg    if (glyphsBase != glyphsLocal)
1193f7df2e56Smrg        free(glyphsBase);
119405b261ecSmrg    return err;
119505b261ecSmrg}
119605b261ecSmrg
119705b261ecSmrgstatic int
1198f7df2e56SmrgProcRenderAddGlyphsFromPicture(ClientPtr client)
119905b261ecSmrg{
120005b261ecSmrg    return BadImplementation;
120105b261ecSmrg}
120205b261ecSmrg
120305b261ecSmrgstatic int
1204f7df2e56SmrgProcRenderFreeGlyphs(ClientPtr client)
120505b261ecSmrg{
120605b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
1207f7df2e56Smrg    GlyphSetPtr glyphSet;
1208f7df2e56Smrg    int rc, nglyph;
1209f7df2e56Smrg    CARD32 *gids;
1210f7df2e56Smrg    CARD32 glyph;
121105b261ecSmrg
121205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
1213f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
1214f7df2e56Smrg                                 GlyphSetType, client, DixRemoveAccess);
1215f7df2e56Smrg    if (rc != Success) {
1216f7df2e56Smrg        client->errorValue = stuff->glyphset;
1217f7df2e56Smrg        return rc;
1218f7df2e56Smrg    }
1219f7df2e56Smrg    nglyph =
1220f7df2e56Smrg        bytes_to_int32((client->req_len << 2) - sizeof(xRenderFreeGlyphsReq));
122105b261ecSmrg    gids = (CARD32 *) (stuff + 1);
1222f7df2e56Smrg    while (nglyph-- > 0) {
1223f7df2e56Smrg        glyph = *gids++;
1224f7df2e56Smrg        if (!DeleteGlyph(glyphSet, glyph)) {
1225f7df2e56Smrg            client->errorValue = glyph;
1226f7df2e56Smrg            return RenderErrBase + BadGlyph;
1227f7df2e56Smrg        }
122805b261ecSmrg    }
12296747b715Smrg    return Success;
123005b261ecSmrg}
123105b261ecSmrg
123205b261ecSmrgstatic int
1233f7df2e56SmrgProcRenderCompositeGlyphs(ClientPtr client)
1234f7df2e56Smrg{
1235f7df2e56Smrg    GlyphSetPtr glyphSet;
1236f7df2e56Smrg    GlyphSet gs;
1237f7df2e56Smrg    PicturePtr pSrc, pDst;
1238f7df2e56Smrg    PictFormatPtr pFormat;
1239f7df2e56Smrg    GlyphListRec listsLocal[NLOCALDELTA];
1240f7df2e56Smrg    GlyphListPtr lists, listsBase;
1241f7df2e56Smrg    GlyphPtr glyphsLocal[NLOCALGLYPH];
1242f7df2e56Smrg    Glyph glyph;
1243f7df2e56Smrg    GlyphPtr *glyphs, *glyphsBase;
1244f7df2e56Smrg    xGlyphElt *elt;
1245f7df2e56Smrg    CARD8 *buffer, *end;
1246f7df2e56Smrg    int nglyph;
1247f7df2e56Smrg    int nlist;
1248f7df2e56Smrg    int space;
1249f7df2e56Smrg    int size;
1250f7df2e56Smrg    int rc, n;
1251f7df2e56Smrg
125205b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
125305b261ecSmrg
125405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
125505b261ecSmrg
125605b261ecSmrg    switch (stuff->renderReqType) {
1257f7df2e56Smrg    default:
1258f7df2e56Smrg        size = 1;
1259f7df2e56Smrg        break;
1260f7df2e56Smrg    case X_RenderCompositeGlyphs16:
1261f7df2e56Smrg        size = 2;
1262f7df2e56Smrg        break;
1263f7df2e56Smrg    case X_RenderCompositeGlyphs32:
1264f7df2e56Smrg        size = 4;
1265f7df2e56Smrg        break;
1266f7df2e56Smrg    }
1267f7df2e56Smrg
1268f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
1269f7df2e56Smrg        client->errorValue = stuff->op;
1270f7df2e56Smrg        return BadValue;
1271f7df2e56Smrg    }
1272f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
1273f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
127405b261ecSmrg    if (!pDst->pDrawable)
127505b261ecSmrg        return BadDrawable;
127605b261ecSmrg    if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
1277f7df2e56Smrg        return BadMatch;
1278f7df2e56Smrg    if (stuff->maskFormat) {
1279f7df2e56Smrg        rc = dixLookupResourceByType((void **) &pFormat, stuff->maskFormat,
1280f7df2e56Smrg                                     PictFormatType, client, DixReadAccess);
1281f7df2e56Smrg        if (rc != Success)
1282f7df2e56Smrg            return rc;
128305b261ecSmrg    }
128405b261ecSmrg    else
1285f7df2e56Smrg        pFormat = 0;
128605b261ecSmrg
1287f7df2e56Smrg    rc = dixLookupResourceByType((void **) &glyphSet, stuff->glyphset,
1288f7df2e56Smrg                                 GlyphSetType, client, DixUseAccess);
12896747b715Smrg    if (rc != Success)
1290f7df2e56Smrg        return rc;
129105b261ecSmrg
129205b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
129305b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
129405b261ecSmrg    nglyph = 0;
129505b261ecSmrg    nlist = 0;
1296f7df2e56Smrg    while (buffer + sizeof(xGlyphElt) < end) {
1297f7df2e56Smrg        elt = (xGlyphElt *) buffer;
1298f7df2e56Smrg        buffer += sizeof(xGlyphElt);
1299f7df2e56Smrg
1300f7df2e56Smrg        if (elt->len == 0xff) {
1301f7df2e56Smrg            buffer += 4;
1302f7df2e56Smrg        }
1303f7df2e56Smrg        else {
1304f7df2e56Smrg            nlist++;
1305f7df2e56Smrg            nglyph += elt->len;
1306f7df2e56Smrg            space = size * elt->len;
1307f7df2e56Smrg            if (space & 3)
1308f7df2e56Smrg                space += 4 - (space & 3);
1309f7df2e56Smrg            buffer += space;
1310f7df2e56Smrg        }
131105b261ecSmrg    }
131205b261ecSmrg    if (nglyph <= NLOCALGLYPH)
1313f7df2e56Smrg        glyphsBase = glyphsLocal;
1314f7df2e56Smrg    else {
1315f7df2e56Smrg        glyphsBase = xallocarray(nglyph, sizeof(GlyphPtr));
1316f7df2e56Smrg        if (!glyphsBase)
1317f7df2e56Smrg            return BadAlloc;
131805b261ecSmrg    }
131905b261ecSmrg    if (nlist <= NLOCALDELTA)
1320f7df2e56Smrg        listsBase = listsLocal;
1321f7df2e56Smrg    else {
1322f7df2e56Smrg        listsBase = xallocarray(nlist, sizeof(GlyphListRec));
1323f7df2e56Smrg        if (!listsBase) {
1324f7df2e56Smrg            rc = BadAlloc;
1325f7df2e56Smrg            goto bail;
1326f7df2e56Smrg        }
132705b261ecSmrg    }
132805b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
132905b261ecSmrg    glyphs = glyphsBase;
133005b261ecSmrg    lists = listsBase;
1331f7df2e56Smrg    while (buffer + sizeof(xGlyphElt) < end) {
1332f7df2e56Smrg        elt = (xGlyphElt *) buffer;
1333f7df2e56Smrg        buffer += sizeof(xGlyphElt);
1334f7df2e56Smrg
1335f7df2e56Smrg        if (elt->len == 0xff) {
1336f7df2e56Smrg            if (buffer + sizeof(GlyphSet) < end) {
133705b261ecSmrg                memcpy(&gs, buffer, sizeof(GlyphSet));
1338f7df2e56Smrg                rc = dixLookupResourceByType((void **) &glyphSet, gs,
1339f7df2e56Smrg                                             GlyphSetType, client,
1340f7df2e56Smrg                                             DixUseAccess);
1341f7df2e56Smrg                if (rc != Success)
1342f7df2e56Smrg                    goto bail;
1343f7df2e56Smrg            }
1344f7df2e56Smrg            buffer += 4;
1345f7df2e56Smrg        }
1346f7df2e56Smrg        else {
1347f7df2e56Smrg            lists->xOff = elt->deltax;
1348f7df2e56Smrg            lists->yOff = elt->deltay;
1349f7df2e56Smrg            lists->format = glyphSet->format;
1350f7df2e56Smrg            lists->len = 0;
1351f7df2e56Smrg            n = elt->len;
1352f7df2e56Smrg            while (n--) {
1353f7df2e56Smrg                if (buffer + size <= end) {
1354f7df2e56Smrg                    switch (size) {
1355f7df2e56Smrg                    case 1:
1356f7df2e56Smrg                        glyph = *((CARD8 *) buffer);
1357f7df2e56Smrg                        break;
1358f7df2e56Smrg                    case 2:
1359f7df2e56Smrg                        glyph = *((CARD16 *) buffer);
1360f7df2e56Smrg                        break;
1361f7df2e56Smrg                    case 4:
1362f7df2e56Smrg                    default:
1363f7df2e56Smrg                        glyph = *((CARD32 *) buffer);
1364f7df2e56Smrg                        break;
1365f7df2e56Smrg                    }
1366f7df2e56Smrg                    if ((*glyphs = FindGlyph(glyphSet, glyph))) {
1367f7df2e56Smrg                        lists->len++;
1368f7df2e56Smrg                        glyphs++;
1369f7df2e56Smrg                    }
1370f7df2e56Smrg                }
1371f7df2e56Smrg                buffer += size;
1372f7df2e56Smrg            }
1373f7df2e56Smrg            space = size * elt->len;
1374f7df2e56Smrg            if (space & 3)
1375f7df2e56Smrg                buffer += 4 - (space & 3);
1376f7df2e56Smrg            lists++;
1377f7df2e56Smrg        }
137805b261ecSmrg    }
13799ace9065Smrg    if (buffer > end) {
1380f7df2e56Smrg        rc = BadLength;
1381f7df2e56Smrg        goto bail;
1382f7df2e56Smrg    }
1383f7df2e56Smrg
1384f7df2e56Smrg    CompositeGlyphs(stuff->op,
1385f7df2e56Smrg                    pSrc,
1386f7df2e56Smrg                    pDst,
1387f7df2e56Smrg                    pFormat,
1388f7df2e56Smrg                    stuff->xSrc, stuff->ySrc, nlist, listsBase, glyphsBase);
13899ace9065Smrg    rc = Success;
139005b261ecSmrg
1391f7df2e56Smrg bail:
139205b261ecSmrg    if (glyphsBase != glyphsLocal)
1393f7df2e56Smrg        free(glyphsBase);
139405b261ecSmrg    if (listsBase != listsLocal)
1395f7df2e56Smrg        free(listsBase);
13969ace9065Smrg    return rc;
139705b261ecSmrg}
139805b261ecSmrg
139905b261ecSmrgstatic int
1400f7df2e56SmrgProcRenderFillRectangles(ClientPtr client)
140105b261ecSmrg{
1402f7df2e56Smrg    PicturePtr pDst;
1403f7df2e56Smrg    int things;
1404f7df2e56Smrg
140505b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
1406f7df2e56Smrg
1407f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq);
1408f7df2e56Smrg    if (!PictOpValid(stuff->op)) {
1409f7df2e56Smrg        client->errorValue = stuff->op;
1410f7df2e56Smrg        return BadValue;
1411f7df2e56Smrg    }
1412f7df2e56Smrg    VERIFY_PICTURE(pDst, stuff->dst, client, DixWriteAccess);
141305b261ecSmrg    if (!pDst->pDrawable)
141405b261ecSmrg        return BadDrawable;
1415f7df2e56Smrg
141605b261ecSmrg    things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
141705b261ecSmrg    if (things & 4)
1418f7df2e56Smrg        return BadLength;
141905b261ecSmrg    things >>= 3;
1420f7df2e56Smrg
1421f7df2e56Smrg    CompositeRects(stuff->op,
1422f7df2e56Smrg                   pDst, &stuff->color, things, (xRectangle *) &stuff[1]);
1423f7df2e56Smrg
14246747b715Smrg    return Success;
142505b261ecSmrg}
142605b261ecSmrg
142705b261ecSmrgstatic void
1428f7df2e56SmrgRenderSetBit(unsigned char *line, int x, int bit)
142905b261ecSmrg{
1430f7df2e56Smrg    unsigned char mask;
1431f7df2e56Smrg
143205b261ecSmrg    if (screenInfo.bitmapBitOrder == LSBFirst)
1433f7df2e56Smrg        mask = (1 << (x & 7));
143405b261ecSmrg    else
1435f7df2e56Smrg        mask = (0x80 >> (x & 7));
143605b261ecSmrg    /* XXX assumes byte order is host byte order */
143705b261ecSmrg    line += (x >> 3);
143805b261ecSmrg    if (bit)
1439f7df2e56Smrg        *line |= mask;
144005b261ecSmrg    else
1441f7df2e56Smrg        *line &= ~mask;
144205b261ecSmrg}
144305b261ecSmrg
144405b261ecSmrg#define DITHER_DIM 2
144505b261ecSmrg
144605b261ecSmrgstatic CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = {
1447f7df2e56Smrg    {1, 3,},
1448f7df2e56Smrg    {4, 2,},
144905b261ecSmrg};
145005b261ecSmrg
145105b261ecSmrg#define DITHER_SIZE  ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1)
145205b261ecSmrg
145305b261ecSmrgstatic int
1454f7df2e56SmrgProcRenderCreateCursor(ClientPtr client)
145505b261ecSmrg{
145605b261ecSmrg    REQUEST(xRenderCreateCursorReq);
1457f7df2e56Smrg    PicturePtr pSrc;
1458f7df2e56Smrg    ScreenPtr pScreen;
1459f7df2e56Smrg    unsigned short width, height;
1460f7df2e56Smrg    CARD32 *argbbits, *argb;
1461f7df2e56Smrg    unsigned char *srcbits, *srcline;
1462f7df2e56Smrg    unsigned char *mskbits, *mskline;
1463f7df2e56Smrg    int stride;
1464f7df2e56Smrg    int x, y;
1465f7df2e56Smrg    int nbytes_mono;
146605b261ecSmrg    CursorMetricRec cm;
1467f7df2e56Smrg    CursorPtr pCursor;
1468f7df2e56Smrg    CARD32 twocolor[3];
1469f7df2e56Smrg    int rc, ncolor;
147005b261ecSmrg
1471f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderCreateCursorReq);
147205b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
1473f7df2e56Smrg
1474f7df2e56Smrg    VERIFY_PICTURE(pSrc, stuff->src, client, DixReadAccess);
147505b261ecSmrg    if (!pSrc->pDrawable)
147605b261ecSmrg        return BadDrawable;
147705b261ecSmrg    pScreen = pSrc->pDrawable->pScreen;
147805b261ecSmrg    width = pSrc->pDrawable->width;
147905b261ecSmrg    height = pSrc->pDrawable->height;
1480f7df2e56Smrg    if (height && width > UINT32_MAX / (height * sizeof(CARD32)))
1481f7df2e56Smrg        return BadAlloc;
1482f7df2e56Smrg    if (stuff->x > width || stuff->y > height)
1483f7df2e56Smrg        return BadMatch;
1484f7df2e56Smrg    argbbits = malloc(width * height * sizeof(CARD32));
148505b261ecSmrg    if (!argbbits)
1486f7df2e56Smrg        return BadAlloc;
1487f7df2e56Smrg
148805b261ecSmrg    stride = BitmapBytePad(width);
1489f7df2e56Smrg    nbytes_mono = stride * height;
14906747b715Smrg    srcbits = calloc(1, nbytes_mono);
1491f7df2e56Smrg    if (!srcbits) {
1492f7df2e56Smrg        free(argbbits);
1493f7df2e56Smrg        return BadAlloc;
149405b261ecSmrg    }
14956747b715Smrg    mskbits = calloc(1, nbytes_mono);
1496f7df2e56Smrg    if (!mskbits) {
1497f7df2e56Smrg        free(argbbits);
1498f7df2e56Smrg        free(srcbits);
1499f7df2e56Smrg        return BadAlloc;
1500f7df2e56Smrg    }
1501f7df2e56Smrg
15024e185dc0Smrg    /* what kind of maniac creates a cursor from a window picture though */
15034e185dc0Smrg    if (pSrc->pDrawable->type == DRAWABLE_WINDOW)
15044e185dc0Smrg        pScreen->SourceValidate(pSrc->pDrawable, 0, 0, width, height,
15054e185dc0Smrg                                IncludeInferiors);
15064e185dc0Smrg
1507f7df2e56Smrg    if (pSrc->format == PICT_a8r8g8b8) {
1508f7df2e56Smrg        (*pScreen->GetImage) (pSrc->pDrawable,
1509f7df2e56Smrg                              0, 0, width, height, ZPixmap,
1510f7df2e56Smrg                              0xffffffff, (void *) argbbits);
1511f7df2e56Smrg    }
1512f7df2e56Smrg    else {
1513f7df2e56Smrg        PixmapPtr pPixmap;
1514f7df2e56Smrg        PicturePtr pPicture;
1515f7df2e56Smrg        PictFormatPtr pFormat;
1516f7df2e56Smrg        int error;
1517f7df2e56Smrg
1518f7df2e56Smrg        pFormat = PictureMatchFormat(pScreen, 32, PICT_a8r8g8b8);
1519f7df2e56Smrg        if (!pFormat) {
1520f7df2e56Smrg            free(argbbits);
1521f7df2e56Smrg            free(srcbits);
1522f7df2e56Smrg            free(mskbits);
1523f7df2e56Smrg            return BadImplementation;
1524f7df2e56Smrg        }
1525f7df2e56Smrg        pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
1526f7df2e56Smrg                                            CREATE_PIXMAP_USAGE_SCRATCH);
1527f7df2e56Smrg        if (!pPixmap) {
1528f7df2e56Smrg            free(argbbits);
1529f7df2e56Smrg            free(srcbits);
1530f7df2e56Smrg            free(mskbits);
1531f7df2e56Smrg            return BadAlloc;
1532f7df2e56Smrg        }
1533f7df2e56Smrg        pPicture = CreatePicture(0, &pPixmap->drawable, pFormat, 0, 0,
1534f7df2e56Smrg                                 client, &error);
1535f7df2e56Smrg        if (!pPicture) {
1536f7df2e56Smrg            free(argbbits);
1537f7df2e56Smrg            free(srcbits);
1538f7df2e56Smrg            free(mskbits);
1539f7df2e56Smrg            return error;
1540f7df2e56Smrg        }
1541f7df2e56Smrg        (*pScreen->DestroyPixmap) (pPixmap);
1542f7df2e56Smrg        CompositePicture(PictOpSrc,
1543f7df2e56Smrg                         pSrc, 0, pPicture, 0, 0, 0, 0, 0, 0, width, height);
1544f7df2e56Smrg        (*pScreen->GetImage) (pPicture->pDrawable,
1545f7df2e56Smrg                              0, 0, width, height, ZPixmap,
1546f7df2e56Smrg                              0xffffffff, (void *) argbbits);
1547f7df2e56Smrg        FreePicture(pPicture, 0);
154805b261ecSmrg    }
154905b261ecSmrg    /*
1550f7df2e56Smrg     * Check whether the cursor can be directly supported by
155105b261ecSmrg     * the core cursor code
155205b261ecSmrg     */
155305b261ecSmrg    ncolor = 0;
155405b261ecSmrg    argb = argbbits;
1555f7df2e56Smrg    for (y = 0; ncolor <= 2 && y < height; y++) {
1556f7df2e56Smrg        for (x = 0; ncolor <= 2 && x < width; x++) {
1557f7df2e56Smrg            CARD32 p = *argb++;
1558f7df2e56Smrg            CARD32 a = (p >> 24);
1559f7df2e56Smrg
1560f7df2e56Smrg            if (a == 0)         /* transparent */
1561f7df2e56Smrg                continue;
1562f7df2e56Smrg            if (a == 0xff) {    /* opaque */
1563f7df2e56Smrg                int n;
1564f7df2e56Smrg
1565f7df2e56Smrg                for (n = 0; n < ncolor; n++)
1566f7df2e56Smrg                    if (p == twocolor[n])
1567f7df2e56Smrg                        break;
1568f7df2e56Smrg                if (n == ncolor)
1569f7df2e56Smrg                    twocolor[ncolor++] = p;
1570f7df2e56Smrg            }
1571f7df2e56Smrg            else
1572f7df2e56Smrg                ncolor = 3;
1573f7df2e56Smrg        }
1574f7df2e56Smrg    }
1575f7df2e56Smrg
157605b261ecSmrg    /*
157705b261ecSmrg     * Convert argb image to two plane cursor
157805b261ecSmrg     */
157905b261ecSmrg    srcline = srcbits;
158005b261ecSmrg    mskline = mskbits;
158105b261ecSmrg    argb = argbbits;
1582f7df2e56Smrg    for (y = 0; y < height; y++) {
1583f7df2e56Smrg        for (x = 0; x < width; x++) {
1584f7df2e56Smrg            CARD32 p = *argb++;
1585f7df2e56Smrg
1586f7df2e56Smrg            if (ncolor <= 2) {
1587f7df2e56Smrg                CARD32 a = ((p >> 24));
1588f7df2e56Smrg
1589f7df2e56Smrg                RenderSetBit(mskline, x, a != 0);
1590f7df2e56Smrg                RenderSetBit(srcline, x, a != 0 && p == twocolor[0]);
1591f7df2e56Smrg            }
1592f7df2e56Smrg            else {
1593f7df2e56Smrg                CARD32 a = ((p >> 24) * DITHER_SIZE + 127) / 255;
1594f7df2e56Smrg                CARD32 i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255;
1595f7df2e56Smrg                CARD32 d =
1596f7df2e56Smrg                    orderedDither[y & (DITHER_DIM - 1)][x & (DITHER_DIM - 1)];
1597f7df2e56Smrg                /* Set mask from dithered alpha value */
1598f7df2e56Smrg                RenderSetBit(mskline, x, a > d);
1599f7df2e56Smrg                /* Set src from dithered intensity value */
1600f7df2e56Smrg                RenderSetBit(srcline, x, a > d && i <= d);
1601f7df2e56Smrg            }
1602f7df2e56Smrg        }
1603f7df2e56Smrg        srcline += stride;
1604f7df2e56Smrg        mskline += stride;
160505b261ecSmrg    }
160605b261ecSmrg    /*
160705b261ecSmrg     * Dither to white and black if the cursor has more than two colors
160805b261ecSmrg     */
1609f7df2e56Smrg    if (ncolor > 2) {
1610f7df2e56Smrg        twocolor[0] = 0xff000000;
1611f7df2e56Smrg        twocolor[1] = 0xffffffff;
161205b261ecSmrg    }
1613f7df2e56Smrg    else {
1614f7df2e56Smrg        free(argbbits);
1615f7df2e56Smrg        argbbits = 0;
161605b261ecSmrg    }
1617f7df2e56Smrg
161805b261ecSmrg#define GetByte(p,s)	(((p) >> (s)) & 0xff)
161905b261ecSmrg#define GetColor(p,s)	(GetByte(p,s) | (GetByte(p,s) << 8))
1620f7df2e56Smrg
162105b261ecSmrg    cm.width = width;
162205b261ecSmrg    cm.height = height;
162305b261ecSmrg    cm.xhot = stuff->x;
162405b261ecSmrg    cm.yhot = stuff->y;
16254642e01fSmrg    rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm,
1626f7df2e56Smrg                         GetColor(twocolor[0], 16),
1627f7df2e56Smrg                         GetColor(twocolor[0], 8),
1628f7df2e56Smrg                         GetColor(twocolor[0], 0),
1629f7df2e56Smrg                         GetColor(twocolor[1], 16),
1630f7df2e56Smrg                         GetColor(twocolor[1], 8),
1631f7df2e56Smrg                         GetColor(twocolor[1], 0),
1632f7df2e56Smrg                         &pCursor, client, stuff->cid);
16334642e01fSmrg    if (rc != Success)
1634f7df2e56Smrg        goto bail;
1635f7df2e56Smrg    if (!AddResource(stuff->cid, RT_CURSOR, (void *) pCursor)) {
1636f7df2e56Smrg        rc = BadAlloc;
1637f7df2e56Smrg        goto bail;
1638f7df2e56Smrg    }
16394642e01fSmrg
16406747b715Smrg    return Success;
1641f7df2e56Smrg bail:
1642f7df2e56Smrg    free(srcbits);
1643f7df2e56Smrg    free(mskbits);
1644f7df2e56Smrg    return rc;
164505b261ecSmrg}
164605b261ecSmrg
164705b261ecSmrgstatic int
1648f7df2e56SmrgProcRenderSetPictureTransform(ClientPtr client)
164905b261ecSmrg{
165005b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
1651f7df2e56Smrg    PicturePtr pPicture;
165205b261ecSmrg
165305b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
1654f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
1655f7df2e56Smrg    return SetPictureTransform(pPicture, (PictTransform *) &stuff->transform);
165605b261ecSmrg}
165705b261ecSmrg
165805b261ecSmrgstatic int
1659f7df2e56SmrgProcRenderQueryFilters(ClientPtr client)
166005b261ecSmrg{
1661f7df2e56Smrg    REQUEST(xRenderQueryFiltersReq);
1662f7df2e56Smrg    DrawablePtr pDrawable;
1663f7df2e56Smrg    xRenderQueryFiltersReply *reply;
1664f7df2e56Smrg    int nbytesName;
1665f7df2e56Smrg    int nnames;
1666f7df2e56Smrg    ScreenPtr pScreen;
1667f7df2e56Smrg    PictureScreenPtr ps;
1668f7df2e56Smrg    int i, j, len, total_bytes, rc;
1669f7df2e56Smrg    INT16 *aliases;
1670f7df2e56Smrg    char *names;
167105b261ecSmrg
167205b261ecSmrg    REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
167305b261ecSmrg    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
1674f7df2e56Smrg                           DixGetAttrAccess);
167505b261ecSmrg    if (rc != Success)
1676f7df2e56Smrg        return rc;
1677f7df2e56Smrg
167805b261ecSmrg    pScreen = pDrawable->pScreen;
167905b261ecSmrg    nbytesName = 0;
168005b261ecSmrg    nnames = 0;
168105b261ecSmrg    ps = GetPictureScreenIfSet(pScreen);
1682f7df2e56Smrg    if (ps) {
1683f7df2e56Smrg        for (i = 0; i < ps->nfilters; i++)
1684f7df2e56Smrg            nbytesName += 1 + strlen(ps->filters[i].name);
1685f7df2e56Smrg        for (i = 0; i < ps->nfilterAliases; i++)
1686f7df2e56Smrg            nbytesName += 1 + strlen(ps->filterAliases[i].alias);
1687f7df2e56Smrg        nnames = ps->nfilters + ps->nfilterAliases;
168805b261ecSmrg    }
16896747b715Smrg    len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName);
1690f7df2e56Smrg    total_bytes = sizeof(xRenderQueryFiltersReply) + (len << 2);
1691f7df2e56Smrg    reply = (xRenderQueryFiltersReply *) calloc(1, total_bytes);
169205b261ecSmrg    if (!reply)
1693f7df2e56Smrg        return BadAlloc;
169405b261ecSmrg    aliases = (INT16 *) (reply + 1);
169505b261ecSmrg    names = (char *) (aliases + ((nnames + 1) & ~1));
1696f7df2e56Smrg
169705b261ecSmrg    reply->type = X_Reply;
169805b261ecSmrg    reply->sequenceNumber = client->sequence;
169905b261ecSmrg    reply->length = len;
170005b261ecSmrg    reply->numAliases = nnames;
170105b261ecSmrg    reply->numFilters = nnames;
1702f7df2e56Smrg    if (ps) {
1703f7df2e56Smrg
1704f7df2e56Smrg        /* fill in alias values */
1705f7df2e56Smrg        for (i = 0; i < ps->nfilters; i++)
1706f7df2e56Smrg            aliases[i] = FilterAliasNone;
1707f7df2e56Smrg        for (i = 0; i < ps->nfilterAliases; i++) {
1708f7df2e56Smrg            for (j = 0; j < ps->nfilters; j++)
1709f7df2e56Smrg                if (ps->filterAliases[i].filter_id == ps->filters[j].id)
1710f7df2e56Smrg                    break;
1711f7df2e56Smrg            if (j == ps->nfilters) {
1712f7df2e56Smrg                for (j = 0; j < ps->nfilterAliases; j++)
1713f7df2e56Smrg                    if (ps->filterAliases[i].filter_id ==
1714f7df2e56Smrg                        ps->filterAliases[j].alias_id) {
1715f7df2e56Smrg                        break;
1716f7df2e56Smrg                    }
1717f7df2e56Smrg                if (j == ps->nfilterAliases)
1718f7df2e56Smrg                    j = FilterAliasNone;
1719f7df2e56Smrg                else
1720f7df2e56Smrg                    j = j + ps->nfilters;
1721f7df2e56Smrg            }
1722f7df2e56Smrg            aliases[i + ps->nfilters] = j;
1723f7df2e56Smrg        }
1724f7df2e56Smrg
1725f7df2e56Smrg        /* fill in filter names */
1726f7df2e56Smrg        for (i = 0; i < ps->nfilters; i++) {
1727f7df2e56Smrg            j = strlen(ps->filters[i].name);
1728f7df2e56Smrg            *names++ = j;
1729f7df2e56Smrg            memcpy(names, ps->filters[i].name, j);
1730f7df2e56Smrg            names += j;
1731f7df2e56Smrg        }
1732f7df2e56Smrg
1733f7df2e56Smrg        /* fill in filter alias names */
1734f7df2e56Smrg        for (i = 0; i < ps->nfilterAliases; i++) {
1735f7df2e56Smrg            j = strlen(ps->filterAliases[i].alias);
1736f7df2e56Smrg            *names++ = j;
1737f7df2e56Smrg            memcpy(names, ps->filterAliases[i].alias, j);
1738f7df2e56Smrg            names += j;
1739f7df2e56Smrg        }
1740f7df2e56Smrg    }
1741f7df2e56Smrg
1742f7df2e56Smrg    if (client->swapped) {
1743f7df2e56Smrg        for (i = 0; i < reply->numAliases; i++) {
1744f7df2e56Smrg            swaps(&aliases[i]);
1745f7df2e56Smrg        }
1746f7df2e56Smrg        swaps(&reply->sequenceNumber);
1747f7df2e56Smrg        swapl(&reply->length);
1748f7df2e56Smrg        swapl(&reply->numAliases);
1749f7df2e56Smrg        swapl(&reply->numFilters);
1750f7df2e56Smrg    }
1751f7df2e56Smrg    WriteToClient(client, total_bytes, reply);
17526747b715Smrg    free(reply);
1753f7df2e56Smrg
17546747b715Smrg    return Success;
175505b261ecSmrg}
175605b261ecSmrg
175705b261ecSmrgstatic int
1758f7df2e56SmrgProcRenderSetPictureFilter(ClientPtr client)
175905b261ecSmrg{
1760f7df2e56Smrg    REQUEST(xRenderSetPictureFilterReq);
1761f7df2e56Smrg    PicturePtr pPicture;
1762f7df2e56Smrg    int result;
1763f7df2e56Smrg    xFixed *params;
1764f7df2e56Smrg    int nparams;
1765f7df2e56Smrg    char *name;
1766f7df2e56Smrg
1767f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
1768f7df2e56Smrg    VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
176905b261ecSmrg    name = (char *) (stuff + 1);
17706747b715Smrg    params = (xFixed *) (name + pad_to_int32(stuff->nbytes));
177105b261ecSmrg    nparams = ((xFixed *) stuff + client->req_len) - params;
17726e78d31fSmrg    if (nparams < 0)
17736e78d31fSmrg	return BadLength;
17746e78d31fSmrg
1775f7df2e56Smrg    result = SetPictureFilter(pPicture, name, stuff->nbytes, params, nparams);
177605b261ecSmrg    return result;
177705b261ecSmrg}
177805b261ecSmrg
177905b261ecSmrgstatic int
1780f7df2e56SmrgProcRenderCreateAnimCursor(ClientPtr client)
178105b261ecSmrg{
178205b261ecSmrg    REQUEST(xRenderCreateAnimCursorReq);
1783f7df2e56Smrg    CursorPtr *cursors;
1784f7df2e56Smrg    CARD32 *deltas;
1785f7df2e56Smrg    CursorPtr pCursor;
1786f7df2e56Smrg    int ncursor;
1787f7df2e56Smrg    xAnimCursorElt *elt;
1788f7df2e56Smrg    int i;
1789f7df2e56Smrg    int ret;
179005b261ecSmrg
179105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
179205b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->cid, client);
179305b261ecSmrg    if (client->req_len & 1)
1794f7df2e56Smrg        return BadLength;
1795f7df2e56Smrg    ncursor =
1796f7df2e56Smrg        (client->req_len -
1797f7df2e56Smrg         (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1;
17982f76b07dSmrg    if (ncursor <= 0)
17992f76b07dSmrg        return BadValue;
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);
19287e31ba66Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
19297e31ba66Smrg        return BadLength;
1930f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
193105b261ecSmrg        return BadLength;
193205b261ecSmrg
1933f7df2e56Smrg    stops = (xFixed *) (stuff + 1);
1934f7df2e56Smrg    colors = (xRenderColor *) (stops + stuff->nStops);
193505b261ecSmrg
1936f7df2e56Smrg    pPicture =
1937f7df2e56Smrg        CreateRadialGradientPicture(stuff->pid, &stuff->inner, &stuff->outer,
1938f7df2e56Smrg                                    stuff->inner_radius, stuff->outer_radius,
1939f7df2e56Smrg                                    stuff->nStops, stops, colors, &error);
194005b261ecSmrg    if (!pPicture)
1941f7df2e56Smrg        return error;
19424642e01fSmrg    /* security creation/labeling check */
19434642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
1944f7df2e56Smrg                     pPicture, RT_NONE, NULL, DixCreateAccess);
19454642e01fSmrg    if (error != Success)
1946f7df2e56Smrg        return error;
1947f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
1948f7df2e56Smrg        return BadAlloc;
194905b261ecSmrg    return Success;
195005b261ecSmrg}
195105b261ecSmrg
1952f7df2e56Smrgstatic int
1953f7df2e56SmrgProcRenderCreateConicalGradient(ClientPtr client)
195405b261ecSmrg{
1955f7df2e56Smrg    PicturePtr pPicture;
1956f7df2e56Smrg    int len;
1957f7df2e56Smrg    int error = 0;
1958f7df2e56Smrg    xFixed *stops;
1959f7df2e56Smrg    xRenderColor *colors;
1960f7df2e56Smrg
196105b261ecSmrg    REQUEST(xRenderCreateConicalGradientReq);
196205b261ecSmrg
196305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
196405b261ecSmrg
196505b261ecSmrg    LEGAL_NEW_RESOURCE(stuff->pid, client);
196605b261ecSmrg
196705b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
19687e31ba66Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
19697e31ba66Smrg        return BadLength;
1970f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
197105b261ecSmrg        return BadLength;
197205b261ecSmrg
1973f7df2e56Smrg    stops = (xFixed *) (stuff + 1);
1974f7df2e56Smrg    colors = (xRenderColor *) (stops + stuff->nStops);
197505b261ecSmrg
1976f7df2e56Smrg    pPicture =
1977f7df2e56Smrg        CreateConicalGradientPicture(stuff->pid, &stuff->center, stuff->angle,
1978f7df2e56Smrg                                     stuff->nStops, stops, colors, &error);
197905b261ecSmrg    if (!pPicture)
1980f7df2e56Smrg        return error;
19814642e01fSmrg    /* security creation/labeling check */
19824642e01fSmrg    error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
1983f7df2e56Smrg                     pPicture, RT_NONE, NULL, DixCreateAccess);
19844642e01fSmrg    if (error != Success)
1985f7df2e56Smrg        return error;
1986f7df2e56Smrg    if (!AddResource(stuff->pid, PictureType, (void *) pPicture))
1987f7df2e56Smrg        return BadAlloc;
198805b261ecSmrg    return Success;
198905b261ecSmrg}
199005b261ecSmrg
199105b261ecSmrgstatic int
1992f7df2e56SmrgProcRenderDispatch(ClientPtr client)
199305b261ecSmrg{
199405b261ecSmrg    REQUEST(xReq);
1995f7df2e56Smrg
199605b261ecSmrg    if (stuff->data < RenderNumberRequests)
1997f7df2e56Smrg        return (*ProcRenderVector[stuff->data]) (client);
199805b261ecSmrg    else
1999f7df2e56Smrg        return BadRequest;
200005b261ecSmrg}
200105b261ecSmrg
20027e31ba66Smrgstatic int _X_COLD
2003f7df2e56SmrgSProcRenderQueryVersion(ClientPtr client)
200405b261ecSmrg{
200505b261ecSmrg    REQUEST(xRenderQueryVersionReq);
20060b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
2007f7df2e56Smrg    swaps(&stuff->length);
2008f7df2e56Smrg    swapl(&stuff->majorVersion);
2009f7df2e56Smrg    swapl(&stuff->minorVersion);
2010f7df2e56Smrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
201105b261ecSmrg}
201205b261ecSmrg
20137e31ba66Smrgstatic int _X_COLD
2014f7df2e56SmrgSProcRenderQueryPictFormats(ClientPtr client)
201505b261ecSmrg{
201605b261ecSmrg    REQUEST(xRenderQueryPictFormatsReq);
20170b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
2018f7df2e56Smrg    swaps(&stuff->length);
201905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
202005b261ecSmrg}
202105b261ecSmrg
20227e31ba66Smrgstatic int _X_COLD
2023f7df2e56SmrgSProcRenderQueryPictIndexValues(ClientPtr client)
202405b261ecSmrg{
202505b261ecSmrg    REQUEST(xRenderQueryPictIndexValuesReq);
20260b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
2027f7df2e56Smrg    swaps(&stuff->length);
2028f7df2e56Smrg    swapl(&stuff->format);
202905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
203005b261ecSmrg}
203105b261ecSmrg
20327e31ba66Smrgstatic int _X_COLD
2033f7df2e56SmrgSProcRenderQueryDithers(ClientPtr client)
203405b261ecSmrg{
203505b261ecSmrg    return BadImplementation;
203605b261ecSmrg}
203705b261ecSmrg
20387e31ba66Smrgstatic int _X_COLD
2039f7df2e56SmrgSProcRenderCreatePicture(ClientPtr client)
204005b261ecSmrg{
204105b261ecSmrg    REQUEST(xRenderCreatePictureReq);
20420b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
2043f7df2e56Smrg    swaps(&stuff->length);
2044f7df2e56Smrg    swapl(&stuff->pid);
2045f7df2e56Smrg    swapl(&stuff->drawable);
2046f7df2e56Smrg    swapl(&stuff->format);
2047f7df2e56Smrg    swapl(&stuff->mask);
204805b261ecSmrg    SwapRestL(stuff);
204905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
205005b261ecSmrg}
205105b261ecSmrg
20527e31ba66Smrgstatic int _X_COLD
2053f7df2e56SmrgSProcRenderChangePicture(ClientPtr client)
205405b261ecSmrg{
205505b261ecSmrg    REQUEST(xRenderChangePictureReq);
20560b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
2057f7df2e56Smrg    swaps(&stuff->length);
2058f7df2e56Smrg    swapl(&stuff->picture);
2059f7df2e56Smrg    swapl(&stuff->mask);
206005b261ecSmrg    SwapRestL(stuff);
206105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
206205b261ecSmrg}
206305b261ecSmrg
20647e31ba66Smrgstatic int _X_COLD
2065f7df2e56SmrgSProcRenderSetPictureClipRectangles(ClientPtr client)
206605b261ecSmrg{
206705b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
20680b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
2069f7df2e56Smrg    swaps(&stuff->length);
2070f7df2e56Smrg    swapl(&stuff->picture);
2071f7df2e56Smrg    swaps(&stuff->xOrigin);
2072f7df2e56Smrg    swaps(&stuff->yOrigin);
207305b261ecSmrg    SwapRestS(stuff);
207405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
207505b261ecSmrg}
207605b261ecSmrg
20777e31ba66Smrgstatic int _X_COLD
2078f7df2e56SmrgSProcRenderFreePicture(ClientPtr client)
207905b261ecSmrg{
208005b261ecSmrg    REQUEST(xRenderFreePictureReq);
20810b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
2082f7df2e56Smrg    swaps(&stuff->length);
2083f7df2e56Smrg    swapl(&stuff->picture);
208405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
208505b261ecSmrg}
208605b261ecSmrg
20877e31ba66Smrgstatic int _X_COLD
2088f7df2e56SmrgSProcRenderComposite(ClientPtr client)
208905b261ecSmrg{
209005b261ecSmrg    REQUEST(xRenderCompositeReq);
20910b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
2092f7df2e56Smrg    swaps(&stuff->length);
2093f7df2e56Smrg    swapl(&stuff->src);
2094f7df2e56Smrg    swapl(&stuff->mask);
2095f7df2e56Smrg    swapl(&stuff->dst);
2096f7df2e56Smrg    swaps(&stuff->xSrc);
2097f7df2e56Smrg    swaps(&stuff->ySrc);
2098f7df2e56Smrg    swaps(&stuff->xMask);
2099f7df2e56Smrg    swaps(&stuff->yMask);
2100f7df2e56Smrg    swaps(&stuff->xDst);
2101f7df2e56Smrg    swaps(&stuff->yDst);
2102f7df2e56Smrg    swaps(&stuff->width);
2103f7df2e56Smrg    swaps(&stuff->height);
210405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
210505b261ecSmrg}
210605b261ecSmrg
21077e31ba66Smrgstatic int _X_COLD
2108f7df2e56SmrgSProcRenderScale(ClientPtr client)
210905b261ecSmrg{
2110f7df2e56Smrg    return BadImplementation;
211105b261ecSmrg}
211205b261ecSmrg
21137e31ba66Smrgstatic int _X_COLD
2114f7df2e56SmrgSProcRenderTrapezoids(ClientPtr client)
211505b261ecSmrg{
211605b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
211705b261ecSmrg
211805b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
2119f7df2e56Smrg    swaps(&stuff->length);
2120f7df2e56Smrg    swapl(&stuff->src);
2121f7df2e56Smrg    swapl(&stuff->dst);
2122f7df2e56Smrg    swapl(&stuff->maskFormat);
2123f7df2e56Smrg    swaps(&stuff->xSrc);
2124f7df2e56Smrg    swaps(&stuff->ySrc);
212505b261ecSmrg    SwapRestL(stuff);
212605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
212705b261ecSmrg}
212805b261ecSmrg
21297e31ba66Smrgstatic int _X_COLD
2130f7df2e56SmrgSProcRenderTriangles(ClientPtr client)
213105b261ecSmrg{
213205b261ecSmrg    REQUEST(xRenderTrianglesReq);
213305b261ecSmrg
213405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
2135f7df2e56Smrg    swaps(&stuff->length);
2136f7df2e56Smrg    swapl(&stuff->src);
2137f7df2e56Smrg    swapl(&stuff->dst);
2138f7df2e56Smrg    swapl(&stuff->maskFormat);
2139f7df2e56Smrg    swaps(&stuff->xSrc);
2140f7df2e56Smrg    swaps(&stuff->ySrc);
214105b261ecSmrg    SwapRestL(stuff);
214205b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
214305b261ecSmrg}
214405b261ecSmrg
21457e31ba66Smrgstatic int _X_COLD
2146f7df2e56SmrgSProcRenderTriStrip(ClientPtr client)
214705b261ecSmrg{
214805b261ecSmrg    REQUEST(xRenderTriStripReq);
214905b261ecSmrg
215005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
2151f7df2e56Smrg    swaps(&stuff->length);
2152f7df2e56Smrg    swapl(&stuff->src);
2153f7df2e56Smrg    swapl(&stuff->dst);
2154f7df2e56Smrg    swapl(&stuff->maskFormat);
2155f7df2e56Smrg    swaps(&stuff->xSrc);
2156f7df2e56Smrg    swaps(&stuff->ySrc);
215705b261ecSmrg    SwapRestL(stuff);
215805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
215905b261ecSmrg}
216005b261ecSmrg
21617e31ba66Smrgstatic int _X_COLD
2162f7df2e56SmrgSProcRenderTriFan(ClientPtr client)
216305b261ecSmrg{
216405b261ecSmrg    REQUEST(xRenderTriFanReq);
216505b261ecSmrg
216605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
2167f7df2e56Smrg    swaps(&stuff->length);
2168f7df2e56Smrg    swapl(&stuff->src);
2169f7df2e56Smrg    swapl(&stuff->dst);
2170f7df2e56Smrg    swapl(&stuff->maskFormat);
2171f7df2e56Smrg    swaps(&stuff->xSrc);
2172f7df2e56Smrg    swaps(&stuff->ySrc);
217305b261ecSmrg    SwapRestL(stuff);
217405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
217505b261ecSmrg}
217605b261ecSmrg
21777e31ba66Smrgstatic int _X_COLD
2178f7df2e56SmrgSProcRenderColorTrapezoids(ClientPtr client)
217905b261ecSmrg{
218005b261ecSmrg    return BadImplementation;
218105b261ecSmrg}
218205b261ecSmrg
21837e31ba66Smrgstatic int _X_COLD
2184f7df2e56SmrgSProcRenderColorTriangles(ClientPtr client)
218505b261ecSmrg{
218605b261ecSmrg    return BadImplementation;
218705b261ecSmrg}
218805b261ecSmrg
21897e31ba66Smrgstatic int _X_COLD
2190f7df2e56SmrgSProcRenderTransform(ClientPtr client)
219105b261ecSmrg{
219205b261ecSmrg    return BadImplementation;
219305b261ecSmrg}
219405b261ecSmrg
21957e31ba66Smrgstatic int _X_COLD
2196f7df2e56SmrgSProcRenderCreateGlyphSet(ClientPtr client)
219705b261ecSmrg{
219805b261ecSmrg    REQUEST(xRenderCreateGlyphSetReq);
21990b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
2200f7df2e56Smrg    swaps(&stuff->length);
2201f7df2e56Smrg    swapl(&stuff->gsid);
2202f7df2e56Smrg    swapl(&stuff->format);
220305b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
220405b261ecSmrg}
220505b261ecSmrg
22067e31ba66Smrgstatic int _X_COLD
2207f7df2e56SmrgSProcRenderReferenceGlyphSet(ClientPtr client)
220805b261ecSmrg{
220905b261ecSmrg    REQUEST(xRenderReferenceGlyphSetReq);
22100b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
2211f7df2e56Smrg    swaps(&stuff->length);
2212f7df2e56Smrg    swapl(&stuff->gsid);
2213f7df2e56Smrg    swapl(&stuff->existing);
2214f7df2e56Smrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
221505b261ecSmrg}
221605b261ecSmrg
22177e31ba66Smrgstatic int _X_COLD
2218f7df2e56SmrgSProcRenderFreeGlyphSet(ClientPtr client)
221905b261ecSmrg{
222005b261ecSmrg    REQUEST(xRenderFreeGlyphSetReq);
22210b0d8713Smrg    REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
2222f7df2e56Smrg    swaps(&stuff->length);
2223f7df2e56Smrg    swapl(&stuff->glyphset);
222405b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
222505b261ecSmrg}
222605b261ecSmrg
22277e31ba66Smrgstatic int _X_COLD
2228f7df2e56SmrgSProcRenderAddGlyphs(ClientPtr client)
222905b261ecSmrg{
223005b261ecSmrg    register int i;
2231f7df2e56Smrg    CARD32 *gids;
2232f7df2e56Smrg    void *end;
223305b261ecSmrg    xGlyphInfo *gi;
2234f7df2e56Smrg
223505b261ecSmrg    REQUEST(xRenderAddGlyphsReq);
22360b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
2237f7df2e56Smrg    swaps(&stuff->length);
2238f7df2e56Smrg    swapl(&stuff->glyphset);
2239f7df2e56Smrg    swapl(&stuff->nglyphs);
224005b261ecSmrg    if (stuff->nglyphs & 0xe0000000)
2241f7df2e56Smrg        return BadLength;
224205b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
224305b261ecSmrg    gids = (CARD32 *) (stuff + 1);
224405b261ecSmrg    gi = (xGlyphInfo *) (gids + stuff->nglyphs);
224505b261ecSmrg    if ((char *) end - (char *) (gids + stuff->nglyphs) < 0)
2246f7df2e56Smrg        return BadLength;
224705b261ecSmrg    if ((char *) end - (char *) (gi + stuff->nglyphs) < 0)
2248f7df2e56Smrg        return BadLength;
2249f7df2e56Smrg    for (i = 0; i < stuff->nglyphs; i++) {
2250f7df2e56Smrg        swapl(&gids[i]);
2251f7df2e56Smrg        swaps(&gi[i].width);
2252f7df2e56Smrg        swaps(&gi[i].height);
2253f7df2e56Smrg        swaps(&gi[i].x);
2254f7df2e56Smrg        swaps(&gi[i].y);
2255f7df2e56Smrg        swaps(&gi[i].xOff);
2256f7df2e56Smrg        swaps(&gi[i].yOff);
225705b261ecSmrg    }
225805b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
225905b261ecSmrg}
226005b261ecSmrg
22617e31ba66Smrgstatic int _X_COLD
2262f7df2e56SmrgSProcRenderAddGlyphsFromPicture(ClientPtr client)
226305b261ecSmrg{
226405b261ecSmrg    return BadImplementation;
226505b261ecSmrg}
226605b261ecSmrg
22677e31ba66Smrgstatic int _X_COLD
2268f7df2e56SmrgSProcRenderFreeGlyphs(ClientPtr client)
226905b261ecSmrg{
227005b261ecSmrg    REQUEST(xRenderFreeGlyphsReq);
22710b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
2272f7df2e56Smrg    swaps(&stuff->length);
2273f7df2e56Smrg    swapl(&stuff->glyphset);
227405b261ecSmrg    SwapRestL(stuff);
227505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
227605b261ecSmrg}
227705b261ecSmrg
22787e31ba66Smrgstatic int _X_COLD
2279f7df2e56SmrgSProcRenderCompositeGlyphs(ClientPtr client)
228005b261ecSmrg{
2281f7df2e56Smrg    xGlyphElt *elt;
2282f7df2e56Smrg    CARD8 *buffer;
2283f7df2e56Smrg    CARD8 *end;
2284f7df2e56Smrg    int space;
2285f7df2e56Smrg    int i;
2286f7df2e56Smrg    int size;
2287f7df2e56Smrg
228805b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
22890b0d8713Smrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
2290f7df2e56Smrg
229105b261ecSmrg    switch (stuff->renderReqType) {
2292f7df2e56Smrg    default:
2293f7df2e56Smrg        size = 1;
2294f7df2e56Smrg        break;
2295f7df2e56Smrg    case X_RenderCompositeGlyphs16:
2296f7df2e56Smrg        size = 2;
2297f7df2e56Smrg        break;
2298f7df2e56Smrg    case X_RenderCompositeGlyphs32:
2299f7df2e56Smrg        size = 4;
2300f7df2e56Smrg        break;
2301f7df2e56Smrg    }
2302f7df2e56Smrg
2303f7df2e56Smrg    swaps(&stuff->length);
2304f7df2e56Smrg    swapl(&stuff->src);
2305f7df2e56Smrg    swapl(&stuff->dst);
2306f7df2e56Smrg    swapl(&stuff->maskFormat);
2307f7df2e56Smrg    swapl(&stuff->glyphset);
2308f7df2e56Smrg    swaps(&stuff->xSrc);
2309f7df2e56Smrg    swaps(&stuff->ySrc);
231005b261ecSmrg    buffer = (CARD8 *) (stuff + 1);
231105b261ecSmrg    end = (CARD8 *) stuff + (client->req_len << 2);
2312f7df2e56Smrg    while (buffer + sizeof(xGlyphElt) < end) {
2313f7df2e56Smrg        elt = (xGlyphElt *) buffer;
2314f7df2e56Smrg        buffer += sizeof(xGlyphElt);
2315f7df2e56Smrg
2316f7df2e56Smrg        swaps(&elt->deltax);
2317f7df2e56Smrg        swaps(&elt->deltay);
2318f7df2e56Smrg
2319f7df2e56Smrg        i = elt->len;
2320f7df2e56Smrg        if (i == 0xff) {
23215a112b11Smrg            if (buffer + 4 > end) {
23225a112b11Smrg                return BadLength;
23235a112b11Smrg            }
2324f7df2e56Smrg            swapl((int *) buffer);
2325f7df2e56Smrg            buffer += 4;
2326f7df2e56Smrg        }
2327f7df2e56Smrg        else {
2328f7df2e56Smrg            space = size * i;
2329f7df2e56Smrg            switch (size) {
2330f7df2e56Smrg            case 1:
2331f7df2e56Smrg                buffer += i;
2332f7df2e56Smrg                break;
2333f7df2e56Smrg            case 2:
23345a112b11Smrg                if (buffer + i * 2 > end) {
23355a112b11Smrg                    return BadLength;
23365a112b11Smrg                }
2337f7df2e56Smrg                while (i--) {
2338f7df2e56Smrg                    swaps((short *) buffer);
2339f7df2e56Smrg                    buffer += 2;
2340f7df2e56Smrg                }
2341f7df2e56Smrg                break;
2342f7df2e56Smrg            case 4:
23435a112b11Smrg                if (buffer + i * 4 > end) {
23445a112b11Smrg                    return BadLength;
23455a112b11Smrg                }
2346f7df2e56Smrg                while (i--) {
2347f7df2e56Smrg                    swapl((int *) buffer);
2348f7df2e56Smrg                    buffer += 4;
2349f7df2e56Smrg                }
2350f7df2e56Smrg                break;
2351f7df2e56Smrg            }
2352f7df2e56Smrg            if (space & 3)
2353f7df2e56Smrg                buffer += 4 - (space & 3);
2354f7df2e56Smrg        }
235505b261ecSmrg    }
235605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
235705b261ecSmrg}
235805b261ecSmrg
23597e31ba66Smrgstatic int _X_COLD
2360f7df2e56SmrgSProcRenderFillRectangles(ClientPtr client)
236105b261ecSmrg{
236205b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
236305b261ecSmrg
2364f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq);
2365f7df2e56Smrg    swaps(&stuff->length);
2366f7df2e56Smrg    swapl(&stuff->dst);
2367f7df2e56Smrg    swaps(&stuff->color.red);
2368f7df2e56Smrg    swaps(&stuff->color.green);
2369f7df2e56Smrg    swaps(&stuff->color.blue);
2370f7df2e56Smrg    swaps(&stuff->color.alpha);
237105b261ecSmrg    SwapRestS(stuff);
237205b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
237305b261ecSmrg}
2374f7df2e56Smrg
23757e31ba66Smrgstatic int _X_COLD
2376f7df2e56SmrgSProcRenderCreateCursor(ClientPtr client)
237705b261ecSmrg{
237805b261ecSmrg    REQUEST(xRenderCreateCursorReq);
2379f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderCreateCursorReq);
2380f7df2e56Smrg
2381f7df2e56Smrg    swaps(&stuff->length);
2382f7df2e56Smrg    swapl(&stuff->cid);
2383f7df2e56Smrg    swapl(&stuff->src);
2384f7df2e56Smrg    swaps(&stuff->x);
2385f7df2e56Smrg    swaps(&stuff->y);
238605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
238705b261ecSmrg}
2388f7df2e56Smrg
23897e31ba66Smrgstatic int _X_COLD
2390f7df2e56SmrgSProcRenderSetPictureTransform(ClientPtr client)
239105b261ecSmrg{
239205b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
239305b261ecSmrg    REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
239405b261ecSmrg
2395f7df2e56Smrg    swaps(&stuff->length);
2396f7df2e56Smrg    swapl(&stuff->picture);
2397f7df2e56Smrg    swapl(&stuff->transform.matrix11);
2398f7df2e56Smrg    swapl(&stuff->transform.matrix12);
2399f7df2e56Smrg    swapl(&stuff->transform.matrix13);
2400f7df2e56Smrg    swapl(&stuff->transform.matrix21);
2401f7df2e56Smrg    swapl(&stuff->transform.matrix22);
2402f7df2e56Smrg    swapl(&stuff->transform.matrix23);
2403f7df2e56Smrg    swapl(&stuff->transform.matrix31);
2404f7df2e56Smrg    swapl(&stuff->transform.matrix32);
2405f7df2e56Smrg    swapl(&stuff->transform.matrix33);
240605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
240705b261ecSmrg}
240805b261ecSmrg
24097e31ba66Smrgstatic int _X_COLD
2410f7df2e56SmrgSProcRenderQueryFilters(ClientPtr client)
241105b261ecSmrg{
2412f7df2e56Smrg    REQUEST(xRenderQueryFiltersReq);
2413f7df2e56Smrg    REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
241405b261ecSmrg
2415f7df2e56Smrg    swaps(&stuff->length);
2416f7df2e56Smrg    swapl(&stuff->drawable);
241705b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
241805b261ecSmrg}
2419f7df2e56Smrg
24207e31ba66Smrgstatic int _X_COLD
2421f7df2e56SmrgSProcRenderSetPictureFilter(ClientPtr client)
242205b261ecSmrg{
2423f7df2e56Smrg    REQUEST(xRenderSetPictureFilterReq);
2424f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
242505b261ecSmrg
2426f7df2e56Smrg    swaps(&stuff->length);
2427f7df2e56Smrg    swapl(&stuff->picture);
2428f7df2e56Smrg    swaps(&stuff->nbytes);
242905b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
243005b261ecSmrg}
2431f7df2e56Smrg
24327e31ba66Smrgstatic int _X_COLD
2433f7df2e56SmrgSProcRenderCreateAnimCursor(ClientPtr client)
243405b261ecSmrg{
2435f7df2e56Smrg    REQUEST(xRenderCreateAnimCursorReq);
2436f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
243705b261ecSmrg
2438f7df2e56Smrg    swaps(&stuff->length);
2439f7df2e56Smrg    swapl(&stuff->cid);
244005b261ecSmrg    SwapRestL(stuff);
244105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
244205b261ecSmrg}
244305b261ecSmrg
24447e31ba66Smrgstatic int _X_COLD
2445f7df2e56SmrgSProcRenderAddTraps(ClientPtr client)
244605b261ecSmrg{
2447f7df2e56Smrg    REQUEST(xRenderAddTrapsReq);
2448f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
244905b261ecSmrg
2450f7df2e56Smrg    swaps(&stuff->length);
2451f7df2e56Smrg    swapl(&stuff->picture);
2452f7df2e56Smrg    swaps(&stuff->xOff);
2453f7df2e56Smrg    swaps(&stuff->yOff);
245405b261ecSmrg    SwapRestL(stuff);
245505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
245605b261ecSmrg}
245705b261ecSmrg
24587e31ba66Smrgstatic int _X_COLD
245905b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client)
246005b261ecSmrg{
2461f7df2e56Smrg    REQUEST(xRenderCreateSolidFillReq);
2462f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
246305b261ecSmrg
2464f7df2e56Smrg    swaps(&stuff->length);
2465f7df2e56Smrg    swapl(&stuff->pid);
2466f7df2e56Smrg    swaps(&stuff->color.alpha);
2467f7df2e56Smrg    swaps(&stuff->color.red);
2468f7df2e56Smrg    swaps(&stuff->color.green);
2469f7df2e56Smrg    swaps(&stuff->color.blue);
247005b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
247105b261ecSmrg}
247205b261ecSmrg
24737e31ba66Smrgstatic void _X_COLD
2474f7df2e56SmrgswapStops(void *stuff, int num)
247505b261ecSmrg{
2476f7df2e56Smrg    int i;
247705b261ecSmrg    CARD32 *stops;
247805b261ecSmrg    CARD16 *colors;
2479f7df2e56Smrg
2480f7df2e56Smrg    stops = (CARD32 *) (stuff);
248105b261ecSmrg    for (i = 0; i < num; ++i) {
2482f7df2e56Smrg        swapl(stops);
248305b261ecSmrg        ++stops;
248405b261ecSmrg    }
2485f7df2e56Smrg    colors = (CARD16 *) (stops);
2486f7df2e56Smrg    for (i = 0; i < 4 * num; ++i) {
2487f7df2e56Smrg        swaps(colors);
24888223e2f2Smrg        ++colors;
248905b261ecSmrg    }
249005b261ecSmrg}
249105b261ecSmrg
24927e31ba66Smrgstatic int _X_COLD
2493f7df2e56SmrgSProcRenderCreateLinearGradient(ClientPtr client)
249405b261ecSmrg{
249505b261ecSmrg    int len;
249605b261ecSmrg
2497f7df2e56Smrg    REQUEST(xRenderCreateLinearGradientReq);
2498f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
2499f7df2e56Smrg
2500f7df2e56Smrg    swaps(&stuff->length);
2501f7df2e56Smrg    swapl(&stuff->pid);
2502f7df2e56Smrg    swapl(&stuff->p1.x);
2503f7df2e56Smrg    swapl(&stuff->p1.y);
2504f7df2e56Smrg    swapl(&stuff->p2.x);
2505f7df2e56Smrg    swapl(&stuff->p2.y);
2506f7df2e56Smrg    swapl(&stuff->nStops);
250705b261ecSmrg
250805b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
2509f7df2e56Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
2510f7df2e56Smrg        return BadLength;
2511f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
251205b261ecSmrg        return BadLength;
251305b261ecSmrg
2514f7df2e56Smrg    swapStops(stuff + 1, stuff->nStops);
251505b261ecSmrg
251605b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
251705b261ecSmrg}
251805b261ecSmrg
25197e31ba66Smrgstatic int _X_COLD
2520f7df2e56SmrgSProcRenderCreateRadialGradient(ClientPtr client)
252105b261ecSmrg{
252205b261ecSmrg    int len;
2523f7df2e56Smrg
2524f7df2e56Smrg    REQUEST(xRenderCreateRadialGradientReq);
2525f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
2526f7df2e56Smrg
2527f7df2e56Smrg    swaps(&stuff->length);
2528f7df2e56Smrg    swapl(&stuff->pid);
2529f7df2e56Smrg    swapl(&stuff->inner.x);
2530f7df2e56Smrg    swapl(&stuff->inner.y);
2531f7df2e56Smrg    swapl(&stuff->outer.x);
2532f7df2e56Smrg    swapl(&stuff->outer.y);
2533f7df2e56Smrg    swapl(&stuff->inner_radius);
2534f7df2e56Smrg    swapl(&stuff->outer_radius);
2535f7df2e56Smrg    swapl(&stuff->nStops);
253605b261ecSmrg
253705b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
2538f7df2e56Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
2539f7df2e56Smrg        return BadLength;
2540f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
254105b261ecSmrg        return BadLength;
254205b261ecSmrg
2543f7df2e56Smrg    swapStops(stuff + 1, stuff->nStops);
254405b261ecSmrg
254505b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
254605b261ecSmrg}
254705b261ecSmrg
25487e31ba66Smrgstatic int _X_COLD
2549f7df2e56SmrgSProcRenderCreateConicalGradient(ClientPtr client)
255005b261ecSmrg{
255105b261ecSmrg    int len;
255205b261ecSmrg
2553f7df2e56Smrg    REQUEST(xRenderCreateConicalGradientReq);
2554f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
2555f7df2e56Smrg
2556f7df2e56Smrg    swaps(&stuff->length);
2557f7df2e56Smrg    swapl(&stuff->pid);
2558f7df2e56Smrg    swapl(&stuff->center.x);
2559f7df2e56Smrg    swapl(&stuff->center.y);
2560f7df2e56Smrg    swapl(&stuff->angle);
2561f7df2e56Smrg    swapl(&stuff->nStops);
256205b261ecSmrg
256305b261ecSmrg    len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
2564f7df2e56Smrg    if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor)))
2565f7df2e56Smrg        return BadLength;
2566f7df2e56Smrg    if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor)))
256705b261ecSmrg        return BadLength;
256805b261ecSmrg
2569f7df2e56Smrg    swapStops(stuff + 1, stuff->nStops);
257005b261ecSmrg
257105b261ecSmrg    return (*ProcRenderVector[stuff->renderReqType]) (client);
257205b261ecSmrg}
257305b261ecSmrg
25747e31ba66Smrgstatic int _X_COLD
2575f7df2e56SmrgSProcRenderDispatch(ClientPtr client)
257605b261ecSmrg{
257705b261ecSmrg    REQUEST(xReq);
2578f7df2e56Smrg
257905b261ecSmrg    if (stuff->data < RenderNumberRequests)
2580f7df2e56Smrg        return (*SProcRenderVector[stuff->data]) (client);
258105b261ecSmrg    else
2582f7df2e56Smrg        return BadRequest;
258305b261ecSmrg}
258405b261ecSmrg
258505b261ecSmrg#ifdef PANORAMIX
25866747b715Smrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\
2587f7df2e56Smrg    int rc = dixLookupResourceByType((void **)&(pPicture), pid,\
25886747b715Smrg                                     XRT_PICTURE, client, mode);\
25896747b715Smrg    if (rc != Success)\
25906747b715Smrg	return rc;\
259105b261ecSmrg}
259205b261ecSmrg
25936747b715Smrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\
259405b261ecSmrg    if (pid == None) \
259505b261ecSmrg	pPicture = 0; \
259605b261ecSmrg    else { \
25976747b715Smrg	VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \
259805b261ecSmrg    } \
259905b261ecSmrg} \
260005b261ecSmrg
2601f7df2e56Smrgint (*PanoramiXSaveRenderVector[RenderNumberRequests]) (ClientPtr);
260205b261ecSmrg
260305b261ecSmrgstatic int
2604f7df2e56SmrgPanoramiXRenderCreatePicture(ClientPtr client)
260505b261ecSmrg{
260605b261ecSmrg    REQUEST(xRenderCreatePictureReq);
2607f7df2e56Smrg    PanoramiXRes *refDraw, *newPict;
2608f7df2e56Smrg    int result, j;
260905b261ecSmrg
261005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
2611f7df2e56Smrg    result = dixLookupResourceByClass((void **) &refDraw, stuff->drawable,
2612f7df2e56Smrg                                      XRC_DRAWABLE, client, DixWriteAccess);
26136747b715Smrg    if (result != Success)
2614f7df2e56Smrg        return (result == BadValue) ? BadDrawable : result;
2615f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
2616f7df2e56Smrg        return BadAlloc;
261705b261ecSmrg    newPict->type = XRT_PICTURE;
2618f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
2619f7df2e56Smrg
262005b261ecSmrg    if (refDraw->type == XRT_WINDOW &&
2621f7df2e56Smrg        stuff->drawable == screenInfo.screens[0]->root->drawable.id) {
2622f7df2e56Smrg        newPict->u.pict.root = TRUE;
262305b261ecSmrg    }
262405b261ecSmrg    else
2625f7df2e56Smrg        newPict->u.pict.root = FALSE;
262605b261ecSmrg
262705b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
2628f7df2e56Smrg        stuff->pid = newPict->info[j].id;
2629f7df2e56Smrg        stuff->drawable = refDraw->info[j].id;
2630f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client);
2631f7df2e56Smrg        if (result != Success)
2632f7df2e56Smrg            break;
263305b261ecSmrg    }
263405b261ecSmrg
263505b261ecSmrg    if (result == Success)
2636f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
2637f7df2e56Smrg    else
2638f7df2e56Smrg        free(newPict);
263905b261ecSmrg
26406747b715Smrg    return result;
264105b261ecSmrg}
264205b261ecSmrg
264305b261ecSmrgstatic int
2644f7df2e56SmrgPanoramiXRenderChangePicture(ClientPtr client)
264505b261ecSmrg{
2646f7df2e56Smrg    PanoramiXRes *pict;
2647f7df2e56Smrg    int result = Success, j;
2648f7df2e56Smrg
264905b261ecSmrg    REQUEST(xRenderChangePictureReq);
265005b261ecSmrg
26516747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
2652f7df2e56Smrg
26536747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2654f7df2e56Smrg
265505b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
265605b261ecSmrg        stuff->picture = pict->info[j].id;
265705b261ecSmrg        result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client);
2658f7df2e56Smrg        if (result != Success)
2659f7df2e56Smrg            break;
266005b261ecSmrg    }
266105b261ecSmrg
26626747b715Smrg    return result;
266305b261ecSmrg}
266405b261ecSmrg
266505b261ecSmrgstatic int
2666f7df2e56SmrgPanoramiXRenderSetPictureClipRectangles(ClientPtr client)
266705b261ecSmrg{
266805b261ecSmrg    REQUEST(xRenderSetPictureClipRectanglesReq);
2669f7df2e56Smrg    int result = Success, j;
2670f7df2e56Smrg    PanoramiXRes *pict;
267105b261ecSmrg
267205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
2673f7df2e56Smrg
26746747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2675f7df2e56Smrg
267605b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
267705b261ecSmrg        stuff->picture = pict->info[j].id;
2678f7df2e56Smrg        result =
2679f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles])
2680f7df2e56Smrg            (client);
2681f7df2e56Smrg        if (result != Success)
2682f7df2e56Smrg            break;
268305b261ecSmrg    }
268405b261ecSmrg
26856747b715Smrg    return result;
268605b261ecSmrg}
268705b261ecSmrg
268805b261ecSmrgstatic int
2689f7df2e56SmrgPanoramiXRenderSetPictureTransform(ClientPtr client)
269005b261ecSmrg{
269105b261ecSmrg    REQUEST(xRenderSetPictureTransformReq);
2692f7df2e56Smrg    int result = Success, j;
2693f7df2e56Smrg    PanoramiXRes *pict;
269405b261ecSmrg
269505b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
2696f7df2e56Smrg
26976747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2698f7df2e56Smrg
269905b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
270005b261ecSmrg        stuff->picture = pict->info[j].id;
2701f7df2e56Smrg        result =
2702f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client);
2703f7df2e56Smrg        if (result != Success)
2704f7df2e56Smrg            break;
270505b261ecSmrg    }
270605b261ecSmrg
27076747b715Smrg    return result;
270805b261ecSmrg}
270905b261ecSmrg
271005b261ecSmrgstatic int
2711f7df2e56SmrgPanoramiXRenderSetPictureFilter(ClientPtr client)
271205b261ecSmrg{
271305b261ecSmrg    REQUEST(xRenderSetPictureFilterReq);
2714f7df2e56Smrg    int result = Success, j;
2715f7df2e56Smrg    PanoramiXRes *pict;
271605b261ecSmrg
271705b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
2718f7df2e56Smrg
27196747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
2720f7df2e56Smrg
272105b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
272205b261ecSmrg        stuff->picture = pict->info[j].id;
2723f7df2e56Smrg        result =
2724f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client);
2725f7df2e56Smrg        if (result != Success)
2726f7df2e56Smrg            break;
272705b261ecSmrg    }
272805b261ecSmrg
27296747b715Smrg    return result;
273005b261ecSmrg}
273105b261ecSmrg
273205b261ecSmrgstatic int
2733f7df2e56SmrgPanoramiXRenderFreePicture(ClientPtr client)
273405b261ecSmrg{
273505b261ecSmrg    PanoramiXRes *pict;
2736f7df2e56Smrg    int result = Success, j;
2737f7df2e56Smrg
273805b261ecSmrg    REQUEST(xRenderFreePictureReq);
273905b261ecSmrg
274005b261ecSmrg    REQUEST_SIZE_MATCH(xRenderFreePictureReq);
274105b261ecSmrg
274205b261ecSmrg    client->errorValue = stuff->picture;
274305b261ecSmrg
27446747b715Smrg    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess);
274505b261ecSmrg
274605b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
2747f7df2e56Smrg        stuff->picture = pict->info[j].id;
2748f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client);
2749f7df2e56Smrg        if (result != Success)
2750f7df2e56Smrg            break;
275105b261ecSmrg    }
275205b261ecSmrg
275305b261ecSmrg    /* Since ProcRenderFreePicture is using FreeResource, it will free
2754f7df2e56Smrg       our resource for us on the last pass through the loop above */
2755f7df2e56Smrg
27566747b715Smrg    return result;
275705b261ecSmrg}
275805b261ecSmrg
275905b261ecSmrgstatic int
2760f7df2e56SmrgPanoramiXRenderComposite(ClientPtr client)
276105b261ecSmrg{
2762f7df2e56Smrg    PanoramiXRes *src, *msk, *dst;
2763f7df2e56Smrg    int result = Success, j;
2764f7df2e56Smrg    xRenderCompositeReq orig;
2765f7df2e56Smrg
276605b261ecSmrg    REQUEST(xRenderCompositeReq);
276705b261ecSmrg
276805b261ecSmrg    REQUEST_SIZE_MATCH(xRenderCompositeReq);
2769f7df2e56Smrg
2770f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2771f7df2e56Smrg    VERIFY_XIN_ALPHA(msk, stuff->mask, client, DixReadAccess);
2772f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2773f7df2e56Smrg
277405b261ecSmrg    orig = *stuff;
2775f7df2e56Smrg
277605b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
2777f7df2e56Smrg        stuff->src = src->info[j].id;
2778f7df2e56Smrg        if (src->u.pict.root) {
2779f7df2e56Smrg            stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x;
2780f7df2e56Smrg            stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y;
2781f7df2e56Smrg        }
2782f7df2e56Smrg        stuff->dst = dst->info[j].id;
2783f7df2e56Smrg        if (dst->u.pict.root) {
2784f7df2e56Smrg            stuff->xDst = orig.xDst - screenInfo.screens[j]->x;
2785f7df2e56Smrg            stuff->yDst = orig.yDst - screenInfo.screens[j]->y;
2786f7df2e56Smrg        }
2787f7df2e56Smrg        if (msk) {
2788f7df2e56Smrg            stuff->mask = msk->info[j].id;
2789f7df2e56Smrg            if (msk->u.pict.root) {
2790f7df2e56Smrg                stuff->xMask = orig.xMask - screenInfo.screens[j]->x;
2791f7df2e56Smrg                stuff->yMask = orig.yMask - screenInfo.screens[j]->y;
2792f7df2e56Smrg            }
2793f7df2e56Smrg        }
2794f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client);
2795f7df2e56Smrg        if (result != Success)
2796f7df2e56Smrg            break;
279705b261ecSmrg    }
279805b261ecSmrg
279905b261ecSmrg    return result;
280005b261ecSmrg}
280105b261ecSmrg
280205b261ecSmrgstatic int
2803f7df2e56SmrgPanoramiXRenderCompositeGlyphs(ClientPtr client)
280405b261ecSmrg{
2805f7df2e56Smrg    PanoramiXRes *src, *dst;
2806f7df2e56Smrg    int result = Success, j;
2807f7df2e56Smrg
280805b261ecSmrg    REQUEST(xRenderCompositeGlyphsReq);
2809f7df2e56Smrg    xGlyphElt origElt, *elt;
2810f7df2e56Smrg    INT16 xSrc, ySrc;
281105b261ecSmrg
281205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
2813f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2814f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2815f7df2e56Smrg
2816f7df2e56Smrg    if (client->req_len << 2 >= (sizeof(xRenderCompositeGlyphsReq) +
2817f7df2e56Smrg                                 sizeof(xGlyphElt))) {
2818f7df2e56Smrg        elt = (xGlyphElt *) (stuff + 1);
2819f7df2e56Smrg        origElt = *elt;
2820f7df2e56Smrg        xSrc = stuff->xSrc;
2821f7df2e56Smrg        ySrc = stuff->ySrc;
2822f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2823f7df2e56Smrg            stuff->src = src->info[j].id;
2824f7df2e56Smrg            if (src->u.pict.root) {
2825f7df2e56Smrg                stuff->xSrc = xSrc - screenInfo.screens[j]->x;
2826f7df2e56Smrg                stuff->ySrc = ySrc - screenInfo.screens[j]->y;
2827f7df2e56Smrg            }
2828f7df2e56Smrg            stuff->dst = dst->info[j].id;
2829f7df2e56Smrg            if (dst->u.pict.root) {
2830f7df2e56Smrg                elt->deltax = origElt.deltax - screenInfo.screens[j]->x;
2831f7df2e56Smrg                elt->deltay = origElt.deltay - screenInfo.screens[j]->y;
2832f7df2e56Smrg            }
2833f7df2e56Smrg            result =
2834f7df2e56Smrg                (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client);
2835f7df2e56Smrg            if (result != Success)
2836f7df2e56Smrg                break;
2837f7df2e56Smrg        }
283805b261ecSmrg    }
283905b261ecSmrg
284005b261ecSmrg    return result;
284105b261ecSmrg}
284205b261ecSmrg
284305b261ecSmrgstatic int
2844f7df2e56SmrgPanoramiXRenderFillRectangles(ClientPtr client)
284505b261ecSmrg{
2846f7df2e56Smrg    PanoramiXRes *dst;
2847f7df2e56Smrg    int result = Success, j;
2848f7df2e56Smrg
284905b261ecSmrg    REQUEST(xRenderFillRectanglesReq);
2850f7df2e56Smrg    char *extra;
2851f7df2e56Smrg    int extra_len;
2852f7df2e56Smrg
2853f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq);
2854f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2855f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
2856f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
2857f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
2858f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2859f7df2e56Smrg            if (j)
2860f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
2861f7df2e56Smrg            if (dst->u.pict.root) {
2862f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
2863f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
2864f7df2e56Smrg
2865f7df2e56Smrg                if (x_off || y_off) {
2866f7df2e56Smrg                    xRectangle *rects = (xRectangle *) (stuff + 1);
2867f7df2e56Smrg                    int i = extra_len / sizeof(xRectangle);
2868f7df2e56Smrg
2869f7df2e56Smrg                    while (i--) {
2870f7df2e56Smrg                        rects->x -= x_off;
2871f7df2e56Smrg                        rects->y -= y_off;
2872f7df2e56Smrg                        rects++;
2873f7df2e56Smrg                    }
2874f7df2e56Smrg                }
2875f7df2e56Smrg            }
2876f7df2e56Smrg            stuff->dst = dst->info[j].id;
2877f7df2e56Smrg            result =
2878f7df2e56Smrg                (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client);
2879f7df2e56Smrg            if (result != Success)
2880f7df2e56Smrg                break;
2881f7df2e56Smrg        }
2882f7df2e56Smrg        free(extra);
288305b261ecSmrg    }
288405b261ecSmrg
288505b261ecSmrg    return result;
288605b261ecSmrg}
288705b261ecSmrg
288805b261ecSmrgstatic int
288905b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client)
289005b261ecSmrg{
2891f7df2e56Smrg    PanoramiXRes *src, *dst;
2892f7df2e56Smrg    int result = Success, j;
2893f7df2e56Smrg
289405b261ecSmrg    REQUEST(xRenderTrapezoidsReq);
2895f7df2e56Smrg    char *extra;
2896f7df2e56Smrg    int extra_len;
2897f7df2e56Smrg
2898f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
2899f7df2e56Smrg
2900f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2901f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2902f7df2e56Smrg
2903f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTrapezoidsReq);
2904f7df2e56Smrg
2905f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
2906f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
2907f7df2e56Smrg
2908f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2909f7df2e56Smrg            if (j)
2910f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
2911f7df2e56Smrg            if (dst->u.pict.root) {
2912f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
2913f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
2914f7df2e56Smrg
2915f7df2e56Smrg                if (x_off || y_off) {
2916f7df2e56Smrg                    xTrapezoid *trap = (xTrapezoid *) (stuff + 1);
2917f7df2e56Smrg                    int i = extra_len / sizeof(xTrapezoid);
2918f7df2e56Smrg
2919f7df2e56Smrg                    while (i--) {
2920f7df2e56Smrg                        trap->top -= y_off;
2921f7df2e56Smrg                        trap->bottom -= y_off;
2922f7df2e56Smrg                        trap->left.p1.x -= x_off;
2923f7df2e56Smrg                        trap->left.p1.y -= y_off;
2924f7df2e56Smrg                        trap->left.p2.x -= x_off;
2925f7df2e56Smrg                        trap->left.p2.y -= y_off;
2926f7df2e56Smrg                        trap->right.p1.x -= x_off;
2927f7df2e56Smrg                        trap->right.p1.y -= y_off;
2928f7df2e56Smrg                        trap->right.p2.x -= x_off;
2929f7df2e56Smrg                        trap->right.p2.y -= y_off;
2930f7df2e56Smrg                        trap++;
2931f7df2e56Smrg                    }
2932f7df2e56Smrg                }
2933f7df2e56Smrg            }
2934f7df2e56Smrg
293505b261ecSmrg            stuff->src = src->info[j].id;
293605b261ecSmrg            stuff->dst = dst->info[j].id;
2937f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client);
2938f7df2e56Smrg
2939f7df2e56Smrg            if (result != Success)
2940f7df2e56Smrg                break;
2941f7df2e56Smrg        }
294205b261ecSmrg
29436747b715Smrg        free(extra);
294405b261ecSmrg    }
294505b261ecSmrg
294605b261ecSmrg    return result;
294705b261ecSmrg}
294805b261ecSmrg
294905b261ecSmrgstatic int
295005b261ecSmrgPanoramiXRenderTriangles(ClientPtr client)
295105b261ecSmrg{
2952f7df2e56Smrg    PanoramiXRes *src, *dst;
2953f7df2e56Smrg    int result = Success, j;
2954f7df2e56Smrg
295505b261ecSmrg    REQUEST(xRenderTrianglesReq);
2956f7df2e56Smrg    char *extra;
2957f7df2e56Smrg    int extra_len;
2958f7df2e56Smrg
2959f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
2960f7df2e56Smrg
2961f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
2962f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
2963f7df2e56Smrg
2964f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTrianglesReq);
2965f7df2e56Smrg
2966f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
2967f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
2968f7df2e56Smrg
2969f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
2970f7df2e56Smrg            if (j)
2971f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
2972f7df2e56Smrg            if (dst->u.pict.root) {
2973f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
2974f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
2975f7df2e56Smrg
2976f7df2e56Smrg                if (x_off || y_off) {
2977f7df2e56Smrg                    xTriangle *tri = (xTriangle *) (stuff + 1);
2978f7df2e56Smrg                    int i = extra_len / sizeof(xTriangle);
2979f7df2e56Smrg
2980f7df2e56Smrg                    while (i--) {
2981f7df2e56Smrg                        tri->p1.x -= x_off;
2982f7df2e56Smrg                        tri->p1.y -= y_off;
2983f7df2e56Smrg                        tri->p2.x -= x_off;
2984f7df2e56Smrg                        tri->p2.y -= y_off;
2985f7df2e56Smrg                        tri->p3.x -= x_off;
2986f7df2e56Smrg                        tri->p3.y -= y_off;
2987f7df2e56Smrg                        tri++;
2988f7df2e56Smrg                    }
2989f7df2e56Smrg                }
2990f7df2e56Smrg            }
2991f7df2e56Smrg
299205b261ecSmrg            stuff->src = src->info[j].id;
299305b261ecSmrg            stuff->dst = dst->info[j].id;
2994f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client);
2995f7df2e56Smrg
2996f7df2e56Smrg            if (result != Success)
2997f7df2e56Smrg                break;
2998f7df2e56Smrg        }
299905b261ecSmrg
30006747b715Smrg        free(extra);
300105b261ecSmrg    }
300205b261ecSmrg
300305b261ecSmrg    return result;
300405b261ecSmrg}
300505b261ecSmrg
300605b261ecSmrgstatic int
300705b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client)
300805b261ecSmrg{
3009f7df2e56Smrg    PanoramiXRes *src, *dst;
3010f7df2e56Smrg    int result = Success, j;
3011f7df2e56Smrg
301205b261ecSmrg    REQUEST(xRenderTriStripReq);
3013f7df2e56Smrg    char *extra;
3014f7df2e56Smrg    int extra_len;
3015f7df2e56Smrg
3016f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
3017f7df2e56Smrg
3018f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
3019f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
3020f7df2e56Smrg
3021f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTriStripReq);
3022f7df2e56Smrg
3023f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
3024f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
3025f7df2e56Smrg
3026f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
3027f7df2e56Smrg            if (j)
3028f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
3029f7df2e56Smrg            if (dst->u.pict.root) {
3030f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
3031f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
3032f7df2e56Smrg
3033f7df2e56Smrg                if (x_off || y_off) {
3034f7df2e56Smrg                    xPointFixed *fixed = (xPointFixed *) (stuff + 1);
3035f7df2e56Smrg                    int i = extra_len / sizeof(xPointFixed);
3036f7df2e56Smrg
3037f7df2e56Smrg                    while (i--) {
3038f7df2e56Smrg                        fixed->x -= x_off;
3039f7df2e56Smrg                        fixed->y -= y_off;
3040f7df2e56Smrg                        fixed++;
3041f7df2e56Smrg                    }
3042f7df2e56Smrg                }
3043f7df2e56Smrg            }
3044f7df2e56Smrg
304505b261ecSmrg            stuff->src = src->info[j].id;
304605b261ecSmrg            stuff->dst = dst->info[j].id;
3047f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client);
3048f7df2e56Smrg
3049f7df2e56Smrg            if (result != Success)
3050f7df2e56Smrg                break;
3051f7df2e56Smrg        }
305205b261ecSmrg
30536747b715Smrg        free(extra);
305405b261ecSmrg    }
305505b261ecSmrg
305605b261ecSmrg    return result;
305705b261ecSmrg}
305805b261ecSmrg
305905b261ecSmrgstatic int
306005b261ecSmrgPanoramiXRenderTriFan(ClientPtr client)
306105b261ecSmrg{
3062f7df2e56Smrg    PanoramiXRes *src, *dst;
3063f7df2e56Smrg    int result = Success, j;
3064f7df2e56Smrg
306505b261ecSmrg    REQUEST(xRenderTriFanReq);
3066f7df2e56Smrg    char *extra;
3067f7df2e56Smrg    int extra_len;
3068f7df2e56Smrg
3069f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
3070f7df2e56Smrg
3071f7df2e56Smrg    VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess);
3072f7df2e56Smrg    VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess);
3073f7df2e56Smrg
3074f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderTriFanReq);
3075f7df2e56Smrg
3076f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
3077f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
3078f7df2e56Smrg
3079f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
3080f7df2e56Smrg            if (j)
3081f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
3082f7df2e56Smrg            if (dst->u.pict.root) {
3083f7df2e56Smrg                int x_off = screenInfo.screens[j]->x;
3084f7df2e56Smrg                int y_off = screenInfo.screens[j]->y;
3085f7df2e56Smrg
3086f7df2e56Smrg                if (x_off || y_off) {
3087f7df2e56Smrg                    xPointFixed *fixed = (xPointFixed *) (stuff + 1);
3088f7df2e56Smrg                    int i = extra_len / sizeof(xPointFixed);
3089f7df2e56Smrg
3090f7df2e56Smrg                    while (i--) {
3091f7df2e56Smrg                        fixed->x -= x_off;
3092f7df2e56Smrg                        fixed->y -= y_off;
3093f7df2e56Smrg                        fixed++;
3094f7df2e56Smrg                    }
3095f7df2e56Smrg                }
3096f7df2e56Smrg            }
3097f7df2e56Smrg
309805b261ecSmrg            stuff->src = src->info[j].id;
309905b261ecSmrg            stuff->dst = dst->info[j].id;
3100f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client);
3101f7df2e56Smrg
3102f7df2e56Smrg            if (result != Success)
3103f7df2e56Smrg                break;
3104f7df2e56Smrg        }
310505b261ecSmrg
31066747b715Smrg        free(extra);
310705b261ecSmrg    }
310805b261ecSmrg
310905b261ecSmrg    return result;
311005b261ecSmrg}
311105b261ecSmrg
311205b261ecSmrgstatic int
3113f7df2e56SmrgPanoramiXRenderAddTraps(ClientPtr client)
311405b261ecSmrg{
3115f7df2e56Smrg    PanoramiXRes *picture;
3116f7df2e56Smrg    int result = Success, j;
3117f7df2e56Smrg
311805b261ecSmrg    REQUEST(xRenderAddTrapsReq);
3119f7df2e56Smrg    char *extra;
3120f7df2e56Smrg    int extra_len;
3121f7df2e56Smrg    INT16 x_off, y_off;
3122f7df2e56Smrg
3123f7df2e56Smrg    REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
3124f7df2e56Smrg    VERIFY_XIN_PICTURE(picture, stuff->picture, client, DixWriteAccess);
3125f7df2e56Smrg    extra_len = (client->req_len << 2) - sizeof(xRenderAddTrapsReq);
3126f7df2e56Smrg    if (extra_len && (extra = (char *) malloc(extra_len))) {
3127f7df2e56Smrg        memcpy(extra, stuff + 1, extra_len);
3128f7df2e56Smrg        x_off = stuff->xOff;
3129f7df2e56Smrg        y_off = stuff->yOff;
3130f7df2e56Smrg        FOR_NSCREENS_FORWARD(j) {
3131f7df2e56Smrg            if (j)
3132f7df2e56Smrg                memcpy(stuff + 1, extra, extra_len);
3133f7df2e56Smrg            stuff->picture = picture->info[j].id;
3134f7df2e56Smrg
3135f7df2e56Smrg            if (picture->u.pict.root) {
3136f7df2e56Smrg                stuff->xOff = x_off + screenInfo.screens[j]->x;
3137f7df2e56Smrg                stuff->yOff = y_off + screenInfo.screens[j]->y;
3138f7df2e56Smrg            }
3139f7df2e56Smrg            result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client);
3140f7df2e56Smrg            if (result != Success)
3141f7df2e56Smrg                break;
3142f7df2e56Smrg        }
3143f7df2e56Smrg        free(extra);
31446747b715Smrg    }
31456747b715Smrg
31466747b715Smrg    return result;
31476747b715Smrg}
31486747b715Smrg
31496747b715Smrgstatic int
3150f7df2e56SmrgPanoramiXRenderCreateSolidFill(ClientPtr client)
31516747b715Smrg{
31526747b715Smrg    REQUEST(xRenderCreateSolidFillReq);
3153f7df2e56Smrg    PanoramiXRes *newPict;
3154f7df2e56Smrg    int result = Success, j;
31556747b715Smrg
31566747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
31576747b715Smrg
3158f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3159f7df2e56Smrg        return BadAlloc;
31606747b715Smrg
31616747b715Smrg    newPict->type = XRT_PICTURE;
3162f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
31636747b715Smrg    newPict->u.pict.root = FALSE;
31646747b715Smrg
31656747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3166f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3167f7df2e56Smrg        result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client);
3168f7df2e56Smrg        if (result != Success)
3169f7df2e56Smrg            break;
31706747b715Smrg    }
31716747b715Smrg
31726747b715Smrg    if (result == Success)
3173f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
31746747b715Smrg    else
3175f7df2e56Smrg        free(newPict);
31766747b715Smrg
31776747b715Smrg    return result;
31786747b715Smrg}
31796747b715Smrg
31806747b715Smrgstatic int
3181f7df2e56SmrgPanoramiXRenderCreateLinearGradient(ClientPtr client)
31826747b715Smrg{
31836747b715Smrg    REQUEST(xRenderCreateLinearGradientReq);
3184f7df2e56Smrg    PanoramiXRes *newPict;
3185f7df2e56Smrg    int result = Success, j;
31866747b715Smrg
31876747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
31886747b715Smrg
3189f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3190f7df2e56Smrg        return BadAlloc;
31916747b715Smrg
31926747b715Smrg    newPict->type = XRT_PICTURE;
3193f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
31946747b715Smrg    newPict->u.pict.root = FALSE;
31956747b715Smrg
31966747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3197f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3198f7df2e56Smrg        result =
3199f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client);
3200f7df2e56Smrg        if (result != Success)
3201f7df2e56Smrg            break;
320205b261ecSmrg    }
320305b261ecSmrg
32046747b715Smrg    if (result == Success)
3205f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
32066747b715Smrg    else
3207f7df2e56Smrg        free(newPict);
32086747b715Smrg
32096747b715Smrg    return result;
32106747b715Smrg}
32116747b715Smrg
32126747b715Smrgstatic int
3213f7df2e56SmrgPanoramiXRenderCreateRadialGradient(ClientPtr client)
32146747b715Smrg{
32156747b715Smrg    REQUEST(xRenderCreateRadialGradientReq);
3216f7df2e56Smrg    PanoramiXRes *newPict;
3217f7df2e56Smrg    int result = Success, j;
32186747b715Smrg
32196747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
32206747b715Smrg
3221f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3222f7df2e56Smrg        return BadAlloc;
32236747b715Smrg
32246747b715Smrg    newPict->type = XRT_PICTURE;
3225f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
32266747b715Smrg    newPict->u.pict.root = FALSE;
32276747b715Smrg
32286747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3229f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3230f7df2e56Smrg        result =
3231f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client);
3232f7df2e56Smrg        if (result != Success)
3233f7df2e56Smrg            break;
32346747b715Smrg    }
32356747b715Smrg
32366747b715Smrg    if (result == Success)
3237f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
32386747b715Smrg    else
3239f7df2e56Smrg        free(newPict);
32406747b715Smrg
32416747b715Smrg    return result;
32426747b715Smrg}
32436747b715Smrg
32446747b715Smrgstatic int
3245f7df2e56SmrgPanoramiXRenderCreateConicalGradient(ClientPtr client)
32466747b715Smrg{
32476747b715Smrg    REQUEST(xRenderCreateConicalGradientReq);
3248f7df2e56Smrg    PanoramiXRes *newPict;
3249f7df2e56Smrg    int result = Success, j;
32506747b715Smrg
32516747b715Smrg    REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
32526747b715Smrg
3253f7df2e56Smrg    if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
3254f7df2e56Smrg        return BadAlloc;
32556747b715Smrg
32566747b715Smrg    newPict->type = XRT_PICTURE;
3257f7df2e56Smrg    panoramix_setup_ids(newPict, client, stuff->pid);
32586747b715Smrg    newPict->u.pict.root = FALSE;
32596747b715Smrg
32606747b715Smrg    FOR_NSCREENS_BACKWARD(j) {
3261f7df2e56Smrg        stuff->pid = newPict->info[j].id;
3262f7df2e56Smrg        result =
3263f7df2e56Smrg            (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient])
3264f7df2e56Smrg            (client);
3265f7df2e56Smrg        if (result != Success)
3266f7df2e56Smrg            break;
32676747b715Smrg    }
32686747b715Smrg
32696747b715Smrg    if (result == Success)
3270f7df2e56Smrg        AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
32716747b715Smrg    else
3272f7df2e56Smrg        free(newPict);
32736747b715Smrg
327405b261ecSmrg    return result;
327505b261ecSmrg}
327605b261ecSmrg
327705b261ecSmrgvoid
3278f7df2e56SmrgPanoramiXRenderInit(void)
327905b261ecSmrg{
3280f7df2e56Smrg    int i;
3281f7df2e56Smrg
3282f7df2e56Smrg    XRT_PICTURE = CreateNewResourceType(XineramaDeleteResource,
3283f7df2e56Smrg                                        "XineramaPicture");
32846747b715Smrg    if (RenderErrBase)
3285f7df2e56Smrg        SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
328605b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
3287f7df2e56Smrg        PanoramiXSaveRenderVector[i] = ProcRenderVector[i];
328805b261ecSmrg    /*
328905b261ecSmrg     * Stuff in Xinerama aware request processing hooks
329005b261ecSmrg     */
329105b261ecSmrg    ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture;
329205b261ecSmrg    ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture;
3293f7df2e56Smrg    ProcRenderVector[X_RenderSetPictureTransform] =
3294f7df2e56Smrg        PanoramiXRenderSetPictureTransform;
3295f7df2e56Smrg    ProcRenderVector[X_RenderSetPictureFilter] =
3296f7df2e56Smrg        PanoramiXRenderSetPictureFilter;
3297f7df2e56Smrg    ProcRenderVector[X_RenderSetPictureClipRectangles] =
3298f7df2e56Smrg        PanoramiXRenderSetPictureClipRectangles;
329905b261ecSmrg    ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture;
330005b261ecSmrg    ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite;
330105b261ecSmrg    ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs;
3302f7df2e56Smrg    ProcRenderVector[X_RenderCompositeGlyphs16] =
3303f7df2e56Smrg        PanoramiXRenderCompositeGlyphs;
3304f7df2e56Smrg    ProcRenderVector[X_RenderCompositeGlyphs32] =
3305f7df2e56Smrg        PanoramiXRenderCompositeGlyphs;
330605b261ecSmrg    ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles;
330705b261ecSmrg
330805b261ecSmrg    ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids;
330905b261ecSmrg    ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles;
331005b261ecSmrg    ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip;
331105b261ecSmrg    ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan;
331205b261ecSmrg    ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps;
33136747b715Smrg
33146747b715Smrg    ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill;
3315f7df2e56Smrg    ProcRenderVector[X_RenderCreateLinearGradient] =
3316f7df2e56Smrg        PanoramiXRenderCreateLinearGradient;
3317f7df2e56Smrg    ProcRenderVector[X_RenderCreateRadialGradient] =
3318f7df2e56Smrg        PanoramiXRenderCreateRadialGradient;
3319f7df2e56Smrg    ProcRenderVector[X_RenderCreateConicalGradient] =
3320f7df2e56Smrg        PanoramiXRenderCreateConicalGradient;
332105b261ecSmrg}
332205b261ecSmrg
332305b261ecSmrgvoid
3324f7df2e56SmrgPanoramiXRenderReset(void)
332505b261ecSmrg{
3326f7df2e56Smrg    int i;
3327f7df2e56Smrg
332805b261ecSmrg    for (i = 0; i < RenderNumberRequests; i++)
3329f7df2e56Smrg        ProcRenderVector[i] = PanoramiXSaveRenderVector[i];
33306747b715Smrg    RenderErrBase = 0;
333105b261ecSmrg}
333205b261ecSmrg
3333f7df2e56Smrg#endif                          /* PANORAMIX */
3334