render.c revision 875c6e4f
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; 1798f7df2e56Smrg cursors = xallocarray(ncursor, sizeof(CursorPtr) + sizeof(CARD32)); 179905b261ecSmrg if (!cursors) 1800f7df2e56Smrg return BadAlloc; 180105b261ecSmrg deltas = (CARD32 *) (cursors + ncursor); 180205b261ecSmrg elt = (xAnimCursorElt *) (stuff + 1); 1803f7df2e56Smrg for (i = 0; i < ncursor; i++) { 1804f7df2e56Smrg ret = dixLookupResourceByType((void **) (cursors + i), elt->cursor, 1805f7df2e56Smrg RT_CURSOR, client, DixReadAccess); 1806f7df2e56Smrg if (ret != Success) { 1807f7df2e56Smrg free(cursors); 1808f7df2e56Smrg return ret; 1809f7df2e56Smrg } 1810f7df2e56Smrg deltas[i] = elt->delay; 1811f7df2e56Smrg elt++; 1812f7df2e56Smrg } 1813f7df2e56Smrg ret = AnimCursorCreate(cursors, deltas, ncursor, &pCursor, client, 1814f7df2e56Smrg stuff->cid); 18156747b715Smrg free(cursors); 181605b261ecSmrg if (ret != Success) 1817f7df2e56Smrg return ret; 1818f7df2e56Smrg 1819f7df2e56Smrg if (AddResource(stuff->cid, RT_CURSOR, (void *) pCursor)) 1820f7df2e56Smrg return Success; 182105b261ecSmrg return BadAlloc; 182205b261ecSmrg} 182305b261ecSmrg 182405b261ecSmrgstatic int 1825f7df2e56SmrgProcRenderAddTraps(ClientPtr client) 182605b261ecSmrg{ 1827f7df2e56Smrg int ntraps; 1828f7df2e56Smrg PicturePtr pPicture; 1829f7df2e56Smrg 183005b261ecSmrg REQUEST(xRenderAddTrapsReq); 183105b261ecSmrg 183205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq); 1833f7df2e56Smrg VERIFY_PICTURE(pPicture, stuff->picture, client, DixWriteAccess); 183405b261ecSmrg if (!pPicture->pDrawable) 183505b261ecSmrg return BadDrawable; 1836f7df2e56Smrg ntraps = (client->req_len << 2) - sizeof(xRenderAddTrapsReq); 1837f7df2e56Smrg if (ntraps % sizeof(xTrap)) 1838f7df2e56Smrg return BadLength; 1839f7df2e56Smrg ntraps /= sizeof(xTrap); 184005b261ecSmrg if (ntraps) 1841f7df2e56Smrg AddTraps(pPicture, 1842f7df2e56Smrg stuff->xOff, stuff->yOff, ntraps, (xTrap *) &stuff[1]); 18436747b715Smrg return Success; 184405b261ecSmrg} 184505b261ecSmrg 1846f7df2e56Smrgstatic int 1847f7df2e56SmrgProcRenderCreateSolidFill(ClientPtr client) 184805b261ecSmrg{ 1849f7df2e56Smrg PicturePtr pPicture; 1850f7df2e56Smrg int error = 0; 1851f7df2e56Smrg 185205b261ecSmrg REQUEST(xRenderCreateSolidFillReq); 185305b261ecSmrg 185405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 185505b261ecSmrg 185605b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 185705b261ecSmrg 185805b261ecSmrg pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error); 185905b261ecSmrg if (!pPicture) 1860f7df2e56Smrg return error; 18614642e01fSmrg /* security creation/labeling check */ 18624642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 1863f7df2e56Smrg pPicture, RT_NONE, NULL, DixCreateAccess); 18644642e01fSmrg if (error != Success) 1865f7df2e56Smrg return error; 1866f7df2e56Smrg if (!AddResource(stuff->pid, PictureType, (void *) pPicture)) 1867f7df2e56Smrg return BadAlloc; 186805b261ecSmrg return Success; 186905b261ecSmrg} 187005b261ecSmrg 1871f7df2e56Smrgstatic int 1872f7df2e56SmrgProcRenderCreateLinearGradient(ClientPtr client) 187305b261ecSmrg{ 1874f7df2e56Smrg PicturePtr pPicture; 1875f7df2e56Smrg int len; 1876f7df2e56Smrg int error = 0; 1877f7df2e56Smrg xFixed *stops; 1878f7df2e56Smrg xRenderColor *colors; 1879f7df2e56Smrg 188005b261ecSmrg REQUEST(xRenderCreateLinearGradientReq); 188105b261ecSmrg 188205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 188305b261ecSmrg 188405b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 188505b261ecSmrg 188605b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 1887f7df2e56Smrg if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) 1888f7df2e56Smrg return BadLength; 1889f7df2e56Smrg if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) 189005b261ecSmrg return BadLength; 189105b261ecSmrg 1892f7df2e56Smrg stops = (xFixed *) (stuff + 1); 1893f7df2e56Smrg colors = (xRenderColor *) (stops + stuff->nStops); 189405b261ecSmrg 1895f7df2e56Smrg pPicture = CreateLinearGradientPicture(stuff->pid, &stuff->p1, &stuff->p2, 1896f7df2e56Smrg stuff->nStops, stops, colors, 1897f7df2e56Smrg &error); 189805b261ecSmrg if (!pPicture) 1899f7df2e56Smrg return error; 19004642e01fSmrg /* security creation/labeling check */ 19014642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 1902f7df2e56Smrg pPicture, RT_NONE, NULL, DixCreateAccess); 19034642e01fSmrg if (error != Success) 1904f7df2e56Smrg return error; 1905f7df2e56Smrg if (!AddResource(stuff->pid, PictureType, (void *) pPicture)) 1906f7df2e56Smrg return BadAlloc; 190705b261ecSmrg return Success; 190805b261ecSmrg} 190905b261ecSmrg 1910f7df2e56Smrgstatic int 1911f7df2e56SmrgProcRenderCreateRadialGradient(ClientPtr client) 191205b261ecSmrg{ 1913f7df2e56Smrg PicturePtr pPicture; 1914f7df2e56Smrg int len; 1915f7df2e56Smrg int error = 0; 1916f7df2e56Smrg xFixed *stops; 1917f7df2e56Smrg xRenderColor *colors; 1918f7df2e56Smrg 191905b261ecSmrg REQUEST(xRenderCreateRadialGradientReq); 192005b261ecSmrg 192105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 192205b261ecSmrg 192305b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 192405b261ecSmrg 192505b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 19267e31ba66Smrg if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) 19277e31ba66Smrg return BadLength; 1928f7df2e56Smrg if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) 192905b261ecSmrg return BadLength; 193005b261ecSmrg 1931f7df2e56Smrg stops = (xFixed *) (stuff + 1); 1932f7df2e56Smrg colors = (xRenderColor *) (stops + stuff->nStops); 193305b261ecSmrg 1934f7df2e56Smrg pPicture = 1935f7df2e56Smrg CreateRadialGradientPicture(stuff->pid, &stuff->inner, &stuff->outer, 1936f7df2e56Smrg stuff->inner_radius, stuff->outer_radius, 1937f7df2e56Smrg stuff->nStops, stops, colors, &error); 193805b261ecSmrg if (!pPicture) 1939f7df2e56Smrg return error; 19404642e01fSmrg /* security creation/labeling check */ 19414642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 1942f7df2e56Smrg pPicture, RT_NONE, NULL, DixCreateAccess); 19434642e01fSmrg if (error != Success) 1944f7df2e56Smrg return error; 1945f7df2e56Smrg if (!AddResource(stuff->pid, PictureType, (void *) pPicture)) 1946f7df2e56Smrg return BadAlloc; 194705b261ecSmrg return Success; 194805b261ecSmrg} 194905b261ecSmrg 1950f7df2e56Smrgstatic int 1951f7df2e56SmrgProcRenderCreateConicalGradient(ClientPtr client) 195205b261ecSmrg{ 1953f7df2e56Smrg PicturePtr pPicture; 1954f7df2e56Smrg int len; 1955f7df2e56Smrg int error = 0; 1956f7df2e56Smrg xFixed *stops; 1957f7df2e56Smrg xRenderColor *colors; 1958f7df2e56Smrg 195905b261ecSmrg REQUEST(xRenderCreateConicalGradientReq); 196005b261ecSmrg 196105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 196205b261ecSmrg 196305b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 196405b261ecSmrg 196505b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 19667e31ba66Smrg if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) 19677e31ba66Smrg return BadLength; 1968f7df2e56Smrg if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) 196905b261ecSmrg return BadLength; 197005b261ecSmrg 1971f7df2e56Smrg stops = (xFixed *) (stuff + 1); 1972f7df2e56Smrg colors = (xRenderColor *) (stops + stuff->nStops); 197305b261ecSmrg 1974f7df2e56Smrg pPicture = 1975f7df2e56Smrg CreateConicalGradientPicture(stuff->pid, &stuff->center, stuff->angle, 1976f7df2e56Smrg stuff->nStops, stops, colors, &error); 197705b261ecSmrg if (!pPicture) 1978f7df2e56Smrg return error; 19794642e01fSmrg /* security creation/labeling check */ 19804642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 1981f7df2e56Smrg pPicture, RT_NONE, NULL, DixCreateAccess); 19824642e01fSmrg if (error != Success) 1983f7df2e56Smrg return error; 1984f7df2e56Smrg if (!AddResource(stuff->pid, PictureType, (void *) pPicture)) 1985f7df2e56Smrg return BadAlloc; 198605b261ecSmrg return Success; 198705b261ecSmrg} 198805b261ecSmrg 198905b261ecSmrgstatic int 1990f7df2e56SmrgProcRenderDispatch(ClientPtr client) 199105b261ecSmrg{ 199205b261ecSmrg REQUEST(xReq); 1993f7df2e56Smrg 199405b261ecSmrg if (stuff->data < RenderNumberRequests) 1995f7df2e56Smrg return (*ProcRenderVector[stuff->data]) (client); 199605b261ecSmrg else 1997f7df2e56Smrg return BadRequest; 199805b261ecSmrg} 199905b261ecSmrg 20007e31ba66Smrgstatic int _X_COLD 2001f7df2e56SmrgSProcRenderQueryVersion(ClientPtr client) 200205b261ecSmrg{ 200305b261ecSmrg REQUEST(xRenderQueryVersionReq); 20040b0d8713Smrg REQUEST_SIZE_MATCH(xRenderQueryVersionReq); 2005f7df2e56Smrg swaps(&stuff->length); 2006f7df2e56Smrg swapl(&stuff->majorVersion); 2007f7df2e56Smrg swapl(&stuff->minorVersion); 2008f7df2e56Smrg return (*ProcRenderVector[stuff->renderReqType]) (client); 200905b261ecSmrg} 201005b261ecSmrg 20117e31ba66Smrgstatic int _X_COLD 2012f7df2e56SmrgSProcRenderQueryPictFormats(ClientPtr client) 201305b261ecSmrg{ 201405b261ecSmrg REQUEST(xRenderQueryPictFormatsReq); 20150b0d8713Smrg REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq); 2016f7df2e56Smrg swaps(&stuff->length); 201705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 201805b261ecSmrg} 201905b261ecSmrg 20207e31ba66Smrgstatic int _X_COLD 2021f7df2e56SmrgSProcRenderQueryPictIndexValues(ClientPtr client) 202205b261ecSmrg{ 202305b261ecSmrg REQUEST(xRenderQueryPictIndexValuesReq); 20240b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq); 2025f7df2e56Smrg swaps(&stuff->length); 2026f7df2e56Smrg swapl(&stuff->format); 202705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 202805b261ecSmrg} 202905b261ecSmrg 20307e31ba66Smrgstatic int _X_COLD 2031f7df2e56SmrgSProcRenderQueryDithers(ClientPtr client) 203205b261ecSmrg{ 203305b261ecSmrg return BadImplementation; 203405b261ecSmrg} 203505b261ecSmrg 20367e31ba66Smrgstatic int _X_COLD 2037f7df2e56SmrgSProcRenderCreatePicture(ClientPtr client) 203805b261ecSmrg{ 203905b261ecSmrg REQUEST(xRenderCreatePictureReq); 20400b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 2041f7df2e56Smrg swaps(&stuff->length); 2042f7df2e56Smrg swapl(&stuff->pid); 2043f7df2e56Smrg swapl(&stuff->drawable); 2044f7df2e56Smrg swapl(&stuff->format); 2045f7df2e56Smrg swapl(&stuff->mask); 204605b261ecSmrg SwapRestL(stuff); 204705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 204805b261ecSmrg} 204905b261ecSmrg 20507e31ba66Smrgstatic int _X_COLD 2051f7df2e56SmrgSProcRenderChangePicture(ClientPtr client) 205205b261ecSmrg{ 205305b261ecSmrg REQUEST(xRenderChangePictureReq); 20540b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 2055f7df2e56Smrg swaps(&stuff->length); 2056f7df2e56Smrg swapl(&stuff->picture); 2057f7df2e56Smrg swapl(&stuff->mask); 205805b261ecSmrg SwapRestL(stuff); 205905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 206005b261ecSmrg} 206105b261ecSmrg 20627e31ba66Smrgstatic int _X_COLD 2063f7df2e56SmrgSProcRenderSetPictureClipRectangles(ClientPtr client) 206405b261ecSmrg{ 206505b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 20660b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 2067f7df2e56Smrg swaps(&stuff->length); 2068f7df2e56Smrg swapl(&stuff->picture); 2069f7df2e56Smrg swaps(&stuff->xOrigin); 2070f7df2e56Smrg swaps(&stuff->yOrigin); 207105b261ecSmrg SwapRestS(stuff); 207205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 207305b261ecSmrg} 207405b261ecSmrg 20757e31ba66Smrgstatic int _X_COLD 2076f7df2e56SmrgSProcRenderFreePicture(ClientPtr client) 207705b261ecSmrg{ 207805b261ecSmrg REQUEST(xRenderFreePictureReq); 20790b0d8713Smrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 2080f7df2e56Smrg swaps(&stuff->length); 2081f7df2e56Smrg swapl(&stuff->picture); 208205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 208305b261ecSmrg} 208405b261ecSmrg 20857e31ba66Smrgstatic int _X_COLD 2086f7df2e56SmrgSProcRenderComposite(ClientPtr client) 208705b261ecSmrg{ 208805b261ecSmrg REQUEST(xRenderCompositeReq); 20890b0d8713Smrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 2090f7df2e56Smrg swaps(&stuff->length); 2091f7df2e56Smrg swapl(&stuff->src); 2092f7df2e56Smrg swapl(&stuff->mask); 2093f7df2e56Smrg swapl(&stuff->dst); 2094f7df2e56Smrg swaps(&stuff->xSrc); 2095f7df2e56Smrg swaps(&stuff->ySrc); 2096f7df2e56Smrg swaps(&stuff->xMask); 2097f7df2e56Smrg swaps(&stuff->yMask); 2098f7df2e56Smrg swaps(&stuff->xDst); 2099f7df2e56Smrg swaps(&stuff->yDst); 2100f7df2e56Smrg swaps(&stuff->width); 2101f7df2e56Smrg swaps(&stuff->height); 210205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 210305b261ecSmrg} 210405b261ecSmrg 21057e31ba66Smrgstatic int _X_COLD 2106f7df2e56SmrgSProcRenderScale(ClientPtr client) 210705b261ecSmrg{ 2108f7df2e56Smrg return BadImplementation; 210905b261ecSmrg} 211005b261ecSmrg 21117e31ba66Smrgstatic int _X_COLD 2112f7df2e56SmrgSProcRenderTrapezoids(ClientPtr client) 211305b261ecSmrg{ 211405b261ecSmrg REQUEST(xRenderTrapezoidsReq); 211505b261ecSmrg 211605b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 2117f7df2e56Smrg swaps(&stuff->length); 2118f7df2e56Smrg swapl(&stuff->src); 2119f7df2e56Smrg swapl(&stuff->dst); 2120f7df2e56Smrg swapl(&stuff->maskFormat); 2121f7df2e56Smrg swaps(&stuff->xSrc); 2122f7df2e56Smrg swaps(&stuff->ySrc); 212305b261ecSmrg SwapRestL(stuff); 212405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 212505b261ecSmrg} 212605b261ecSmrg 21277e31ba66Smrgstatic int _X_COLD 2128f7df2e56SmrgSProcRenderTriangles(ClientPtr client) 212905b261ecSmrg{ 213005b261ecSmrg REQUEST(xRenderTrianglesReq); 213105b261ecSmrg 213205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 2133f7df2e56Smrg swaps(&stuff->length); 2134f7df2e56Smrg swapl(&stuff->src); 2135f7df2e56Smrg swapl(&stuff->dst); 2136f7df2e56Smrg swapl(&stuff->maskFormat); 2137f7df2e56Smrg swaps(&stuff->xSrc); 2138f7df2e56Smrg swaps(&stuff->ySrc); 213905b261ecSmrg SwapRestL(stuff); 214005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 214105b261ecSmrg} 214205b261ecSmrg 21437e31ba66Smrgstatic int _X_COLD 2144f7df2e56SmrgSProcRenderTriStrip(ClientPtr client) 214505b261ecSmrg{ 214605b261ecSmrg REQUEST(xRenderTriStripReq); 214705b261ecSmrg 214805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriStripReq); 2149f7df2e56Smrg swaps(&stuff->length); 2150f7df2e56Smrg swapl(&stuff->src); 2151f7df2e56Smrg swapl(&stuff->dst); 2152f7df2e56Smrg swapl(&stuff->maskFormat); 2153f7df2e56Smrg swaps(&stuff->xSrc); 2154f7df2e56Smrg swaps(&stuff->ySrc); 215505b261ecSmrg SwapRestL(stuff); 215605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 215705b261ecSmrg} 215805b261ecSmrg 21597e31ba66Smrgstatic int _X_COLD 2160f7df2e56SmrgSProcRenderTriFan(ClientPtr client) 216105b261ecSmrg{ 216205b261ecSmrg REQUEST(xRenderTriFanReq); 216305b261ecSmrg 216405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriFanReq); 2165f7df2e56Smrg swaps(&stuff->length); 2166f7df2e56Smrg swapl(&stuff->src); 2167f7df2e56Smrg swapl(&stuff->dst); 2168f7df2e56Smrg swapl(&stuff->maskFormat); 2169f7df2e56Smrg swaps(&stuff->xSrc); 2170f7df2e56Smrg swaps(&stuff->ySrc); 217105b261ecSmrg SwapRestL(stuff); 217205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 217305b261ecSmrg} 217405b261ecSmrg 21757e31ba66Smrgstatic int _X_COLD 2176f7df2e56SmrgSProcRenderColorTrapezoids(ClientPtr client) 217705b261ecSmrg{ 217805b261ecSmrg return BadImplementation; 217905b261ecSmrg} 218005b261ecSmrg 21817e31ba66Smrgstatic int _X_COLD 2182f7df2e56SmrgSProcRenderColorTriangles(ClientPtr client) 218305b261ecSmrg{ 218405b261ecSmrg return BadImplementation; 218505b261ecSmrg} 218605b261ecSmrg 21877e31ba66Smrgstatic int _X_COLD 2188f7df2e56SmrgSProcRenderTransform(ClientPtr client) 218905b261ecSmrg{ 219005b261ecSmrg return BadImplementation; 219105b261ecSmrg} 219205b261ecSmrg 21937e31ba66Smrgstatic int _X_COLD 2194f7df2e56SmrgSProcRenderCreateGlyphSet(ClientPtr client) 219505b261ecSmrg{ 219605b261ecSmrg REQUEST(xRenderCreateGlyphSetReq); 21970b0d8713Smrg REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq); 2198f7df2e56Smrg swaps(&stuff->length); 2199f7df2e56Smrg swapl(&stuff->gsid); 2200f7df2e56Smrg swapl(&stuff->format); 220105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 220205b261ecSmrg} 220305b261ecSmrg 22047e31ba66Smrgstatic int _X_COLD 2205f7df2e56SmrgSProcRenderReferenceGlyphSet(ClientPtr client) 220605b261ecSmrg{ 220705b261ecSmrg REQUEST(xRenderReferenceGlyphSetReq); 22080b0d8713Smrg REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq); 2209f7df2e56Smrg swaps(&stuff->length); 2210f7df2e56Smrg swapl(&stuff->gsid); 2211f7df2e56Smrg swapl(&stuff->existing); 2212f7df2e56Smrg return (*ProcRenderVector[stuff->renderReqType]) (client); 221305b261ecSmrg} 221405b261ecSmrg 22157e31ba66Smrgstatic int _X_COLD 2216f7df2e56SmrgSProcRenderFreeGlyphSet(ClientPtr client) 221705b261ecSmrg{ 221805b261ecSmrg REQUEST(xRenderFreeGlyphSetReq); 22190b0d8713Smrg REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq); 2220f7df2e56Smrg swaps(&stuff->length); 2221f7df2e56Smrg swapl(&stuff->glyphset); 222205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 222305b261ecSmrg} 222405b261ecSmrg 22257e31ba66Smrgstatic int _X_COLD 2226f7df2e56SmrgSProcRenderAddGlyphs(ClientPtr client) 222705b261ecSmrg{ 222805b261ecSmrg register int i; 2229f7df2e56Smrg CARD32 *gids; 2230f7df2e56Smrg void *end; 223105b261ecSmrg xGlyphInfo *gi; 2232f7df2e56Smrg 223305b261ecSmrg REQUEST(xRenderAddGlyphsReq); 22340b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq); 2235f7df2e56Smrg swaps(&stuff->length); 2236f7df2e56Smrg swapl(&stuff->glyphset); 2237f7df2e56Smrg swapl(&stuff->nglyphs); 223805b261ecSmrg if (stuff->nglyphs & 0xe0000000) 2239f7df2e56Smrg return BadLength; 224005b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 224105b261ecSmrg gids = (CARD32 *) (stuff + 1); 224205b261ecSmrg gi = (xGlyphInfo *) (gids + stuff->nglyphs); 224305b261ecSmrg if ((char *) end - (char *) (gids + stuff->nglyphs) < 0) 2244f7df2e56Smrg return BadLength; 224505b261ecSmrg if ((char *) end - (char *) (gi + stuff->nglyphs) < 0) 2246f7df2e56Smrg return BadLength; 2247f7df2e56Smrg for (i = 0; i < stuff->nglyphs; i++) { 2248f7df2e56Smrg swapl(&gids[i]); 2249f7df2e56Smrg swaps(&gi[i].width); 2250f7df2e56Smrg swaps(&gi[i].height); 2251f7df2e56Smrg swaps(&gi[i].x); 2252f7df2e56Smrg swaps(&gi[i].y); 2253f7df2e56Smrg swaps(&gi[i].xOff); 2254f7df2e56Smrg swaps(&gi[i].yOff); 225505b261ecSmrg } 225605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 225705b261ecSmrg} 225805b261ecSmrg 22597e31ba66Smrgstatic int _X_COLD 2260f7df2e56SmrgSProcRenderAddGlyphsFromPicture(ClientPtr client) 226105b261ecSmrg{ 226205b261ecSmrg return BadImplementation; 226305b261ecSmrg} 226405b261ecSmrg 22657e31ba66Smrgstatic int _X_COLD 2266f7df2e56SmrgSProcRenderFreeGlyphs(ClientPtr client) 226705b261ecSmrg{ 226805b261ecSmrg REQUEST(xRenderFreeGlyphsReq); 22690b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq); 2270f7df2e56Smrg swaps(&stuff->length); 2271f7df2e56Smrg swapl(&stuff->glyphset); 227205b261ecSmrg SwapRestL(stuff); 227305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 227405b261ecSmrg} 227505b261ecSmrg 22767e31ba66Smrgstatic int _X_COLD 2277f7df2e56SmrgSProcRenderCompositeGlyphs(ClientPtr client) 227805b261ecSmrg{ 2279f7df2e56Smrg xGlyphElt *elt; 2280f7df2e56Smrg CARD8 *buffer; 2281f7df2e56Smrg CARD8 *end; 2282f7df2e56Smrg int space; 2283f7df2e56Smrg int i; 2284f7df2e56Smrg int size; 2285f7df2e56Smrg 228605b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 22870b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 2288f7df2e56Smrg 228905b261ecSmrg switch (stuff->renderReqType) { 2290f7df2e56Smrg default: 2291f7df2e56Smrg size = 1; 2292f7df2e56Smrg break; 2293f7df2e56Smrg case X_RenderCompositeGlyphs16: 2294f7df2e56Smrg size = 2; 2295f7df2e56Smrg break; 2296f7df2e56Smrg case X_RenderCompositeGlyphs32: 2297f7df2e56Smrg size = 4; 2298f7df2e56Smrg break; 2299f7df2e56Smrg } 2300f7df2e56Smrg 2301f7df2e56Smrg swaps(&stuff->length); 2302f7df2e56Smrg swapl(&stuff->src); 2303f7df2e56Smrg swapl(&stuff->dst); 2304f7df2e56Smrg swapl(&stuff->maskFormat); 2305f7df2e56Smrg swapl(&stuff->glyphset); 2306f7df2e56Smrg swaps(&stuff->xSrc); 2307f7df2e56Smrg swaps(&stuff->ySrc); 230805b261ecSmrg buffer = (CARD8 *) (stuff + 1); 230905b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 2310f7df2e56Smrg while (buffer + sizeof(xGlyphElt) < end) { 2311f7df2e56Smrg elt = (xGlyphElt *) buffer; 2312f7df2e56Smrg buffer += sizeof(xGlyphElt); 2313f7df2e56Smrg 2314f7df2e56Smrg swaps(&elt->deltax); 2315f7df2e56Smrg swaps(&elt->deltay); 2316f7df2e56Smrg 2317f7df2e56Smrg i = elt->len; 2318f7df2e56Smrg if (i == 0xff) { 23195a112b11Smrg if (buffer + 4 > end) { 23205a112b11Smrg return BadLength; 23215a112b11Smrg } 2322f7df2e56Smrg swapl((int *) buffer); 2323f7df2e56Smrg buffer += 4; 2324f7df2e56Smrg } 2325f7df2e56Smrg else { 2326f7df2e56Smrg space = size * i; 2327f7df2e56Smrg switch (size) { 2328f7df2e56Smrg case 1: 2329f7df2e56Smrg buffer += i; 2330f7df2e56Smrg break; 2331f7df2e56Smrg case 2: 23325a112b11Smrg if (buffer + i * 2 > end) { 23335a112b11Smrg return BadLength; 23345a112b11Smrg } 2335f7df2e56Smrg while (i--) { 2336f7df2e56Smrg swaps((short *) buffer); 2337f7df2e56Smrg buffer += 2; 2338f7df2e56Smrg } 2339f7df2e56Smrg break; 2340f7df2e56Smrg case 4: 23415a112b11Smrg if (buffer + i * 4 > end) { 23425a112b11Smrg return BadLength; 23435a112b11Smrg } 2344f7df2e56Smrg while (i--) { 2345f7df2e56Smrg swapl((int *) buffer); 2346f7df2e56Smrg buffer += 4; 2347f7df2e56Smrg } 2348f7df2e56Smrg break; 2349f7df2e56Smrg } 2350f7df2e56Smrg if (space & 3) 2351f7df2e56Smrg buffer += 4 - (space & 3); 2352f7df2e56Smrg } 235305b261ecSmrg } 235405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 235505b261ecSmrg} 235605b261ecSmrg 23577e31ba66Smrgstatic int _X_COLD 2358f7df2e56SmrgSProcRenderFillRectangles(ClientPtr client) 235905b261ecSmrg{ 236005b261ecSmrg REQUEST(xRenderFillRectanglesReq); 236105b261ecSmrg 2362f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq); 2363f7df2e56Smrg swaps(&stuff->length); 2364f7df2e56Smrg swapl(&stuff->dst); 2365f7df2e56Smrg swaps(&stuff->color.red); 2366f7df2e56Smrg swaps(&stuff->color.green); 2367f7df2e56Smrg swaps(&stuff->color.blue); 2368f7df2e56Smrg swaps(&stuff->color.alpha); 236905b261ecSmrg SwapRestS(stuff); 237005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 237105b261ecSmrg} 2372f7df2e56Smrg 23737e31ba66Smrgstatic int _X_COLD 2374f7df2e56SmrgSProcRenderCreateCursor(ClientPtr client) 237505b261ecSmrg{ 237605b261ecSmrg REQUEST(xRenderCreateCursorReq); 2377f7df2e56Smrg REQUEST_SIZE_MATCH(xRenderCreateCursorReq); 2378f7df2e56Smrg 2379f7df2e56Smrg swaps(&stuff->length); 2380f7df2e56Smrg swapl(&stuff->cid); 2381f7df2e56Smrg swapl(&stuff->src); 2382f7df2e56Smrg swaps(&stuff->x); 2383f7df2e56Smrg swaps(&stuff->y); 238405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 238505b261ecSmrg} 2386f7df2e56Smrg 23877e31ba66Smrgstatic int _X_COLD 2388f7df2e56SmrgSProcRenderSetPictureTransform(ClientPtr client) 238905b261ecSmrg{ 239005b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 239105b261ecSmrg REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq); 239205b261ecSmrg 2393f7df2e56Smrg swaps(&stuff->length); 2394f7df2e56Smrg swapl(&stuff->picture); 2395f7df2e56Smrg swapl(&stuff->transform.matrix11); 2396f7df2e56Smrg swapl(&stuff->transform.matrix12); 2397f7df2e56Smrg swapl(&stuff->transform.matrix13); 2398f7df2e56Smrg swapl(&stuff->transform.matrix21); 2399f7df2e56Smrg swapl(&stuff->transform.matrix22); 2400f7df2e56Smrg swapl(&stuff->transform.matrix23); 2401f7df2e56Smrg swapl(&stuff->transform.matrix31); 2402f7df2e56Smrg swapl(&stuff->transform.matrix32); 2403f7df2e56Smrg swapl(&stuff->transform.matrix33); 240405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 240505b261ecSmrg} 240605b261ecSmrg 24077e31ba66Smrgstatic int _X_COLD 2408f7df2e56SmrgSProcRenderQueryFilters(ClientPtr client) 240905b261ecSmrg{ 2410f7df2e56Smrg REQUEST(xRenderQueryFiltersReq); 2411f7df2e56Smrg REQUEST_SIZE_MATCH(xRenderQueryFiltersReq); 241205b261ecSmrg 2413f7df2e56Smrg swaps(&stuff->length); 2414f7df2e56Smrg swapl(&stuff->drawable); 241505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 241605b261ecSmrg} 2417f7df2e56Smrg 24187e31ba66Smrgstatic int _X_COLD 2419f7df2e56SmrgSProcRenderSetPictureFilter(ClientPtr client) 242005b261ecSmrg{ 2421f7df2e56Smrg REQUEST(xRenderSetPictureFilterReq); 2422f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq); 242305b261ecSmrg 2424f7df2e56Smrg swaps(&stuff->length); 2425f7df2e56Smrg swapl(&stuff->picture); 2426f7df2e56Smrg swaps(&stuff->nbytes); 242705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 242805b261ecSmrg} 2429f7df2e56Smrg 24307e31ba66Smrgstatic int _X_COLD 2431f7df2e56SmrgSProcRenderCreateAnimCursor(ClientPtr client) 243205b261ecSmrg{ 2433f7df2e56Smrg REQUEST(xRenderCreateAnimCursorReq); 2434f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq); 243505b261ecSmrg 2436f7df2e56Smrg swaps(&stuff->length); 2437f7df2e56Smrg swapl(&stuff->cid); 243805b261ecSmrg SwapRestL(stuff); 243905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 244005b261ecSmrg} 244105b261ecSmrg 24427e31ba66Smrgstatic int _X_COLD 2443f7df2e56SmrgSProcRenderAddTraps(ClientPtr client) 244405b261ecSmrg{ 2445f7df2e56Smrg REQUEST(xRenderAddTrapsReq); 2446f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq); 244705b261ecSmrg 2448f7df2e56Smrg swaps(&stuff->length); 2449f7df2e56Smrg swapl(&stuff->picture); 2450f7df2e56Smrg swaps(&stuff->xOff); 2451f7df2e56Smrg swaps(&stuff->yOff); 245205b261ecSmrg SwapRestL(stuff); 245305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 245405b261ecSmrg} 245505b261ecSmrg 24567e31ba66Smrgstatic int _X_COLD 245705b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client) 245805b261ecSmrg{ 2459f7df2e56Smrg REQUEST(xRenderCreateSolidFillReq); 2460f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 246105b261ecSmrg 2462f7df2e56Smrg swaps(&stuff->length); 2463f7df2e56Smrg swapl(&stuff->pid); 2464f7df2e56Smrg swaps(&stuff->color.alpha); 2465f7df2e56Smrg swaps(&stuff->color.red); 2466f7df2e56Smrg swaps(&stuff->color.green); 2467f7df2e56Smrg swaps(&stuff->color.blue); 246805b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 246905b261ecSmrg} 247005b261ecSmrg 24717e31ba66Smrgstatic void _X_COLD 2472f7df2e56SmrgswapStops(void *stuff, int num) 247305b261ecSmrg{ 2474f7df2e56Smrg int i; 247505b261ecSmrg CARD32 *stops; 247605b261ecSmrg CARD16 *colors; 2477f7df2e56Smrg 2478f7df2e56Smrg stops = (CARD32 *) (stuff); 247905b261ecSmrg for (i = 0; i < num; ++i) { 2480f7df2e56Smrg swapl(stops); 248105b261ecSmrg ++stops; 248205b261ecSmrg } 2483f7df2e56Smrg colors = (CARD16 *) (stops); 2484f7df2e56Smrg for (i = 0; i < 4 * num; ++i) { 2485f7df2e56Smrg swaps(colors); 24868223e2f2Smrg ++colors; 248705b261ecSmrg } 248805b261ecSmrg} 248905b261ecSmrg 24907e31ba66Smrgstatic int _X_COLD 2491f7df2e56SmrgSProcRenderCreateLinearGradient(ClientPtr client) 249205b261ecSmrg{ 249305b261ecSmrg int len; 249405b261ecSmrg 2495f7df2e56Smrg REQUEST(xRenderCreateLinearGradientReq); 2496f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 2497f7df2e56Smrg 2498f7df2e56Smrg swaps(&stuff->length); 2499f7df2e56Smrg swapl(&stuff->pid); 2500f7df2e56Smrg swapl(&stuff->p1.x); 2501f7df2e56Smrg swapl(&stuff->p1.y); 2502f7df2e56Smrg swapl(&stuff->p2.x); 2503f7df2e56Smrg swapl(&stuff->p2.y); 2504f7df2e56Smrg swapl(&stuff->nStops); 250505b261ecSmrg 250605b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 2507f7df2e56Smrg if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) 2508f7df2e56Smrg return BadLength; 2509f7df2e56Smrg if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) 251005b261ecSmrg return BadLength; 251105b261ecSmrg 2512f7df2e56Smrg swapStops(stuff + 1, stuff->nStops); 251305b261ecSmrg 251405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 251505b261ecSmrg} 251605b261ecSmrg 25177e31ba66Smrgstatic int _X_COLD 2518f7df2e56SmrgSProcRenderCreateRadialGradient(ClientPtr client) 251905b261ecSmrg{ 252005b261ecSmrg int len; 2521f7df2e56Smrg 2522f7df2e56Smrg REQUEST(xRenderCreateRadialGradientReq); 2523f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 2524f7df2e56Smrg 2525f7df2e56Smrg swaps(&stuff->length); 2526f7df2e56Smrg swapl(&stuff->pid); 2527f7df2e56Smrg swapl(&stuff->inner.x); 2528f7df2e56Smrg swapl(&stuff->inner.y); 2529f7df2e56Smrg swapl(&stuff->outer.x); 2530f7df2e56Smrg swapl(&stuff->outer.y); 2531f7df2e56Smrg swapl(&stuff->inner_radius); 2532f7df2e56Smrg swapl(&stuff->outer_radius); 2533f7df2e56Smrg swapl(&stuff->nStops); 253405b261ecSmrg 253505b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 2536f7df2e56Smrg if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) 2537f7df2e56Smrg return BadLength; 2538f7df2e56Smrg if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) 253905b261ecSmrg return BadLength; 254005b261ecSmrg 2541f7df2e56Smrg swapStops(stuff + 1, stuff->nStops); 254205b261ecSmrg 254305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 254405b261ecSmrg} 254505b261ecSmrg 25467e31ba66Smrgstatic int _X_COLD 2547f7df2e56SmrgSProcRenderCreateConicalGradient(ClientPtr client) 254805b261ecSmrg{ 254905b261ecSmrg int len; 255005b261ecSmrg 2551f7df2e56Smrg REQUEST(xRenderCreateConicalGradientReq); 2552f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 2553f7df2e56Smrg 2554f7df2e56Smrg swaps(&stuff->length); 2555f7df2e56Smrg swapl(&stuff->pid); 2556f7df2e56Smrg swapl(&stuff->center.x); 2557f7df2e56Smrg swapl(&stuff->center.y); 2558f7df2e56Smrg swapl(&stuff->angle); 2559f7df2e56Smrg swapl(&stuff->nStops); 256005b261ecSmrg 256105b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 2562f7df2e56Smrg if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) 2563f7df2e56Smrg return BadLength; 2564f7df2e56Smrg if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) 256505b261ecSmrg return BadLength; 256605b261ecSmrg 2567f7df2e56Smrg swapStops(stuff + 1, stuff->nStops); 256805b261ecSmrg 256905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 257005b261ecSmrg} 257105b261ecSmrg 25727e31ba66Smrgstatic int _X_COLD 2573f7df2e56SmrgSProcRenderDispatch(ClientPtr client) 257405b261ecSmrg{ 257505b261ecSmrg REQUEST(xReq); 2576f7df2e56Smrg 257705b261ecSmrg if (stuff->data < RenderNumberRequests) 2578f7df2e56Smrg return (*SProcRenderVector[stuff->data]) (client); 257905b261ecSmrg else 2580f7df2e56Smrg return BadRequest; 258105b261ecSmrg} 258205b261ecSmrg 258305b261ecSmrg#ifdef PANORAMIX 25846747b715Smrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\ 2585f7df2e56Smrg int rc = dixLookupResourceByType((void **)&(pPicture), pid,\ 25866747b715Smrg XRT_PICTURE, client, mode);\ 25876747b715Smrg if (rc != Success)\ 25886747b715Smrg return rc;\ 258905b261ecSmrg} 259005b261ecSmrg 25916747b715Smrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\ 259205b261ecSmrg if (pid == None) \ 259305b261ecSmrg pPicture = 0; \ 259405b261ecSmrg else { \ 25956747b715Smrg VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \ 259605b261ecSmrg } \ 259705b261ecSmrg} \ 259805b261ecSmrg 2599f7df2e56Smrgint (*PanoramiXSaveRenderVector[RenderNumberRequests]) (ClientPtr); 260005b261ecSmrg 260105b261ecSmrgstatic int 2602f7df2e56SmrgPanoramiXRenderCreatePicture(ClientPtr client) 260305b261ecSmrg{ 260405b261ecSmrg REQUEST(xRenderCreatePictureReq); 2605f7df2e56Smrg PanoramiXRes *refDraw, *newPict; 2606f7df2e56Smrg int result, j; 260705b261ecSmrg 260805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 2609f7df2e56Smrg result = dixLookupResourceByClass((void **) &refDraw, stuff->drawable, 2610f7df2e56Smrg XRC_DRAWABLE, client, DixWriteAccess); 26116747b715Smrg if (result != Success) 2612f7df2e56Smrg return (result == BadValue) ? BadDrawable : result; 2613f7df2e56Smrg if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 2614f7df2e56Smrg return BadAlloc; 261505b261ecSmrg newPict->type = XRT_PICTURE; 2616f7df2e56Smrg panoramix_setup_ids(newPict, client, stuff->pid); 2617f7df2e56Smrg 261805b261ecSmrg if (refDraw->type == XRT_WINDOW && 2619f7df2e56Smrg stuff->drawable == screenInfo.screens[0]->root->drawable.id) { 2620f7df2e56Smrg newPict->u.pict.root = TRUE; 262105b261ecSmrg } 262205b261ecSmrg else 2623f7df2e56Smrg newPict->u.pict.root = FALSE; 262405b261ecSmrg 262505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 2626f7df2e56Smrg stuff->pid = newPict->info[j].id; 2627f7df2e56Smrg stuff->drawable = refDraw->info[j].id; 2628f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client); 2629f7df2e56Smrg if (result != Success) 2630f7df2e56Smrg break; 263105b261ecSmrg } 263205b261ecSmrg 263305b261ecSmrg if (result == Success) 2634f7df2e56Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 2635f7df2e56Smrg else 2636f7df2e56Smrg free(newPict); 263705b261ecSmrg 26386747b715Smrg return result; 263905b261ecSmrg} 264005b261ecSmrg 264105b261ecSmrgstatic int 2642f7df2e56SmrgPanoramiXRenderChangePicture(ClientPtr client) 264305b261ecSmrg{ 2644f7df2e56Smrg PanoramiXRes *pict; 2645f7df2e56Smrg int result = Success, j; 2646f7df2e56Smrg 264705b261ecSmrg REQUEST(xRenderChangePictureReq); 264805b261ecSmrg 26496747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 2650f7df2e56Smrg 26516747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 2652f7df2e56Smrg 265305b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 265405b261ecSmrg stuff->picture = pict->info[j].id; 265505b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client); 2656f7df2e56Smrg if (result != Success) 2657f7df2e56Smrg break; 265805b261ecSmrg } 265905b261ecSmrg 26606747b715Smrg return result; 266105b261ecSmrg} 266205b261ecSmrg 266305b261ecSmrgstatic int 2664f7df2e56SmrgPanoramiXRenderSetPictureClipRectangles(ClientPtr client) 266505b261ecSmrg{ 266605b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 2667f7df2e56Smrg int result = Success, j; 2668f7df2e56Smrg PanoramiXRes *pict; 266905b261ecSmrg 267005b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 2671f7df2e56Smrg 26726747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 2673f7df2e56Smrg 267405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 267505b261ecSmrg stuff->picture = pict->info[j].id; 2676f7df2e56Smrg result = 2677f7df2e56Smrg (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) 2678f7df2e56Smrg (client); 2679f7df2e56Smrg if (result != Success) 2680f7df2e56Smrg break; 268105b261ecSmrg } 268205b261ecSmrg 26836747b715Smrg return result; 268405b261ecSmrg} 268505b261ecSmrg 268605b261ecSmrgstatic int 2687f7df2e56SmrgPanoramiXRenderSetPictureTransform(ClientPtr client) 268805b261ecSmrg{ 268905b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 2690f7df2e56Smrg int result = Success, j; 2691f7df2e56Smrg PanoramiXRes *pict; 269205b261ecSmrg 269305b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq); 2694f7df2e56Smrg 26956747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 2696f7df2e56Smrg 269705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 269805b261ecSmrg stuff->picture = pict->info[j].id; 2699f7df2e56Smrg result = 2700f7df2e56Smrg (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client); 2701f7df2e56Smrg if (result != Success) 2702f7df2e56Smrg break; 270305b261ecSmrg } 270405b261ecSmrg 27056747b715Smrg return result; 270605b261ecSmrg} 270705b261ecSmrg 270805b261ecSmrgstatic int 2709f7df2e56SmrgPanoramiXRenderSetPictureFilter(ClientPtr client) 271005b261ecSmrg{ 271105b261ecSmrg REQUEST(xRenderSetPictureFilterReq); 2712f7df2e56Smrg int result = Success, j; 2713f7df2e56Smrg PanoramiXRes *pict; 271405b261ecSmrg 271505b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq); 2716f7df2e56Smrg 27176747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 2718f7df2e56Smrg 271905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 272005b261ecSmrg stuff->picture = pict->info[j].id; 2721f7df2e56Smrg result = 2722f7df2e56Smrg (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client); 2723f7df2e56Smrg if (result != Success) 2724f7df2e56Smrg break; 272505b261ecSmrg } 272605b261ecSmrg 27276747b715Smrg return result; 272805b261ecSmrg} 272905b261ecSmrg 273005b261ecSmrgstatic int 2731f7df2e56SmrgPanoramiXRenderFreePicture(ClientPtr client) 273205b261ecSmrg{ 273305b261ecSmrg PanoramiXRes *pict; 2734f7df2e56Smrg int result = Success, j; 2735f7df2e56Smrg 273605b261ecSmrg REQUEST(xRenderFreePictureReq); 273705b261ecSmrg 273805b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 273905b261ecSmrg 274005b261ecSmrg client->errorValue = stuff->picture; 274105b261ecSmrg 27426747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess); 274305b261ecSmrg 274405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 2745f7df2e56Smrg stuff->picture = pict->info[j].id; 2746f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client); 2747f7df2e56Smrg if (result != Success) 2748f7df2e56Smrg break; 274905b261ecSmrg } 275005b261ecSmrg 275105b261ecSmrg /* Since ProcRenderFreePicture is using FreeResource, it will free 2752f7df2e56Smrg our resource for us on the last pass through the loop above */ 2753f7df2e56Smrg 27546747b715Smrg return result; 275505b261ecSmrg} 275605b261ecSmrg 275705b261ecSmrgstatic int 2758f7df2e56SmrgPanoramiXRenderComposite(ClientPtr client) 275905b261ecSmrg{ 2760f7df2e56Smrg PanoramiXRes *src, *msk, *dst; 2761f7df2e56Smrg int result = Success, j; 2762f7df2e56Smrg xRenderCompositeReq orig; 2763f7df2e56Smrg 276405b261ecSmrg REQUEST(xRenderCompositeReq); 276505b261ecSmrg 276605b261ecSmrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 2767f7df2e56Smrg 2768f7df2e56Smrg VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess); 2769f7df2e56Smrg VERIFY_XIN_ALPHA(msk, stuff->mask, client, DixReadAccess); 2770f7df2e56Smrg VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess); 2771f7df2e56Smrg 277205b261ecSmrg orig = *stuff; 2773f7df2e56Smrg 277405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 2775f7df2e56Smrg stuff->src = src->info[j].id; 2776f7df2e56Smrg if (src->u.pict.root) { 2777f7df2e56Smrg stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x; 2778f7df2e56Smrg stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y; 2779f7df2e56Smrg } 2780f7df2e56Smrg stuff->dst = dst->info[j].id; 2781f7df2e56Smrg if (dst->u.pict.root) { 2782f7df2e56Smrg stuff->xDst = orig.xDst - screenInfo.screens[j]->x; 2783f7df2e56Smrg stuff->yDst = orig.yDst - screenInfo.screens[j]->y; 2784f7df2e56Smrg } 2785f7df2e56Smrg if (msk) { 2786f7df2e56Smrg stuff->mask = msk->info[j].id; 2787f7df2e56Smrg if (msk->u.pict.root) { 2788f7df2e56Smrg stuff->xMask = orig.xMask - screenInfo.screens[j]->x; 2789f7df2e56Smrg stuff->yMask = orig.yMask - screenInfo.screens[j]->y; 2790f7df2e56Smrg } 2791f7df2e56Smrg } 2792f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client); 2793f7df2e56Smrg if (result != Success) 2794f7df2e56Smrg break; 279505b261ecSmrg } 279605b261ecSmrg 279705b261ecSmrg return result; 279805b261ecSmrg} 279905b261ecSmrg 280005b261ecSmrgstatic int 2801f7df2e56SmrgPanoramiXRenderCompositeGlyphs(ClientPtr client) 280205b261ecSmrg{ 2803f7df2e56Smrg PanoramiXRes *src, *dst; 2804f7df2e56Smrg int result = Success, j; 2805f7df2e56Smrg 280605b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 2807f7df2e56Smrg xGlyphElt origElt, *elt; 2808f7df2e56Smrg INT16 xSrc, ySrc; 280905b261ecSmrg 281005b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 2811f7df2e56Smrg VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess); 2812f7df2e56Smrg VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess); 2813f7df2e56Smrg 2814f7df2e56Smrg if (client->req_len << 2 >= (sizeof(xRenderCompositeGlyphsReq) + 2815f7df2e56Smrg sizeof(xGlyphElt))) { 2816f7df2e56Smrg elt = (xGlyphElt *) (stuff + 1); 2817f7df2e56Smrg origElt = *elt; 2818f7df2e56Smrg xSrc = stuff->xSrc; 2819f7df2e56Smrg ySrc = stuff->ySrc; 2820f7df2e56Smrg FOR_NSCREENS_FORWARD(j) { 2821f7df2e56Smrg stuff->src = src->info[j].id; 2822f7df2e56Smrg if (src->u.pict.root) { 2823f7df2e56Smrg stuff->xSrc = xSrc - screenInfo.screens[j]->x; 2824f7df2e56Smrg stuff->ySrc = ySrc - screenInfo.screens[j]->y; 2825f7df2e56Smrg } 2826f7df2e56Smrg stuff->dst = dst->info[j].id; 2827f7df2e56Smrg if (dst->u.pict.root) { 2828f7df2e56Smrg elt->deltax = origElt.deltax - screenInfo.screens[j]->x; 2829f7df2e56Smrg elt->deltay = origElt.deltay - screenInfo.screens[j]->y; 2830f7df2e56Smrg } 2831f7df2e56Smrg result = 2832f7df2e56Smrg (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client); 2833f7df2e56Smrg if (result != Success) 2834f7df2e56Smrg break; 2835f7df2e56Smrg } 283605b261ecSmrg } 283705b261ecSmrg 283805b261ecSmrg return result; 283905b261ecSmrg} 284005b261ecSmrg 284105b261ecSmrgstatic int 2842f7df2e56SmrgPanoramiXRenderFillRectangles(ClientPtr client) 284305b261ecSmrg{ 2844f7df2e56Smrg PanoramiXRes *dst; 2845f7df2e56Smrg int result = Success, j; 2846f7df2e56Smrg 284705b261ecSmrg REQUEST(xRenderFillRectanglesReq); 2848f7df2e56Smrg char *extra; 2849f7df2e56Smrg int extra_len; 2850f7df2e56Smrg 2851f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderFillRectanglesReq); 2852f7df2e56Smrg VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess); 2853f7df2e56Smrg extra_len = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq); 2854f7df2e56Smrg if (extra_len && (extra = (char *) malloc(extra_len))) { 2855f7df2e56Smrg memcpy(extra, stuff + 1, extra_len); 2856f7df2e56Smrg FOR_NSCREENS_FORWARD(j) { 2857f7df2e56Smrg if (j) 2858f7df2e56Smrg memcpy(stuff + 1, extra, extra_len); 2859f7df2e56Smrg if (dst->u.pict.root) { 2860f7df2e56Smrg int x_off = screenInfo.screens[j]->x; 2861f7df2e56Smrg int y_off = screenInfo.screens[j]->y; 2862f7df2e56Smrg 2863f7df2e56Smrg if (x_off || y_off) { 2864f7df2e56Smrg xRectangle *rects = (xRectangle *) (stuff + 1); 2865f7df2e56Smrg int i = extra_len / sizeof(xRectangle); 2866f7df2e56Smrg 2867f7df2e56Smrg while (i--) { 2868f7df2e56Smrg rects->x -= x_off; 2869f7df2e56Smrg rects->y -= y_off; 2870f7df2e56Smrg rects++; 2871f7df2e56Smrg } 2872f7df2e56Smrg } 2873f7df2e56Smrg } 2874f7df2e56Smrg stuff->dst = dst->info[j].id; 2875f7df2e56Smrg result = 2876f7df2e56Smrg (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client); 2877f7df2e56Smrg if (result != Success) 2878f7df2e56Smrg break; 2879f7df2e56Smrg } 2880f7df2e56Smrg free(extra); 288105b261ecSmrg } 288205b261ecSmrg 288305b261ecSmrg return result; 288405b261ecSmrg} 288505b261ecSmrg 288605b261ecSmrgstatic int 288705b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client) 288805b261ecSmrg{ 2889f7df2e56Smrg PanoramiXRes *src, *dst; 2890f7df2e56Smrg int result = Success, j; 2891f7df2e56Smrg 289205b261ecSmrg REQUEST(xRenderTrapezoidsReq); 2893f7df2e56Smrg char *extra; 2894f7df2e56Smrg int extra_len; 2895f7df2e56Smrg 2896f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 2897f7df2e56Smrg 2898f7df2e56Smrg VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess); 2899f7df2e56Smrg VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess); 2900f7df2e56Smrg 2901f7df2e56Smrg extra_len = (client->req_len << 2) - sizeof(xRenderTrapezoidsReq); 2902f7df2e56Smrg 2903f7df2e56Smrg if (extra_len && (extra = (char *) malloc(extra_len))) { 2904f7df2e56Smrg memcpy(extra, stuff + 1, extra_len); 2905f7df2e56Smrg 2906f7df2e56Smrg FOR_NSCREENS_FORWARD(j) { 2907f7df2e56Smrg if (j) 2908f7df2e56Smrg memcpy(stuff + 1, extra, extra_len); 2909f7df2e56Smrg if (dst->u.pict.root) { 2910f7df2e56Smrg int x_off = screenInfo.screens[j]->x; 2911f7df2e56Smrg int y_off = screenInfo.screens[j]->y; 2912f7df2e56Smrg 2913f7df2e56Smrg if (x_off || y_off) { 2914f7df2e56Smrg xTrapezoid *trap = (xTrapezoid *) (stuff + 1); 2915f7df2e56Smrg int i = extra_len / sizeof(xTrapezoid); 2916f7df2e56Smrg 2917f7df2e56Smrg while (i--) { 2918f7df2e56Smrg trap->top -= y_off; 2919f7df2e56Smrg trap->bottom -= y_off; 2920f7df2e56Smrg trap->left.p1.x -= x_off; 2921f7df2e56Smrg trap->left.p1.y -= y_off; 2922f7df2e56Smrg trap->left.p2.x -= x_off; 2923f7df2e56Smrg trap->left.p2.y -= y_off; 2924f7df2e56Smrg trap->right.p1.x -= x_off; 2925f7df2e56Smrg trap->right.p1.y -= y_off; 2926f7df2e56Smrg trap->right.p2.x -= x_off; 2927f7df2e56Smrg trap->right.p2.y -= y_off; 2928f7df2e56Smrg trap++; 2929f7df2e56Smrg } 2930f7df2e56Smrg } 2931f7df2e56Smrg } 2932f7df2e56Smrg 293305b261ecSmrg stuff->src = src->info[j].id; 293405b261ecSmrg stuff->dst = dst->info[j].id; 2935f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client); 2936f7df2e56Smrg 2937f7df2e56Smrg if (result != Success) 2938f7df2e56Smrg break; 2939f7df2e56Smrg } 294005b261ecSmrg 29416747b715Smrg free(extra); 294205b261ecSmrg } 294305b261ecSmrg 294405b261ecSmrg return result; 294505b261ecSmrg} 294605b261ecSmrg 294705b261ecSmrgstatic int 294805b261ecSmrgPanoramiXRenderTriangles(ClientPtr client) 294905b261ecSmrg{ 2950f7df2e56Smrg PanoramiXRes *src, *dst; 2951f7df2e56Smrg int result = Success, j; 2952f7df2e56Smrg 295305b261ecSmrg REQUEST(xRenderTrianglesReq); 2954f7df2e56Smrg char *extra; 2955f7df2e56Smrg int extra_len; 2956f7df2e56Smrg 2957f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 2958f7df2e56Smrg 2959f7df2e56Smrg VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess); 2960f7df2e56Smrg VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess); 2961f7df2e56Smrg 2962f7df2e56Smrg extra_len = (client->req_len << 2) - sizeof(xRenderTrianglesReq); 2963f7df2e56Smrg 2964f7df2e56Smrg if (extra_len && (extra = (char *) malloc(extra_len))) { 2965f7df2e56Smrg memcpy(extra, stuff + 1, extra_len); 2966f7df2e56Smrg 2967f7df2e56Smrg FOR_NSCREENS_FORWARD(j) { 2968f7df2e56Smrg if (j) 2969f7df2e56Smrg memcpy(stuff + 1, extra, extra_len); 2970f7df2e56Smrg if (dst->u.pict.root) { 2971f7df2e56Smrg int x_off = screenInfo.screens[j]->x; 2972f7df2e56Smrg int y_off = screenInfo.screens[j]->y; 2973f7df2e56Smrg 2974f7df2e56Smrg if (x_off || y_off) { 2975f7df2e56Smrg xTriangle *tri = (xTriangle *) (stuff + 1); 2976f7df2e56Smrg int i = extra_len / sizeof(xTriangle); 2977f7df2e56Smrg 2978f7df2e56Smrg while (i--) { 2979f7df2e56Smrg tri->p1.x -= x_off; 2980f7df2e56Smrg tri->p1.y -= y_off; 2981f7df2e56Smrg tri->p2.x -= x_off; 2982f7df2e56Smrg tri->p2.y -= y_off; 2983f7df2e56Smrg tri->p3.x -= x_off; 2984f7df2e56Smrg tri->p3.y -= y_off; 2985f7df2e56Smrg tri++; 2986f7df2e56Smrg } 2987f7df2e56Smrg } 2988f7df2e56Smrg } 2989f7df2e56Smrg 299005b261ecSmrg stuff->src = src->info[j].id; 299105b261ecSmrg stuff->dst = dst->info[j].id; 2992f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client); 2993f7df2e56Smrg 2994f7df2e56Smrg if (result != Success) 2995f7df2e56Smrg break; 2996f7df2e56Smrg } 299705b261ecSmrg 29986747b715Smrg free(extra); 299905b261ecSmrg } 300005b261ecSmrg 300105b261ecSmrg return result; 300205b261ecSmrg} 300305b261ecSmrg 300405b261ecSmrgstatic int 300505b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client) 300605b261ecSmrg{ 3007f7df2e56Smrg PanoramiXRes *src, *dst; 3008f7df2e56Smrg int result = Success, j; 3009f7df2e56Smrg 301005b261ecSmrg REQUEST(xRenderTriStripReq); 3011f7df2e56Smrg char *extra; 3012f7df2e56Smrg int extra_len; 3013f7df2e56Smrg 3014f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderTriStripReq); 3015f7df2e56Smrg 3016f7df2e56Smrg VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess); 3017f7df2e56Smrg VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess); 3018f7df2e56Smrg 3019f7df2e56Smrg extra_len = (client->req_len << 2) - sizeof(xRenderTriStripReq); 3020f7df2e56Smrg 3021f7df2e56Smrg if (extra_len && (extra = (char *) malloc(extra_len))) { 3022f7df2e56Smrg memcpy(extra, stuff + 1, extra_len); 3023f7df2e56Smrg 3024f7df2e56Smrg FOR_NSCREENS_FORWARD(j) { 3025f7df2e56Smrg if (j) 3026f7df2e56Smrg memcpy(stuff + 1, extra, extra_len); 3027f7df2e56Smrg if (dst->u.pict.root) { 3028f7df2e56Smrg int x_off = screenInfo.screens[j]->x; 3029f7df2e56Smrg int y_off = screenInfo.screens[j]->y; 3030f7df2e56Smrg 3031f7df2e56Smrg if (x_off || y_off) { 3032f7df2e56Smrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 3033f7df2e56Smrg int i = extra_len / sizeof(xPointFixed); 3034f7df2e56Smrg 3035f7df2e56Smrg while (i--) { 3036f7df2e56Smrg fixed->x -= x_off; 3037f7df2e56Smrg fixed->y -= y_off; 3038f7df2e56Smrg fixed++; 3039f7df2e56Smrg } 3040f7df2e56Smrg } 3041f7df2e56Smrg } 3042f7df2e56Smrg 304305b261ecSmrg stuff->src = src->info[j].id; 304405b261ecSmrg stuff->dst = dst->info[j].id; 3045f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client); 3046f7df2e56Smrg 3047f7df2e56Smrg if (result != Success) 3048f7df2e56Smrg break; 3049f7df2e56Smrg } 305005b261ecSmrg 30516747b715Smrg free(extra); 305205b261ecSmrg } 305305b261ecSmrg 305405b261ecSmrg return result; 305505b261ecSmrg} 305605b261ecSmrg 305705b261ecSmrgstatic int 305805b261ecSmrgPanoramiXRenderTriFan(ClientPtr client) 305905b261ecSmrg{ 3060f7df2e56Smrg PanoramiXRes *src, *dst; 3061f7df2e56Smrg int result = Success, j; 3062f7df2e56Smrg 306305b261ecSmrg REQUEST(xRenderTriFanReq); 3064f7df2e56Smrg char *extra; 3065f7df2e56Smrg int extra_len; 3066f7df2e56Smrg 3067f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderTriFanReq); 3068f7df2e56Smrg 3069f7df2e56Smrg VERIFY_XIN_PICTURE(src, stuff->src, client, DixReadAccess); 3070f7df2e56Smrg VERIFY_XIN_PICTURE(dst, stuff->dst, client, DixWriteAccess); 3071f7df2e56Smrg 3072f7df2e56Smrg extra_len = (client->req_len << 2) - sizeof(xRenderTriFanReq); 3073f7df2e56Smrg 3074f7df2e56Smrg if (extra_len && (extra = (char *) malloc(extra_len))) { 3075f7df2e56Smrg memcpy(extra, stuff + 1, extra_len); 3076f7df2e56Smrg 3077f7df2e56Smrg FOR_NSCREENS_FORWARD(j) { 3078f7df2e56Smrg if (j) 3079f7df2e56Smrg memcpy(stuff + 1, extra, extra_len); 3080f7df2e56Smrg if (dst->u.pict.root) { 3081f7df2e56Smrg int x_off = screenInfo.screens[j]->x; 3082f7df2e56Smrg int y_off = screenInfo.screens[j]->y; 3083f7df2e56Smrg 3084f7df2e56Smrg if (x_off || y_off) { 3085f7df2e56Smrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 3086f7df2e56Smrg int i = extra_len / sizeof(xPointFixed); 3087f7df2e56Smrg 3088f7df2e56Smrg while (i--) { 3089f7df2e56Smrg fixed->x -= x_off; 3090f7df2e56Smrg fixed->y -= y_off; 3091f7df2e56Smrg fixed++; 3092f7df2e56Smrg } 3093f7df2e56Smrg } 3094f7df2e56Smrg } 3095f7df2e56Smrg 309605b261ecSmrg stuff->src = src->info[j].id; 309705b261ecSmrg stuff->dst = dst->info[j].id; 3098f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client); 3099f7df2e56Smrg 3100f7df2e56Smrg if (result != Success) 3101f7df2e56Smrg break; 3102f7df2e56Smrg } 310305b261ecSmrg 31046747b715Smrg free(extra); 310505b261ecSmrg } 310605b261ecSmrg 310705b261ecSmrg return result; 310805b261ecSmrg} 310905b261ecSmrg 311005b261ecSmrgstatic int 3111f7df2e56SmrgPanoramiXRenderAddTraps(ClientPtr client) 311205b261ecSmrg{ 3113f7df2e56Smrg PanoramiXRes *picture; 3114f7df2e56Smrg int result = Success, j; 3115f7df2e56Smrg 311605b261ecSmrg REQUEST(xRenderAddTrapsReq); 3117f7df2e56Smrg char *extra; 3118f7df2e56Smrg int extra_len; 3119f7df2e56Smrg INT16 x_off, y_off; 3120f7df2e56Smrg 3121f7df2e56Smrg REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq); 3122f7df2e56Smrg VERIFY_XIN_PICTURE(picture, stuff->picture, client, DixWriteAccess); 3123f7df2e56Smrg extra_len = (client->req_len << 2) - sizeof(xRenderAddTrapsReq); 3124f7df2e56Smrg if (extra_len && (extra = (char *) malloc(extra_len))) { 3125f7df2e56Smrg memcpy(extra, stuff + 1, extra_len); 3126f7df2e56Smrg x_off = stuff->xOff; 3127f7df2e56Smrg y_off = stuff->yOff; 3128f7df2e56Smrg FOR_NSCREENS_FORWARD(j) { 3129f7df2e56Smrg if (j) 3130f7df2e56Smrg memcpy(stuff + 1, extra, extra_len); 3131f7df2e56Smrg stuff->picture = picture->info[j].id; 3132f7df2e56Smrg 3133f7df2e56Smrg if (picture->u.pict.root) { 3134f7df2e56Smrg stuff->xOff = x_off + screenInfo.screens[j]->x; 3135f7df2e56Smrg stuff->yOff = y_off + screenInfo.screens[j]->y; 3136f7df2e56Smrg } 3137f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client); 3138f7df2e56Smrg if (result != Success) 3139f7df2e56Smrg break; 3140f7df2e56Smrg } 3141f7df2e56Smrg free(extra); 31426747b715Smrg } 31436747b715Smrg 31446747b715Smrg return result; 31456747b715Smrg} 31466747b715Smrg 31476747b715Smrgstatic int 3148f7df2e56SmrgPanoramiXRenderCreateSolidFill(ClientPtr client) 31496747b715Smrg{ 31506747b715Smrg REQUEST(xRenderCreateSolidFillReq); 3151f7df2e56Smrg PanoramiXRes *newPict; 3152f7df2e56Smrg int result = Success, j; 31536747b715Smrg 31546747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 31556747b715Smrg 3156f7df2e56Smrg if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 3157f7df2e56Smrg return BadAlloc; 31586747b715Smrg 31596747b715Smrg newPict->type = XRT_PICTURE; 3160f7df2e56Smrg panoramix_setup_ids(newPict, client, stuff->pid); 31616747b715Smrg newPict->u.pict.root = FALSE; 31626747b715Smrg 31636747b715Smrg FOR_NSCREENS_BACKWARD(j) { 3164f7df2e56Smrg stuff->pid = newPict->info[j].id; 3165f7df2e56Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client); 3166f7df2e56Smrg if (result != Success) 3167f7df2e56Smrg break; 31686747b715Smrg } 31696747b715Smrg 31706747b715Smrg if (result == Success) 3171f7df2e56Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 31726747b715Smrg else 3173f7df2e56Smrg free(newPict); 31746747b715Smrg 31756747b715Smrg return result; 31766747b715Smrg} 31776747b715Smrg 31786747b715Smrgstatic int 3179f7df2e56SmrgPanoramiXRenderCreateLinearGradient(ClientPtr client) 31806747b715Smrg{ 31816747b715Smrg REQUEST(xRenderCreateLinearGradientReq); 3182f7df2e56Smrg PanoramiXRes *newPict; 3183f7df2e56Smrg int result = Success, j; 31846747b715Smrg 31856747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 31866747b715Smrg 3187f7df2e56Smrg if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 3188f7df2e56Smrg return BadAlloc; 31896747b715Smrg 31906747b715Smrg newPict->type = XRT_PICTURE; 3191f7df2e56Smrg panoramix_setup_ids(newPict, client, stuff->pid); 31926747b715Smrg newPict->u.pict.root = FALSE; 31936747b715Smrg 31946747b715Smrg FOR_NSCREENS_BACKWARD(j) { 3195f7df2e56Smrg stuff->pid = newPict->info[j].id; 3196f7df2e56Smrg result = 3197f7df2e56Smrg (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client); 3198f7df2e56Smrg if (result != Success) 3199f7df2e56Smrg break; 320005b261ecSmrg } 320105b261ecSmrg 32026747b715Smrg if (result == Success) 3203f7df2e56Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 32046747b715Smrg else 3205f7df2e56Smrg free(newPict); 32066747b715Smrg 32076747b715Smrg return result; 32086747b715Smrg} 32096747b715Smrg 32106747b715Smrgstatic int 3211f7df2e56SmrgPanoramiXRenderCreateRadialGradient(ClientPtr client) 32126747b715Smrg{ 32136747b715Smrg REQUEST(xRenderCreateRadialGradientReq); 3214f7df2e56Smrg PanoramiXRes *newPict; 3215f7df2e56Smrg int result = Success, j; 32166747b715Smrg 32176747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 32186747b715Smrg 3219f7df2e56Smrg if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 3220f7df2e56Smrg return BadAlloc; 32216747b715Smrg 32226747b715Smrg newPict->type = XRT_PICTURE; 3223f7df2e56Smrg panoramix_setup_ids(newPict, client, stuff->pid); 32246747b715Smrg newPict->u.pict.root = FALSE; 32256747b715Smrg 32266747b715Smrg FOR_NSCREENS_BACKWARD(j) { 3227f7df2e56Smrg stuff->pid = newPict->info[j].id; 3228f7df2e56Smrg result = 3229f7df2e56Smrg (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client); 3230f7df2e56Smrg if (result != Success) 3231f7df2e56Smrg break; 32326747b715Smrg } 32336747b715Smrg 32346747b715Smrg if (result == Success) 3235f7df2e56Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 32366747b715Smrg else 3237f7df2e56Smrg free(newPict); 32386747b715Smrg 32396747b715Smrg return result; 32406747b715Smrg} 32416747b715Smrg 32426747b715Smrgstatic int 3243f7df2e56SmrgPanoramiXRenderCreateConicalGradient(ClientPtr client) 32446747b715Smrg{ 32456747b715Smrg REQUEST(xRenderCreateConicalGradientReq); 3246f7df2e56Smrg PanoramiXRes *newPict; 3247f7df2e56Smrg int result = Success, j; 32486747b715Smrg 32496747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 32506747b715Smrg 3251f7df2e56Smrg if (!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 3252f7df2e56Smrg return BadAlloc; 32536747b715Smrg 32546747b715Smrg newPict->type = XRT_PICTURE; 3255f7df2e56Smrg panoramix_setup_ids(newPict, client, stuff->pid); 32566747b715Smrg newPict->u.pict.root = FALSE; 32576747b715Smrg 32586747b715Smrg FOR_NSCREENS_BACKWARD(j) { 3259f7df2e56Smrg stuff->pid = newPict->info[j].id; 3260f7df2e56Smrg result = 3261f7df2e56Smrg (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient]) 3262f7df2e56Smrg (client); 3263f7df2e56Smrg if (result != Success) 3264f7df2e56Smrg break; 32656747b715Smrg } 32666747b715Smrg 32676747b715Smrg if (result == Success) 3268f7df2e56Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 32696747b715Smrg else 3270f7df2e56Smrg free(newPict); 32716747b715Smrg 327205b261ecSmrg return result; 327305b261ecSmrg} 327405b261ecSmrg 327505b261ecSmrgvoid 3276f7df2e56SmrgPanoramiXRenderInit(void) 327705b261ecSmrg{ 3278f7df2e56Smrg int i; 3279f7df2e56Smrg 3280f7df2e56Smrg XRT_PICTURE = CreateNewResourceType(XineramaDeleteResource, 3281f7df2e56Smrg "XineramaPicture"); 32826747b715Smrg if (RenderErrBase) 3283f7df2e56Smrg SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture); 328405b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 3285f7df2e56Smrg PanoramiXSaveRenderVector[i] = ProcRenderVector[i]; 328605b261ecSmrg /* 328705b261ecSmrg * Stuff in Xinerama aware request processing hooks 328805b261ecSmrg */ 328905b261ecSmrg ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture; 329005b261ecSmrg ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture; 3291f7df2e56Smrg ProcRenderVector[X_RenderSetPictureTransform] = 3292f7df2e56Smrg PanoramiXRenderSetPictureTransform; 3293f7df2e56Smrg ProcRenderVector[X_RenderSetPictureFilter] = 3294f7df2e56Smrg PanoramiXRenderSetPictureFilter; 3295f7df2e56Smrg ProcRenderVector[X_RenderSetPictureClipRectangles] = 3296f7df2e56Smrg PanoramiXRenderSetPictureClipRectangles; 329705b261ecSmrg ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture; 329805b261ecSmrg ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite; 329905b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs; 3300f7df2e56Smrg ProcRenderVector[X_RenderCompositeGlyphs16] = 3301f7df2e56Smrg PanoramiXRenderCompositeGlyphs; 3302f7df2e56Smrg ProcRenderVector[X_RenderCompositeGlyphs32] = 3303f7df2e56Smrg PanoramiXRenderCompositeGlyphs; 330405b261ecSmrg ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles; 330505b261ecSmrg 330605b261ecSmrg ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids; 330705b261ecSmrg ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles; 330805b261ecSmrg ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip; 330905b261ecSmrg ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan; 331005b261ecSmrg ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps; 33116747b715Smrg 33126747b715Smrg ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill; 3313f7df2e56Smrg ProcRenderVector[X_RenderCreateLinearGradient] = 3314f7df2e56Smrg PanoramiXRenderCreateLinearGradient; 3315f7df2e56Smrg ProcRenderVector[X_RenderCreateRadialGradient] = 3316f7df2e56Smrg PanoramiXRenderCreateRadialGradient; 3317f7df2e56Smrg ProcRenderVector[X_RenderCreateConicalGradient] = 3318f7df2e56Smrg PanoramiXRenderCreateConicalGradient; 331905b261ecSmrg} 332005b261ecSmrg 332105b261ecSmrgvoid 3322f7df2e56SmrgPanoramiXRenderReset(void) 332305b261ecSmrg{ 3324f7df2e56Smrg int i; 3325f7df2e56Smrg 332605b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 3327f7df2e56Smrg ProcRenderVector[i] = PanoramiXSaveRenderVector[i]; 33286747b715Smrg RenderErrBase = 0; 332905b261ecSmrg} 333005b261ecSmrg 3331f7df2e56Smrg#endif /* PANORAMIX */ 3332