render.c revision 8223e2f2
105b261ecSmrg/* 205b261ecSmrg * 305b261ecSmrg * Copyright © 2000 SuSE, Inc. 405b261ecSmrg * 505b261ecSmrg * Permission to use, copy, modify, distribute, and sell this software and its 605b261ecSmrg * documentation for any purpose is hereby granted without fee, provided that 705b261ecSmrg * the above copyright notice appear in all copies and that both that 805b261ecSmrg * copyright notice and this permission notice appear in supporting 905b261ecSmrg * documentation, and that the name of SuSE not be used in advertising or 1005b261ecSmrg * publicity pertaining to distribution of the software without specific, 1105b261ecSmrg * written prior permission. SuSE makes no representations about the 1205b261ecSmrg * suitability of this software for any purpose. It is provided "as is" 1305b261ecSmrg * without express or implied warranty. 1405b261ecSmrg * 1505b261ecSmrg * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL 1605b261ecSmrg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE 1705b261ecSmrg * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1805b261ecSmrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 1905b261ecSmrg * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 2005b261ecSmrg * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 2105b261ecSmrg * 2205b261ecSmrg * Author: Keith Packard, SuSE, Inc. 2305b261ecSmrg */ 2405b261ecSmrg 2505b261ecSmrg#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" 4005b261ecSmrg#include "servermd.h" 4105b261ecSmrg#include <X11/extensions/render.h> 4205b261ecSmrg#include <X11/extensions/renderproto.h> 4305b261ecSmrg#include "picturestr.h" 4405b261ecSmrg#include "glyphstr.h" 4505b261ecSmrg#include <X11/Xfuncproto.h> 4605b261ecSmrg#include "cursorstr.h" 474642e01fSmrg#include "xace.h" 486747b715Smrg#include "protocol-versions.h" 4905b261ecSmrg 5005b261ecSmrg#if HAVE_STDINT_H 5105b261ecSmrg#include <stdint.h> 5205b261ecSmrg#elif !defined(UINT32_MAX) 5305b261ecSmrg#define UINT32_MAX 0xffffffffU 5405b261ecSmrg#endif 5505b261ecSmrg 5605b261ecSmrgstatic int ProcRenderQueryVersion (ClientPtr pClient); 5705b261ecSmrgstatic int ProcRenderQueryPictFormats (ClientPtr pClient); 5805b261ecSmrgstatic int ProcRenderQueryPictIndexValues (ClientPtr pClient); 5905b261ecSmrgstatic int ProcRenderQueryDithers (ClientPtr pClient); 6005b261ecSmrgstatic int ProcRenderCreatePicture (ClientPtr pClient); 6105b261ecSmrgstatic int ProcRenderChangePicture (ClientPtr pClient); 6205b261ecSmrgstatic int ProcRenderSetPictureClipRectangles (ClientPtr pClient); 6305b261ecSmrgstatic int ProcRenderFreePicture (ClientPtr pClient); 6405b261ecSmrgstatic int ProcRenderComposite (ClientPtr pClient); 6505b261ecSmrgstatic int ProcRenderScale (ClientPtr pClient); 6605b261ecSmrgstatic int ProcRenderTrapezoids (ClientPtr pClient); 6705b261ecSmrgstatic int ProcRenderTriangles (ClientPtr pClient); 6805b261ecSmrgstatic int ProcRenderTriStrip (ClientPtr pClient); 6905b261ecSmrgstatic int ProcRenderTriFan (ClientPtr pClient); 7005b261ecSmrgstatic int ProcRenderColorTrapezoids (ClientPtr pClient); 7105b261ecSmrgstatic int ProcRenderColorTriangles (ClientPtr pClient); 7205b261ecSmrgstatic int ProcRenderTransform (ClientPtr pClient); 7305b261ecSmrgstatic int ProcRenderCreateGlyphSet (ClientPtr pClient); 7405b261ecSmrgstatic int ProcRenderReferenceGlyphSet (ClientPtr pClient); 7505b261ecSmrgstatic int ProcRenderFreeGlyphSet (ClientPtr pClient); 7605b261ecSmrgstatic int ProcRenderAddGlyphs (ClientPtr pClient); 7705b261ecSmrgstatic int ProcRenderAddGlyphsFromPicture (ClientPtr pClient); 7805b261ecSmrgstatic int ProcRenderFreeGlyphs (ClientPtr pClient); 7905b261ecSmrgstatic int ProcRenderCompositeGlyphs (ClientPtr pClient); 8005b261ecSmrgstatic int ProcRenderFillRectangles (ClientPtr pClient); 8105b261ecSmrgstatic int ProcRenderCreateCursor (ClientPtr pClient); 8205b261ecSmrgstatic int ProcRenderSetPictureTransform (ClientPtr pClient); 8305b261ecSmrgstatic int ProcRenderQueryFilters (ClientPtr pClient); 8405b261ecSmrgstatic int ProcRenderSetPictureFilter (ClientPtr pClient); 8505b261ecSmrgstatic int ProcRenderCreateAnimCursor (ClientPtr pClient); 8605b261ecSmrgstatic int ProcRenderAddTraps (ClientPtr pClient); 8705b261ecSmrgstatic int ProcRenderCreateSolidFill (ClientPtr pClient); 8805b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr pClient); 8905b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr pClient); 9005b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr pClient); 9105b261ecSmrg 9205b261ecSmrgstatic int ProcRenderDispatch (ClientPtr pClient); 9305b261ecSmrg 9405b261ecSmrgstatic int SProcRenderQueryVersion (ClientPtr pClient); 9505b261ecSmrgstatic int SProcRenderQueryPictFormats (ClientPtr pClient); 9605b261ecSmrgstatic int SProcRenderQueryPictIndexValues (ClientPtr pClient); 9705b261ecSmrgstatic int SProcRenderQueryDithers (ClientPtr pClient); 9805b261ecSmrgstatic int SProcRenderCreatePicture (ClientPtr pClient); 9905b261ecSmrgstatic int SProcRenderChangePicture (ClientPtr pClient); 10005b261ecSmrgstatic int SProcRenderSetPictureClipRectangles (ClientPtr pClient); 10105b261ecSmrgstatic int SProcRenderFreePicture (ClientPtr pClient); 10205b261ecSmrgstatic int SProcRenderComposite (ClientPtr pClient); 10305b261ecSmrgstatic int SProcRenderScale (ClientPtr pClient); 10405b261ecSmrgstatic int SProcRenderTrapezoids (ClientPtr pClient); 10505b261ecSmrgstatic int SProcRenderTriangles (ClientPtr pClient); 10605b261ecSmrgstatic int SProcRenderTriStrip (ClientPtr pClient); 10705b261ecSmrgstatic int SProcRenderTriFan (ClientPtr pClient); 10805b261ecSmrgstatic int SProcRenderColorTrapezoids (ClientPtr pClient); 10905b261ecSmrgstatic int SProcRenderColorTriangles (ClientPtr pClient); 11005b261ecSmrgstatic int SProcRenderTransform (ClientPtr pClient); 11105b261ecSmrgstatic int SProcRenderCreateGlyphSet (ClientPtr pClient); 11205b261ecSmrgstatic int SProcRenderReferenceGlyphSet (ClientPtr pClient); 11305b261ecSmrgstatic int SProcRenderFreeGlyphSet (ClientPtr pClient); 11405b261ecSmrgstatic int SProcRenderAddGlyphs (ClientPtr pClient); 11505b261ecSmrgstatic int SProcRenderAddGlyphsFromPicture (ClientPtr pClient); 11605b261ecSmrgstatic int SProcRenderFreeGlyphs (ClientPtr pClient); 11705b261ecSmrgstatic int SProcRenderCompositeGlyphs (ClientPtr pClient); 11805b261ecSmrgstatic int SProcRenderFillRectangles (ClientPtr pClient); 11905b261ecSmrgstatic int SProcRenderCreateCursor (ClientPtr pClient); 12005b261ecSmrgstatic int SProcRenderSetPictureTransform (ClientPtr pClient); 12105b261ecSmrgstatic int SProcRenderQueryFilters (ClientPtr pClient); 12205b261ecSmrgstatic int SProcRenderSetPictureFilter (ClientPtr pClient); 12305b261ecSmrgstatic int SProcRenderCreateAnimCursor (ClientPtr pClient); 12405b261ecSmrgstatic int SProcRenderAddTraps (ClientPtr pClient); 12505b261ecSmrgstatic int SProcRenderCreateSolidFill (ClientPtr pClient); 12605b261ecSmrgstatic int SProcRenderCreateLinearGradient (ClientPtr pClient); 12705b261ecSmrgstatic int SProcRenderCreateRadialGradient (ClientPtr pClient); 12805b261ecSmrgstatic int SProcRenderCreateConicalGradient (ClientPtr pClient); 12905b261ecSmrg 13005b261ecSmrgstatic int SProcRenderDispatch (ClientPtr pClient); 13105b261ecSmrg 13205b261ecSmrgint (*ProcRenderVector[RenderNumberRequests])(ClientPtr) = { 13305b261ecSmrg ProcRenderQueryVersion, 13405b261ecSmrg ProcRenderQueryPictFormats, 13505b261ecSmrg ProcRenderQueryPictIndexValues, 13605b261ecSmrg ProcRenderQueryDithers, 13705b261ecSmrg ProcRenderCreatePicture, 13805b261ecSmrg ProcRenderChangePicture, 13905b261ecSmrg ProcRenderSetPictureClipRectangles, 14005b261ecSmrg ProcRenderFreePicture, 14105b261ecSmrg ProcRenderComposite, 14205b261ecSmrg ProcRenderScale, 14305b261ecSmrg ProcRenderTrapezoids, 14405b261ecSmrg ProcRenderTriangles, 14505b261ecSmrg ProcRenderTriStrip, 14605b261ecSmrg ProcRenderTriFan, 14705b261ecSmrg ProcRenderColorTrapezoids, 14805b261ecSmrg ProcRenderColorTriangles, 14905b261ecSmrg ProcRenderTransform, 15005b261ecSmrg ProcRenderCreateGlyphSet, 15105b261ecSmrg ProcRenderReferenceGlyphSet, 15205b261ecSmrg ProcRenderFreeGlyphSet, 15305b261ecSmrg ProcRenderAddGlyphs, 15405b261ecSmrg ProcRenderAddGlyphsFromPicture, 15505b261ecSmrg ProcRenderFreeGlyphs, 15605b261ecSmrg ProcRenderCompositeGlyphs, 15705b261ecSmrg ProcRenderCompositeGlyphs, 15805b261ecSmrg ProcRenderCompositeGlyphs, 15905b261ecSmrg ProcRenderFillRectangles, 16005b261ecSmrg ProcRenderCreateCursor, 16105b261ecSmrg ProcRenderSetPictureTransform, 16205b261ecSmrg ProcRenderQueryFilters, 16305b261ecSmrg ProcRenderSetPictureFilter, 16405b261ecSmrg ProcRenderCreateAnimCursor, 16505b261ecSmrg ProcRenderAddTraps, 16605b261ecSmrg ProcRenderCreateSolidFill, 16705b261ecSmrg ProcRenderCreateLinearGradient, 16805b261ecSmrg ProcRenderCreateRadialGradient, 16905b261ecSmrg ProcRenderCreateConicalGradient 17005b261ecSmrg}; 17105b261ecSmrg 17205b261ecSmrgint (*SProcRenderVector[RenderNumberRequests])(ClientPtr) = { 17305b261ecSmrg SProcRenderQueryVersion, 17405b261ecSmrg SProcRenderQueryPictFormats, 17505b261ecSmrg SProcRenderQueryPictIndexValues, 17605b261ecSmrg SProcRenderQueryDithers, 17705b261ecSmrg SProcRenderCreatePicture, 17805b261ecSmrg SProcRenderChangePicture, 17905b261ecSmrg SProcRenderSetPictureClipRectangles, 18005b261ecSmrg SProcRenderFreePicture, 18105b261ecSmrg SProcRenderComposite, 18205b261ecSmrg SProcRenderScale, 18305b261ecSmrg SProcRenderTrapezoids, 18405b261ecSmrg SProcRenderTriangles, 18505b261ecSmrg SProcRenderTriStrip, 18605b261ecSmrg SProcRenderTriFan, 18705b261ecSmrg SProcRenderColorTrapezoids, 18805b261ecSmrg SProcRenderColorTriangles, 18905b261ecSmrg SProcRenderTransform, 19005b261ecSmrg SProcRenderCreateGlyphSet, 19105b261ecSmrg SProcRenderReferenceGlyphSet, 19205b261ecSmrg SProcRenderFreeGlyphSet, 19305b261ecSmrg SProcRenderAddGlyphs, 19405b261ecSmrg SProcRenderAddGlyphsFromPicture, 19505b261ecSmrg SProcRenderFreeGlyphs, 19605b261ecSmrg SProcRenderCompositeGlyphs, 19705b261ecSmrg SProcRenderCompositeGlyphs, 19805b261ecSmrg SProcRenderCompositeGlyphs, 19905b261ecSmrg SProcRenderFillRectangles, 20005b261ecSmrg SProcRenderCreateCursor, 20105b261ecSmrg SProcRenderSetPictureTransform, 20205b261ecSmrg SProcRenderQueryFilters, 20305b261ecSmrg SProcRenderSetPictureFilter, 20405b261ecSmrg SProcRenderCreateAnimCursor, 20505b261ecSmrg SProcRenderAddTraps, 20605b261ecSmrg SProcRenderCreateSolidFill, 20705b261ecSmrg SProcRenderCreateLinearGradient, 20805b261ecSmrg SProcRenderCreateRadialGradient, 20905b261ecSmrg SProcRenderCreateConicalGradient 21005b261ecSmrg}; 21105b261ecSmrg 21205b261ecSmrgint RenderErrBase; 2136747b715Smrgstatic DevPrivateKeyRec RenderClientPrivateKeyRec; 2146747b715Smrg#define RenderClientPrivateKey (&RenderClientPrivateKeyRec ) 21505b261ecSmrg 21605b261ecSmrgtypedef struct _RenderClient { 21705b261ecSmrg int major_version; 21805b261ecSmrg int minor_version; 21905b261ecSmrg} RenderClientRec, *RenderClientPtr; 22005b261ecSmrg 2214642e01fSmrg#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey)) 22205b261ecSmrg 22305b261ecSmrgstatic void 22405b261ecSmrgRenderClientCallback (CallbackListPtr *list, 22505b261ecSmrg pointer closure, 22605b261ecSmrg pointer data) 22705b261ecSmrg{ 22805b261ecSmrg NewClientInfoRec *clientinfo = (NewClientInfoRec *) data; 22905b261ecSmrg ClientPtr pClient = clientinfo->client; 23005b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (pClient); 23105b261ecSmrg 23205b261ecSmrg pRenderClient->major_version = 0; 23305b261ecSmrg pRenderClient->minor_version = 0; 23405b261ecSmrg} 23505b261ecSmrg 2366747b715Smrg#ifdef PANORAMIX 2376747b715Smrgunsigned long XRT_PICTURE; 2386747b715Smrg#endif 2396747b715Smrg 24005b261ecSmrgvoid 24105b261ecSmrgRenderExtensionInit (void) 24205b261ecSmrg{ 24305b261ecSmrg ExtensionEntry *extEntry; 24405b261ecSmrg 24505b261ecSmrg if (!PictureType) 24605b261ecSmrg return; 24705b261ecSmrg if (!PictureFinishInit ()) 24805b261ecSmrg return; 2496747b715Smrg if (!dixRegisterPrivateKey(&RenderClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(RenderClientRec))) 25005b261ecSmrg return; 25105b261ecSmrg if (!AddCallback (&ClientStateCallback, RenderClientCallback, 0)) 25205b261ecSmrg return; 25305b261ecSmrg 25405b261ecSmrg extEntry = AddExtension (RENDER_NAME, 0, RenderNumberErrors, 25505b261ecSmrg ProcRenderDispatch, SProcRenderDispatch, 2564642e01fSmrg NULL, StandardMinorOpcode); 25705b261ecSmrg if (!extEntry) 25805b261ecSmrg return; 25905b261ecSmrg RenderErrBase = extEntry->errorBase; 2606747b715Smrg#ifdef PANORAMIX 2616747b715Smrg if (XRT_PICTURE) 2626747b715Smrg SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture); 2636747b715Smrg#endif 2646747b715Smrg SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture); 2656747b715Smrg SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat); 2666747b715Smrg SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet); 26705b261ecSmrg} 26805b261ecSmrg 26905b261ecSmrgstatic int 27005b261ecSmrgProcRenderQueryVersion (ClientPtr client) 27105b261ecSmrg{ 27205b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (client); 27305b261ecSmrg xRenderQueryVersionReply rep; 27405b261ecSmrg register int n; 27505b261ecSmrg REQUEST(xRenderQueryVersionReq); 27605b261ecSmrg 27705b261ecSmrg pRenderClient->major_version = stuff->majorVersion; 27805b261ecSmrg pRenderClient->minor_version = stuff->minorVersion; 27905b261ecSmrg 28005b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryVersionReq); 2816747b715Smrg memset(&rep, 0, sizeof(xRenderQueryVersionReply)); 28205b261ecSmrg rep.type = X_Reply; 28305b261ecSmrg rep.length = 0; 28405b261ecSmrg rep.sequenceNumber = client->sequence; 2856747b715Smrg 2866747b715Smrg if ((stuff->majorVersion * 1000 + stuff->minorVersion) < 2876747b715Smrg (SERVER_RENDER_MAJOR_VERSION * 1000 + SERVER_RENDER_MINOR_VERSION)) 2886747b715Smrg { 2896747b715Smrg rep.majorVersion = stuff->majorVersion; 2906747b715Smrg rep.minorVersion = stuff->minorVersion; 2916747b715Smrg } else 2926747b715Smrg { 2936747b715Smrg rep.majorVersion = SERVER_RENDER_MAJOR_VERSION; 2946747b715Smrg rep.minorVersion = SERVER_RENDER_MINOR_VERSION; 2956747b715Smrg } 2966747b715Smrg 29705b261ecSmrg if (client->swapped) { 29805b261ecSmrg swaps(&rep.sequenceNumber, n); 29905b261ecSmrg swapl(&rep.length, n); 30005b261ecSmrg swapl(&rep.majorVersion, n); 30105b261ecSmrg swapl(&rep.minorVersion, n); 30205b261ecSmrg } 30305b261ecSmrg WriteToClient(client, sizeof(xRenderQueryVersionReply), (char *)&rep); 3046747b715Smrg return Success; 30505b261ecSmrg} 30605b261ecSmrg 30705b261ecSmrgstatic VisualPtr 30805b261ecSmrgfindVisual (ScreenPtr pScreen, VisualID vid) 30905b261ecSmrg{ 31005b261ecSmrg VisualPtr pVisual; 31105b261ecSmrg int v; 31205b261ecSmrg 31305b261ecSmrg for (v = 0; v < pScreen->numVisuals; v++) 31405b261ecSmrg { 31505b261ecSmrg pVisual = pScreen->visuals + v; 31605b261ecSmrg if (pVisual->vid == vid) 31705b261ecSmrg return pVisual; 31805b261ecSmrg } 31905b261ecSmrg return 0; 32005b261ecSmrg} 32105b261ecSmrg 32205b261ecSmrgstatic int 32305b261ecSmrgProcRenderQueryPictFormats (ClientPtr client) 32405b261ecSmrg{ 32505b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (client); 32605b261ecSmrg xRenderQueryPictFormatsReply *reply; 32705b261ecSmrg xPictScreen *pictScreen; 32805b261ecSmrg xPictDepth *pictDepth; 32905b261ecSmrg xPictVisual *pictVisual; 33005b261ecSmrg xPictFormInfo *pictForm; 33105b261ecSmrg CARD32 *pictSubpixel; 33205b261ecSmrg ScreenPtr pScreen; 33305b261ecSmrg VisualPtr pVisual; 33405b261ecSmrg DepthPtr pDepth; 33505b261ecSmrg int v, d; 33605b261ecSmrg PictureScreenPtr ps; 33705b261ecSmrg PictFormatPtr pFormat; 33805b261ecSmrg int nformat; 33905b261ecSmrg int ndepth; 34005b261ecSmrg int nvisual; 34105b261ecSmrg int rlength; 34205b261ecSmrg int s; 34305b261ecSmrg int n; 34405b261ecSmrg int numScreens; 34505b261ecSmrg int numSubpixel; 34605b261ecSmrg/* REQUEST(xRenderQueryPictFormatsReq); */ 34705b261ecSmrg 34805b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq); 34905b261ecSmrg 35005b261ecSmrg#ifdef PANORAMIX 35105b261ecSmrg if (noPanoramiXExtension) 35205b261ecSmrg numScreens = screenInfo.numScreens; 35305b261ecSmrg else 35405b261ecSmrg numScreens = ((xConnSetup *)ConnectionInfo)->numRoots; 35505b261ecSmrg#else 35605b261ecSmrg numScreens = screenInfo.numScreens; 35705b261ecSmrg#endif 35805b261ecSmrg ndepth = nformat = nvisual = 0; 35905b261ecSmrg for (s = 0; s < numScreens; s++) 36005b261ecSmrg { 36105b261ecSmrg pScreen = screenInfo.screens[s]; 36205b261ecSmrg for (d = 0; d < pScreen->numDepths; d++) 36305b261ecSmrg { 36405b261ecSmrg pDepth = pScreen->allowedDepths + d; 36505b261ecSmrg ++ndepth; 36605b261ecSmrg 36705b261ecSmrg for (v = 0; v < pDepth->numVids; v++) 36805b261ecSmrg { 36905b261ecSmrg pVisual = findVisual (pScreen, pDepth->vids[v]); 37005b261ecSmrg if (pVisual && PictureMatchVisual (pScreen, pDepth->depth, pVisual)) 37105b261ecSmrg ++nvisual; 37205b261ecSmrg } 37305b261ecSmrg } 37405b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 37505b261ecSmrg if (ps) 37605b261ecSmrg nformat += ps->nformats; 37705b261ecSmrg } 37805b261ecSmrg if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6) 37905b261ecSmrg numSubpixel = 0; 38005b261ecSmrg else 38105b261ecSmrg numSubpixel = numScreens; 38205b261ecSmrg 38305b261ecSmrg rlength = (sizeof (xRenderQueryPictFormatsReply) + 38405b261ecSmrg nformat * sizeof (xPictFormInfo) + 38505b261ecSmrg numScreens * sizeof (xPictScreen) + 38605b261ecSmrg ndepth * sizeof (xPictDepth) + 38705b261ecSmrg nvisual * sizeof (xPictVisual) + 38805b261ecSmrg numSubpixel * sizeof (CARD32)); 3896747b715Smrg reply = (xRenderQueryPictFormatsReply *) calloc(1, rlength); 39005b261ecSmrg if (!reply) 39105b261ecSmrg return BadAlloc; 39205b261ecSmrg reply->type = X_Reply; 39305b261ecSmrg reply->sequenceNumber = client->sequence; 3946747b715Smrg reply->length = bytes_to_int32(rlength - sizeof(xGenericReply)); 39505b261ecSmrg reply->numFormats = nformat; 39605b261ecSmrg reply->numScreens = numScreens; 39705b261ecSmrg reply->numDepths = ndepth; 39805b261ecSmrg reply->numVisuals = nvisual; 39905b261ecSmrg reply->numSubpixel = numSubpixel; 40005b261ecSmrg 40105b261ecSmrg pictForm = (xPictFormInfo *) (reply + 1); 40205b261ecSmrg 40305b261ecSmrg for (s = 0; s < numScreens; s++) 40405b261ecSmrg { 40505b261ecSmrg pScreen = screenInfo.screens[s]; 40605b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 40705b261ecSmrg if (ps) 40805b261ecSmrg { 40905b261ecSmrg for (nformat = 0, pFormat = ps->formats; 41005b261ecSmrg nformat < ps->nformats; 41105b261ecSmrg nformat++, pFormat++) 41205b261ecSmrg { 41305b261ecSmrg pictForm->id = pFormat->id; 41405b261ecSmrg pictForm->type = pFormat->type; 41505b261ecSmrg pictForm->depth = pFormat->depth; 41605b261ecSmrg pictForm->direct.red = pFormat->direct.red; 41705b261ecSmrg pictForm->direct.redMask = pFormat->direct.redMask; 41805b261ecSmrg pictForm->direct.green = pFormat->direct.green; 41905b261ecSmrg pictForm->direct.greenMask = pFormat->direct.greenMask; 42005b261ecSmrg pictForm->direct.blue = pFormat->direct.blue; 42105b261ecSmrg pictForm->direct.blueMask = pFormat->direct.blueMask; 42205b261ecSmrg pictForm->direct.alpha = pFormat->direct.alpha; 42305b261ecSmrg pictForm->direct.alphaMask = pFormat->direct.alphaMask; 42405b261ecSmrg if (pFormat->type == PictTypeIndexed && pFormat->index.pColormap) 42505b261ecSmrg pictForm->colormap = pFormat->index.pColormap->mid; 42605b261ecSmrg else 42705b261ecSmrg pictForm->colormap = None; 42805b261ecSmrg if (client->swapped) 42905b261ecSmrg { 43005b261ecSmrg swapl (&pictForm->id, n); 43105b261ecSmrg swaps (&pictForm->direct.red, n); 43205b261ecSmrg swaps (&pictForm->direct.redMask, n); 43305b261ecSmrg swaps (&pictForm->direct.green, n); 43405b261ecSmrg swaps (&pictForm->direct.greenMask, n); 43505b261ecSmrg swaps (&pictForm->direct.blue, n); 43605b261ecSmrg swaps (&pictForm->direct.blueMask, n); 43705b261ecSmrg swaps (&pictForm->direct.alpha, n); 43805b261ecSmrg swaps (&pictForm->direct.alphaMask, n); 43905b261ecSmrg swapl (&pictForm->colormap, n); 44005b261ecSmrg } 44105b261ecSmrg pictForm++; 44205b261ecSmrg } 44305b261ecSmrg } 44405b261ecSmrg } 44505b261ecSmrg 44605b261ecSmrg pictScreen = (xPictScreen *) pictForm; 44705b261ecSmrg for (s = 0; s < numScreens; s++) 44805b261ecSmrg { 44905b261ecSmrg pScreen = screenInfo.screens[s]; 45005b261ecSmrg pictDepth = (xPictDepth *) (pictScreen + 1); 45105b261ecSmrg ndepth = 0; 45205b261ecSmrg for (d = 0; d < pScreen->numDepths; d++) 45305b261ecSmrg { 45405b261ecSmrg pictVisual = (xPictVisual *) (pictDepth + 1); 45505b261ecSmrg pDepth = pScreen->allowedDepths + d; 45605b261ecSmrg 45705b261ecSmrg nvisual = 0; 45805b261ecSmrg for (v = 0; v < pDepth->numVids; v++) 45905b261ecSmrg { 46005b261ecSmrg pVisual = findVisual (pScreen, pDepth->vids[v]); 46105b261ecSmrg if (pVisual && (pFormat = PictureMatchVisual (pScreen, 46205b261ecSmrg pDepth->depth, 46305b261ecSmrg pVisual))) 46405b261ecSmrg { 46505b261ecSmrg pictVisual->visual = pVisual->vid; 46605b261ecSmrg pictVisual->format = pFormat->id; 46705b261ecSmrg if (client->swapped) 46805b261ecSmrg { 46905b261ecSmrg swapl (&pictVisual->visual, n); 47005b261ecSmrg swapl (&pictVisual->format, n); 47105b261ecSmrg } 47205b261ecSmrg pictVisual++; 47305b261ecSmrg nvisual++; 47405b261ecSmrg } 47505b261ecSmrg } 47605b261ecSmrg pictDepth->depth = pDepth->depth; 47705b261ecSmrg pictDepth->nPictVisuals = nvisual; 47805b261ecSmrg if (client->swapped) 47905b261ecSmrg { 48005b261ecSmrg swaps (&pictDepth->nPictVisuals, n); 48105b261ecSmrg } 48205b261ecSmrg ndepth++; 48305b261ecSmrg pictDepth = (xPictDepth *) pictVisual; 48405b261ecSmrg } 48505b261ecSmrg pictScreen->nDepth = ndepth; 48605b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 48705b261ecSmrg if (ps) 48805b261ecSmrg pictScreen->fallback = ps->fallback->id; 48905b261ecSmrg else 49005b261ecSmrg pictScreen->fallback = 0; 49105b261ecSmrg if (client->swapped) 49205b261ecSmrg { 49305b261ecSmrg swapl (&pictScreen->nDepth, n); 49405b261ecSmrg swapl (&pictScreen->fallback, n); 49505b261ecSmrg } 49605b261ecSmrg pictScreen = (xPictScreen *) pictDepth; 49705b261ecSmrg } 49805b261ecSmrg pictSubpixel = (CARD32 *) pictScreen; 49905b261ecSmrg 50005b261ecSmrg for (s = 0; s < numSubpixel; s++) 50105b261ecSmrg { 50205b261ecSmrg pScreen = screenInfo.screens[s]; 50305b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 50405b261ecSmrg if (ps) 50505b261ecSmrg *pictSubpixel = ps->subpixel; 50605b261ecSmrg else 50705b261ecSmrg *pictSubpixel = SubPixelUnknown; 50805b261ecSmrg if (client->swapped) 50905b261ecSmrg { 51005b261ecSmrg swapl (pictSubpixel, n); 51105b261ecSmrg } 51205b261ecSmrg ++pictSubpixel; 51305b261ecSmrg } 51405b261ecSmrg 51505b261ecSmrg if (client->swapped) 51605b261ecSmrg { 51705b261ecSmrg swaps (&reply->sequenceNumber, n); 51805b261ecSmrg swapl (&reply->length, n); 51905b261ecSmrg swapl (&reply->numFormats, n); 52005b261ecSmrg swapl (&reply->numScreens, n); 52105b261ecSmrg swapl (&reply->numDepths, n); 52205b261ecSmrg swapl (&reply->numVisuals, n); 52305b261ecSmrg swapl (&reply->numSubpixel, n); 52405b261ecSmrg } 52505b261ecSmrg WriteToClient(client, rlength, (char *) reply); 5266747b715Smrg free(reply); 5276747b715Smrg return Success; 52805b261ecSmrg} 52905b261ecSmrg 53005b261ecSmrgstatic int 53105b261ecSmrgProcRenderQueryPictIndexValues (ClientPtr client) 53205b261ecSmrg{ 53305b261ecSmrg PictFormatPtr pFormat; 5346747b715Smrg int rc, num; 53505b261ecSmrg int rlength; 53605b261ecSmrg int i, n; 53705b261ecSmrg REQUEST(xRenderQueryPictIndexValuesReq); 53805b261ecSmrg xRenderQueryPictIndexValuesReply *reply; 53905b261ecSmrg xIndexValue *values; 54005b261ecSmrg 54105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq); 54205b261ecSmrg 5436747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format, 5446747b715Smrg PictFormatType, client, DixReadAccess); 5456747b715Smrg if (rc != Success) 5466747b715Smrg return rc; 54705b261ecSmrg 54805b261ecSmrg if (pFormat->type != PictTypeIndexed) 54905b261ecSmrg { 55005b261ecSmrg client->errorValue = stuff->format; 55105b261ecSmrg return BadMatch; 55205b261ecSmrg } 55305b261ecSmrg num = pFormat->index.nvalues; 55405b261ecSmrg rlength = (sizeof (xRenderQueryPictIndexValuesReply) + 55505b261ecSmrg num * sizeof(xIndexValue)); 5566747b715Smrg reply = (xRenderQueryPictIndexValuesReply *) malloc(rlength); 55705b261ecSmrg if (!reply) 55805b261ecSmrg return BadAlloc; 55905b261ecSmrg 56005b261ecSmrg reply->type = X_Reply; 56105b261ecSmrg reply->sequenceNumber = client->sequence; 5626747b715Smrg reply->length = bytes_to_int32(rlength - sizeof(xGenericReply)); 56305b261ecSmrg reply->numIndexValues = num; 56405b261ecSmrg 56505b261ecSmrg values = (xIndexValue *) (reply + 1); 56605b261ecSmrg 56705b261ecSmrg memcpy (reply + 1, pFormat->index.pValues, num * sizeof (xIndexValue)); 56805b261ecSmrg 56905b261ecSmrg if (client->swapped) 57005b261ecSmrg { 57105b261ecSmrg for (i = 0; i < num; i++) 57205b261ecSmrg { 57305b261ecSmrg swapl (&values[i].pixel, n); 57405b261ecSmrg swaps (&values[i].red, n); 57505b261ecSmrg swaps (&values[i].green, n); 57605b261ecSmrg swaps (&values[i].blue, n); 57705b261ecSmrg swaps (&values[i].alpha, n); 57805b261ecSmrg } 57905b261ecSmrg swaps (&reply->sequenceNumber, n); 58005b261ecSmrg swapl (&reply->length, n); 58105b261ecSmrg swapl (&reply->numIndexValues, n); 58205b261ecSmrg } 58305b261ecSmrg 58405b261ecSmrg WriteToClient(client, rlength, (char *) reply); 5856747b715Smrg free(reply); 5866747b715Smrg return Success; 58705b261ecSmrg} 58805b261ecSmrg 58905b261ecSmrgstatic int 59005b261ecSmrgProcRenderQueryDithers (ClientPtr client) 59105b261ecSmrg{ 59205b261ecSmrg return BadImplementation; 59305b261ecSmrg} 59405b261ecSmrg 59505b261ecSmrgstatic int 59605b261ecSmrgProcRenderCreatePicture (ClientPtr client) 59705b261ecSmrg{ 59805b261ecSmrg PicturePtr pPicture; 59905b261ecSmrg DrawablePtr pDrawable; 60005b261ecSmrg PictFormatPtr pFormat; 60105b261ecSmrg int len, error, rc; 60205b261ecSmrg REQUEST(xRenderCreatePictureReq); 60305b261ecSmrg 60405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 60505b261ecSmrg 60605b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 60705b261ecSmrg rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0, 6084642e01fSmrg DixReadAccess|DixAddAccess); 60905b261ecSmrg if (rc != Success) 61005b261ecSmrg return rc; 61105b261ecSmrg 6126747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format, 6136747b715Smrg PictFormatType, client, DixReadAccess); 6146747b715Smrg if (rc != Success) 6156747b715Smrg return rc; 6166747b715Smrg 61705b261ecSmrg if (pFormat->depth != pDrawable->depth) 61805b261ecSmrg return BadMatch; 6196747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq)); 62005b261ecSmrg if (Ones(stuff->mask) != len) 62105b261ecSmrg return BadLength; 62205b261ecSmrg 62305b261ecSmrg pPicture = CreatePicture (stuff->pid, 62405b261ecSmrg pDrawable, 62505b261ecSmrg pFormat, 62605b261ecSmrg stuff->mask, 62705b261ecSmrg (XID *) (stuff + 1), 62805b261ecSmrg client, 62905b261ecSmrg &error); 63005b261ecSmrg if (!pPicture) 63105b261ecSmrg return error; 63205b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 63305b261ecSmrg return BadAlloc; 63405b261ecSmrg return Success; 63505b261ecSmrg} 63605b261ecSmrg 63705b261ecSmrgstatic int 63805b261ecSmrgProcRenderChangePicture (ClientPtr client) 63905b261ecSmrg{ 64005b261ecSmrg PicturePtr pPicture; 64105b261ecSmrg REQUEST(xRenderChangePictureReq); 64205b261ecSmrg int len; 64305b261ecSmrg 64405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 6456747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 64605b261ecSmrg 6476747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq)); 64805b261ecSmrg if (Ones(stuff->mask) != len) 64905b261ecSmrg return BadLength; 65005b261ecSmrg 65105b261ecSmrg return ChangePicture (pPicture, stuff->mask, (XID *) (stuff + 1), 65205b261ecSmrg (DevUnion *) 0, client); 65305b261ecSmrg} 65405b261ecSmrg 65505b261ecSmrgstatic int 65605b261ecSmrgProcRenderSetPictureClipRectangles (ClientPtr client) 65705b261ecSmrg{ 65805b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 65905b261ecSmrg PicturePtr pPicture; 66005b261ecSmrg int nr; 66105b261ecSmrg 66205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 6636747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 66405b261ecSmrg if (!pPicture->pDrawable) 66505b261ecSmrg return BadDrawable; 66605b261ecSmrg 6676747b715Smrg nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq); 66805b261ecSmrg if (nr & 4) 66905b261ecSmrg return BadLength; 67005b261ecSmrg nr >>= 3; 6716747b715Smrg return SetPictureClipRects (pPicture, 67205b261ecSmrg stuff->xOrigin, stuff->yOrigin, 67305b261ecSmrg nr, (xRectangle *) &stuff[1]); 67405b261ecSmrg} 67505b261ecSmrg 67605b261ecSmrgstatic int 67705b261ecSmrgProcRenderFreePicture (ClientPtr client) 67805b261ecSmrg{ 67905b261ecSmrg PicturePtr pPicture; 68005b261ecSmrg REQUEST(xRenderFreePictureReq); 68105b261ecSmrg 68205b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 68305b261ecSmrg 6846747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess); 68505b261ecSmrg FreeResource (stuff->picture, RT_NONE); 6866747b715Smrg return Success; 68705b261ecSmrg} 68805b261ecSmrg 68905b261ecSmrgstatic Bool 69005b261ecSmrgPictOpValid (CARD8 op) 69105b261ecSmrg{ 69205b261ecSmrg if (/*PictOpMinimum <= op && */ op <= PictOpMaximum) 69305b261ecSmrg return TRUE; 69405b261ecSmrg if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum) 69505b261ecSmrg return TRUE; 69605b261ecSmrg if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum) 69705b261ecSmrg return TRUE; 6986747b715Smrg if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum) 6996747b715Smrg return TRUE; 70005b261ecSmrg return FALSE; 70105b261ecSmrg} 70205b261ecSmrg 70305b261ecSmrgstatic int 70405b261ecSmrgProcRenderComposite (ClientPtr client) 70505b261ecSmrg{ 70605b261ecSmrg PicturePtr pSrc, pMask, pDst; 70705b261ecSmrg REQUEST(xRenderCompositeReq); 70805b261ecSmrg 70905b261ecSmrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 71005b261ecSmrg if (!PictOpValid (stuff->op)) 71105b261ecSmrg { 71205b261ecSmrg client->errorValue = stuff->op; 71305b261ecSmrg return BadValue; 71405b261ecSmrg } 7156747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 71605b261ecSmrg if (!pDst->pDrawable) 71705b261ecSmrg return BadDrawable; 7186747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 7196747b715Smrg VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess); 72005b261ecSmrg if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) || 72105b261ecSmrg (pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen)) 72205b261ecSmrg return BadMatch; 72305b261ecSmrg CompositePicture (stuff->op, 72405b261ecSmrg pSrc, 72505b261ecSmrg pMask, 72605b261ecSmrg pDst, 72705b261ecSmrg stuff->xSrc, 72805b261ecSmrg stuff->ySrc, 72905b261ecSmrg stuff->xMask, 73005b261ecSmrg stuff->yMask, 73105b261ecSmrg stuff->xDst, 73205b261ecSmrg stuff->yDst, 73305b261ecSmrg stuff->width, 73405b261ecSmrg stuff->height); 73505b261ecSmrg return Success; 73605b261ecSmrg} 73705b261ecSmrg 73805b261ecSmrgstatic int 73905b261ecSmrgProcRenderScale (ClientPtr client) 74005b261ecSmrg{ 74105b261ecSmrg return BadImplementation; 74205b261ecSmrg} 74305b261ecSmrg 74405b261ecSmrgstatic int 74505b261ecSmrgProcRenderTrapezoids (ClientPtr client) 74605b261ecSmrg{ 7476747b715Smrg int rc, ntraps; 74805b261ecSmrg PicturePtr pSrc, pDst; 74905b261ecSmrg PictFormatPtr pFormat; 75005b261ecSmrg REQUEST(xRenderTrapezoidsReq); 75105b261ecSmrg 75205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 75305b261ecSmrg if (!PictOpValid (stuff->op)) 75405b261ecSmrg { 75505b261ecSmrg client->errorValue = stuff->op; 75605b261ecSmrg return BadValue; 75705b261ecSmrg } 7586747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 7596747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 76005b261ecSmrg if (!pDst->pDrawable) 76105b261ecSmrg return BadDrawable; 76205b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 76305b261ecSmrg return BadMatch; 76405b261ecSmrg if (stuff->maskFormat) 76505b261ecSmrg { 7666747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 7676747b715Smrg PictFormatType, client, DixReadAccess); 7686747b715Smrg if (rc != Success) 7696747b715Smrg return rc; 77005b261ecSmrg } 77105b261ecSmrg else 77205b261ecSmrg pFormat = 0; 77305b261ecSmrg ntraps = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq); 77405b261ecSmrg if (ntraps % sizeof (xTrapezoid)) 77505b261ecSmrg return BadLength; 77605b261ecSmrg ntraps /= sizeof (xTrapezoid); 77705b261ecSmrg if (ntraps) 77805b261ecSmrg CompositeTrapezoids (stuff->op, pSrc, pDst, pFormat, 77905b261ecSmrg stuff->xSrc, stuff->ySrc, 78005b261ecSmrg ntraps, (xTrapezoid *) &stuff[1]); 7816747b715Smrg return Success; 78205b261ecSmrg} 78305b261ecSmrg 78405b261ecSmrgstatic int 78505b261ecSmrgProcRenderTriangles (ClientPtr client) 78605b261ecSmrg{ 7876747b715Smrg int rc, ntris; 78805b261ecSmrg PicturePtr pSrc, pDst; 78905b261ecSmrg PictFormatPtr pFormat; 79005b261ecSmrg REQUEST(xRenderTrianglesReq); 79105b261ecSmrg 79205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 79305b261ecSmrg if (!PictOpValid (stuff->op)) 79405b261ecSmrg { 79505b261ecSmrg client->errorValue = stuff->op; 79605b261ecSmrg return BadValue; 79705b261ecSmrg } 7986747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 7996747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 80005b261ecSmrg if (!pDst->pDrawable) 80105b261ecSmrg return BadDrawable; 80205b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 80305b261ecSmrg return BadMatch; 80405b261ecSmrg if (stuff->maskFormat) 80505b261ecSmrg { 8066747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 8076747b715Smrg PictFormatType, client, DixReadAccess); 8086747b715Smrg if (rc != Success) 8096747b715Smrg return rc; 81005b261ecSmrg } 81105b261ecSmrg else 81205b261ecSmrg pFormat = 0; 81305b261ecSmrg ntris = (client->req_len << 2) - sizeof (xRenderTrianglesReq); 81405b261ecSmrg if (ntris % sizeof (xTriangle)) 81505b261ecSmrg return BadLength; 81605b261ecSmrg ntris /= sizeof (xTriangle); 81705b261ecSmrg if (ntris) 81805b261ecSmrg CompositeTriangles (stuff->op, pSrc, pDst, pFormat, 81905b261ecSmrg stuff->xSrc, stuff->ySrc, 82005b261ecSmrg ntris, (xTriangle *) &stuff[1]); 8216747b715Smrg return Success; 82205b261ecSmrg} 82305b261ecSmrg 82405b261ecSmrgstatic int 82505b261ecSmrgProcRenderTriStrip (ClientPtr client) 82605b261ecSmrg{ 8276747b715Smrg int rc, npoints; 82805b261ecSmrg PicturePtr pSrc, pDst; 82905b261ecSmrg PictFormatPtr pFormat; 83005b261ecSmrg REQUEST(xRenderTrianglesReq); 83105b261ecSmrg 83205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 83305b261ecSmrg if (!PictOpValid (stuff->op)) 83405b261ecSmrg { 83505b261ecSmrg client->errorValue = stuff->op; 83605b261ecSmrg return BadValue; 83705b261ecSmrg } 8386747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 8396747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 84005b261ecSmrg if (!pDst->pDrawable) 84105b261ecSmrg return BadDrawable; 84205b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 84305b261ecSmrg return BadMatch; 84405b261ecSmrg if (stuff->maskFormat) 84505b261ecSmrg { 8466747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 8476747b715Smrg PictFormatType, client, DixReadAccess); 8486747b715Smrg if (rc != Success) 8496747b715Smrg return rc; 85005b261ecSmrg } 85105b261ecSmrg else 85205b261ecSmrg pFormat = 0; 85305b261ecSmrg npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq)); 85405b261ecSmrg if (npoints & 4) 8556747b715Smrg return BadLength; 85605b261ecSmrg npoints >>= 3; 85705b261ecSmrg if (npoints >= 3) 85805b261ecSmrg CompositeTriStrip (stuff->op, pSrc, pDst, pFormat, 85905b261ecSmrg stuff->xSrc, stuff->ySrc, 86005b261ecSmrg npoints, (xPointFixed *) &stuff[1]); 8616747b715Smrg return Success; 86205b261ecSmrg} 86305b261ecSmrg 86405b261ecSmrgstatic int 86505b261ecSmrgProcRenderTriFan (ClientPtr client) 86605b261ecSmrg{ 8676747b715Smrg int rc, npoints; 86805b261ecSmrg PicturePtr pSrc, pDst; 86905b261ecSmrg PictFormatPtr pFormat; 87005b261ecSmrg REQUEST(xRenderTrianglesReq); 87105b261ecSmrg 87205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 87305b261ecSmrg if (!PictOpValid (stuff->op)) 87405b261ecSmrg { 87505b261ecSmrg client->errorValue = stuff->op; 87605b261ecSmrg return BadValue; 87705b261ecSmrg } 8786747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 8796747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 88005b261ecSmrg if (!pDst->pDrawable) 88105b261ecSmrg return BadDrawable; 88205b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 88305b261ecSmrg return BadMatch; 88405b261ecSmrg if (stuff->maskFormat) 88505b261ecSmrg { 8866747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 8876747b715Smrg PictFormatType, client, DixReadAccess); 8886747b715Smrg if (rc != Success) 8896747b715Smrg return rc; 89005b261ecSmrg } 89105b261ecSmrg else 89205b261ecSmrg pFormat = 0; 89305b261ecSmrg npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq)); 89405b261ecSmrg if (npoints & 4) 8956747b715Smrg return BadLength; 89605b261ecSmrg npoints >>= 3; 89705b261ecSmrg if (npoints >= 3) 89805b261ecSmrg CompositeTriFan (stuff->op, pSrc, pDst, pFormat, 89905b261ecSmrg stuff->xSrc, stuff->ySrc, 90005b261ecSmrg npoints, (xPointFixed *) &stuff[1]); 9016747b715Smrg return Success; 90205b261ecSmrg} 90305b261ecSmrg 90405b261ecSmrgstatic int 90505b261ecSmrgProcRenderColorTrapezoids (ClientPtr client) 90605b261ecSmrg{ 90705b261ecSmrg return BadImplementation; 90805b261ecSmrg} 90905b261ecSmrg 91005b261ecSmrgstatic int 91105b261ecSmrgProcRenderColorTriangles (ClientPtr client) 91205b261ecSmrg{ 91305b261ecSmrg return BadImplementation; 91405b261ecSmrg} 91505b261ecSmrg 91605b261ecSmrgstatic int 91705b261ecSmrgProcRenderTransform (ClientPtr client) 91805b261ecSmrg{ 91905b261ecSmrg return BadImplementation; 92005b261ecSmrg} 92105b261ecSmrg 92205b261ecSmrgstatic int 92305b261ecSmrgProcRenderCreateGlyphSet (ClientPtr client) 92405b261ecSmrg{ 92505b261ecSmrg GlyphSetPtr glyphSet; 92605b261ecSmrg PictFormatPtr format; 9274642e01fSmrg int rc, f; 92805b261ecSmrg REQUEST(xRenderCreateGlyphSetReq); 92905b261ecSmrg 93005b261ecSmrg REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq); 93105b261ecSmrg 93205b261ecSmrg LEGAL_NEW_RESOURCE(stuff->gsid, client); 9336747b715Smrg rc = dixLookupResourceByType((pointer *)&format, stuff->format, 9346747b715Smrg PictFormatType, client, DixReadAccess); 9356747b715Smrg if (rc != Success) 9366747b715Smrg return rc; 9376747b715Smrg 93805b261ecSmrg switch (format->depth) { 93905b261ecSmrg case 1: 94005b261ecSmrg f = GlyphFormat1; 94105b261ecSmrg break; 94205b261ecSmrg case 4: 94305b261ecSmrg f = GlyphFormat4; 94405b261ecSmrg break; 94505b261ecSmrg case 8: 94605b261ecSmrg f = GlyphFormat8; 94705b261ecSmrg break; 94805b261ecSmrg case 16: 94905b261ecSmrg f = GlyphFormat16; 95005b261ecSmrg break; 95105b261ecSmrg case 32: 95205b261ecSmrg f = GlyphFormat32; 95305b261ecSmrg break; 95405b261ecSmrg default: 95505b261ecSmrg return BadMatch; 95605b261ecSmrg } 95705b261ecSmrg if (format->type != PictTypeDirect) 95805b261ecSmrg return BadMatch; 95905b261ecSmrg glyphSet = AllocateGlyphSet (f, format); 96005b261ecSmrg if (!glyphSet) 96105b261ecSmrg return BadAlloc; 9624642e01fSmrg /* security creation/labeling check */ 9634642e01fSmrg rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType, 9644642e01fSmrg glyphSet, RT_NONE, NULL, DixCreateAccess); 9654642e01fSmrg if (rc != Success) 9664642e01fSmrg return rc; 96705b261ecSmrg if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet)) 96805b261ecSmrg return BadAlloc; 96905b261ecSmrg return Success; 97005b261ecSmrg} 97105b261ecSmrg 97205b261ecSmrgstatic int 97305b261ecSmrgProcRenderReferenceGlyphSet (ClientPtr client) 97405b261ecSmrg{ 97505b261ecSmrg GlyphSetPtr glyphSet; 9764642e01fSmrg int rc; 97705b261ecSmrg REQUEST(xRenderReferenceGlyphSetReq); 97805b261ecSmrg 97905b261ecSmrg REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq); 98005b261ecSmrg 98105b261ecSmrg LEGAL_NEW_RESOURCE(stuff->gsid, client); 98205b261ecSmrg 983b86d567bSmrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->existing, GlyphSetType, 9844642e01fSmrg client, DixGetAttrAccess); 9854642e01fSmrg if (rc != Success) 98605b261ecSmrg { 98705b261ecSmrg client->errorValue = stuff->existing; 9886747b715Smrg return rc; 98905b261ecSmrg } 99005b261ecSmrg glyphSet->refcnt++; 99105b261ecSmrg if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet)) 99205b261ecSmrg return BadAlloc; 9936747b715Smrg return Success; 99405b261ecSmrg} 99505b261ecSmrg 99605b261ecSmrg#define NLOCALDELTA 64 99705b261ecSmrg#define NLOCALGLYPH 256 99805b261ecSmrg 99905b261ecSmrgstatic int 100005b261ecSmrgProcRenderFreeGlyphSet (ClientPtr client) 100105b261ecSmrg{ 100205b261ecSmrg GlyphSetPtr glyphSet; 10034642e01fSmrg int rc; 100405b261ecSmrg REQUEST(xRenderFreeGlyphSetReq); 100505b261ecSmrg 100605b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq); 1007b86d567bSmrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 10084642e01fSmrg client, DixDestroyAccess); 10094642e01fSmrg if (rc != Success) 101005b261ecSmrg { 101105b261ecSmrg client->errorValue = stuff->glyphset; 10126747b715Smrg return rc; 101305b261ecSmrg } 101405b261ecSmrg FreeResource (stuff->glyphset, RT_NONE); 10156747b715Smrg return Success; 101605b261ecSmrg} 101705b261ecSmrg 101805b261ecSmrgtypedef struct _GlyphNew { 10194642e01fSmrg Glyph id; 10204642e01fSmrg GlyphPtr glyph; 10214642e01fSmrg Bool found; 10224642e01fSmrg unsigned char sha1[20]; 102305b261ecSmrg} GlyphNewRec, *GlyphNewPtr; 102405b261ecSmrg 10254642e01fSmrg#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0) 10264642e01fSmrg 102705b261ecSmrgstatic int 102805b261ecSmrgProcRenderAddGlyphs (ClientPtr client) 102905b261ecSmrg{ 103005b261ecSmrg GlyphSetPtr glyphSet; 103105b261ecSmrg REQUEST(xRenderAddGlyphsReq); 103205b261ecSmrg GlyphNewRec glyphsLocal[NLOCALGLYPH]; 10334642e01fSmrg GlyphNewPtr glyphsBase, glyphs, glyph_new; 103405b261ecSmrg int remain, nglyphs; 103505b261ecSmrg CARD32 *gids; 103605b261ecSmrg xGlyphInfo *gi; 103705b261ecSmrg CARD8 *bits; 10386747b715Smrg unsigned int size; 10394642e01fSmrg int err; 10404642e01fSmrg int i, screen; 10414642e01fSmrg PicturePtr pSrc = NULL, pDst = NULL; 10424642e01fSmrg PixmapPtr pSrcPix = NULL, pDstPix = NULL; 10434642e01fSmrg CARD32 component_alpha; 104405b261ecSmrg 104505b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq); 1046b86d567bSmrg err = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 10474642e01fSmrg client, DixAddAccess); 10484642e01fSmrg if (err != Success) 104905b261ecSmrg { 105005b261ecSmrg client->errorValue = stuff->glyphset; 10516747b715Smrg return err; 105205b261ecSmrg } 105305b261ecSmrg 10544642e01fSmrg err = BadAlloc; 105505b261ecSmrg nglyphs = stuff->nglyphs; 105605b261ecSmrg if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec)) 105705b261ecSmrg return BadAlloc; 105805b261ecSmrg 10594642e01fSmrg component_alpha = NeedsComponent (glyphSet->format->format); 10604642e01fSmrg 10614642e01fSmrg if (nglyphs <= NLOCALGLYPH) { 10624642e01fSmrg memset (glyphsLocal, 0, sizeof (glyphsLocal)); 106305b261ecSmrg glyphsBase = glyphsLocal; 10644642e01fSmrg } 106505b261ecSmrg else 106605b261ecSmrg { 10676747b715Smrg glyphsBase = (GlyphNewPtr)calloc(nglyphs, sizeof (GlyphNewRec)); 106805b261ecSmrg if (!glyphsBase) 106905b261ecSmrg return BadAlloc; 107005b261ecSmrg } 107105b261ecSmrg 107205b261ecSmrg remain = (client->req_len << 2) - sizeof (xRenderAddGlyphsReq); 107305b261ecSmrg 107405b261ecSmrg glyphs = glyphsBase; 107505b261ecSmrg 107605b261ecSmrg gids = (CARD32 *) (stuff + 1); 107705b261ecSmrg gi = (xGlyphInfo *) (gids + nglyphs); 107805b261ecSmrg bits = (CARD8 *) (gi + nglyphs); 107905b261ecSmrg remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs; 10806747b715Smrg 10816747b715Smrg /* protect against bad nglyphs */ 10826747b715Smrg if (gi < stuff || gi > ((CARD32 *)stuff + client->req_len) || 10836747b715Smrg bits < stuff || bits > ((CARD32 *)stuff + client->req_len)) { 10846747b715Smrg err = BadLength; 10856747b715Smrg goto bail; 10866747b715Smrg } 10876747b715Smrg 10884642e01fSmrg for (i = 0; i < nglyphs; i++) 108905b261ecSmrg { 10904642e01fSmrg size_t padded_width; 10914642e01fSmrg glyph_new = &glyphs[i]; 10924642e01fSmrg 10934642e01fSmrg padded_width = PixmapBytePad (gi[i].width, 10944642e01fSmrg glyphSet->format->depth); 10954642e01fSmrg 10964642e01fSmrg if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height) 10974642e01fSmrg break; 109805b261ecSmrg 10994642e01fSmrg size = gi[i].height * padded_width; 110005b261ecSmrg if (remain < size) 110105b261ecSmrg break; 11024642e01fSmrg 11034642e01fSmrg err = HashGlyph (&gi[i], bits, size, glyph_new->sha1); 11044642e01fSmrg if (err) 11054642e01fSmrg goto bail; 11064642e01fSmrg 11074642e01fSmrg glyph_new->glyph = FindGlyphByHash (glyph_new->sha1, 11084642e01fSmrg glyphSet->fdepth); 11094642e01fSmrg 11104642e01fSmrg if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph) 11114642e01fSmrg { 11124642e01fSmrg glyph_new->found = TRUE; 11134642e01fSmrg } 11144642e01fSmrg else 11154642e01fSmrg { 11164642e01fSmrg GlyphPtr glyph; 11174642e01fSmrg 11184642e01fSmrg glyph_new->found = FALSE; 11194642e01fSmrg glyph_new->glyph = glyph = AllocateGlyph (&gi[i], glyphSet->fdepth); 11204642e01fSmrg if (! glyph) 11214642e01fSmrg { 11224642e01fSmrg err = BadAlloc; 11234642e01fSmrg goto bail; 11244642e01fSmrg } 11254642e01fSmrg 11264642e01fSmrg for (screen = 0; screen < screenInfo.numScreens; screen++) 11274642e01fSmrg { 11284642e01fSmrg int width = gi[i].width; 11294642e01fSmrg int height = gi[i].height; 11304642e01fSmrg int depth = glyphSet->format->depth; 11314642e01fSmrg ScreenPtr pScreen; 11324642e01fSmrg int error; 11334642e01fSmrg 11346747b715Smrg /* Skip work if it's invisibly small anyway */ 11356747b715Smrg if (!width || !height) 11366747b715Smrg break; 11376747b715Smrg 11384642e01fSmrg pScreen = screenInfo.screens[screen]; 11394642e01fSmrg pSrcPix = GetScratchPixmapHeader (pScreen, 11404642e01fSmrg width, height, 11414642e01fSmrg depth, depth, 11424642e01fSmrg -1, bits); 11434642e01fSmrg if (! pSrcPix) 11444642e01fSmrg { 11454642e01fSmrg err = BadAlloc; 11464642e01fSmrg goto bail; 11474642e01fSmrg } 11484642e01fSmrg 11494642e01fSmrg pSrc = CreatePicture (0, &pSrcPix->drawable, 11504642e01fSmrg glyphSet->format, 0, NULL, 11514642e01fSmrg serverClient, &error); 11524642e01fSmrg if (! pSrc) 11534642e01fSmrg { 11544642e01fSmrg err = BadAlloc; 11554642e01fSmrg goto bail; 11564642e01fSmrg } 11574642e01fSmrg 11584642e01fSmrg pDstPix = (pScreen->CreatePixmap) (pScreen, 11594642e01fSmrg width, height, depth, 11604642e01fSmrg CREATE_PIXMAP_USAGE_GLYPH_PICTURE); 11614642e01fSmrg 11626747b715Smrg if (!pDstPix) 11636747b715Smrg { 11646747b715Smrg err = BadAlloc; 11656747b715Smrg goto bail; 11666747b715Smrg } 11676747b715Smrg 11684642e01fSmrg GlyphPicture (glyph)[screen] = pDst = 11694642e01fSmrg CreatePicture (0, &pDstPix->drawable, 11704642e01fSmrg glyphSet->format, 11714642e01fSmrg CPComponentAlpha, &component_alpha, 11724642e01fSmrg serverClient, &error); 11734642e01fSmrg 11744642e01fSmrg /* The picture takes a reference to the pixmap, so we 11754642e01fSmrg drop ours. */ 11764642e01fSmrg (pScreen->DestroyPixmap) (pDstPix); 11776747b715Smrg pDstPix = NULL; 11784642e01fSmrg 11794642e01fSmrg if (! pDst) 11804642e01fSmrg { 11814642e01fSmrg err = BadAlloc; 11824642e01fSmrg goto bail; 11834642e01fSmrg } 11844642e01fSmrg 11854642e01fSmrg CompositePicture (PictOpSrc, 11864642e01fSmrg pSrc, 11874642e01fSmrg None, 11884642e01fSmrg pDst, 11894642e01fSmrg 0, 0, 11904642e01fSmrg 0, 0, 11914642e01fSmrg 0, 0, 11924642e01fSmrg width, height); 11934642e01fSmrg 11944642e01fSmrg FreePicture ((pointer) pSrc, 0); 11954642e01fSmrg pSrc = NULL; 11964642e01fSmrg FreeScratchPixmapHeader (pSrcPix); 11974642e01fSmrg pSrcPix = NULL; 11984642e01fSmrg } 11994642e01fSmrg 12004642e01fSmrg memcpy (glyph_new->glyph->sha1, glyph_new->sha1, 20); 12014642e01fSmrg } 12024642e01fSmrg 12034642e01fSmrg glyph_new->id = gids[i]; 120405b261ecSmrg 120505b261ecSmrg if (size & 3) 120605b261ecSmrg size += 4 - (size & 3); 120705b261ecSmrg bits += size; 120805b261ecSmrg remain -= size; 120905b261ecSmrg } 12104642e01fSmrg if (remain || i < nglyphs) 121105b261ecSmrg { 121205b261ecSmrg err = BadLength; 121305b261ecSmrg goto bail; 121405b261ecSmrg } 121505b261ecSmrg if (!ResizeGlyphSet (glyphSet, nglyphs)) 121605b261ecSmrg { 121705b261ecSmrg err = BadAlloc; 121805b261ecSmrg goto bail; 121905b261ecSmrg } 12204642e01fSmrg for (i = 0; i < nglyphs; i++) 12214642e01fSmrg AddGlyph (glyphSet, glyphs[i].glyph, glyphs[i].id); 122205b261ecSmrg 122305b261ecSmrg if (glyphsBase != glyphsLocal) 12246747b715Smrg free(glyphsBase); 12256747b715Smrg return Success; 122605b261ecSmrgbail: 12274642e01fSmrg if (pSrc) 12284642e01fSmrg FreePicture ((pointer) pSrc, 0); 12294642e01fSmrg if (pSrcPix) 12304642e01fSmrg FreeScratchPixmapHeader (pSrcPix); 12314642e01fSmrg for (i = 0; i < nglyphs; i++) 12324642e01fSmrg if (glyphs[i].glyph && ! glyphs[i].found) 12336747b715Smrg free(glyphs[i].glyph); 123405b261ecSmrg if (glyphsBase != glyphsLocal) 12356747b715Smrg free(glyphsBase); 123605b261ecSmrg return err; 123705b261ecSmrg} 123805b261ecSmrg 123905b261ecSmrgstatic int 124005b261ecSmrgProcRenderAddGlyphsFromPicture (ClientPtr client) 124105b261ecSmrg{ 124205b261ecSmrg return BadImplementation; 124305b261ecSmrg} 124405b261ecSmrg 124505b261ecSmrgstatic int 124605b261ecSmrgProcRenderFreeGlyphs (ClientPtr client) 124705b261ecSmrg{ 124805b261ecSmrg REQUEST(xRenderFreeGlyphsReq); 124905b261ecSmrg GlyphSetPtr glyphSet; 12504642e01fSmrg int rc, nglyph; 125105b261ecSmrg CARD32 *gids; 125205b261ecSmrg CARD32 glyph; 125305b261ecSmrg 125405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq); 1255b86d567bSmrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 12564642e01fSmrg client, DixRemoveAccess); 12574642e01fSmrg if (rc != Success) 125805b261ecSmrg { 125905b261ecSmrg client->errorValue = stuff->glyphset; 12606747b715Smrg return rc; 126105b261ecSmrg } 12626747b715Smrg nglyph = bytes_to_int32((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq)); 126305b261ecSmrg gids = (CARD32 *) (stuff + 1); 126405b261ecSmrg while (nglyph-- > 0) 126505b261ecSmrg { 126605b261ecSmrg glyph = *gids++; 126705b261ecSmrg if (!DeleteGlyph (glyphSet, glyph)) 126805b261ecSmrg { 126905b261ecSmrg client->errorValue = glyph; 127005b261ecSmrg return RenderErrBase + BadGlyph; 127105b261ecSmrg } 127205b261ecSmrg } 12736747b715Smrg return Success; 127405b261ecSmrg} 127505b261ecSmrg 127605b261ecSmrgstatic int 127705b261ecSmrgProcRenderCompositeGlyphs (ClientPtr client) 127805b261ecSmrg{ 127905b261ecSmrg GlyphSetPtr glyphSet; 128005b261ecSmrg GlyphSet gs; 128105b261ecSmrg PicturePtr pSrc, pDst; 128205b261ecSmrg PictFormatPtr pFormat; 128305b261ecSmrg GlyphListRec listsLocal[NLOCALDELTA]; 128405b261ecSmrg GlyphListPtr lists, listsBase; 128505b261ecSmrg GlyphPtr glyphsLocal[NLOCALGLYPH]; 128605b261ecSmrg Glyph glyph; 128705b261ecSmrg GlyphPtr *glyphs, *glyphsBase; 128805b261ecSmrg xGlyphElt *elt; 128905b261ecSmrg CARD8 *buffer, *end; 129005b261ecSmrg int nglyph; 129105b261ecSmrg int nlist; 129205b261ecSmrg int space; 129305b261ecSmrg int size; 12946747b715Smrg int rc, n; 129505b261ecSmrg 129605b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 129705b261ecSmrg 129805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 129905b261ecSmrg 130005b261ecSmrg switch (stuff->renderReqType) { 130105b261ecSmrg default: size = 1; break; 130205b261ecSmrg case X_RenderCompositeGlyphs16: size = 2; break; 130305b261ecSmrg case X_RenderCompositeGlyphs32: size = 4; break; 130405b261ecSmrg } 130505b261ecSmrg 130605b261ecSmrg if (!PictOpValid (stuff->op)) 130705b261ecSmrg { 130805b261ecSmrg client->errorValue = stuff->op; 130905b261ecSmrg return BadValue; 131005b261ecSmrg } 13116747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 13126747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 131305b261ecSmrg if (!pDst->pDrawable) 131405b261ecSmrg return BadDrawable; 131505b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 131605b261ecSmrg return BadMatch; 131705b261ecSmrg if (stuff->maskFormat) 131805b261ecSmrg { 13196747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 13206747b715Smrg PictFormatType, client, DixReadAccess); 13216747b715Smrg if (rc != Success) 13226747b715Smrg return rc; 132305b261ecSmrg } 132405b261ecSmrg else 132505b261ecSmrg pFormat = 0; 132605b261ecSmrg 13276747b715Smrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, 13286747b715Smrg GlyphSetType, client, DixUseAccess); 13296747b715Smrg if (rc != Success) 13306747b715Smrg return rc; 133105b261ecSmrg 133205b261ecSmrg buffer = (CARD8 *) (stuff + 1); 133305b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 133405b261ecSmrg nglyph = 0; 133505b261ecSmrg nlist = 0; 133605b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 133705b261ecSmrg { 133805b261ecSmrg elt = (xGlyphElt *) buffer; 133905b261ecSmrg buffer += sizeof (xGlyphElt); 134005b261ecSmrg 134105b261ecSmrg if (elt->len == 0xff) 134205b261ecSmrg { 134305b261ecSmrg buffer += 4; 134405b261ecSmrg } 134505b261ecSmrg else 134605b261ecSmrg { 134705b261ecSmrg nlist++; 134805b261ecSmrg nglyph += elt->len; 134905b261ecSmrg space = size * elt->len; 135005b261ecSmrg if (space & 3) 135105b261ecSmrg space += 4 - (space & 3); 135205b261ecSmrg buffer += space; 135305b261ecSmrg } 135405b261ecSmrg } 135505b261ecSmrg if (nglyph <= NLOCALGLYPH) 135605b261ecSmrg glyphsBase = glyphsLocal; 135705b261ecSmrg else 135805b261ecSmrg { 13596747b715Smrg glyphsBase = (GlyphPtr *) malloc(nglyph * sizeof (GlyphPtr)); 136005b261ecSmrg if (!glyphsBase) 136105b261ecSmrg return BadAlloc; 136205b261ecSmrg } 136305b261ecSmrg if (nlist <= NLOCALDELTA) 136405b261ecSmrg listsBase = listsLocal; 136505b261ecSmrg else 136605b261ecSmrg { 13676747b715Smrg listsBase = (GlyphListPtr) malloc(nlist * sizeof (GlyphListRec)); 136805b261ecSmrg if (!listsBase) 136905b261ecSmrg return BadAlloc; 137005b261ecSmrg } 137105b261ecSmrg buffer = (CARD8 *) (stuff + 1); 137205b261ecSmrg glyphs = glyphsBase; 137305b261ecSmrg lists = listsBase; 137405b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 137505b261ecSmrg { 137605b261ecSmrg elt = (xGlyphElt *) buffer; 137705b261ecSmrg buffer += sizeof (xGlyphElt); 137805b261ecSmrg 137905b261ecSmrg if (elt->len == 0xff) 138005b261ecSmrg { 138105b261ecSmrg if (buffer + sizeof (GlyphSet) < end) 138205b261ecSmrg { 138305b261ecSmrg memcpy(&gs, buffer, sizeof(GlyphSet)); 13846747b715Smrg rc = dixLookupResourceByType((pointer *)&glyphSet, gs, 13856747b715Smrg GlyphSetType, client, 13866747b715Smrg DixUseAccess); 13876747b715Smrg if (rc != Success) 138805b261ecSmrg { 138905b261ecSmrg if (glyphsBase != glyphsLocal) 13906747b715Smrg free(glyphsBase); 139105b261ecSmrg if (listsBase != listsLocal) 13926747b715Smrg free(listsBase); 13936747b715Smrg return rc; 139405b261ecSmrg } 139505b261ecSmrg } 139605b261ecSmrg buffer += 4; 139705b261ecSmrg } 139805b261ecSmrg else 139905b261ecSmrg { 140005b261ecSmrg lists->xOff = elt->deltax; 140105b261ecSmrg lists->yOff = elt->deltay; 140205b261ecSmrg lists->format = glyphSet->format; 140305b261ecSmrg lists->len = 0; 140405b261ecSmrg n = elt->len; 140505b261ecSmrg while (n--) 140605b261ecSmrg { 140705b261ecSmrg if (buffer + size <= end) 140805b261ecSmrg { 140905b261ecSmrg switch (size) { 141005b261ecSmrg case 1: 141105b261ecSmrg glyph = *((CARD8 *)buffer); break; 141205b261ecSmrg case 2: 141305b261ecSmrg glyph = *((CARD16 *)buffer); break; 141405b261ecSmrg case 4: 141505b261ecSmrg default: 141605b261ecSmrg glyph = *((CARD32 *)buffer); break; 141705b261ecSmrg } 141805b261ecSmrg if ((*glyphs = FindGlyph (glyphSet, glyph))) 141905b261ecSmrg { 142005b261ecSmrg lists->len++; 142105b261ecSmrg glyphs++; 142205b261ecSmrg } 142305b261ecSmrg } 142405b261ecSmrg buffer += size; 142505b261ecSmrg } 142605b261ecSmrg space = size * elt->len; 142705b261ecSmrg if (space & 3) 142805b261ecSmrg buffer += 4 - (space & 3); 142905b261ecSmrg lists++; 143005b261ecSmrg } 143105b261ecSmrg } 143205b261ecSmrg if (buffer > end) 143305b261ecSmrg return BadLength; 143405b261ecSmrg 143505b261ecSmrg CompositeGlyphs (stuff->op, 143605b261ecSmrg pSrc, 143705b261ecSmrg pDst, 143805b261ecSmrg pFormat, 143905b261ecSmrg stuff->xSrc, 144005b261ecSmrg stuff->ySrc, 144105b261ecSmrg nlist, 144205b261ecSmrg listsBase, 144305b261ecSmrg glyphsBase); 144405b261ecSmrg 144505b261ecSmrg if (glyphsBase != glyphsLocal) 14466747b715Smrg free(glyphsBase); 144705b261ecSmrg if (listsBase != listsLocal) 14486747b715Smrg free(listsBase); 144905b261ecSmrg 14506747b715Smrg return Success; 145105b261ecSmrg} 145205b261ecSmrg 145305b261ecSmrgstatic int 145405b261ecSmrgProcRenderFillRectangles (ClientPtr client) 145505b261ecSmrg{ 145605b261ecSmrg PicturePtr pDst; 145705b261ecSmrg int things; 145805b261ecSmrg REQUEST(xRenderFillRectanglesReq); 145905b261ecSmrg 146005b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 146105b261ecSmrg if (!PictOpValid (stuff->op)) 146205b261ecSmrg { 146305b261ecSmrg client->errorValue = stuff->op; 146405b261ecSmrg return BadValue; 146505b261ecSmrg } 14666747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 146705b261ecSmrg if (!pDst->pDrawable) 146805b261ecSmrg return BadDrawable; 146905b261ecSmrg 147005b261ecSmrg things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq); 147105b261ecSmrg if (things & 4) 14726747b715Smrg return BadLength; 147305b261ecSmrg things >>= 3; 147405b261ecSmrg 147505b261ecSmrg CompositeRects (stuff->op, 147605b261ecSmrg pDst, 147705b261ecSmrg &stuff->color, 147805b261ecSmrg things, 147905b261ecSmrg (xRectangle *) &stuff[1]); 148005b261ecSmrg 14816747b715Smrg return Success; 148205b261ecSmrg} 148305b261ecSmrg 148405b261ecSmrgstatic void 14856747b715SmrgRenderSetBit (unsigned char *line, int x, int bit) 148605b261ecSmrg{ 148705b261ecSmrg unsigned char mask; 148805b261ecSmrg 148905b261ecSmrg if (screenInfo.bitmapBitOrder == LSBFirst) 149005b261ecSmrg mask = (1 << (x & 7)); 149105b261ecSmrg else 149205b261ecSmrg mask = (0x80 >> (x & 7)); 149305b261ecSmrg /* XXX assumes byte order is host byte order */ 149405b261ecSmrg line += (x >> 3); 149505b261ecSmrg if (bit) 149605b261ecSmrg *line |= mask; 149705b261ecSmrg else 149805b261ecSmrg *line &= ~mask; 149905b261ecSmrg} 150005b261ecSmrg 150105b261ecSmrg#define DITHER_DIM 2 150205b261ecSmrg 150305b261ecSmrgstatic CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = { 150405b261ecSmrg { 1, 3, }, 150505b261ecSmrg { 4, 2, }, 150605b261ecSmrg}; 150705b261ecSmrg 150805b261ecSmrg#define DITHER_SIZE ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1) 150905b261ecSmrg 151005b261ecSmrgstatic int 151105b261ecSmrgProcRenderCreateCursor (ClientPtr client) 151205b261ecSmrg{ 151305b261ecSmrg REQUEST(xRenderCreateCursorReq); 151405b261ecSmrg PicturePtr pSrc; 151505b261ecSmrg ScreenPtr pScreen; 151605b261ecSmrg unsigned short width, height; 151705b261ecSmrg CARD32 *argbbits, *argb; 151805b261ecSmrg unsigned char *srcbits, *srcline; 151905b261ecSmrg unsigned char *mskbits, *mskline; 152005b261ecSmrg int stride; 152105b261ecSmrg int x, y; 152205b261ecSmrg int nbytes_mono; 152305b261ecSmrg CursorMetricRec cm; 152405b261ecSmrg CursorPtr pCursor; 152505b261ecSmrg CARD32 twocolor[3]; 15264642e01fSmrg int rc, ncolor; 152705b261ecSmrg 152805b261ecSmrg REQUEST_SIZE_MATCH (xRenderCreateCursorReq); 152905b261ecSmrg LEGAL_NEW_RESOURCE(stuff->cid, client); 153005b261ecSmrg 15316747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 153205b261ecSmrg if (!pSrc->pDrawable) 153305b261ecSmrg return BadDrawable; 153405b261ecSmrg pScreen = pSrc->pDrawable->pScreen; 153505b261ecSmrg width = pSrc->pDrawable->width; 153605b261ecSmrg height = pSrc->pDrawable->height; 153705b261ecSmrg if (height && width > UINT32_MAX/(height*sizeof(CARD32))) 153805b261ecSmrg return BadAlloc; 153905b261ecSmrg if ( stuff->x > width 154005b261ecSmrg || stuff->y > height ) 15416747b715Smrg return BadMatch; 15426747b715Smrg argbbits = malloc(width * height * sizeof (CARD32)); 154305b261ecSmrg if (!argbbits) 15446747b715Smrg return BadAlloc; 154505b261ecSmrg 154605b261ecSmrg stride = BitmapBytePad(width); 154705b261ecSmrg nbytes_mono = stride*height; 15486747b715Smrg srcbits = calloc(1, nbytes_mono); 154905b261ecSmrg if (!srcbits) 155005b261ecSmrg { 15516747b715Smrg free(argbbits); 15526747b715Smrg return BadAlloc; 155305b261ecSmrg } 15546747b715Smrg mskbits = calloc(1, nbytes_mono); 155505b261ecSmrg if (!mskbits) 155605b261ecSmrg { 15576747b715Smrg free(argbbits); 15586747b715Smrg free(srcbits); 15596747b715Smrg return BadAlloc; 156005b261ecSmrg } 156105b261ecSmrg 156205b261ecSmrg if (pSrc->format == PICT_a8r8g8b8) 156305b261ecSmrg { 156405b261ecSmrg (*pScreen->GetImage) (pSrc->pDrawable, 156505b261ecSmrg 0, 0, width, height, ZPixmap, 156605b261ecSmrg 0xffffffff, (pointer) argbbits); 156705b261ecSmrg } 156805b261ecSmrg else 156905b261ecSmrg { 157005b261ecSmrg PixmapPtr pPixmap; 157105b261ecSmrg PicturePtr pPicture; 157205b261ecSmrg PictFormatPtr pFormat; 157305b261ecSmrg int error; 157405b261ecSmrg 157505b261ecSmrg pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8); 157605b261ecSmrg if (!pFormat) 157705b261ecSmrg { 15786747b715Smrg free(argbbits); 15796747b715Smrg free(srcbits); 15806747b715Smrg free(mskbits); 15816747b715Smrg return BadImplementation; 158205b261ecSmrg } 15834642e01fSmrg pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32, 15844642e01fSmrg CREATE_PIXMAP_USAGE_SCRATCH); 158505b261ecSmrg if (!pPixmap) 158605b261ecSmrg { 15876747b715Smrg free(argbbits); 15886747b715Smrg free(srcbits); 15896747b715Smrg free(mskbits); 15906747b715Smrg return BadAlloc; 159105b261ecSmrg } 159205b261ecSmrg pPicture = CreatePicture (0, &pPixmap->drawable, pFormat, 0, 0, 159305b261ecSmrg client, &error); 159405b261ecSmrg if (!pPicture) 159505b261ecSmrg { 15966747b715Smrg free(argbbits); 15976747b715Smrg free(srcbits); 15986747b715Smrg free(mskbits); 159905b261ecSmrg return error; 160005b261ecSmrg } 160105b261ecSmrg (*pScreen->DestroyPixmap) (pPixmap); 160205b261ecSmrg CompositePicture (PictOpSrc, 160305b261ecSmrg pSrc, 0, pPicture, 160405b261ecSmrg 0, 0, 0, 0, 0, 0, width, height); 160505b261ecSmrg (*pScreen->GetImage) (pPicture->pDrawable, 160605b261ecSmrg 0, 0, width, height, ZPixmap, 160705b261ecSmrg 0xffffffff, (pointer) argbbits); 160805b261ecSmrg FreePicture (pPicture, 0); 160905b261ecSmrg } 161005b261ecSmrg /* 161105b261ecSmrg * Check whether the cursor can be directly supported by 161205b261ecSmrg * the core cursor code 161305b261ecSmrg */ 161405b261ecSmrg ncolor = 0; 161505b261ecSmrg argb = argbbits; 161605b261ecSmrg for (y = 0; ncolor <= 2 && y < height; y++) 161705b261ecSmrg { 161805b261ecSmrg for (x = 0; ncolor <= 2 && x < width; x++) 161905b261ecSmrg { 162005b261ecSmrg CARD32 p = *argb++; 162105b261ecSmrg CARD32 a = (p >> 24); 162205b261ecSmrg 162305b261ecSmrg if (a == 0) /* transparent */ 162405b261ecSmrg continue; 162505b261ecSmrg if (a == 0xff) /* opaque */ 162605b261ecSmrg { 162705b261ecSmrg int n; 162805b261ecSmrg for (n = 0; n < ncolor; n++) 162905b261ecSmrg if (p == twocolor[n]) 163005b261ecSmrg break; 163105b261ecSmrg if (n == ncolor) 163205b261ecSmrg twocolor[ncolor++] = p; 163305b261ecSmrg } 163405b261ecSmrg else 163505b261ecSmrg ncolor = 3; 163605b261ecSmrg } 163705b261ecSmrg } 163805b261ecSmrg 163905b261ecSmrg /* 164005b261ecSmrg * Convert argb image to two plane cursor 164105b261ecSmrg */ 164205b261ecSmrg srcline = srcbits; 164305b261ecSmrg mskline = mskbits; 164405b261ecSmrg argb = argbbits; 164505b261ecSmrg for (y = 0; y < height; y++) 164605b261ecSmrg { 164705b261ecSmrg for (x = 0; x < width; x++) 164805b261ecSmrg { 164905b261ecSmrg CARD32 p = *argb++; 165005b261ecSmrg 165105b261ecSmrg if (ncolor <= 2) 165205b261ecSmrg { 165305b261ecSmrg CARD32 a = ((p >> 24)); 165405b261ecSmrg 16556747b715Smrg RenderSetBit (mskline, x, a != 0); 16566747b715Smrg RenderSetBit (srcline, x, a != 0 && p == twocolor[0]); 165705b261ecSmrg } 165805b261ecSmrg else 165905b261ecSmrg { 166005b261ecSmrg CARD32 a = ((p >> 24) * DITHER_SIZE + 127) / 255; 166105b261ecSmrg CARD32 i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255; 166205b261ecSmrg CARD32 d = orderedDither[y&(DITHER_DIM-1)][x&(DITHER_DIM-1)]; 166305b261ecSmrg /* Set mask from dithered alpha value */ 16646747b715Smrg RenderSetBit(mskline, x, a > d); 166505b261ecSmrg /* Set src from dithered intensity value */ 16666747b715Smrg RenderSetBit(srcline, x, a > d && i <= d); 166705b261ecSmrg } 166805b261ecSmrg } 166905b261ecSmrg srcline += stride; 167005b261ecSmrg mskline += stride; 167105b261ecSmrg } 167205b261ecSmrg /* 167305b261ecSmrg * Dither to white and black if the cursor has more than two colors 167405b261ecSmrg */ 167505b261ecSmrg if (ncolor > 2) 167605b261ecSmrg { 167705b261ecSmrg twocolor[0] = 0xff000000; 167805b261ecSmrg twocolor[1] = 0xffffffff; 167905b261ecSmrg } 168005b261ecSmrg else 168105b261ecSmrg { 16826747b715Smrg free(argbbits); 168305b261ecSmrg argbbits = 0; 168405b261ecSmrg } 168505b261ecSmrg 168605b261ecSmrg#define GetByte(p,s) (((p) >> (s)) & 0xff) 168705b261ecSmrg#define GetColor(p,s) (GetByte(p,s) | (GetByte(p,s) << 8)) 168805b261ecSmrg 168905b261ecSmrg cm.width = width; 169005b261ecSmrg cm.height = height; 169105b261ecSmrg cm.xhot = stuff->x; 169205b261ecSmrg cm.yhot = stuff->y; 16934642e01fSmrg rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm, 16944642e01fSmrg GetColor(twocolor[0], 16), 16954642e01fSmrg GetColor(twocolor[0], 8), 16964642e01fSmrg GetColor(twocolor[0], 0), 16974642e01fSmrg GetColor(twocolor[1], 16), 16984642e01fSmrg GetColor(twocolor[1], 8), 16994642e01fSmrg GetColor(twocolor[1], 0), 17004642e01fSmrg &pCursor, client, stuff->cid); 17014642e01fSmrg if (rc != Success) 17024642e01fSmrg return rc; 17034642e01fSmrg if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor)) 17044642e01fSmrg return BadAlloc; 17054642e01fSmrg 17066747b715Smrg return Success; 170705b261ecSmrg} 170805b261ecSmrg 170905b261ecSmrgstatic int 171005b261ecSmrgProcRenderSetPictureTransform (ClientPtr client) 171105b261ecSmrg{ 171205b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 171305b261ecSmrg PicturePtr pPicture; 171405b261ecSmrg 171505b261ecSmrg REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq); 17166747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 17176747b715Smrg return SetPictureTransform (pPicture, (PictTransform *) &stuff->transform); 171805b261ecSmrg} 171905b261ecSmrg 172005b261ecSmrgstatic int 172105b261ecSmrgProcRenderQueryFilters (ClientPtr client) 172205b261ecSmrg{ 172305b261ecSmrg REQUEST (xRenderQueryFiltersReq); 172405b261ecSmrg DrawablePtr pDrawable; 172505b261ecSmrg xRenderQueryFiltersReply *reply; 172605b261ecSmrg int nbytesName; 172705b261ecSmrg int nnames; 172805b261ecSmrg ScreenPtr pScreen; 172905b261ecSmrg PictureScreenPtr ps; 173005b261ecSmrg int i, j, len, total_bytes, rc; 173105b261ecSmrg INT16 *aliases; 173205b261ecSmrg char *names; 173305b261ecSmrg 173405b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryFiltersReq); 173505b261ecSmrg rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0, 17364642e01fSmrg DixGetAttrAccess); 173705b261ecSmrg if (rc != Success) 173805b261ecSmrg return rc; 173905b261ecSmrg 174005b261ecSmrg pScreen = pDrawable->pScreen; 174105b261ecSmrg nbytesName = 0; 174205b261ecSmrg nnames = 0; 174305b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 174405b261ecSmrg if (ps) 174505b261ecSmrg { 174605b261ecSmrg for (i = 0; i < ps->nfilters; i++) 174705b261ecSmrg nbytesName += 1 + strlen (ps->filters[i].name); 174805b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 174905b261ecSmrg nbytesName += 1 + strlen (ps->filterAliases[i].alias); 175005b261ecSmrg nnames = ps->nfilters + ps->nfilterAliases; 175105b261ecSmrg } 17526747b715Smrg len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName); 175305b261ecSmrg total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2); 17546747b715Smrg reply = (xRenderQueryFiltersReply *) malloc(total_bytes); 175505b261ecSmrg if (!reply) 175605b261ecSmrg return BadAlloc; 175705b261ecSmrg aliases = (INT16 *) (reply + 1); 175805b261ecSmrg names = (char *) (aliases + ((nnames + 1) & ~1)); 175905b261ecSmrg 176005b261ecSmrg reply->type = X_Reply; 176105b261ecSmrg reply->sequenceNumber = client->sequence; 176205b261ecSmrg reply->length = len; 176305b261ecSmrg reply->numAliases = nnames; 176405b261ecSmrg reply->numFilters = nnames; 176505b261ecSmrg if (ps) 176605b261ecSmrg { 176705b261ecSmrg 176805b261ecSmrg /* fill in alias values */ 176905b261ecSmrg for (i = 0; i < ps->nfilters; i++) 177005b261ecSmrg aliases[i] = FilterAliasNone; 177105b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 177205b261ecSmrg { 177305b261ecSmrg for (j = 0; j < ps->nfilters; j++) 177405b261ecSmrg if (ps->filterAliases[i].filter_id == ps->filters[j].id) 177505b261ecSmrg break; 177605b261ecSmrg if (j == ps->nfilters) 177705b261ecSmrg { 177805b261ecSmrg for (j = 0; j < ps->nfilterAliases; j++) 177905b261ecSmrg if (ps->filterAliases[i].filter_id == 178005b261ecSmrg ps->filterAliases[j].alias_id) 178105b261ecSmrg { 178205b261ecSmrg break; 178305b261ecSmrg } 178405b261ecSmrg if (j == ps->nfilterAliases) 178505b261ecSmrg j = FilterAliasNone; 178605b261ecSmrg else 178705b261ecSmrg j = j + ps->nfilters; 178805b261ecSmrg } 178905b261ecSmrg aliases[i + ps->nfilters] = j; 179005b261ecSmrg } 179105b261ecSmrg 179205b261ecSmrg /* fill in filter names */ 179305b261ecSmrg for (i = 0; i < ps->nfilters; i++) 179405b261ecSmrg { 179505b261ecSmrg j = strlen (ps->filters[i].name); 179605b261ecSmrg *names++ = j; 179705b261ecSmrg strncpy (names, ps->filters[i].name, j); 179805b261ecSmrg names += j; 179905b261ecSmrg } 180005b261ecSmrg 180105b261ecSmrg /* fill in filter alias names */ 180205b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 180305b261ecSmrg { 180405b261ecSmrg j = strlen (ps->filterAliases[i].alias); 180505b261ecSmrg *names++ = j; 180605b261ecSmrg strncpy (names, ps->filterAliases[i].alias, j); 180705b261ecSmrg names += j; 180805b261ecSmrg } 180905b261ecSmrg } 181005b261ecSmrg 181105b261ecSmrg if (client->swapped) 181205b261ecSmrg { 181305b261ecSmrg register int n; 181405b261ecSmrg 181505b261ecSmrg for (i = 0; i < reply->numAliases; i++) 181605b261ecSmrg { 181705b261ecSmrg swaps (&aliases[i], n); 181805b261ecSmrg } 181905b261ecSmrg swaps(&reply->sequenceNumber, n); 182005b261ecSmrg swapl(&reply->length, n); 182105b261ecSmrg swapl(&reply->numAliases, n); 182205b261ecSmrg swapl(&reply->numFilters, n); 182305b261ecSmrg } 182405b261ecSmrg WriteToClient(client, total_bytes, (char *) reply); 18256747b715Smrg free(reply); 182605b261ecSmrg 18276747b715Smrg return Success; 182805b261ecSmrg} 182905b261ecSmrg 183005b261ecSmrgstatic int 183105b261ecSmrgProcRenderSetPictureFilter (ClientPtr client) 183205b261ecSmrg{ 183305b261ecSmrg REQUEST (xRenderSetPictureFilterReq); 183405b261ecSmrg PicturePtr pPicture; 183505b261ecSmrg int result; 183605b261ecSmrg xFixed *params; 183705b261ecSmrg int nparams; 183805b261ecSmrg char *name; 183905b261ecSmrg 184005b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq); 18416747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 184205b261ecSmrg name = (char *) (stuff + 1); 18436747b715Smrg params = (xFixed *) (name + pad_to_int32(stuff->nbytes)); 184405b261ecSmrg nparams = ((xFixed *) stuff + client->req_len) - params; 184505b261ecSmrg result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams); 184605b261ecSmrg return result; 184705b261ecSmrg} 184805b261ecSmrg 184905b261ecSmrgstatic int 185005b261ecSmrgProcRenderCreateAnimCursor (ClientPtr client) 185105b261ecSmrg{ 185205b261ecSmrg REQUEST(xRenderCreateAnimCursorReq); 185305b261ecSmrg CursorPtr *cursors; 185405b261ecSmrg CARD32 *deltas; 185505b261ecSmrg CursorPtr pCursor; 185605b261ecSmrg int ncursor; 185705b261ecSmrg xAnimCursorElt *elt; 185805b261ecSmrg int i; 185905b261ecSmrg int ret; 186005b261ecSmrg 186105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq); 186205b261ecSmrg LEGAL_NEW_RESOURCE(stuff->cid, client); 186305b261ecSmrg if (client->req_len & 1) 186405b261ecSmrg return BadLength; 18656747b715Smrg ncursor = (client->req_len - (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1; 18666747b715Smrg cursors = malloc(ncursor * (sizeof (CursorPtr) + sizeof (CARD32))); 186705b261ecSmrg if (!cursors) 186805b261ecSmrg return BadAlloc; 186905b261ecSmrg deltas = (CARD32 *) (cursors + ncursor); 187005b261ecSmrg elt = (xAnimCursorElt *) (stuff + 1); 187105b261ecSmrg for (i = 0; i < ncursor; i++) 187205b261ecSmrg { 18736747b715Smrg ret = dixLookupResourceByType((pointer *)(cursors + i), elt->cursor, 18746747b715Smrg RT_CURSOR, client, DixReadAccess); 18756747b715Smrg if (ret != Success) 187605b261ecSmrg { 18776747b715Smrg free(cursors); 18786747b715Smrg return ret; 187905b261ecSmrg } 188005b261ecSmrg deltas[i] = elt->delay; 188105b261ecSmrg elt++; 188205b261ecSmrg } 18834642e01fSmrg ret = AnimCursorCreate (cursors, deltas, ncursor, &pCursor, client, 18844642e01fSmrg stuff->cid); 18856747b715Smrg free(cursors); 188605b261ecSmrg if (ret != Success) 188705b261ecSmrg return ret; 188805b261ecSmrg 188905b261ecSmrg if (AddResource (stuff->cid, RT_CURSOR, (pointer)pCursor)) 18906747b715Smrg return Success; 189105b261ecSmrg return BadAlloc; 189205b261ecSmrg} 189305b261ecSmrg 189405b261ecSmrgstatic int 189505b261ecSmrgProcRenderAddTraps (ClientPtr client) 189605b261ecSmrg{ 189705b261ecSmrg int ntraps; 189805b261ecSmrg PicturePtr pPicture; 189905b261ecSmrg REQUEST(xRenderAddTrapsReq); 190005b261ecSmrg 190105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq); 19026747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess); 190305b261ecSmrg if (!pPicture->pDrawable) 190405b261ecSmrg return BadDrawable; 190505b261ecSmrg ntraps = (client->req_len << 2) - sizeof (xRenderAddTrapsReq); 190605b261ecSmrg if (ntraps % sizeof (xTrap)) 190705b261ecSmrg return BadLength; 190805b261ecSmrg ntraps /= sizeof (xTrap); 190905b261ecSmrg if (ntraps) 191005b261ecSmrg AddTraps (pPicture, 191105b261ecSmrg stuff->xOff, stuff->yOff, 191205b261ecSmrg ntraps, (xTrap *) &stuff[1]); 19136747b715Smrg return Success; 191405b261ecSmrg} 191505b261ecSmrg 191605b261ecSmrgstatic int ProcRenderCreateSolidFill(ClientPtr client) 191705b261ecSmrg{ 191805b261ecSmrg PicturePtr pPicture; 191905b261ecSmrg int error = 0; 192005b261ecSmrg REQUEST(xRenderCreateSolidFillReq); 192105b261ecSmrg 192205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 192305b261ecSmrg 192405b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 192505b261ecSmrg 192605b261ecSmrg pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error); 192705b261ecSmrg if (!pPicture) 192805b261ecSmrg return error; 19294642e01fSmrg /* security creation/labeling check */ 19304642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 19314642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 19324642e01fSmrg if (error != Success) 19334642e01fSmrg return error; 193405b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 193505b261ecSmrg return BadAlloc; 193605b261ecSmrg return Success; 193705b261ecSmrg} 193805b261ecSmrg 193905b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr client) 194005b261ecSmrg{ 194105b261ecSmrg PicturePtr pPicture; 194205b261ecSmrg int len; 194305b261ecSmrg int error = 0; 194405b261ecSmrg xFixed *stops; 194505b261ecSmrg xRenderColor *colors; 194605b261ecSmrg REQUEST(xRenderCreateLinearGradientReq); 194705b261ecSmrg 194805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 194905b261ecSmrg 195005b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 195105b261ecSmrg 195205b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 195305b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 195405b261ecSmrg return BadLength; 195505b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 195605b261ecSmrg return BadLength; 195705b261ecSmrg 195805b261ecSmrg stops = (xFixed *)(stuff + 1); 195905b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 196005b261ecSmrg 196105b261ecSmrg pPicture = CreateLinearGradientPicture (stuff->pid, &stuff->p1, &stuff->p2, 196205b261ecSmrg stuff->nStops, stops, colors, &error); 196305b261ecSmrg if (!pPicture) 196405b261ecSmrg return error; 19654642e01fSmrg /* security creation/labeling check */ 19664642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 19674642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 19684642e01fSmrg if (error != Success) 19694642e01fSmrg return error; 197005b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 197105b261ecSmrg return BadAlloc; 197205b261ecSmrg return Success; 197305b261ecSmrg} 197405b261ecSmrg 197505b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr client) 197605b261ecSmrg{ 197705b261ecSmrg PicturePtr pPicture; 197805b261ecSmrg int len; 197905b261ecSmrg int error = 0; 198005b261ecSmrg xFixed *stops; 198105b261ecSmrg xRenderColor *colors; 198205b261ecSmrg REQUEST(xRenderCreateRadialGradientReq); 198305b261ecSmrg 198405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 198505b261ecSmrg 198605b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 198705b261ecSmrg 198805b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 198905b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 199005b261ecSmrg return BadLength; 199105b261ecSmrg 199205b261ecSmrg stops = (xFixed *)(stuff + 1); 199305b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 199405b261ecSmrg 199505b261ecSmrg pPicture = CreateRadialGradientPicture (stuff->pid, &stuff->inner, &stuff->outer, 199605b261ecSmrg stuff->inner_radius, stuff->outer_radius, 199705b261ecSmrg stuff->nStops, stops, colors, &error); 199805b261ecSmrg if (!pPicture) 199905b261ecSmrg return error; 20004642e01fSmrg /* security creation/labeling check */ 20014642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 20024642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 20034642e01fSmrg if (error != Success) 20044642e01fSmrg return error; 200505b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 200605b261ecSmrg return BadAlloc; 200705b261ecSmrg return Success; 200805b261ecSmrg} 200905b261ecSmrg 201005b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr client) 201105b261ecSmrg{ 201205b261ecSmrg PicturePtr pPicture; 201305b261ecSmrg int len; 201405b261ecSmrg int error = 0; 201505b261ecSmrg xFixed *stops; 201605b261ecSmrg xRenderColor *colors; 201705b261ecSmrg REQUEST(xRenderCreateConicalGradientReq); 201805b261ecSmrg 201905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 202005b261ecSmrg 202105b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 202205b261ecSmrg 202305b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 202405b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 202505b261ecSmrg return BadLength; 202605b261ecSmrg 202705b261ecSmrg stops = (xFixed *)(stuff + 1); 202805b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 202905b261ecSmrg 203005b261ecSmrg pPicture = CreateConicalGradientPicture (stuff->pid, &stuff->center, stuff->angle, 203105b261ecSmrg stuff->nStops, stops, colors, &error); 203205b261ecSmrg if (!pPicture) 203305b261ecSmrg return error; 20344642e01fSmrg /* security creation/labeling check */ 20354642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 20364642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 20374642e01fSmrg if (error != Success) 20384642e01fSmrg return error; 203905b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 204005b261ecSmrg return BadAlloc; 204105b261ecSmrg return Success; 204205b261ecSmrg} 204305b261ecSmrg 204405b261ecSmrg 204505b261ecSmrgstatic int 204605b261ecSmrgProcRenderDispatch (ClientPtr client) 204705b261ecSmrg{ 204805b261ecSmrg REQUEST(xReq); 204905b261ecSmrg 205005b261ecSmrg if (stuff->data < RenderNumberRequests) 205105b261ecSmrg return (*ProcRenderVector[stuff->data]) (client); 205205b261ecSmrg else 205305b261ecSmrg return BadRequest; 205405b261ecSmrg} 205505b261ecSmrg 205605b261ecSmrgstatic int 205705b261ecSmrgSProcRenderQueryVersion (ClientPtr client) 205805b261ecSmrg{ 205905b261ecSmrg register int n; 206005b261ecSmrg REQUEST(xRenderQueryVersionReq); 206105b261ecSmrg 206205b261ecSmrg swaps(&stuff->length, n); 206305b261ecSmrg swapl(&stuff->majorVersion, n); 206405b261ecSmrg swapl(&stuff->minorVersion, n); 206505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType])(client); 206605b261ecSmrg} 206705b261ecSmrg 206805b261ecSmrgstatic int 206905b261ecSmrgSProcRenderQueryPictFormats (ClientPtr client) 207005b261ecSmrg{ 207105b261ecSmrg register int n; 207205b261ecSmrg REQUEST(xRenderQueryPictFormatsReq); 207305b261ecSmrg swaps(&stuff->length, n); 207405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 207505b261ecSmrg} 207605b261ecSmrg 207705b261ecSmrgstatic int 207805b261ecSmrgSProcRenderQueryPictIndexValues (ClientPtr client) 207905b261ecSmrg{ 208005b261ecSmrg register int n; 208105b261ecSmrg REQUEST(xRenderQueryPictIndexValuesReq); 208205b261ecSmrg swaps(&stuff->length, n); 208305b261ecSmrg swapl(&stuff->format, n); 208405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 208505b261ecSmrg} 208605b261ecSmrg 208705b261ecSmrgstatic int 208805b261ecSmrgSProcRenderQueryDithers (ClientPtr client) 208905b261ecSmrg{ 209005b261ecSmrg return BadImplementation; 209105b261ecSmrg} 209205b261ecSmrg 209305b261ecSmrgstatic int 209405b261ecSmrgSProcRenderCreatePicture (ClientPtr client) 209505b261ecSmrg{ 209605b261ecSmrg register int n; 209705b261ecSmrg REQUEST(xRenderCreatePictureReq); 209805b261ecSmrg swaps(&stuff->length, n); 209905b261ecSmrg swapl(&stuff->pid, n); 210005b261ecSmrg swapl(&stuff->drawable, n); 210105b261ecSmrg swapl(&stuff->format, n); 210205b261ecSmrg swapl(&stuff->mask, n); 210305b261ecSmrg SwapRestL(stuff); 210405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 210505b261ecSmrg} 210605b261ecSmrg 210705b261ecSmrgstatic int 210805b261ecSmrgSProcRenderChangePicture (ClientPtr client) 210905b261ecSmrg{ 211005b261ecSmrg register int n; 211105b261ecSmrg REQUEST(xRenderChangePictureReq); 211205b261ecSmrg swaps(&stuff->length, n); 211305b261ecSmrg swapl(&stuff->picture, n); 211405b261ecSmrg swapl(&stuff->mask, n); 211505b261ecSmrg SwapRestL(stuff); 211605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 211705b261ecSmrg} 211805b261ecSmrg 211905b261ecSmrgstatic int 212005b261ecSmrgSProcRenderSetPictureClipRectangles (ClientPtr client) 212105b261ecSmrg{ 212205b261ecSmrg register int n; 212305b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 212405b261ecSmrg swaps(&stuff->length, n); 212505b261ecSmrg swapl(&stuff->picture, n); 212605b261ecSmrg swaps(&stuff->xOrigin, n); 212705b261ecSmrg swaps(&stuff->yOrigin, n); 212805b261ecSmrg SwapRestS(stuff); 212905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 213005b261ecSmrg} 213105b261ecSmrg 213205b261ecSmrgstatic int 213305b261ecSmrgSProcRenderFreePicture (ClientPtr client) 213405b261ecSmrg{ 213505b261ecSmrg register int n; 213605b261ecSmrg REQUEST(xRenderFreePictureReq); 213705b261ecSmrg swaps(&stuff->length, n); 213805b261ecSmrg swapl(&stuff->picture, n); 213905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 214005b261ecSmrg} 214105b261ecSmrg 214205b261ecSmrgstatic int 214305b261ecSmrgSProcRenderComposite (ClientPtr client) 214405b261ecSmrg{ 214505b261ecSmrg register int n; 214605b261ecSmrg REQUEST(xRenderCompositeReq); 214705b261ecSmrg swaps(&stuff->length, n); 214805b261ecSmrg swapl(&stuff->src, n); 214905b261ecSmrg swapl(&stuff->mask, n); 215005b261ecSmrg swapl(&stuff->dst, n); 215105b261ecSmrg swaps(&stuff->xSrc, n); 215205b261ecSmrg swaps(&stuff->ySrc, n); 215305b261ecSmrg swaps(&stuff->xMask, n); 215405b261ecSmrg swaps(&stuff->yMask, n); 215505b261ecSmrg swaps(&stuff->xDst, n); 215605b261ecSmrg swaps(&stuff->yDst, n); 215705b261ecSmrg swaps(&stuff->width, n); 215805b261ecSmrg swaps(&stuff->height, n); 215905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 216005b261ecSmrg} 216105b261ecSmrg 216205b261ecSmrgstatic int 216305b261ecSmrgSProcRenderScale (ClientPtr client) 216405b261ecSmrg{ 216505b261ecSmrg register int n; 216605b261ecSmrg REQUEST(xRenderScaleReq); 216705b261ecSmrg swaps(&stuff->length, n); 216805b261ecSmrg swapl(&stuff->src, n); 216905b261ecSmrg swapl(&stuff->dst, n); 217005b261ecSmrg swapl(&stuff->colorScale, n); 217105b261ecSmrg swapl(&stuff->alphaScale, n); 217205b261ecSmrg swaps(&stuff->xSrc, n); 217305b261ecSmrg swaps(&stuff->ySrc, n); 217405b261ecSmrg swaps(&stuff->xDst, n); 217505b261ecSmrg swaps(&stuff->yDst, n); 217605b261ecSmrg swaps(&stuff->width, n); 217705b261ecSmrg swaps(&stuff->height, n); 217805b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 217905b261ecSmrg} 218005b261ecSmrg 218105b261ecSmrgstatic int 218205b261ecSmrgSProcRenderTrapezoids (ClientPtr client) 218305b261ecSmrg{ 218405b261ecSmrg register int n; 218505b261ecSmrg REQUEST(xRenderTrapezoidsReq); 218605b261ecSmrg 218705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 218805b261ecSmrg swaps (&stuff->length, n); 218905b261ecSmrg swapl (&stuff->src, n); 219005b261ecSmrg swapl (&stuff->dst, n); 219105b261ecSmrg swapl (&stuff->maskFormat, n); 219205b261ecSmrg swaps (&stuff->xSrc, n); 219305b261ecSmrg swaps (&stuff->ySrc, n); 219405b261ecSmrg SwapRestL(stuff); 219505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 219605b261ecSmrg} 219705b261ecSmrg 219805b261ecSmrgstatic int 219905b261ecSmrgSProcRenderTriangles (ClientPtr client) 220005b261ecSmrg{ 220105b261ecSmrg register int n; 220205b261ecSmrg REQUEST(xRenderTrianglesReq); 220305b261ecSmrg 220405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 220505b261ecSmrg swaps (&stuff->length, n); 220605b261ecSmrg swapl (&stuff->src, n); 220705b261ecSmrg swapl (&stuff->dst, n); 220805b261ecSmrg swapl (&stuff->maskFormat, n); 220905b261ecSmrg swaps (&stuff->xSrc, n); 221005b261ecSmrg swaps (&stuff->ySrc, n); 221105b261ecSmrg SwapRestL(stuff); 221205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 221305b261ecSmrg} 221405b261ecSmrg 221505b261ecSmrgstatic int 221605b261ecSmrgSProcRenderTriStrip (ClientPtr client) 221705b261ecSmrg{ 221805b261ecSmrg register int n; 221905b261ecSmrg REQUEST(xRenderTriStripReq); 222005b261ecSmrg 222105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriStripReq); 222205b261ecSmrg swaps (&stuff->length, n); 222305b261ecSmrg swapl (&stuff->src, n); 222405b261ecSmrg swapl (&stuff->dst, n); 222505b261ecSmrg swapl (&stuff->maskFormat, n); 222605b261ecSmrg swaps (&stuff->xSrc, n); 222705b261ecSmrg swaps (&stuff->ySrc, n); 222805b261ecSmrg SwapRestL(stuff); 222905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 223005b261ecSmrg} 223105b261ecSmrg 223205b261ecSmrgstatic int 223305b261ecSmrgSProcRenderTriFan (ClientPtr client) 223405b261ecSmrg{ 223505b261ecSmrg register int n; 223605b261ecSmrg REQUEST(xRenderTriFanReq); 223705b261ecSmrg 223805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriFanReq); 223905b261ecSmrg swaps (&stuff->length, n); 224005b261ecSmrg swapl (&stuff->src, n); 224105b261ecSmrg swapl (&stuff->dst, n); 224205b261ecSmrg swapl (&stuff->maskFormat, n); 224305b261ecSmrg swaps (&stuff->xSrc, n); 224405b261ecSmrg swaps (&stuff->ySrc, n); 224505b261ecSmrg SwapRestL(stuff); 224605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 224705b261ecSmrg} 224805b261ecSmrg 224905b261ecSmrgstatic int 225005b261ecSmrgSProcRenderColorTrapezoids (ClientPtr client) 225105b261ecSmrg{ 225205b261ecSmrg return BadImplementation; 225305b261ecSmrg} 225405b261ecSmrg 225505b261ecSmrgstatic int 225605b261ecSmrgSProcRenderColorTriangles (ClientPtr client) 225705b261ecSmrg{ 225805b261ecSmrg return BadImplementation; 225905b261ecSmrg} 226005b261ecSmrg 226105b261ecSmrgstatic int 226205b261ecSmrgSProcRenderTransform (ClientPtr client) 226305b261ecSmrg{ 226405b261ecSmrg return BadImplementation; 226505b261ecSmrg} 226605b261ecSmrg 226705b261ecSmrgstatic int 226805b261ecSmrgSProcRenderCreateGlyphSet (ClientPtr client) 226905b261ecSmrg{ 227005b261ecSmrg register int n; 227105b261ecSmrg REQUEST(xRenderCreateGlyphSetReq); 227205b261ecSmrg swaps(&stuff->length, n); 227305b261ecSmrg swapl(&stuff->gsid, n); 227405b261ecSmrg swapl(&stuff->format, n); 227505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 227605b261ecSmrg} 227705b261ecSmrg 227805b261ecSmrgstatic int 227905b261ecSmrgSProcRenderReferenceGlyphSet (ClientPtr client) 228005b261ecSmrg{ 228105b261ecSmrg register int n; 228205b261ecSmrg REQUEST(xRenderReferenceGlyphSetReq); 228305b261ecSmrg swaps(&stuff->length, n); 228405b261ecSmrg swapl(&stuff->gsid, n); 228505b261ecSmrg swapl(&stuff->existing, n); 228605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 228705b261ecSmrg} 228805b261ecSmrg 228905b261ecSmrgstatic int 229005b261ecSmrgSProcRenderFreeGlyphSet (ClientPtr client) 229105b261ecSmrg{ 229205b261ecSmrg register int n; 229305b261ecSmrg REQUEST(xRenderFreeGlyphSetReq); 229405b261ecSmrg swaps(&stuff->length, n); 229505b261ecSmrg swapl(&stuff->glyphset, n); 229605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 229705b261ecSmrg} 229805b261ecSmrg 229905b261ecSmrgstatic int 230005b261ecSmrgSProcRenderAddGlyphs (ClientPtr client) 230105b261ecSmrg{ 230205b261ecSmrg register int n; 230305b261ecSmrg register int i; 230405b261ecSmrg CARD32 *gids; 230505b261ecSmrg void *end; 230605b261ecSmrg xGlyphInfo *gi; 230705b261ecSmrg REQUEST(xRenderAddGlyphsReq); 230805b261ecSmrg swaps(&stuff->length, n); 230905b261ecSmrg swapl(&stuff->glyphset, n); 231005b261ecSmrg swapl(&stuff->nglyphs, n); 231105b261ecSmrg if (stuff->nglyphs & 0xe0000000) 231205b261ecSmrg return BadLength; 231305b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 231405b261ecSmrg gids = (CARD32 *) (stuff + 1); 231505b261ecSmrg gi = (xGlyphInfo *) (gids + stuff->nglyphs); 231605b261ecSmrg if ((char *) end - (char *) (gids + stuff->nglyphs) < 0) 231705b261ecSmrg return BadLength; 231805b261ecSmrg if ((char *) end - (char *) (gi + stuff->nglyphs) < 0) 231905b261ecSmrg return BadLength; 232005b261ecSmrg for (i = 0; i < stuff->nglyphs; i++) 232105b261ecSmrg { 232205b261ecSmrg swapl (&gids[i], n); 232305b261ecSmrg swaps (&gi[i].width, n); 232405b261ecSmrg swaps (&gi[i].height, n); 232505b261ecSmrg swaps (&gi[i].x, n); 232605b261ecSmrg swaps (&gi[i].y, n); 232705b261ecSmrg swaps (&gi[i].xOff, n); 232805b261ecSmrg swaps (&gi[i].yOff, n); 232905b261ecSmrg } 233005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 233105b261ecSmrg} 233205b261ecSmrg 233305b261ecSmrgstatic int 233405b261ecSmrgSProcRenderAddGlyphsFromPicture (ClientPtr client) 233505b261ecSmrg{ 233605b261ecSmrg return BadImplementation; 233705b261ecSmrg} 233805b261ecSmrg 233905b261ecSmrgstatic int 234005b261ecSmrgSProcRenderFreeGlyphs (ClientPtr client) 234105b261ecSmrg{ 234205b261ecSmrg register int n; 234305b261ecSmrg REQUEST(xRenderFreeGlyphsReq); 234405b261ecSmrg swaps(&stuff->length, n); 234505b261ecSmrg swapl(&stuff->glyphset, n); 234605b261ecSmrg SwapRestL(stuff); 234705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 234805b261ecSmrg} 234905b261ecSmrg 235005b261ecSmrgstatic int 235105b261ecSmrgSProcRenderCompositeGlyphs (ClientPtr client) 235205b261ecSmrg{ 235305b261ecSmrg register int n; 235405b261ecSmrg xGlyphElt *elt; 235505b261ecSmrg CARD8 *buffer; 235605b261ecSmrg CARD8 *end; 235705b261ecSmrg int space; 235805b261ecSmrg int i; 235905b261ecSmrg int size; 236005b261ecSmrg 236105b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 236205b261ecSmrg 236305b261ecSmrg switch (stuff->renderReqType) { 236405b261ecSmrg default: size = 1; break; 236505b261ecSmrg case X_RenderCompositeGlyphs16: size = 2; break; 236605b261ecSmrg case X_RenderCompositeGlyphs32: size = 4; break; 236705b261ecSmrg } 236805b261ecSmrg 236905b261ecSmrg swaps(&stuff->length, n); 237005b261ecSmrg swapl(&stuff->src, n); 237105b261ecSmrg swapl(&stuff->dst, n); 237205b261ecSmrg swapl(&stuff->maskFormat, n); 237305b261ecSmrg swapl(&stuff->glyphset, n); 237405b261ecSmrg swaps(&stuff->xSrc, n); 237505b261ecSmrg swaps(&stuff->ySrc, n); 237605b261ecSmrg buffer = (CARD8 *) (stuff + 1); 237705b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 237805b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 237905b261ecSmrg { 238005b261ecSmrg elt = (xGlyphElt *) buffer; 238105b261ecSmrg buffer += sizeof (xGlyphElt); 238205b261ecSmrg 238305b261ecSmrg swaps (&elt->deltax, n); 238405b261ecSmrg swaps (&elt->deltay, n); 238505b261ecSmrg 238605b261ecSmrg i = elt->len; 238705b261ecSmrg if (i == 0xff) 238805b261ecSmrg { 238905b261ecSmrg swapl (buffer, n); 239005b261ecSmrg buffer += 4; 239105b261ecSmrg } 239205b261ecSmrg else 239305b261ecSmrg { 239405b261ecSmrg space = size * i; 239505b261ecSmrg switch (size) { 239605b261ecSmrg case 1: 239705b261ecSmrg buffer += i; 239805b261ecSmrg break; 239905b261ecSmrg case 2: 240005b261ecSmrg while (i--) 240105b261ecSmrg { 240205b261ecSmrg swaps (buffer, n); 240305b261ecSmrg buffer += 2; 240405b261ecSmrg } 240505b261ecSmrg break; 240605b261ecSmrg case 4: 240705b261ecSmrg while (i--) 240805b261ecSmrg { 240905b261ecSmrg swapl (buffer, n); 241005b261ecSmrg buffer += 4; 241105b261ecSmrg } 241205b261ecSmrg break; 241305b261ecSmrg } 241405b261ecSmrg if (space & 3) 241505b261ecSmrg buffer += 4 - (space & 3); 241605b261ecSmrg } 241705b261ecSmrg } 241805b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 241905b261ecSmrg} 242005b261ecSmrg 242105b261ecSmrgstatic int 242205b261ecSmrgSProcRenderFillRectangles (ClientPtr client) 242305b261ecSmrg{ 242405b261ecSmrg register int n; 242505b261ecSmrg REQUEST(xRenderFillRectanglesReq); 242605b261ecSmrg 242705b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 242805b261ecSmrg swaps(&stuff->length, n); 242905b261ecSmrg swapl(&stuff->dst, n); 243005b261ecSmrg swaps(&stuff->color.red, n); 243105b261ecSmrg swaps(&stuff->color.green, n); 243205b261ecSmrg swaps(&stuff->color.blue, n); 243305b261ecSmrg swaps(&stuff->color.alpha, n); 243405b261ecSmrg SwapRestS(stuff); 243505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 243605b261ecSmrg} 243705b261ecSmrg 243805b261ecSmrgstatic int 243905b261ecSmrgSProcRenderCreateCursor (ClientPtr client) 244005b261ecSmrg{ 244105b261ecSmrg register int n; 244205b261ecSmrg REQUEST(xRenderCreateCursorReq); 244305b261ecSmrg REQUEST_SIZE_MATCH (xRenderCreateCursorReq); 244405b261ecSmrg 244505b261ecSmrg swaps(&stuff->length, n); 244605b261ecSmrg swapl(&stuff->cid, n); 244705b261ecSmrg swapl(&stuff->src, n); 244805b261ecSmrg swaps(&stuff->x, n); 244905b261ecSmrg swaps(&stuff->y, n); 245005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 245105b261ecSmrg} 245205b261ecSmrg 245305b261ecSmrgstatic int 245405b261ecSmrgSProcRenderSetPictureTransform (ClientPtr client) 245505b261ecSmrg{ 245605b261ecSmrg register int n; 245705b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 245805b261ecSmrg REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq); 245905b261ecSmrg 246005b261ecSmrg swaps(&stuff->length, n); 246105b261ecSmrg swapl(&stuff->picture, n); 246205b261ecSmrg swapl(&stuff->transform.matrix11, n); 246305b261ecSmrg swapl(&stuff->transform.matrix12, n); 246405b261ecSmrg swapl(&stuff->transform.matrix13, n); 246505b261ecSmrg swapl(&stuff->transform.matrix21, n); 246605b261ecSmrg swapl(&stuff->transform.matrix22, n); 246705b261ecSmrg swapl(&stuff->transform.matrix23, n); 246805b261ecSmrg swapl(&stuff->transform.matrix31, n); 246905b261ecSmrg swapl(&stuff->transform.matrix32, n); 247005b261ecSmrg swapl(&stuff->transform.matrix33, n); 247105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 247205b261ecSmrg} 247305b261ecSmrg 247405b261ecSmrgstatic int 247505b261ecSmrgSProcRenderQueryFilters (ClientPtr client) 247605b261ecSmrg{ 247705b261ecSmrg register int n; 247805b261ecSmrg REQUEST (xRenderQueryFiltersReq); 247905b261ecSmrg REQUEST_SIZE_MATCH (xRenderQueryFiltersReq); 248005b261ecSmrg 248105b261ecSmrg swaps(&stuff->length, n); 248205b261ecSmrg swapl(&stuff->drawable, n); 248305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 248405b261ecSmrg} 248505b261ecSmrg 248605b261ecSmrgstatic int 248705b261ecSmrgSProcRenderSetPictureFilter (ClientPtr client) 248805b261ecSmrg{ 248905b261ecSmrg register int n; 249005b261ecSmrg REQUEST (xRenderSetPictureFilterReq); 249105b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq); 249205b261ecSmrg 249305b261ecSmrg swaps(&stuff->length, n); 249405b261ecSmrg swapl(&stuff->picture, n); 249505b261ecSmrg swaps(&stuff->nbytes, n); 249605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 249705b261ecSmrg} 249805b261ecSmrg 249905b261ecSmrgstatic int 250005b261ecSmrgSProcRenderCreateAnimCursor (ClientPtr client) 250105b261ecSmrg{ 250205b261ecSmrg register int n; 250305b261ecSmrg REQUEST (xRenderCreateAnimCursorReq); 250405b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateAnimCursorReq); 250505b261ecSmrg 250605b261ecSmrg swaps(&stuff->length, n); 250705b261ecSmrg swapl(&stuff->cid, n); 250805b261ecSmrg SwapRestL(stuff); 250905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 251005b261ecSmrg} 251105b261ecSmrg 251205b261ecSmrgstatic int 251305b261ecSmrgSProcRenderAddTraps (ClientPtr client) 251405b261ecSmrg{ 251505b261ecSmrg register int n; 251605b261ecSmrg REQUEST (xRenderAddTrapsReq); 251705b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq); 251805b261ecSmrg 251905b261ecSmrg swaps(&stuff->length, n); 252005b261ecSmrg swapl(&stuff->picture, n); 252105b261ecSmrg swaps(&stuff->xOff, n); 252205b261ecSmrg swaps(&stuff->yOff, n); 252305b261ecSmrg SwapRestL(stuff); 252405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 252505b261ecSmrg} 252605b261ecSmrg 252705b261ecSmrgstatic int 252805b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client) 252905b261ecSmrg{ 253005b261ecSmrg register int n; 253105b261ecSmrg REQUEST (xRenderCreateSolidFillReq); 253205b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateSolidFillReq); 253305b261ecSmrg 253405b261ecSmrg swaps(&stuff->length, n); 253505b261ecSmrg swapl(&stuff->pid, n); 253605b261ecSmrg swaps(&stuff->color.alpha, n); 253705b261ecSmrg swaps(&stuff->color.red, n); 253805b261ecSmrg swaps(&stuff->color.green, n); 253905b261ecSmrg swaps(&stuff->color.blue, n); 254005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 254105b261ecSmrg} 254205b261ecSmrg 254305b261ecSmrgstatic void swapStops(void *stuff, int num) 254405b261ecSmrg{ 254505b261ecSmrg int i, n; 254605b261ecSmrg CARD32 *stops; 254705b261ecSmrg CARD16 *colors; 254805b261ecSmrg stops = (CARD32 *)(stuff); 254905b261ecSmrg for (i = 0; i < num; ++i) { 255005b261ecSmrg swapl(stops, n); 255105b261ecSmrg ++stops; 255205b261ecSmrg } 255305b261ecSmrg colors = (CARD16 *)(stops); 255405b261ecSmrg for (i = 0; i < 4*num; ++i) { 25558223e2f2Smrg swaps(colors, n); 25568223e2f2Smrg ++colors; 255705b261ecSmrg } 255805b261ecSmrg} 255905b261ecSmrg 256005b261ecSmrgstatic int 256105b261ecSmrgSProcRenderCreateLinearGradient (ClientPtr client) 256205b261ecSmrg{ 256305b261ecSmrg register int n; 256405b261ecSmrg int len; 256505b261ecSmrg REQUEST (xRenderCreateLinearGradientReq); 256605b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateLinearGradientReq); 256705b261ecSmrg 256805b261ecSmrg swaps(&stuff->length, n); 256905b261ecSmrg swapl(&stuff->pid, n); 257005b261ecSmrg swapl(&stuff->p1.x, n); 257105b261ecSmrg swapl(&stuff->p1.y, n); 257205b261ecSmrg swapl(&stuff->p2.x, n); 257305b261ecSmrg swapl(&stuff->p2.y, n); 257405b261ecSmrg swapl(&stuff->nStops, n); 257505b261ecSmrg 257605b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 257705b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 257805b261ecSmrg return BadLength; 257905b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 258005b261ecSmrg return BadLength; 258105b261ecSmrg 258205b261ecSmrg swapStops(stuff+1, stuff->nStops); 258305b261ecSmrg 258405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 258505b261ecSmrg} 258605b261ecSmrg 258705b261ecSmrgstatic int 258805b261ecSmrgSProcRenderCreateRadialGradient (ClientPtr client) 258905b261ecSmrg{ 259005b261ecSmrg register int n; 259105b261ecSmrg int len; 259205b261ecSmrg REQUEST (xRenderCreateRadialGradientReq); 259305b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateRadialGradientReq); 259405b261ecSmrg 259505b261ecSmrg swaps(&stuff->length, n); 259605b261ecSmrg swapl(&stuff->pid, n); 259705b261ecSmrg swapl(&stuff->inner.x, n); 259805b261ecSmrg swapl(&stuff->inner.y, n); 259905b261ecSmrg swapl(&stuff->outer.x, n); 260005b261ecSmrg swapl(&stuff->outer.y, n); 260105b261ecSmrg swapl(&stuff->inner_radius, n); 260205b261ecSmrg swapl(&stuff->outer_radius, n); 260305b261ecSmrg swapl(&stuff->nStops, n); 260405b261ecSmrg 260505b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 260605b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 260705b261ecSmrg return BadLength; 260805b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 260905b261ecSmrg return BadLength; 261005b261ecSmrg 261105b261ecSmrg swapStops(stuff+1, stuff->nStops); 261205b261ecSmrg 261305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 261405b261ecSmrg} 261505b261ecSmrg 261605b261ecSmrgstatic int 261705b261ecSmrgSProcRenderCreateConicalGradient (ClientPtr client) 261805b261ecSmrg{ 261905b261ecSmrg register int n; 262005b261ecSmrg int len; 262105b261ecSmrg REQUEST (xRenderCreateConicalGradientReq); 262205b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateConicalGradientReq); 262305b261ecSmrg 262405b261ecSmrg swaps(&stuff->length, n); 262505b261ecSmrg swapl(&stuff->pid, n); 262605b261ecSmrg swapl(&stuff->center.x, n); 262705b261ecSmrg swapl(&stuff->center.y, n); 262805b261ecSmrg swapl(&stuff->angle, n); 262905b261ecSmrg swapl(&stuff->nStops, n); 263005b261ecSmrg 263105b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 263205b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 263305b261ecSmrg return BadLength; 263405b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 263505b261ecSmrg return BadLength; 263605b261ecSmrg 263705b261ecSmrg swapStops(stuff+1, stuff->nStops); 263805b261ecSmrg 263905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 264005b261ecSmrg} 264105b261ecSmrg 264205b261ecSmrgstatic int 264305b261ecSmrgSProcRenderDispatch (ClientPtr client) 264405b261ecSmrg{ 264505b261ecSmrg REQUEST(xReq); 264605b261ecSmrg 264705b261ecSmrg if (stuff->data < RenderNumberRequests) 264805b261ecSmrg return (*SProcRenderVector[stuff->data]) (client); 264905b261ecSmrg else 265005b261ecSmrg return BadRequest; 265105b261ecSmrg} 265205b261ecSmrg 265305b261ecSmrg#ifdef PANORAMIX 265405b261ecSmrg#include "panoramiX.h" 265505b261ecSmrg#include "panoramiXsrv.h" 265605b261ecSmrg 26576747b715Smrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\ 26586747b715Smrg int rc = dixLookupResourceByType((pointer *)&(pPicture), pid,\ 26596747b715Smrg XRT_PICTURE, client, mode);\ 26606747b715Smrg if (rc != Success)\ 26616747b715Smrg return rc;\ 266205b261ecSmrg} 266305b261ecSmrg 26646747b715Smrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\ 266505b261ecSmrg if (pid == None) \ 266605b261ecSmrg pPicture = 0; \ 266705b261ecSmrg else { \ 26686747b715Smrg VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \ 266905b261ecSmrg } \ 267005b261ecSmrg} \ 267105b261ecSmrg 267205b261ecSmrgint (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr); 267305b261ecSmrg 267405b261ecSmrgstatic int 267505b261ecSmrgPanoramiXRenderCreatePicture (ClientPtr client) 267605b261ecSmrg{ 267705b261ecSmrg REQUEST(xRenderCreatePictureReq); 267805b261ecSmrg PanoramiXRes *refDraw, *newPict; 26796747b715Smrg int result, j; 268005b261ecSmrg 268105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 26826747b715Smrg result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable, 26836747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 26846747b715Smrg if (result != Success) 26856747b715Smrg return (result == BadValue) ? BadDrawable : result; 26866747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 268705b261ecSmrg return BadAlloc; 268805b261ecSmrg newPict->type = XRT_PICTURE; 268905b261ecSmrg newPict->info[0].id = stuff->pid; 269005b261ecSmrg 269105b261ecSmrg if (refDraw->type == XRT_WINDOW && 26926747b715Smrg stuff->drawable == screenInfo.screens[0]->root->drawable.id) 269305b261ecSmrg { 269405b261ecSmrg newPict->u.pict.root = TRUE; 269505b261ecSmrg } 269605b261ecSmrg else 269705b261ecSmrg newPict->u.pict.root = FALSE; 269805b261ecSmrg 269905b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 270005b261ecSmrg newPict->info[j].id = FakeClientID(client->index); 270105b261ecSmrg 270205b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 270305b261ecSmrg stuff->pid = newPict->info[j].id; 270405b261ecSmrg stuff->drawable = refDraw->info[j].id; 270505b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client); 270605b261ecSmrg if(result != Success) break; 270705b261ecSmrg } 270805b261ecSmrg 270905b261ecSmrg if (result == Success) 271005b261ecSmrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 271105b261ecSmrg else 27126747b715Smrg free(newPict); 271305b261ecSmrg 27146747b715Smrg return result; 271505b261ecSmrg} 271605b261ecSmrg 271705b261ecSmrgstatic int 271805b261ecSmrgPanoramiXRenderChangePicture (ClientPtr client) 271905b261ecSmrg{ 272005b261ecSmrg PanoramiXRes *pict; 272105b261ecSmrg int result = Success, j; 272205b261ecSmrg REQUEST(xRenderChangePictureReq); 272305b261ecSmrg 27246747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 272505b261ecSmrg 27266747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 272705b261ecSmrg 272805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 272905b261ecSmrg stuff->picture = pict->info[j].id; 273005b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client); 273105b261ecSmrg if(result != Success) break; 273205b261ecSmrg } 273305b261ecSmrg 27346747b715Smrg return result; 273505b261ecSmrg} 273605b261ecSmrg 273705b261ecSmrgstatic int 273805b261ecSmrgPanoramiXRenderSetPictureClipRectangles (ClientPtr client) 273905b261ecSmrg{ 274005b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 274105b261ecSmrg int result = Success, j; 274205b261ecSmrg PanoramiXRes *pict; 274305b261ecSmrg 274405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 274505b261ecSmrg 27466747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 274705b261ecSmrg 274805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 274905b261ecSmrg stuff->picture = pict->info[j].id; 275005b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) (client); 275105b261ecSmrg if(result != Success) break; 275205b261ecSmrg } 275305b261ecSmrg 27546747b715Smrg return result; 275505b261ecSmrg} 275605b261ecSmrg 275705b261ecSmrgstatic int 275805b261ecSmrgPanoramiXRenderSetPictureTransform (ClientPtr client) 275905b261ecSmrg{ 276005b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 276105b261ecSmrg int result = Success, j; 276205b261ecSmrg PanoramiXRes *pict; 276305b261ecSmrg 276405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq); 276505b261ecSmrg 27666747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 276705b261ecSmrg 276805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 276905b261ecSmrg stuff->picture = pict->info[j].id; 277005b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client); 277105b261ecSmrg if(result != Success) break; 277205b261ecSmrg } 277305b261ecSmrg 27746747b715Smrg return result; 277505b261ecSmrg} 277605b261ecSmrg 277705b261ecSmrgstatic int 277805b261ecSmrgPanoramiXRenderSetPictureFilter (ClientPtr client) 277905b261ecSmrg{ 278005b261ecSmrg REQUEST(xRenderSetPictureFilterReq); 278105b261ecSmrg int result = Success, j; 278205b261ecSmrg PanoramiXRes *pict; 278305b261ecSmrg 278405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq); 278505b261ecSmrg 27866747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 278705b261ecSmrg 278805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 278905b261ecSmrg stuff->picture = pict->info[j].id; 279005b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client); 279105b261ecSmrg if(result != Success) break; 279205b261ecSmrg } 279305b261ecSmrg 27946747b715Smrg return result; 279505b261ecSmrg} 279605b261ecSmrg 279705b261ecSmrgstatic int 279805b261ecSmrgPanoramiXRenderFreePicture (ClientPtr client) 279905b261ecSmrg{ 280005b261ecSmrg PanoramiXRes *pict; 280105b261ecSmrg int result = Success, j; 280205b261ecSmrg REQUEST(xRenderFreePictureReq); 280305b261ecSmrg 280405b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 280505b261ecSmrg 280605b261ecSmrg client->errorValue = stuff->picture; 280705b261ecSmrg 28086747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess); 280905b261ecSmrg 281005b261ecSmrg 281105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 281205b261ecSmrg stuff->picture = pict->info[j].id; 281305b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client); 281405b261ecSmrg if(result != Success) break; 281505b261ecSmrg } 281605b261ecSmrg 281705b261ecSmrg /* Since ProcRenderFreePicture is using FreeResource, it will free 281805b261ecSmrg our resource for us on the last pass through the loop above */ 281905b261ecSmrg 28206747b715Smrg return result; 282105b261ecSmrg} 282205b261ecSmrg 282305b261ecSmrgstatic int 282405b261ecSmrgPanoramiXRenderComposite (ClientPtr client) 282505b261ecSmrg{ 282605b261ecSmrg PanoramiXRes *src, *msk, *dst; 282705b261ecSmrg int result = Success, j; 282805b261ecSmrg xRenderCompositeReq orig; 282905b261ecSmrg REQUEST(xRenderCompositeReq); 283005b261ecSmrg 283105b261ecSmrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 283205b261ecSmrg 28336747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 28346747b715Smrg VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess); 28356747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 283605b261ecSmrg 283705b261ecSmrg orig = *stuff; 283805b261ecSmrg 283905b261ecSmrg FOR_NSCREENS_FORWARD(j) { 284005b261ecSmrg stuff->src = src->info[j].id; 284105b261ecSmrg if (src->u.pict.root) 284205b261ecSmrg { 28436747b715Smrg stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x; 28446747b715Smrg stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y; 284505b261ecSmrg } 284605b261ecSmrg stuff->dst = dst->info[j].id; 284705b261ecSmrg if (dst->u.pict.root) 284805b261ecSmrg { 28496747b715Smrg stuff->xDst = orig.xDst - screenInfo.screens[j]->x; 28506747b715Smrg stuff->yDst = orig.yDst - screenInfo.screens[j]->y; 285105b261ecSmrg } 285205b261ecSmrg if (msk) 285305b261ecSmrg { 285405b261ecSmrg stuff->mask = msk->info[j].id; 285505b261ecSmrg if (msk->u.pict.root) 285605b261ecSmrg { 28576747b715Smrg stuff->xMask = orig.xMask - screenInfo.screens[j]->x; 28586747b715Smrg stuff->yMask = orig.yMask - screenInfo.screens[j]->y; 285905b261ecSmrg } 286005b261ecSmrg } 286105b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client); 286205b261ecSmrg if(result != Success) break; 286305b261ecSmrg } 286405b261ecSmrg 286505b261ecSmrg return result; 286605b261ecSmrg} 286705b261ecSmrg 286805b261ecSmrgstatic int 286905b261ecSmrgPanoramiXRenderCompositeGlyphs (ClientPtr client) 287005b261ecSmrg{ 287105b261ecSmrg PanoramiXRes *src, *dst; 287205b261ecSmrg int result = Success, j; 287305b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 287405b261ecSmrg xGlyphElt origElt, *elt; 287505b261ecSmrg INT16 xSrc, ySrc; 287605b261ecSmrg 287705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 28786747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 28796747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 288005b261ecSmrg 288105b261ecSmrg if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) + 288205b261ecSmrg sizeof (xGlyphElt))) 288305b261ecSmrg { 288405b261ecSmrg elt = (xGlyphElt *) (stuff + 1); 288505b261ecSmrg origElt = *elt; 288605b261ecSmrg xSrc = stuff->xSrc; 288705b261ecSmrg ySrc = stuff->ySrc; 288805b261ecSmrg FOR_NSCREENS_FORWARD(j) { 288905b261ecSmrg stuff->src = src->info[j].id; 289005b261ecSmrg if (src->u.pict.root) 289105b261ecSmrg { 28926747b715Smrg stuff->xSrc = xSrc - screenInfo.screens[j]->x; 28936747b715Smrg stuff->ySrc = ySrc - screenInfo.screens[j]->y; 289405b261ecSmrg } 289505b261ecSmrg stuff->dst = dst->info[j].id; 289605b261ecSmrg if (dst->u.pict.root) 289705b261ecSmrg { 28986747b715Smrg elt->deltax = origElt.deltax - screenInfo.screens[j]->x; 28996747b715Smrg elt->deltay = origElt.deltay - screenInfo.screens[j]->y; 290005b261ecSmrg } 290105b261ecSmrg result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client); 290205b261ecSmrg if(result != Success) break; 290305b261ecSmrg } 290405b261ecSmrg } 290505b261ecSmrg 290605b261ecSmrg return result; 290705b261ecSmrg} 290805b261ecSmrg 290905b261ecSmrgstatic int 291005b261ecSmrgPanoramiXRenderFillRectangles (ClientPtr client) 291105b261ecSmrg{ 291205b261ecSmrg PanoramiXRes *dst; 291305b261ecSmrg int result = Success, j; 291405b261ecSmrg REQUEST(xRenderFillRectanglesReq); 291505b261ecSmrg char *extra; 291605b261ecSmrg int extra_len; 291705b261ecSmrg 291805b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 29196747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 292005b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq); 292105b261ecSmrg if (extra_len && 29226747b715Smrg (extra = (char *) malloc(extra_len))) 292305b261ecSmrg { 292405b261ecSmrg memcpy (extra, stuff + 1, extra_len); 292505b261ecSmrg FOR_NSCREENS_FORWARD(j) { 292605b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 292705b261ecSmrg if (dst->u.pict.root) 292805b261ecSmrg { 29296747b715Smrg int x_off = screenInfo.screens[j]->x; 29306747b715Smrg int y_off = screenInfo.screens[j]->y; 293105b261ecSmrg 293205b261ecSmrg if(x_off || y_off) { 293305b261ecSmrg xRectangle *rects = (xRectangle *) (stuff + 1); 293405b261ecSmrg int i = extra_len / sizeof (xRectangle); 293505b261ecSmrg 293605b261ecSmrg while (i--) 293705b261ecSmrg { 293805b261ecSmrg rects->x -= x_off; 293905b261ecSmrg rects->y -= y_off; 294005b261ecSmrg rects++; 294105b261ecSmrg } 294205b261ecSmrg } 294305b261ecSmrg } 294405b261ecSmrg stuff->dst = dst->info[j].id; 294505b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client); 294605b261ecSmrg if(result != Success) break; 294705b261ecSmrg } 29486747b715Smrg free(extra); 294905b261ecSmrg } 295005b261ecSmrg 295105b261ecSmrg return result; 295205b261ecSmrg} 295305b261ecSmrg 295405b261ecSmrgstatic int 295505b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client) 295605b261ecSmrg{ 295705b261ecSmrg PanoramiXRes *src, *dst; 295805b261ecSmrg int result = Success, j; 295905b261ecSmrg REQUEST(xRenderTrapezoidsReq); 296005b261ecSmrg char *extra; 296105b261ecSmrg int extra_len; 296205b261ecSmrg 296305b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq); 296405b261ecSmrg 29656747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 29666747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 296705b261ecSmrg 296805b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq); 296905b261ecSmrg 297005b261ecSmrg if (extra_len && 29716747b715Smrg (extra = (char *) malloc(extra_len))) { 297205b261ecSmrg memcpy (extra, stuff + 1, extra_len); 297305b261ecSmrg 297405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 297505b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 297605b261ecSmrg if (dst->u.pict.root) { 29776747b715Smrg int x_off = screenInfo.screens[j]->x; 29786747b715Smrg int y_off = screenInfo.screens[j]->y; 297905b261ecSmrg 298005b261ecSmrg if(x_off || y_off) { 298105b261ecSmrg xTrapezoid *trap = (xTrapezoid *) (stuff + 1); 298205b261ecSmrg int i = extra_len / sizeof (xTrapezoid); 298305b261ecSmrg 298405b261ecSmrg while (i--) { 298505b261ecSmrg trap->top -= y_off; 298605b261ecSmrg trap->bottom -= y_off; 298705b261ecSmrg trap->left.p1.x -= x_off; 298805b261ecSmrg trap->left.p1.y -= y_off; 298905b261ecSmrg trap->left.p2.x -= x_off; 299005b261ecSmrg trap->left.p2.y -= y_off; 299105b261ecSmrg trap->right.p1.x -= x_off; 299205b261ecSmrg trap->right.p1.y -= y_off; 299305b261ecSmrg trap->right.p2.x -= x_off; 299405b261ecSmrg trap->right.p2.y -= y_off; 299505b261ecSmrg trap++; 299605b261ecSmrg } 299705b261ecSmrg } 299805b261ecSmrg } 299905b261ecSmrg 300005b261ecSmrg stuff->src = src->info[j].id; 300105b261ecSmrg stuff->dst = dst->info[j].id; 300205b261ecSmrg result = 300305b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client); 300405b261ecSmrg 300505b261ecSmrg if(result != Success) break; 300605b261ecSmrg } 300705b261ecSmrg 30086747b715Smrg free(extra); 300905b261ecSmrg } 301005b261ecSmrg 301105b261ecSmrg return result; 301205b261ecSmrg} 301305b261ecSmrg 301405b261ecSmrgstatic int 301505b261ecSmrgPanoramiXRenderTriangles(ClientPtr client) 301605b261ecSmrg{ 301705b261ecSmrg PanoramiXRes *src, *dst; 301805b261ecSmrg int result = Success, j; 301905b261ecSmrg REQUEST(xRenderTrianglesReq); 302005b261ecSmrg char *extra; 302105b261ecSmrg int extra_len; 302205b261ecSmrg 302305b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq); 302405b261ecSmrg 30256747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 30266747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 302705b261ecSmrg 302805b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq); 302905b261ecSmrg 303005b261ecSmrg if (extra_len && 30316747b715Smrg (extra = (char *) malloc(extra_len))) { 303205b261ecSmrg memcpy (extra, stuff + 1, extra_len); 303305b261ecSmrg 303405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 303505b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 303605b261ecSmrg if (dst->u.pict.root) { 30376747b715Smrg int x_off = screenInfo.screens[j]->x; 30386747b715Smrg int y_off = screenInfo.screens[j]->y; 303905b261ecSmrg 304005b261ecSmrg if(x_off || y_off) { 304105b261ecSmrg xTriangle *tri = (xTriangle *) (stuff + 1); 304205b261ecSmrg int i = extra_len / sizeof (xTriangle); 304305b261ecSmrg 304405b261ecSmrg while (i--) { 304505b261ecSmrg tri->p1.x -= x_off; 304605b261ecSmrg tri->p1.y -= y_off; 304705b261ecSmrg tri->p2.x -= x_off; 304805b261ecSmrg tri->p2.y -= y_off; 304905b261ecSmrg tri->p3.x -= x_off; 305005b261ecSmrg tri->p3.y -= y_off; 305105b261ecSmrg tri++; 305205b261ecSmrg } 305305b261ecSmrg } 305405b261ecSmrg } 305505b261ecSmrg 305605b261ecSmrg stuff->src = src->info[j].id; 305705b261ecSmrg stuff->dst = dst->info[j].id; 305805b261ecSmrg result = 305905b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client); 306005b261ecSmrg 306105b261ecSmrg if(result != Success) break; 306205b261ecSmrg } 306305b261ecSmrg 30646747b715Smrg free(extra); 306505b261ecSmrg } 306605b261ecSmrg 306705b261ecSmrg return result; 306805b261ecSmrg} 306905b261ecSmrg 307005b261ecSmrgstatic int 307105b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client) 307205b261ecSmrg{ 307305b261ecSmrg PanoramiXRes *src, *dst; 307405b261ecSmrg int result = Success, j; 307505b261ecSmrg REQUEST(xRenderTriStripReq); 307605b261ecSmrg char *extra; 307705b261ecSmrg int extra_len; 307805b261ecSmrg 307905b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTriStripReq); 308005b261ecSmrg 30816747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 30826747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 308305b261ecSmrg 308405b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq); 308505b261ecSmrg 308605b261ecSmrg if (extra_len && 30876747b715Smrg (extra = (char *) malloc(extra_len))) { 308805b261ecSmrg memcpy (extra, stuff + 1, extra_len); 308905b261ecSmrg 309005b261ecSmrg FOR_NSCREENS_FORWARD(j) { 309105b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 309205b261ecSmrg if (dst->u.pict.root) { 30936747b715Smrg int x_off = screenInfo.screens[j]->x; 30946747b715Smrg int y_off = screenInfo.screens[j]->y; 309505b261ecSmrg 309605b261ecSmrg if(x_off || y_off) { 309705b261ecSmrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 309805b261ecSmrg int i = extra_len / sizeof (xPointFixed); 309905b261ecSmrg 310005b261ecSmrg while (i--) { 310105b261ecSmrg fixed->x -= x_off; 310205b261ecSmrg fixed->y -= y_off; 310305b261ecSmrg fixed++; 310405b261ecSmrg } 310505b261ecSmrg } 310605b261ecSmrg } 310705b261ecSmrg 310805b261ecSmrg stuff->src = src->info[j].id; 310905b261ecSmrg stuff->dst = dst->info[j].id; 311005b261ecSmrg result = 311105b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client); 311205b261ecSmrg 311305b261ecSmrg if(result != Success) break; 311405b261ecSmrg } 311505b261ecSmrg 31166747b715Smrg free(extra); 311705b261ecSmrg } 311805b261ecSmrg 311905b261ecSmrg return result; 312005b261ecSmrg} 312105b261ecSmrg 312205b261ecSmrgstatic int 312305b261ecSmrgPanoramiXRenderTriFan(ClientPtr client) 312405b261ecSmrg{ 312505b261ecSmrg PanoramiXRes *src, *dst; 312605b261ecSmrg int result = Success, j; 312705b261ecSmrg REQUEST(xRenderTriFanReq); 312805b261ecSmrg char *extra; 312905b261ecSmrg int extra_len; 313005b261ecSmrg 313105b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTriFanReq); 313205b261ecSmrg 31336747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 31346747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 313505b261ecSmrg 313605b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq); 313705b261ecSmrg 313805b261ecSmrg if (extra_len && 31396747b715Smrg (extra = (char *) malloc(extra_len))) { 314005b261ecSmrg memcpy (extra, stuff + 1, extra_len); 314105b261ecSmrg 314205b261ecSmrg FOR_NSCREENS_FORWARD(j) { 314305b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 314405b261ecSmrg if (dst->u.pict.root) { 31456747b715Smrg int x_off = screenInfo.screens[j]->x; 31466747b715Smrg int y_off = screenInfo.screens[j]->y; 314705b261ecSmrg 314805b261ecSmrg if(x_off || y_off) { 314905b261ecSmrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 315005b261ecSmrg int i = extra_len / sizeof (xPointFixed); 315105b261ecSmrg 315205b261ecSmrg while (i--) { 315305b261ecSmrg fixed->x -= x_off; 315405b261ecSmrg fixed->y -= y_off; 315505b261ecSmrg fixed++; 315605b261ecSmrg } 315705b261ecSmrg } 315805b261ecSmrg } 315905b261ecSmrg 316005b261ecSmrg stuff->src = src->info[j].id; 316105b261ecSmrg stuff->dst = dst->info[j].id; 316205b261ecSmrg result = 316305b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client); 316405b261ecSmrg 316505b261ecSmrg if(result != Success) break; 316605b261ecSmrg } 316705b261ecSmrg 31686747b715Smrg free(extra); 316905b261ecSmrg } 317005b261ecSmrg 317105b261ecSmrg return result; 317205b261ecSmrg} 317305b261ecSmrg 317405b261ecSmrgstatic int 317505b261ecSmrgPanoramiXRenderAddTraps (ClientPtr client) 317605b261ecSmrg{ 317705b261ecSmrg PanoramiXRes *picture; 317805b261ecSmrg int result = Success, j; 317905b261ecSmrg REQUEST(xRenderAddTrapsReq); 318005b261ecSmrg char *extra; 318105b261ecSmrg int extra_len; 318205b261ecSmrg INT16 x_off, y_off; 318305b261ecSmrg 318405b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq); 31856747b715Smrg VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess); 318605b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq); 318705b261ecSmrg if (extra_len && 31886747b715Smrg (extra = (char *) malloc(extra_len))) 318905b261ecSmrg { 319005b261ecSmrg memcpy (extra, stuff + 1, extra_len); 319105b261ecSmrg x_off = stuff->xOff; 319205b261ecSmrg y_off = stuff->yOff; 319305b261ecSmrg FOR_NSCREENS_FORWARD(j) { 319405b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 319505b261ecSmrg stuff->picture = picture->info[j].id; 319605b261ecSmrg 319705b261ecSmrg if (picture->u.pict.root) 319805b261ecSmrg { 31996747b715Smrg stuff->xOff = x_off + screenInfo.screens[j]->x; 32006747b715Smrg stuff->yOff = y_off + screenInfo.screens[j]->y; 320105b261ecSmrg } 320205b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client); 320305b261ecSmrg if(result != Success) break; 320405b261ecSmrg } 32056747b715Smrg free(extra); 32066747b715Smrg } 32076747b715Smrg 32086747b715Smrg return result; 32096747b715Smrg} 32106747b715Smrg 32116747b715Smrgstatic int 32126747b715SmrgPanoramiXRenderCreateSolidFill (ClientPtr client) 32136747b715Smrg{ 32146747b715Smrg REQUEST(xRenderCreateSolidFillReq); 32156747b715Smrg PanoramiXRes *newPict; 32166747b715Smrg int result = Success, j; 32176747b715Smrg 32186747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 32196747b715Smrg 32206747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 32216747b715Smrg return BadAlloc; 32226747b715Smrg 32236747b715Smrg newPict->type = XRT_PICTURE; 32246747b715Smrg newPict->info[0].id = stuff->pid; 32256747b715Smrg newPict->u.pict.root = FALSE; 32266747b715Smrg 32276747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 32286747b715Smrg newPict->info[j].id = FakeClientID(client->index); 32296747b715Smrg 32306747b715Smrg FOR_NSCREENS_BACKWARD(j) { 32316747b715Smrg stuff->pid = newPict->info[j].id; 32326747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client); 32336747b715Smrg if(result != Success) break; 32346747b715Smrg } 32356747b715Smrg 32366747b715Smrg if (result == Success) 32376747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 32386747b715Smrg else 32396747b715Smrg free(newPict); 32406747b715Smrg 32416747b715Smrg return result; 32426747b715Smrg} 32436747b715Smrg 32446747b715Smrgstatic int 32456747b715SmrgPanoramiXRenderCreateLinearGradient (ClientPtr client) 32466747b715Smrg{ 32476747b715Smrg REQUEST(xRenderCreateLinearGradientReq); 32486747b715Smrg PanoramiXRes *newPict; 32496747b715Smrg int result = Success, j; 32506747b715Smrg 32516747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 32526747b715Smrg 32536747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 32546747b715Smrg return BadAlloc; 32556747b715Smrg 32566747b715Smrg newPict->type = XRT_PICTURE; 32576747b715Smrg newPict->info[0].id = stuff->pid; 32586747b715Smrg newPict->u.pict.root = FALSE; 32596747b715Smrg 32606747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 32616747b715Smrg newPict->info[j].id = FakeClientID(client->index); 32626747b715Smrg 32636747b715Smrg FOR_NSCREENS_BACKWARD(j) { 32646747b715Smrg stuff->pid = newPict->info[j].id; 32656747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client); 32666747b715Smrg if(result != Success) break; 326705b261ecSmrg } 326805b261ecSmrg 32696747b715Smrg if (result == Success) 32706747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 32716747b715Smrg else 32726747b715Smrg free(newPict); 32736747b715Smrg 32746747b715Smrg return result; 32756747b715Smrg} 32766747b715Smrg 32776747b715Smrgstatic int 32786747b715SmrgPanoramiXRenderCreateRadialGradient (ClientPtr client) 32796747b715Smrg{ 32806747b715Smrg REQUEST(xRenderCreateRadialGradientReq); 32816747b715Smrg PanoramiXRes *newPict; 32826747b715Smrg int result = Success, j; 32836747b715Smrg 32846747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 32856747b715Smrg 32866747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 32876747b715Smrg return BadAlloc; 32886747b715Smrg 32896747b715Smrg newPict->type = XRT_PICTURE; 32906747b715Smrg newPict->info[0].id = stuff->pid; 32916747b715Smrg newPict->u.pict.root = FALSE; 32926747b715Smrg 32936747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 32946747b715Smrg newPict->info[j].id = FakeClientID(client->index); 32956747b715Smrg 32966747b715Smrg FOR_NSCREENS_BACKWARD(j) { 32976747b715Smrg stuff->pid = newPict->info[j].id; 32986747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client); 32996747b715Smrg if(result != Success) break; 33006747b715Smrg } 33016747b715Smrg 33026747b715Smrg if (result == Success) 33036747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 33046747b715Smrg else 33056747b715Smrg free(newPict); 33066747b715Smrg 33076747b715Smrg return result; 33086747b715Smrg} 33096747b715Smrg 33106747b715Smrgstatic int 33116747b715SmrgPanoramiXRenderCreateConicalGradient (ClientPtr client) 33126747b715Smrg{ 33136747b715Smrg REQUEST(xRenderCreateConicalGradientReq); 33146747b715Smrg PanoramiXRes *newPict; 33156747b715Smrg int result = Success, j; 33166747b715Smrg 33176747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 33186747b715Smrg 33196747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 33206747b715Smrg return BadAlloc; 33216747b715Smrg 33226747b715Smrg newPict->type = XRT_PICTURE; 33236747b715Smrg newPict->info[0].id = stuff->pid; 33246747b715Smrg newPict->u.pict.root = FALSE; 33256747b715Smrg 33266747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 33276747b715Smrg newPict->info[j].id = FakeClientID(client->index); 33286747b715Smrg 33296747b715Smrg FOR_NSCREENS_BACKWARD(j) { 33306747b715Smrg stuff->pid = newPict->info[j].id; 33316747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient]) (client); 33326747b715Smrg if(result != Success) break; 33336747b715Smrg } 33346747b715Smrg 33356747b715Smrg if (result == Success) 33366747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 33376747b715Smrg else 33386747b715Smrg free(newPict); 33396747b715Smrg 334005b261ecSmrg return result; 334105b261ecSmrg} 334205b261ecSmrg 334305b261ecSmrgvoid 334405b261ecSmrgPanoramiXRenderInit (void) 334505b261ecSmrg{ 334605b261ecSmrg int i; 334705b261ecSmrg 33486747b715Smrg XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource, 33496747b715Smrg "XineramaPicture"); 33506747b715Smrg if (RenderErrBase) 33516747b715Smrg SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture); 335205b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 335305b261ecSmrg PanoramiXSaveRenderVector[i] = ProcRenderVector[i]; 335405b261ecSmrg /* 335505b261ecSmrg * Stuff in Xinerama aware request processing hooks 335605b261ecSmrg */ 335705b261ecSmrg ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture; 335805b261ecSmrg ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture; 335905b261ecSmrg ProcRenderVector[X_RenderSetPictureTransform] = PanoramiXRenderSetPictureTransform; 336005b261ecSmrg ProcRenderVector[X_RenderSetPictureFilter] = PanoramiXRenderSetPictureFilter; 336105b261ecSmrg ProcRenderVector[X_RenderSetPictureClipRectangles] = PanoramiXRenderSetPictureClipRectangles; 336205b261ecSmrg ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture; 336305b261ecSmrg ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite; 336405b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs; 336505b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs16] = PanoramiXRenderCompositeGlyphs; 336605b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs32] = PanoramiXRenderCompositeGlyphs; 336705b261ecSmrg ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles; 336805b261ecSmrg 336905b261ecSmrg ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids; 337005b261ecSmrg ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles; 337105b261ecSmrg ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip; 337205b261ecSmrg ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan; 337305b261ecSmrg ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps; 33746747b715Smrg 33756747b715Smrg ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill; 33766747b715Smrg ProcRenderVector[X_RenderCreateLinearGradient] = PanoramiXRenderCreateLinearGradient; 33776747b715Smrg ProcRenderVector[X_RenderCreateRadialGradient] = PanoramiXRenderCreateRadialGradient; 33786747b715Smrg ProcRenderVector[X_RenderCreateConicalGradient] = PanoramiXRenderCreateConicalGradient; 337905b261ecSmrg} 338005b261ecSmrg 338105b261ecSmrgvoid 338205b261ecSmrgPanoramiXRenderReset (void) 338305b261ecSmrg{ 338405b261ecSmrg int i; 338505b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 338605b261ecSmrg ProcRenderVector[i] = PanoramiXSaveRenderVector[i]; 33876747b715Smrg RenderErrBase = 0; 338805b261ecSmrg} 338905b261ecSmrg 339005b261ecSmrg#endif /* PANORAMIX */ 3391