render.c revision 0b0d8713
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 509ace9065Smrg#ifdef PANORAMIX 519ace9065Smrg#include "panoramiX.h" 529ace9065Smrg#include "panoramiXsrv.h" 539ace9065Smrg#endif 549ace9065Smrg 5505b261ecSmrg#if HAVE_STDINT_H 5605b261ecSmrg#include <stdint.h> 5705b261ecSmrg#elif !defined(UINT32_MAX) 5805b261ecSmrg#define UINT32_MAX 0xffffffffU 5905b261ecSmrg#endif 6005b261ecSmrg 6105b261ecSmrgstatic int ProcRenderQueryVersion (ClientPtr pClient); 6205b261ecSmrgstatic int ProcRenderQueryPictFormats (ClientPtr pClient); 6305b261ecSmrgstatic int ProcRenderQueryPictIndexValues (ClientPtr pClient); 6405b261ecSmrgstatic int ProcRenderQueryDithers (ClientPtr pClient); 6505b261ecSmrgstatic int ProcRenderCreatePicture (ClientPtr pClient); 6605b261ecSmrgstatic int ProcRenderChangePicture (ClientPtr pClient); 6705b261ecSmrgstatic int ProcRenderSetPictureClipRectangles (ClientPtr pClient); 6805b261ecSmrgstatic int ProcRenderFreePicture (ClientPtr pClient); 6905b261ecSmrgstatic int ProcRenderComposite (ClientPtr pClient); 7005b261ecSmrgstatic int ProcRenderScale (ClientPtr pClient); 7105b261ecSmrgstatic int ProcRenderTrapezoids (ClientPtr pClient); 7205b261ecSmrgstatic int ProcRenderTriangles (ClientPtr pClient); 7305b261ecSmrgstatic int ProcRenderTriStrip (ClientPtr pClient); 7405b261ecSmrgstatic int ProcRenderTriFan (ClientPtr pClient); 7505b261ecSmrgstatic int ProcRenderColorTrapezoids (ClientPtr pClient); 7605b261ecSmrgstatic int ProcRenderColorTriangles (ClientPtr pClient); 7705b261ecSmrgstatic int ProcRenderTransform (ClientPtr pClient); 7805b261ecSmrgstatic int ProcRenderCreateGlyphSet (ClientPtr pClient); 7905b261ecSmrgstatic int ProcRenderReferenceGlyphSet (ClientPtr pClient); 8005b261ecSmrgstatic int ProcRenderFreeGlyphSet (ClientPtr pClient); 8105b261ecSmrgstatic int ProcRenderAddGlyphs (ClientPtr pClient); 8205b261ecSmrgstatic int ProcRenderAddGlyphsFromPicture (ClientPtr pClient); 8305b261ecSmrgstatic int ProcRenderFreeGlyphs (ClientPtr pClient); 8405b261ecSmrgstatic int ProcRenderCompositeGlyphs (ClientPtr pClient); 8505b261ecSmrgstatic int ProcRenderFillRectangles (ClientPtr pClient); 8605b261ecSmrgstatic int ProcRenderCreateCursor (ClientPtr pClient); 8705b261ecSmrgstatic int ProcRenderSetPictureTransform (ClientPtr pClient); 8805b261ecSmrgstatic int ProcRenderQueryFilters (ClientPtr pClient); 8905b261ecSmrgstatic int ProcRenderSetPictureFilter (ClientPtr pClient); 9005b261ecSmrgstatic int ProcRenderCreateAnimCursor (ClientPtr pClient); 9105b261ecSmrgstatic int ProcRenderAddTraps (ClientPtr pClient); 9205b261ecSmrgstatic int ProcRenderCreateSolidFill (ClientPtr pClient); 9305b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr pClient); 9405b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr pClient); 9505b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr pClient); 9605b261ecSmrg 9705b261ecSmrgstatic int ProcRenderDispatch (ClientPtr pClient); 9805b261ecSmrg 9905b261ecSmrgstatic int SProcRenderQueryVersion (ClientPtr pClient); 10005b261ecSmrgstatic int SProcRenderQueryPictFormats (ClientPtr pClient); 10105b261ecSmrgstatic int SProcRenderQueryPictIndexValues (ClientPtr pClient); 10205b261ecSmrgstatic int SProcRenderQueryDithers (ClientPtr pClient); 10305b261ecSmrgstatic int SProcRenderCreatePicture (ClientPtr pClient); 10405b261ecSmrgstatic int SProcRenderChangePicture (ClientPtr pClient); 10505b261ecSmrgstatic int SProcRenderSetPictureClipRectangles (ClientPtr pClient); 10605b261ecSmrgstatic int SProcRenderFreePicture (ClientPtr pClient); 10705b261ecSmrgstatic int SProcRenderComposite (ClientPtr pClient); 10805b261ecSmrgstatic int SProcRenderScale (ClientPtr pClient); 10905b261ecSmrgstatic int SProcRenderTrapezoids (ClientPtr pClient); 11005b261ecSmrgstatic int SProcRenderTriangles (ClientPtr pClient); 11105b261ecSmrgstatic int SProcRenderTriStrip (ClientPtr pClient); 11205b261ecSmrgstatic int SProcRenderTriFan (ClientPtr pClient); 11305b261ecSmrgstatic int SProcRenderColorTrapezoids (ClientPtr pClient); 11405b261ecSmrgstatic int SProcRenderColorTriangles (ClientPtr pClient); 11505b261ecSmrgstatic int SProcRenderTransform (ClientPtr pClient); 11605b261ecSmrgstatic int SProcRenderCreateGlyphSet (ClientPtr pClient); 11705b261ecSmrgstatic int SProcRenderReferenceGlyphSet (ClientPtr pClient); 11805b261ecSmrgstatic int SProcRenderFreeGlyphSet (ClientPtr pClient); 11905b261ecSmrgstatic int SProcRenderAddGlyphs (ClientPtr pClient); 12005b261ecSmrgstatic int SProcRenderAddGlyphsFromPicture (ClientPtr pClient); 12105b261ecSmrgstatic int SProcRenderFreeGlyphs (ClientPtr pClient); 12205b261ecSmrgstatic int SProcRenderCompositeGlyphs (ClientPtr pClient); 12305b261ecSmrgstatic int SProcRenderFillRectangles (ClientPtr pClient); 12405b261ecSmrgstatic int SProcRenderCreateCursor (ClientPtr pClient); 12505b261ecSmrgstatic int SProcRenderSetPictureTransform (ClientPtr pClient); 12605b261ecSmrgstatic int SProcRenderQueryFilters (ClientPtr pClient); 12705b261ecSmrgstatic int SProcRenderSetPictureFilter (ClientPtr pClient); 12805b261ecSmrgstatic int SProcRenderCreateAnimCursor (ClientPtr pClient); 12905b261ecSmrgstatic int SProcRenderAddTraps (ClientPtr pClient); 13005b261ecSmrgstatic int SProcRenderCreateSolidFill (ClientPtr pClient); 13105b261ecSmrgstatic int SProcRenderCreateLinearGradient (ClientPtr pClient); 13205b261ecSmrgstatic int SProcRenderCreateRadialGradient (ClientPtr pClient); 13305b261ecSmrgstatic int SProcRenderCreateConicalGradient (ClientPtr pClient); 13405b261ecSmrg 13505b261ecSmrgstatic int SProcRenderDispatch (ClientPtr pClient); 13605b261ecSmrg 13705b261ecSmrgint (*ProcRenderVector[RenderNumberRequests])(ClientPtr) = { 13805b261ecSmrg ProcRenderQueryVersion, 13905b261ecSmrg ProcRenderQueryPictFormats, 14005b261ecSmrg ProcRenderQueryPictIndexValues, 14105b261ecSmrg ProcRenderQueryDithers, 14205b261ecSmrg ProcRenderCreatePicture, 14305b261ecSmrg ProcRenderChangePicture, 14405b261ecSmrg ProcRenderSetPictureClipRectangles, 14505b261ecSmrg ProcRenderFreePicture, 14605b261ecSmrg ProcRenderComposite, 14705b261ecSmrg ProcRenderScale, 14805b261ecSmrg ProcRenderTrapezoids, 14905b261ecSmrg ProcRenderTriangles, 15005b261ecSmrg ProcRenderTriStrip, 15105b261ecSmrg ProcRenderTriFan, 15205b261ecSmrg ProcRenderColorTrapezoids, 15305b261ecSmrg ProcRenderColorTriangles, 15405b261ecSmrg ProcRenderTransform, 15505b261ecSmrg ProcRenderCreateGlyphSet, 15605b261ecSmrg ProcRenderReferenceGlyphSet, 15705b261ecSmrg ProcRenderFreeGlyphSet, 15805b261ecSmrg ProcRenderAddGlyphs, 15905b261ecSmrg ProcRenderAddGlyphsFromPicture, 16005b261ecSmrg ProcRenderFreeGlyphs, 16105b261ecSmrg ProcRenderCompositeGlyphs, 16205b261ecSmrg ProcRenderCompositeGlyphs, 16305b261ecSmrg ProcRenderCompositeGlyphs, 16405b261ecSmrg ProcRenderFillRectangles, 16505b261ecSmrg ProcRenderCreateCursor, 16605b261ecSmrg ProcRenderSetPictureTransform, 16705b261ecSmrg ProcRenderQueryFilters, 16805b261ecSmrg ProcRenderSetPictureFilter, 16905b261ecSmrg ProcRenderCreateAnimCursor, 17005b261ecSmrg ProcRenderAddTraps, 17105b261ecSmrg ProcRenderCreateSolidFill, 17205b261ecSmrg ProcRenderCreateLinearGradient, 17305b261ecSmrg ProcRenderCreateRadialGradient, 17405b261ecSmrg ProcRenderCreateConicalGradient 17505b261ecSmrg}; 17605b261ecSmrg 17705b261ecSmrgint (*SProcRenderVector[RenderNumberRequests])(ClientPtr) = { 17805b261ecSmrg SProcRenderQueryVersion, 17905b261ecSmrg SProcRenderQueryPictFormats, 18005b261ecSmrg SProcRenderQueryPictIndexValues, 18105b261ecSmrg SProcRenderQueryDithers, 18205b261ecSmrg SProcRenderCreatePicture, 18305b261ecSmrg SProcRenderChangePicture, 18405b261ecSmrg SProcRenderSetPictureClipRectangles, 18505b261ecSmrg SProcRenderFreePicture, 18605b261ecSmrg SProcRenderComposite, 18705b261ecSmrg SProcRenderScale, 18805b261ecSmrg SProcRenderTrapezoids, 18905b261ecSmrg SProcRenderTriangles, 19005b261ecSmrg SProcRenderTriStrip, 19105b261ecSmrg SProcRenderTriFan, 19205b261ecSmrg SProcRenderColorTrapezoids, 19305b261ecSmrg SProcRenderColorTriangles, 19405b261ecSmrg SProcRenderTransform, 19505b261ecSmrg SProcRenderCreateGlyphSet, 19605b261ecSmrg SProcRenderReferenceGlyphSet, 19705b261ecSmrg SProcRenderFreeGlyphSet, 19805b261ecSmrg SProcRenderAddGlyphs, 19905b261ecSmrg SProcRenderAddGlyphsFromPicture, 20005b261ecSmrg SProcRenderFreeGlyphs, 20105b261ecSmrg SProcRenderCompositeGlyphs, 20205b261ecSmrg SProcRenderCompositeGlyphs, 20305b261ecSmrg SProcRenderCompositeGlyphs, 20405b261ecSmrg SProcRenderFillRectangles, 20505b261ecSmrg SProcRenderCreateCursor, 20605b261ecSmrg SProcRenderSetPictureTransform, 20705b261ecSmrg SProcRenderQueryFilters, 20805b261ecSmrg SProcRenderSetPictureFilter, 20905b261ecSmrg SProcRenderCreateAnimCursor, 21005b261ecSmrg SProcRenderAddTraps, 21105b261ecSmrg SProcRenderCreateSolidFill, 21205b261ecSmrg SProcRenderCreateLinearGradient, 21305b261ecSmrg SProcRenderCreateRadialGradient, 21405b261ecSmrg SProcRenderCreateConicalGradient 21505b261ecSmrg}; 21605b261ecSmrg 21705b261ecSmrgint RenderErrBase; 2186747b715Smrgstatic DevPrivateKeyRec RenderClientPrivateKeyRec; 2196747b715Smrg#define RenderClientPrivateKey (&RenderClientPrivateKeyRec ) 22005b261ecSmrg 22105b261ecSmrgtypedef struct _RenderClient { 22205b261ecSmrg int major_version; 22305b261ecSmrg int minor_version; 22405b261ecSmrg} RenderClientRec, *RenderClientPtr; 22505b261ecSmrg 2264642e01fSmrg#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey)) 22705b261ecSmrg 22805b261ecSmrgstatic void 22905b261ecSmrgRenderClientCallback (CallbackListPtr *list, 23005b261ecSmrg pointer closure, 23105b261ecSmrg pointer data) 23205b261ecSmrg{ 23305b261ecSmrg NewClientInfoRec *clientinfo = (NewClientInfoRec *) data; 23405b261ecSmrg ClientPtr pClient = clientinfo->client; 23505b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (pClient); 23605b261ecSmrg 23705b261ecSmrg pRenderClient->major_version = 0; 23805b261ecSmrg pRenderClient->minor_version = 0; 23905b261ecSmrg} 24005b261ecSmrg 2416747b715Smrg#ifdef PANORAMIX 2426747b715Smrgunsigned long XRT_PICTURE; 2436747b715Smrg#endif 2446747b715Smrg 24505b261ecSmrgvoid 24605b261ecSmrgRenderExtensionInit (void) 24705b261ecSmrg{ 24805b261ecSmrg ExtensionEntry *extEntry; 24905b261ecSmrg 25005b261ecSmrg if (!PictureType) 25105b261ecSmrg return; 25205b261ecSmrg if (!PictureFinishInit ()) 25305b261ecSmrg return; 2546747b715Smrg if (!dixRegisterPrivateKey(&RenderClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(RenderClientRec))) 25505b261ecSmrg return; 25605b261ecSmrg if (!AddCallback (&ClientStateCallback, RenderClientCallback, 0)) 25705b261ecSmrg return; 25805b261ecSmrg 25905b261ecSmrg extEntry = AddExtension (RENDER_NAME, 0, RenderNumberErrors, 26005b261ecSmrg ProcRenderDispatch, SProcRenderDispatch, 2614642e01fSmrg NULL, StandardMinorOpcode); 26205b261ecSmrg if (!extEntry) 26305b261ecSmrg return; 26405b261ecSmrg RenderErrBase = extEntry->errorBase; 2656747b715Smrg#ifdef PANORAMIX 2666747b715Smrg if (XRT_PICTURE) 2676747b715Smrg SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture); 2686747b715Smrg#endif 2696747b715Smrg SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture); 2706747b715Smrg SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat); 2716747b715Smrg SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet); 27205b261ecSmrg} 27305b261ecSmrg 27405b261ecSmrgstatic int 27505b261ecSmrgProcRenderQueryVersion (ClientPtr client) 27605b261ecSmrg{ 27705b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (client); 27805b261ecSmrg xRenderQueryVersionReply rep; 27905b261ecSmrg register int n; 28005b261ecSmrg REQUEST(xRenderQueryVersionReq); 2810b0d8713Smrg REQUEST_SIZE_MATCH(xRenderQueryVersionReq); 28205b261ecSmrg 28305b261ecSmrg pRenderClient->major_version = stuff->majorVersion; 28405b261ecSmrg pRenderClient->minor_version = stuff->minorVersion; 28505b261ecSmrg 2866747b715Smrg memset(&rep, 0, sizeof(xRenderQueryVersionReply)); 28705b261ecSmrg rep.type = X_Reply; 28805b261ecSmrg rep.length = 0; 28905b261ecSmrg rep.sequenceNumber = client->sequence; 2906747b715Smrg 2916747b715Smrg if ((stuff->majorVersion * 1000 + stuff->minorVersion) < 2926747b715Smrg (SERVER_RENDER_MAJOR_VERSION * 1000 + SERVER_RENDER_MINOR_VERSION)) 2936747b715Smrg { 2946747b715Smrg rep.majorVersion = stuff->majorVersion; 2956747b715Smrg rep.minorVersion = stuff->minorVersion; 2966747b715Smrg } else 2976747b715Smrg { 2986747b715Smrg rep.majorVersion = SERVER_RENDER_MAJOR_VERSION; 2996747b715Smrg rep.minorVersion = SERVER_RENDER_MINOR_VERSION; 3006747b715Smrg } 3016747b715Smrg 30205b261ecSmrg if (client->swapped) { 30305b261ecSmrg swaps(&rep.sequenceNumber, n); 30405b261ecSmrg swapl(&rep.length, n); 30505b261ecSmrg swapl(&rep.majorVersion, n); 30605b261ecSmrg swapl(&rep.minorVersion, n); 30705b261ecSmrg } 30805b261ecSmrg WriteToClient(client, sizeof(xRenderQueryVersionReply), (char *)&rep); 3096747b715Smrg return Success; 31005b261ecSmrg} 31105b261ecSmrg 31205b261ecSmrgstatic VisualPtr 31305b261ecSmrgfindVisual (ScreenPtr pScreen, VisualID vid) 31405b261ecSmrg{ 31505b261ecSmrg VisualPtr pVisual; 31605b261ecSmrg int v; 31705b261ecSmrg 31805b261ecSmrg for (v = 0; v < pScreen->numVisuals; v++) 31905b261ecSmrg { 32005b261ecSmrg pVisual = pScreen->visuals + v; 32105b261ecSmrg if (pVisual->vid == vid) 32205b261ecSmrg return pVisual; 32305b261ecSmrg } 32405b261ecSmrg return 0; 32505b261ecSmrg} 32605b261ecSmrg 32705b261ecSmrgstatic int 32805b261ecSmrgProcRenderQueryPictFormats (ClientPtr client) 32905b261ecSmrg{ 33005b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (client); 33105b261ecSmrg xRenderQueryPictFormatsReply *reply; 33205b261ecSmrg xPictScreen *pictScreen; 33305b261ecSmrg xPictDepth *pictDepth; 33405b261ecSmrg xPictVisual *pictVisual; 33505b261ecSmrg xPictFormInfo *pictForm; 33605b261ecSmrg CARD32 *pictSubpixel; 33705b261ecSmrg ScreenPtr pScreen; 33805b261ecSmrg VisualPtr pVisual; 33905b261ecSmrg DepthPtr pDepth; 34005b261ecSmrg int v, d; 34105b261ecSmrg PictureScreenPtr ps; 34205b261ecSmrg PictFormatPtr pFormat; 34305b261ecSmrg int nformat; 34405b261ecSmrg int ndepth; 34505b261ecSmrg int nvisual; 34605b261ecSmrg int rlength; 34705b261ecSmrg int s; 34805b261ecSmrg int n; 34905b261ecSmrg int numScreens; 35005b261ecSmrg int numSubpixel; 35105b261ecSmrg/* REQUEST(xRenderQueryPictFormatsReq); */ 35205b261ecSmrg 35305b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq); 35405b261ecSmrg 35505b261ecSmrg#ifdef PANORAMIX 35605b261ecSmrg if (noPanoramiXExtension) 35705b261ecSmrg numScreens = screenInfo.numScreens; 35805b261ecSmrg else 35905b261ecSmrg numScreens = ((xConnSetup *)ConnectionInfo)->numRoots; 36005b261ecSmrg#else 36105b261ecSmrg numScreens = screenInfo.numScreens; 36205b261ecSmrg#endif 36305b261ecSmrg ndepth = nformat = nvisual = 0; 36405b261ecSmrg for (s = 0; s < numScreens; s++) 36505b261ecSmrg { 36605b261ecSmrg pScreen = screenInfo.screens[s]; 36705b261ecSmrg for (d = 0; d < pScreen->numDepths; d++) 36805b261ecSmrg { 36905b261ecSmrg pDepth = pScreen->allowedDepths + d; 37005b261ecSmrg ++ndepth; 37105b261ecSmrg 37205b261ecSmrg for (v = 0; v < pDepth->numVids; v++) 37305b261ecSmrg { 37405b261ecSmrg pVisual = findVisual (pScreen, pDepth->vids[v]); 37505b261ecSmrg if (pVisual && PictureMatchVisual (pScreen, pDepth->depth, pVisual)) 37605b261ecSmrg ++nvisual; 37705b261ecSmrg } 37805b261ecSmrg } 37905b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 38005b261ecSmrg if (ps) 38105b261ecSmrg nformat += ps->nformats; 38205b261ecSmrg } 38305b261ecSmrg if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6) 38405b261ecSmrg numSubpixel = 0; 38505b261ecSmrg else 38605b261ecSmrg numSubpixel = numScreens; 38705b261ecSmrg 38805b261ecSmrg rlength = (sizeof (xRenderQueryPictFormatsReply) + 38905b261ecSmrg nformat * sizeof (xPictFormInfo) + 39005b261ecSmrg numScreens * sizeof (xPictScreen) + 39105b261ecSmrg ndepth * sizeof (xPictDepth) + 39205b261ecSmrg nvisual * sizeof (xPictVisual) + 39305b261ecSmrg numSubpixel * sizeof (CARD32)); 3946747b715Smrg reply = (xRenderQueryPictFormatsReply *) calloc(1, rlength); 39505b261ecSmrg if (!reply) 39605b261ecSmrg return BadAlloc; 39705b261ecSmrg reply->type = X_Reply; 39805b261ecSmrg reply->sequenceNumber = client->sequence; 3996747b715Smrg reply->length = bytes_to_int32(rlength - sizeof(xGenericReply)); 40005b261ecSmrg reply->numFormats = nformat; 40105b261ecSmrg reply->numScreens = numScreens; 40205b261ecSmrg reply->numDepths = ndepth; 40305b261ecSmrg reply->numVisuals = nvisual; 40405b261ecSmrg reply->numSubpixel = numSubpixel; 40505b261ecSmrg 40605b261ecSmrg pictForm = (xPictFormInfo *) (reply + 1); 40705b261ecSmrg 40805b261ecSmrg for (s = 0; s < numScreens; s++) 40905b261ecSmrg { 41005b261ecSmrg pScreen = screenInfo.screens[s]; 41105b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 41205b261ecSmrg if (ps) 41305b261ecSmrg { 41405b261ecSmrg for (nformat = 0, pFormat = ps->formats; 41505b261ecSmrg nformat < ps->nformats; 41605b261ecSmrg nformat++, pFormat++) 41705b261ecSmrg { 41805b261ecSmrg pictForm->id = pFormat->id; 41905b261ecSmrg pictForm->type = pFormat->type; 42005b261ecSmrg pictForm->depth = pFormat->depth; 42105b261ecSmrg pictForm->direct.red = pFormat->direct.red; 42205b261ecSmrg pictForm->direct.redMask = pFormat->direct.redMask; 42305b261ecSmrg pictForm->direct.green = pFormat->direct.green; 42405b261ecSmrg pictForm->direct.greenMask = pFormat->direct.greenMask; 42505b261ecSmrg pictForm->direct.blue = pFormat->direct.blue; 42605b261ecSmrg pictForm->direct.blueMask = pFormat->direct.blueMask; 42705b261ecSmrg pictForm->direct.alpha = pFormat->direct.alpha; 42805b261ecSmrg pictForm->direct.alphaMask = pFormat->direct.alphaMask; 42905b261ecSmrg if (pFormat->type == PictTypeIndexed && pFormat->index.pColormap) 43005b261ecSmrg pictForm->colormap = pFormat->index.pColormap->mid; 43105b261ecSmrg else 43205b261ecSmrg pictForm->colormap = None; 43305b261ecSmrg if (client->swapped) 43405b261ecSmrg { 43505b261ecSmrg swapl (&pictForm->id, n); 43605b261ecSmrg swaps (&pictForm->direct.red, n); 43705b261ecSmrg swaps (&pictForm->direct.redMask, n); 43805b261ecSmrg swaps (&pictForm->direct.green, n); 43905b261ecSmrg swaps (&pictForm->direct.greenMask, n); 44005b261ecSmrg swaps (&pictForm->direct.blue, n); 44105b261ecSmrg swaps (&pictForm->direct.blueMask, n); 44205b261ecSmrg swaps (&pictForm->direct.alpha, n); 44305b261ecSmrg swaps (&pictForm->direct.alphaMask, n); 44405b261ecSmrg swapl (&pictForm->colormap, n); 44505b261ecSmrg } 44605b261ecSmrg pictForm++; 44705b261ecSmrg } 44805b261ecSmrg } 44905b261ecSmrg } 45005b261ecSmrg 45105b261ecSmrg pictScreen = (xPictScreen *) pictForm; 45205b261ecSmrg for (s = 0; s < numScreens; s++) 45305b261ecSmrg { 45405b261ecSmrg pScreen = screenInfo.screens[s]; 45505b261ecSmrg pictDepth = (xPictDepth *) (pictScreen + 1); 45605b261ecSmrg ndepth = 0; 45705b261ecSmrg for (d = 0; d < pScreen->numDepths; d++) 45805b261ecSmrg { 45905b261ecSmrg pictVisual = (xPictVisual *) (pictDepth + 1); 46005b261ecSmrg pDepth = pScreen->allowedDepths + d; 46105b261ecSmrg 46205b261ecSmrg nvisual = 0; 46305b261ecSmrg for (v = 0; v < pDepth->numVids; v++) 46405b261ecSmrg { 46505b261ecSmrg pVisual = findVisual (pScreen, pDepth->vids[v]); 46605b261ecSmrg if (pVisual && (pFormat = PictureMatchVisual (pScreen, 46705b261ecSmrg pDepth->depth, 46805b261ecSmrg pVisual))) 46905b261ecSmrg { 47005b261ecSmrg pictVisual->visual = pVisual->vid; 47105b261ecSmrg pictVisual->format = pFormat->id; 47205b261ecSmrg if (client->swapped) 47305b261ecSmrg { 47405b261ecSmrg swapl (&pictVisual->visual, n); 47505b261ecSmrg swapl (&pictVisual->format, n); 47605b261ecSmrg } 47705b261ecSmrg pictVisual++; 47805b261ecSmrg nvisual++; 47905b261ecSmrg } 48005b261ecSmrg } 48105b261ecSmrg pictDepth->depth = pDepth->depth; 48205b261ecSmrg pictDepth->nPictVisuals = nvisual; 48305b261ecSmrg if (client->swapped) 48405b261ecSmrg { 48505b261ecSmrg swaps (&pictDepth->nPictVisuals, n); 48605b261ecSmrg } 48705b261ecSmrg ndepth++; 48805b261ecSmrg pictDepth = (xPictDepth *) pictVisual; 48905b261ecSmrg } 49005b261ecSmrg pictScreen->nDepth = ndepth; 49105b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 49205b261ecSmrg if (ps) 49305b261ecSmrg pictScreen->fallback = ps->fallback->id; 49405b261ecSmrg else 49505b261ecSmrg pictScreen->fallback = 0; 49605b261ecSmrg if (client->swapped) 49705b261ecSmrg { 49805b261ecSmrg swapl (&pictScreen->nDepth, n); 49905b261ecSmrg swapl (&pictScreen->fallback, n); 50005b261ecSmrg } 50105b261ecSmrg pictScreen = (xPictScreen *) pictDepth; 50205b261ecSmrg } 50305b261ecSmrg pictSubpixel = (CARD32 *) pictScreen; 50405b261ecSmrg 50505b261ecSmrg for (s = 0; s < numSubpixel; s++) 50605b261ecSmrg { 50705b261ecSmrg pScreen = screenInfo.screens[s]; 50805b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 50905b261ecSmrg if (ps) 51005b261ecSmrg *pictSubpixel = ps->subpixel; 51105b261ecSmrg else 51205b261ecSmrg *pictSubpixel = SubPixelUnknown; 51305b261ecSmrg if (client->swapped) 51405b261ecSmrg { 51505b261ecSmrg swapl (pictSubpixel, n); 51605b261ecSmrg } 51705b261ecSmrg ++pictSubpixel; 51805b261ecSmrg } 51905b261ecSmrg 52005b261ecSmrg if (client->swapped) 52105b261ecSmrg { 52205b261ecSmrg swaps (&reply->sequenceNumber, n); 52305b261ecSmrg swapl (&reply->length, n); 52405b261ecSmrg swapl (&reply->numFormats, n); 52505b261ecSmrg swapl (&reply->numScreens, n); 52605b261ecSmrg swapl (&reply->numDepths, n); 52705b261ecSmrg swapl (&reply->numVisuals, n); 52805b261ecSmrg swapl (&reply->numSubpixel, n); 52905b261ecSmrg } 53005b261ecSmrg WriteToClient(client, rlength, (char *) reply); 5316747b715Smrg free(reply); 5326747b715Smrg return Success; 53305b261ecSmrg} 53405b261ecSmrg 53505b261ecSmrgstatic int 53605b261ecSmrgProcRenderQueryPictIndexValues (ClientPtr client) 53705b261ecSmrg{ 53805b261ecSmrg PictFormatPtr pFormat; 5396747b715Smrg int rc, num; 54005b261ecSmrg int rlength; 54105b261ecSmrg int i, n; 54205b261ecSmrg REQUEST(xRenderQueryPictIndexValuesReq); 54305b261ecSmrg xRenderQueryPictIndexValuesReply *reply; 54405b261ecSmrg xIndexValue *values; 54505b261ecSmrg 54605b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq); 54705b261ecSmrg 5486747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format, 5496747b715Smrg PictFormatType, client, DixReadAccess); 5506747b715Smrg if (rc != Success) 5516747b715Smrg return rc; 55205b261ecSmrg 55305b261ecSmrg if (pFormat->type != PictTypeIndexed) 55405b261ecSmrg { 55505b261ecSmrg client->errorValue = stuff->format; 55605b261ecSmrg return BadMatch; 55705b261ecSmrg } 55805b261ecSmrg num = pFormat->index.nvalues; 55905b261ecSmrg rlength = (sizeof (xRenderQueryPictIndexValuesReply) + 56005b261ecSmrg num * sizeof(xIndexValue)); 5616747b715Smrg reply = (xRenderQueryPictIndexValuesReply *) malloc(rlength); 56205b261ecSmrg if (!reply) 56305b261ecSmrg return BadAlloc; 56405b261ecSmrg 56505b261ecSmrg reply->type = X_Reply; 56605b261ecSmrg reply->sequenceNumber = client->sequence; 5676747b715Smrg reply->length = bytes_to_int32(rlength - sizeof(xGenericReply)); 56805b261ecSmrg reply->numIndexValues = num; 56905b261ecSmrg 57005b261ecSmrg values = (xIndexValue *) (reply + 1); 57105b261ecSmrg 57205b261ecSmrg memcpy (reply + 1, pFormat->index.pValues, num * sizeof (xIndexValue)); 57305b261ecSmrg 57405b261ecSmrg if (client->swapped) 57505b261ecSmrg { 57605b261ecSmrg for (i = 0; i < num; i++) 57705b261ecSmrg { 57805b261ecSmrg swapl (&values[i].pixel, n); 57905b261ecSmrg swaps (&values[i].red, n); 58005b261ecSmrg swaps (&values[i].green, n); 58105b261ecSmrg swaps (&values[i].blue, n); 58205b261ecSmrg swaps (&values[i].alpha, n); 58305b261ecSmrg } 58405b261ecSmrg swaps (&reply->sequenceNumber, n); 58505b261ecSmrg swapl (&reply->length, n); 58605b261ecSmrg swapl (&reply->numIndexValues, n); 58705b261ecSmrg } 58805b261ecSmrg 58905b261ecSmrg WriteToClient(client, rlength, (char *) reply); 5906747b715Smrg free(reply); 5916747b715Smrg return Success; 59205b261ecSmrg} 59305b261ecSmrg 59405b261ecSmrgstatic int 59505b261ecSmrgProcRenderQueryDithers (ClientPtr client) 59605b261ecSmrg{ 59705b261ecSmrg return BadImplementation; 59805b261ecSmrg} 59905b261ecSmrg 60005b261ecSmrgstatic int 60105b261ecSmrgProcRenderCreatePicture (ClientPtr client) 60205b261ecSmrg{ 60305b261ecSmrg PicturePtr pPicture; 60405b261ecSmrg DrawablePtr pDrawable; 60505b261ecSmrg PictFormatPtr pFormat; 60605b261ecSmrg int len, error, rc; 60705b261ecSmrg REQUEST(xRenderCreatePictureReq); 60805b261ecSmrg 60905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 61005b261ecSmrg 61105b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 61205b261ecSmrg rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0, 6134642e01fSmrg DixReadAccess|DixAddAccess); 61405b261ecSmrg if (rc != Success) 61505b261ecSmrg return rc; 61605b261ecSmrg 6176747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format, 6186747b715Smrg PictFormatType, client, DixReadAccess); 6196747b715Smrg if (rc != Success) 6206747b715Smrg return rc; 6216747b715Smrg 62205b261ecSmrg if (pFormat->depth != pDrawable->depth) 62305b261ecSmrg return BadMatch; 6246747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq)); 62505b261ecSmrg if (Ones(stuff->mask) != len) 62605b261ecSmrg return BadLength; 62705b261ecSmrg 62805b261ecSmrg pPicture = CreatePicture (stuff->pid, 62905b261ecSmrg pDrawable, 63005b261ecSmrg pFormat, 63105b261ecSmrg stuff->mask, 63205b261ecSmrg (XID *) (stuff + 1), 63305b261ecSmrg client, 63405b261ecSmrg &error); 63505b261ecSmrg if (!pPicture) 63605b261ecSmrg return error; 63705b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 63805b261ecSmrg return BadAlloc; 63905b261ecSmrg return Success; 64005b261ecSmrg} 64105b261ecSmrg 64205b261ecSmrgstatic int 64305b261ecSmrgProcRenderChangePicture (ClientPtr client) 64405b261ecSmrg{ 64505b261ecSmrg PicturePtr pPicture; 64605b261ecSmrg REQUEST(xRenderChangePictureReq); 64705b261ecSmrg int len; 64805b261ecSmrg 64905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 6506747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 65105b261ecSmrg 6526747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq)); 65305b261ecSmrg if (Ones(stuff->mask) != len) 65405b261ecSmrg return BadLength; 65505b261ecSmrg 65605b261ecSmrg return ChangePicture (pPicture, stuff->mask, (XID *) (stuff + 1), 65705b261ecSmrg (DevUnion *) 0, client); 65805b261ecSmrg} 65905b261ecSmrg 66005b261ecSmrgstatic int 66105b261ecSmrgProcRenderSetPictureClipRectangles (ClientPtr client) 66205b261ecSmrg{ 66305b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 66405b261ecSmrg PicturePtr pPicture; 66505b261ecSmrg int nr; 66605b261ecSmrg 66705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 6686747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 66905b261ecSmrg if (!pPicture->pDrawable) 67005b261ecSmrg return BadDrawable; 67105b261ecSmrg 6726747b715Smrg nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq); 67305b261ecSmrg if (nr & 4) 67405b261ecSmrg return BadLength; 67505b261ecSmrg nr >>= 3; 6766747b715Smrg return SetPictureClipRects (pPicture, 67705b261ecSmrg stuff->xOrigin, stuff->yOrigin, 67805b261ecSmrg nr, (xRectangle *) &stuff[1]); 67905b261ecSmrg} 68005b261ecSmrg 68105b261ecSmrgstatic int 68205b261ecSmrgProcRenderFreePicture (ClientPtr client) 68305b261ecSmrg{ 68405b261ecSmrg PicturePtr pPicture; 68505b261ecSmrg REQUEST(xRenderFreePictureReq); 68605b261ecSmrg 68705b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 68805b261ecSmrg 6896747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess); 69005b261ecSmrg FreeResource (stuff->picture, RT_NONE); 6916747b715Smrg return Success; 69205b261ecSmrg} 69305b261ecSmrg 69405b261ecSmrgstatic Bool 69505b261ecSmrgPictOpValid (CARD8 op) 69605b261ecSmrg{ 69705b261ecSmrg if (/*PictOpMinimum <= op && */ op <= PictOpMaximum) 69805b261ecSmrg return TRUE; 69905b261ecSmrg if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum) 70005b261ecSmrg return TRUE; 70105b261ecSmrg if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum) 70205b261ecSmrg return TRUE; 7036747b715Smrg if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum) 7046747b715Smrg return TRUE; 70505b261ecSmrg return FALSE; 70605b261ecSmrg} 70705b261ecSmrg 70805b261ecSmrgstatic int 70905b261ecSmrgProcRenderComposite (ClientPtr client) 71005b261ecSmrg{ 71105b261ecSmrg PicturePtr pSrc, pMask, pDst; 71205b261ecSmrg REQUEST(xRenderCompositeReq); 71305b261ecSmrg 71405b261ecSmrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 71505b261ecSmrg if (!PictOpValid (stuff->op)) 71605b261ecSmrg { 71705b261ecSmrg client->errorValue = stuff->op; 71805b261ecSmrg return BadValue; 71905b261ecSmrg } 7206747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 72105b261ecSmrg if (!pDst->pDrawable) 72205b261ecSmrg return BadDrawable; 7236747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 7246747b715Smrg VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess); 72505b261ecSmrg if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) || 72605b261ecSmrg (pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen)) 72705b261ecSmrg return BadMatch; 72805b261ecSmrg CompositePicture (stuff->op, 72905b261ecSmrg pSrc, 73005b261ecSmrg pMask, 73105b261ecSmrg pDst, 73205b261ecSmrg stuff->xSrc, 73305b261ecSmrg stuff->ySrc, 73405b261ecSmrg stuff->xMask, 73505b261ecSmrg stuff->yMask, 73605b261ecSmrg stuff->xDst, 73705b261ecSmrg stuff->yDst, 73805b261ecSmrg stuff->width, 73905b261ecSmrg stuff->height); 74005b261ecSmrg return Success; 74105b261ecSmrg} 74205b261ecSmrg 74305b261ecSmrgstatic int 74405b261ecSmrgProcRenderScale (ClientPtr client) 74505b261ecSmrg{ 74605b261ecSmrg return BadImplementation; 74705b261ecSmrg} 74805b261ecSmrg 74905b261ecSmrgstatic int 75005b261ecSmrgProcRenderTrapezoids (ClientPtr client) 75105b261ecSmrg{ 7526747b715Smrg int rc, ntraps; 75305b261ecSmrg PicturePtr pSrc, pDst; 75405b261ecSmrg PictFormatPtr pFormat; 75505b261ecSmrg REQUEST(xRenderTrapezoidsReq); 75605b261ecSmrg 75705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 75805b261ecSmrg if (!PictOpValid (stuff->op)) 75905b261ecSmrg { 76005b261ecSmrg client->errorValue = stuff->op; 76105b261ecSmrg return BadValue; 76205b261ecSmrg } 7636747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 7646747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 76505b261ecSmrg if (!pDst->pDrawable) 76605b261ecSmrg return BadDrawable; 76705b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 76805b261ecSmrg return BadMatch; 76905b261ecSmrg if (stuff->maskFormat) 77005b261ecSmrg { 7716747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 7726747b715Smrg PictFormatType, client, DixReadAccess); 7736747b715Smrg if (rc != Success) 7746747b715Smrg return rc; 77505b261ecSmrg } 77605b261ecSmrg else 77705b261ecSmrg pFormat = 0; 77805b261ecSmrg ntraps = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq); 77905b261ecSmrg if (ntraps % sizeof (xTrapezoid)) 78005b261ecSmrg return BadLength; 78105b261ecSmrg ntraps /= sizeof (xTrapezoid); 78205b261ecSmrg if (ntraps) 78305b261ecSmrg CompositeTrapezoids (stuff->op, pSrc, pDst, pFormat, 78405b261ecSmrg stuff->xSrc, stuff->ySrc, 78505b261ecSmrg ntraps, (xTrapezoid *) &stuff[1]); 7866747b715Smrg return Success; 78705b261ecSmrg} 78805b261ecSmrg 78905b261ecSmrgstatic int 79005b261ecSmrgProcRenderTriangles (ClientPtr client) 79105b261ecSmrg{ 7926747b715Smrg int rc, ntris; 79305b261ecSmrg PicturePtr pSrc, pDst; 79405b261ecSmrg PictFormatPtr pFormat; 79505b261ecSmrg REQUEST(xRenderTrianglesReq); 79605b261ecSmrg 79705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 79805b261ecSmrg if (!PictOpValid (stuff->op)) 79905b261ecSmrg { 80005b261ecSmrg client->errorValue = stuff->op; 80105b261ecSmrg return BadValue; 80205b261ecSmrg } 8036747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 8046747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 80505b261ecSmrg if (!pDst->pDrawable) 80605b261ecSmrg return BadDrawable; 80705b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 80805b261ecSmrg return BadMatch; 80905b261ecSmrg if (stuff->maskFormat) 81005b261ecSmrg { 8116747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 8126747b715Smrg PictFormatType, client, DixReadAccess); 8136747b715Smrg if (rc != Success) 8146747b715Smrg return rc; 81505b261ecSmrg } 81605b261ecSmrg else 81705b261ecSmrg pFormat = 0; 81805b261ecSmrg ntris = (client->req_len << 2) - sizeof (xRenderTrianglesReq); 81905b261ecSmrg if (ntris % sizeof (xTriangle)) 82005b261ecSmrg return BadLength; 82105b261ecSmrg ntris /= sizeof (xTriangle); 82205b261ecSmrg if (ntris) 82305b261ecSmrg CompositeTriangles (stuff->op, pSrc, pDst, pFormat, 82405b261ecSmrg stuff->xSrc, stuff->ySrc, 82505b261ecSmrg ntris, (xTriangle *) &stuff[1]); 8266747b715Smrg return Success; 82705b261ecSmrg} 82805b261ecSmrg 82905b261ecSmrgstatic int 83005b261ecSmrgProcRenderTriStrip (ClientPtr client) 83105b261ecSmrg{ 8326747b715Smrg int rc, npoints; 83305b261ecSmrg PicturePtr pSrc, pDst; 83405b261ecSmrg PictFormatPtr pFormat; 83505b261ecSmrg REQUEST(xRenderTrianglesReq); 83605b261ecSmrg 83705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 83805b261ecSmrg if (!PictOpValid (stuff->op)) 83905b261ecSmrg { 84005b261ecSmrg client->errorValue = stuff->op; 84105b261ecSmrg return BadValue; 84205b261ecSmrg } 8436747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 8446747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 84505b261ecSmrg if (!pDst->pDrawable) 84605b261ecSmrg return BadDrawable; 84705b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 84805b261ecSmrg return BadMatch; 84905b261ecSmrg if (stuff->maskFormat) 85005b261ecSmrg { 8516747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 8526747b715Smrg PictFormatType, client, DixReadAccess); 8536747b715Smrg if (rc != Success) 8546747b715Smrg return rc; 85505b261ecSmrg } 85605b261ecSmrg else 85705b261ecSmrg pFormat = 0; 85805b261ecSmrg npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq)); 85905b261ecSmrg if (npoints & 4) 8606747b715Smrg return BadLength; 86105b261ecSmrg npoints >>= 3; 86205b261ecSmrg if (npoints >= 3) 86305b261ecSmrg CompositeTriStrip (stuff->op, pSrc, pDst, pFormat, 86405b261ecSmrg stuff->xSrc, stuff->ySrc, 86505b261ecSmrg npoints, (xPointFixed *) &stuff[1]); 8666747b715Smrg return Success; 86705b261ecSmrg} 86805b261ecSmrg 86905b261ecSmrgstatic int 87005b261ecSmrgProcRenderTriFan (ClientPtr client) 87105b261ecSmrg{ 8726747b715Smrg int rc, npoints; 87305b261ecSmrg PicturePtr pSrc, pDst; 87405b261ecSmrg PictFormatPtr pFormat; 87505b261ecSmrg REQUEST(xRenderTrianglesReq); 87605b261ecSmrg 87705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 87805b261ecSmrg if (!PictOpValid (stuff->op)) 87905b261ecSmrg { 88005b261ecSmrg client->errorValue = stuff->op; 88105b261ecSmrg return BadValue; 88205b261ecSmrg } 8836747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 8846747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 88505b261ecSmrg if (!pDst->pDrawable) 88605b261ecSmrg return BadDrawable; 88705b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 88805b261ecSmrg return BadMatch; 88905b261ecSmrg if (stuff->maskFormat) 89005b261ecSmrg { 8916747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 8926747b715Smrg PictFormatType, client, DixReadAccess); 8936747b715Smrg if (rc != Success) 8946747b715Smrg return rc; 89505b261ecSmrg } 89605b261ecSmrg else 89705b261ecSmrg pFormat = 0; 89805b261ecSmrg npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq)); 89905b261ecSmrg if (npoints & 4) 9006747b715Smrg return BadLength; 90105b261ecSmrg npoints >>= 3; 90205b261ecSmrg if (npoints >= 3) 90305b261ecSmrg CompositeTriFan (stuff->op, pSrc, pDst, pFormat, 90405b261ecSmrg stuff->xSrc, stuff->ySrc, 90505b261ecSmrg npoints, (xPointFixed *) &stuff[1]); 9066747b715Smrg return Success; 90705b261ecSmrg} 90805b261ecSmrg 90905b261ecSmrgstatic int 91005b261ecSmrgProcRenderColorTrapezoids (ClientPtr client) 91105b261ecSmrg{ 91205b261ecSmrg return BadImplementation; 91305b261ecSmrg} 91405b261ecSmrg 91505b261ecSmrgstatic int 91605b261ecSmrgProcRenderColorTriangles (ClientPtr client) 91705b261ecSmrg{ 91805b261ecSmrg return BadImplementation; 91905b261ecSmrg} 92005b261ecSmrg 92105b261ecSmrgstatic int 92205b261ecSmrgProcRenderTransform (ClientPtr client) 92305b261ecSmrg{ 92405b261ecSmrg return BadImplementation; 92505b261ecSmrg} 92605b261ecSmrg 92705b261ecSmrgstatic int 92805b261ecSmrgProcRenderCreateGlyphSet (ClientPtr client) 92905b261ecSmrg{ 93005b261ecSmrg GlyphSetPtr glyphSet; 93105b261ecSmrg PictFormatPtr format; 9324642e01fSmrg int rc, f; 93305b261ecSmrg REQUEST(xRenderCreateGlyphSetReq); 93405b261ecSmrg 93505b261ecSmrg REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq); 93605b261ecSmrg 93705b261ecSmrg LEGAL_NEW_RESOURCE(stuff->gsid, client); 9386747b715Smrg rc = dixLookupResourceByType((pointer *)&format, stuff->format, 9396747b715Smrg PictFormatType, client, DixReadAccess); 9406747b715Smrg if (rc != Success) 9416747b715Smrg return rc; 9426747b715Smrg 94305b261ecSmrg switch (format->depth) { 94405b261ecSmrg case 1: 94505b261ecSmrg f = GlyphFormat1; 94605b261ecSmrg break; 94705b261ecSmrg case 4: 94805b261ecSmrg f = GlyphFormat4; 94905b261ecSmrg break; 95005b261ecSmrg case 8: 95105b261ecSmrg f = GlyphFormat8; 95205b261ecSmrg break; 95305b261ecSmrg case 16: 95405b261ecSmrg f = GlyphFormat16; 95505b261ecSmrg break; 95605b261ecSmrg case 32: 95705b261ecSmrg f = GlyphFormat32; 95805b261ecSmrg break; 95905b261ecSmrg default: 96005b261ecSmrg return BadMatch; 96105b261ecSmrg } 96205b261ecSmrg if (format->type != PictTypeDirect) 96305b261ecSmrg return BadMatch; 96405b261ecSmrg glyphSet = AllocateGlyphSet (f, format); 96505b261ecSmrg if (!glyphSet) 96605b261ecSmrg return BadAlloc; 9674642e01fSmrg /* security creation/labeling check */ 9684642e01fSmrg rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType, 9694642e01fSmrg glyphSet, RT_NONE, NULL, DixCreateAccess); 9704642e01fSmrg if (rc != Success) 9714642e01fSmrg return rc; 97205b261ecSmrg if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet)) 97305b261ecSmrg return BadAlloc; 97405b261ecSmrg return Success; 97505b261ecSmrg} 97605b261ecSmrg 97705b261ecSmrgstatic int 97805b261ecSmrgProcRenderReferenceGlyphSet (ClientPtr client) 97905b261ecSmrg{ 98005b261ecSmrg GlyphSetPtr glyphSet; 9814642e01fSmrg int rc; 98205b261ecSmrg REQUEST(xRenderReferenceGlyphSetReq); 98305b261ecSmrg 98405b261ecSmrg REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq); 98505b261ecSmrg 98605b261ecSmrg LEGAL_NEW_RESOURCE(stuff->gsid, client); 98705b261ecSmrg 988b86d567bSmrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->existing, GlyphSetType, 9894642e01fSmrg client, DixGetAttrAccess); 9904642e01fSmrg if (rc != Success) 99105b261ecSmrg { 99205b261ecSmrg client->errorValue = stuff->existing; 9936747b715Smrg return rc; 99405b261ecSmrg } 99505b261ecSmrg glyphSet->refcnt++; 99605b261ecSmrg if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet)) 99705b261ecSmrg return BadAlloc; 9986747b715Smrg return Success; 99905b261ecSmrg} 100005b261ecSmrg 100105b261ecSmrg#define NLOCALDELTA 64 100205b261ecSmrg#define NLOCALGLYPH 256 100305b261ecSmrg 100405b261ecSmrgstatic int 100505b261ecSmrgProcRenderFreeGlyphSet (ClientPtr client) 100605b261ecSmrg{ 100705b261ecSmrg GlyphSetPtr glyphSet; 10084642e01fSmrg int rc; 100905b261ecSmrg REQUEST(xRenderFreeGlyphSetReq); 101005b261ecSmrg 101105b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq); 1012b86d567bSmrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 10134642e01fSmrg client, DixDestroyAccess); 10144642e01fSmrg if (rc != Success) 101505b261ecSmrg { 101605b261ecSmrg client->errorValue = stuff->glyphset; 10176747b715Smrg return rc; 101805b261ecSmrg } 101905b261ecSmrg FreeResource (stuff->glyphset, RT_NONE); 10206747b715Smrg return Success; 102105b261ecSmrg} 102205b261ecSmrg 102305b261ecSmrgtypedef struct _GlyphNew { 10244642e01fSmrg Glyph id; 10254642e01fSmrg GlyphPtr glyph; 10264642e01fSmrg Bool found; 10274642e01fSmrg unsigned char sha1[20]; 102805b261ecSmrg} GlyphNewRec, *GlyphNewPtr; 102905b261ecSmrg 10304642e01fSmrg#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0) 10314642e01fSmrg 103205b261ecSmrgstatic int 103305b261ecSmrgProcRenderAddGlyphs (ClientPtr client) 103405b261ecSmrg{ 103505b261ecSmrg GlyphSetPtr glyphSet; 103605b261ecSmrg REQUEST(xRenderAddGlyphsReq); 103705b261ecSmrg GlyphNewRec glyphsLocal[NLOCALGLYPH]; 10384642e01fSmrg GlyphNewPtr glyphsBase, glyphs, glyph_new; 103905b261ecSmrg int remain, nglyphs; 104005b261ecSmrg CARD32 *gids; 104105b261ecSmrg xGlyphInfo *gi; 104205b261ecSmrg CARD8 *bits; 10436747b715Smrg unsigned int size; 10444642e01fSmrg int err; 10454642e01fSmrg int i, screen; 10464642e01fSmrg PicturePtr pSrc = NULL, pDst = NULL; 10474642e01fSmrg PixmapPtr pSrcPix = NULL, pDstPix = NULL; 10484642e01fSmrg CARD32 component_alpha; 104905b261ecSmrg 105005b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq); 1051b86d567bSmrg err = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 10524642e01fSmrg client, DixAddAccess); 10534642e01fSmrg if (err != Success) 105405b261ecSmrg { 105505b261ecSmrg client->errorValue = stuff->glyphset; 10566747b715Smrg return err; 105705b261ecSmrg } 105805b261ecSmrg 10594642e01fSmrg err = BadAlloc; 106005b261ecSmrg nglyphs = stuff->nglyphs; 106105b261ecSmrg if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec)) 106205b261ecSmrg return BadAlloc; 106305b261ecSmrg 10644642e01fSmrg component_alpha = NeedsComponent (glyphSet->format->format); 10654642e01fSmrg 10664642e01fSmrg if (nglyphs <= NLOCALGLYPH) { 10674642e01fSmrg memset (glyphsLocal, 0, sizeof (glyphsLocal)); 106805b261ecSmrg glyphsBase = glyphsLocal; 10694642e01fSmrg } 107005b261ecSmrg else 107105b261ecSmrg { 10726747b715Smrg glyphsBase = (GlyphNewPtr)calloc(nglyphs, sizeof (GlyphNewRec)); 107305b261ecSmrg if (!glyphsBase) 107405b261ecSmrg return BadAlloc; 107505b261ecSmrg } 107605b261ecSmrg 107705b261ecSmrg remain = (client->req_len << 2) - sizeof (xRenderAddGlyphsReq); 107805b261ecSmrg 107905b261ecSmrg glyphs = glyphsBase; 108005b261ecSmrg 108105b261ecSmrg gids = (CARD32 *) (stuff + 1); 108205b261ecSmrg gi = (xGlyphInfo *) (gids + nglyphs); 108305b261ecSmrg bits = (CARD8 *) (gi + nglyphs); 108405b261ecSmrg remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs; 10856747b715Smrg 10866747b715Smrg /* protect against bad nglyphs */ 10879ace9065Smrg if (gi < ((xGlyphInfo *)stuff) || 10889ace9065Smrg gi > ((xGlyphInfo *)((CARD32 *)stuff + client->req_len)) || 10899ace9065Smrg bits < ((CARD8 *)stuff) || 10909ace9065Smrg bits > ((CARD8 *)((CARD32 *)stuff + client->req_len))) { 10916747b715Smrg err = BadLength; 10926747b715Smrg goto bail; 10936747b715Smrg } 10946747b715Smrg 10954642e01fSmrg for (i = 0; i < nglyphs; i++) 109605b261ecSmrg { 10974642e01fSmrg size_t padded_width; 10984642e01fSmrg glyph_new = &glyphs[i]; 10994642e01fSmrg 11004642e01fSmrg padded_width = PixmapBytePad (gi[i].width, 11014642e01fSmrg glyphSet->format->depth); 11024642e01fSmrg 11034642e01fSmrg if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height) 11044642e01fSmrg break; 110505b261ecSmrg 11064642e01fSmrg size = gi[i].height * padded_width; 110705b261ecSmrg if (remain < size) 110805b261ecSmrg break; 11094642e01fSmrg 11104642e01fSmrg err = HashGlyph (&gi[i], bits, size, glyph_new->sha1); 11114642e01fSmrg if (err) 11124642e01fSmrg goto bail; 11134642e01fSmrg 11144642e01fSmrg glyph_new->glyph = FindGlyphByHash (glyph_new->sha1, 11154642e01fSmrg glyphSet->fdepth); 11164642e01fSmrg 11174642e01fSmrg if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph) 11184642e01fSmrg { 11194642e01fSmrg glyph_new->found = TRUE; 11204642e01fSmrg } 11214642e01fSmrg else 11224642e01fSmrg { 11234642e01fSmrg GlyphPtr glyph; 11244642e01fSmrg 11254642e01fSmrg glyph_new->found = FALSE; 11264642e01fSmrg glyph_new->glyph = glyph = AllocateGlyph (&gi[i], glyphSet->fdepth); 11274642e01fSmrg if (! glyph) 11284642e01fSmrg { 11294642e01fSmrg err = BadAlloc; 11304642e01fSmrg goto bail; 11314642e01fSmrg } 11324642e01fSmrg 11334642e01fSmrg for (screen = 0; screen < screenInfo.numScreens; screen++) 11344642e01fSmrg { 11354642e01fSmrg int width = gi[i].width; 11364642e01fSmrg int height = gi[i].height; 11374642e01fSmrg int depth = glyphSet->format->depth; 11384642e01fSmrg ScreenPtr pScreen; 11394642e01fSmrg int error; 11404642e01fSmrg 11416747b715Smrg /* Skip work if it's invisibly small anyway */ 11426747b715Smrg if (!width || !height) 11436747b715Smrg break; 11446747b715Smrg 11454642e01fSmrg pScreen = screenInfo.screens[screen]; 11464642e01fSmrg pSrcPix = GetScratchPixmapHeader (pScreen, 11474642e01fSmrg width, height, 11484642e01fSmrg depth, depth, 11494642e01fSmrg -1, bits); 11504642e01fSmrg if (! pSrcPix) 11514642e01fSmrg { 11524642e01fSmrg err = BadAlloc; 11534642e01fSmrg goto bail; 11544642e01fSmrg } 11554642e01fSmrg 11564642e01fSmrg pSrc = CreatePicture (0, &pSrcPix->drawable, 11574642e01fSmrg glyphSet->format, 0, NULL, 11584642e01fSmrg serverClient, &error); 11594642e01fSmrg if (! pSrc) 11604642e01fSmrg { 11614642e01fSmrg err = BadAlloc; 11624642e01fSmrg goto bail; 11634642e01fSmrg } 11644642e01fSmrg 11654642e01fSmrg pDstPix = (pScreen->CreatePixmap) (pScreen, 11664642e01fSmrg width, height, depth, 11674642e01fSmrg CREATE_PIXMAP_USAGE_GLYPH_PICTURE); 11684642e01fSmrg 11696747b715Smrg if (!pDstPix) 11706747b715Smrg { 11716747b715Smrg err = BadAlloc; 11726747b715Smrg goto bail; 11736747b715Smrg } 11746747b715Smrg 11754642e01fSmrg GlyphPicture (glyph)[screen] = pDst = 11764642e01fSmrg CreatePicture (0, &pDstPix->drawable, 11774642e01fSmrg glyphSet->format, 11784642e01fSmrg CPComponentAlpha, &component_alpha, 11794642e01fSmrg serverClient, &error); 11804642e01fSmrg 11814642e01fSmrg /* The picture takes a reference to the pixmap, so we 11824642e01fSmrg drop ours. */ 11834642e01fSmrg (pScreen->DestroyPixmap) (pDstPix); 11846747b715Smrg pDstPix = NULL; 11854642e01fSmrg 11864642e01fSmrg if (! pDst) 11874642e01fSmrg { 11884642e01fSmrg err = BadAlloc; 11894642e01fSmrg goto bail; 11904642e01fSmrg } 11914642e01fSmrg 11924642e01fSmrg CompositePicture (PictOpSrc, 11934642e01fSmrg pSrc, 11944642e01fSmrg None, 11954642e01fSmrg pDst, 11964642e01fSmrg 0, 0, 11974642e01fSmrg 0, 0, 11984642e01fSmrg 0, 0, 11994642e01fSmrg width, height); 12004642e01fSmrg 12014642e01fSmrg FreePicture ((pointer) pSrc, 0); 12024642e01fSmrg pSrc = NULL; 12034642e01fSmrg FreeScratchPixmapHeader (pSrcPix); 12044642e01fSmrg pSrcPix = NULL; 12054642e01fSmrg } 12064642e01fSmrg 12074642e01fSmrg memcpy (glyph_new->glyph->sha1, glyph_new->sha1, 20); 12084642e01fSmrg } 12094642e01fSmrg 12104642e01fSmrg glyph_new->id = gids[i]; 121105b261ecSmrg 121205b261ecSmrg if (size & 3) 121305b261ecSmrg size += 4 - (size & 3); 121405b261ecSmrg bits += size; 121505b261ecSmrg remain -= size; 121605b261ecSmrg } 12174642e01fSmrg if (remain || i < nglyphs) 121805b261ecSmrg { 121905b261ecSmrg err = BadLength; 122005b261ecSmrg goto bail; 122105b261ecSmrg } 122205b261ecSmrg if (!ResizeGlyphSet (glyphSet, nglyphs)) 122305b261ecSmrg { 122405b261ecSmrg err = BadAlloc; 122505b261ecSmrg goto bail; 122605b261ecSmrg } 12274642e01fSmrg for (i = 0; i < nglyphs; i++) 12284642e01fSmrg AddGlyph (glyphSet, glyphs[i].glyph, glyphs[i].id); 122905b261ecSmrg 123005b261ecSmrg if (glyphsBase != glyphsLocal) 12316747b715Smrg free(glyphsBase); 12326747b715Smrg return Success; 123305b261ecSmrgbail: 12344642e01fSmrg if (pSrc) 12354642e01fSmrg FreePicture ((pointer) pSrc, 0); 12364642e01fSmrg if (pSrcPix) 12374642e01fSmrg FreeScratchPixmapHeader (pSrcPix); 12384642e01fSmrg for (i = 0; i < nglyphs; i++) 12394642e01fSmrg if (glyphs[i].glyph && ! glyphs[i].found) 12406747b715Smrg free(glyphs[i].glyph); 124105b261ecSmrg if (glyphsBase != glyphsLocal) 12426747b715Smrg free(glyphsBase); 124305b261ecSmrg return err; 124405b261ecSmrg} 124505b261ecSmrg 124605b261ecSmrgstatic int 124705b261ecSmrgProcRenderAddGlyphsFromPicture (ClientPtr client) 124805b261ecSmrg{ 124905b261ecSmrg return BadImplementation; 125005b261ecSmrg} 125105b261ecSmrg 125205b261ecSmrgstatic int 125305b261ecSmrgProcRenderFreeGlyphs (ClientPtr client) 125405b261ecSmrg{ 125505b261ecSmrg REQUEST(xRenderFreeGlyphsReq); 125605b261ecSmrg GlyphSetPtr glyphSet; 12574642e01fSmrg int rc, nglyph; 125805b261ecSmrg CARD32 *gids; 125905b261ecSmrg CARD32 glyph; 126005b261ecSmrg 126105b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq); 1262b86d567bSmrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 12634642e01fSmrg client, DixRemoveAccess); 12644642e01fSmrg if (rc != Success) 126505b261ecSmrg { 126605b261ecSmrg client->errorValue = stuff->glyphset; 12676747b715Smrg return rc; 126805b261ecSmrg } 12696747b715Smrg nglyph = bytes_to_int32((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq)); 127005b261ecSmrg gids = (CARD32 *) (stuff + 1); 127105b261ecSmrg while (nglyph-- > 0) 127205b261ecSmrg { 127305b261ecSmrg glyph = *gids++; 127405b261ecSmrg if (!DeleteGlyph (glyphSet, glyph)) 127505b261ecSmrg { 127605b261ecSmrg client->errorValue = glyph; 127705b261ecSmrg return RenderErrBase + BadGlyph; 127805b261ecSmrg } 127905b261ecSmrg } 12806747b715Smrg return Success; 128105b261ecSmrg} 128205b261ecSmrg 128305b261ecSmrgstatic int 128405b261ecSmrgProcRenderCompositeGlyphs (ClientPtr client) 128505b261ecSmrg{ 128605b261ecSmrg GlyphSetPtr glyphSet; 128705b261ecSmrg GlyphSet gs; 128805b261ecSmrg PicturePtr pSrc, pDst; 128905b261ecSmrg PictFormatPtr pFormat; 129005b261ecSmrg GlyphListRec listsLocal[NLOCALDELTA]; 129105b261ecSmrg GlyphListPtr lists, listsBase; 129205b261ecSmrg GlyphPtr glyphsLocal[NLOCALGLYPH]; 129305b261ecSmrg Glyph glyph; 129405b261ecSmrg GlyphPtr *glyphs, *glyphsBase; 129505b261ecSmrg xGlyphElt *elt; 129605b261ecSmrg CARD8 *buffer, *end; 129705b261ecSmrg int nglyph; 129805b261ecSmrg int nlist; 129905b261ecSmrg int space; 130005b261ecSmrg int size; 13016747b715Smrg int rc, n; 130205b261ecSmrg 130305b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 130405b261ecSmrg 130505b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 130605b261ecSmrg 130705b261ecSmrg switch (stuff->renderReqType) { 130805b261ecSmrg default: size = 1; break; 130905b261ecSmrg case X_RenderCompositeGlyphs16: size = 2; break; 131005b261ecSmrg case X_RenderCompositeGlyphs32: size = 4; break; 131105b261ecSmrg } 131205b261ecSmrg 131305b261ecSmrg if (!PictOpValid (stuff->op)) 131405b261ecSmrg { 131505b261ecSmrg client->errorValue = stuff->op; 131605b261ecSmrg return BadValue; 131705b261ecSmrg } 13186747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 13196747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 132005b261ecSmrg if (!pDst->pDrawable) 132105b261ecSmrg return BadDrawable; 132205b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 132305b261ecSmrg return BadMatch; 132405b261ecSmrg if (stuff->maskFormat) 132505b261ecSmrg { 13266747b715Smrg rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat, 13276747b715Smrg PictFormatType, client, DixReadAccess); 13286747b715Smrg if (rc != Success) 13296747b715Smrg return rc; 133005b261ecSmrg } 133105b261ecSmrg else 133205b261ecSmrg pFormat = 0; 133305b261ecSmrg 13346747b715Smrg rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, 13356747b715Smrg GlyphSetType, client, DixUseAccess); 13366747b715Smrg if (rc != Success) 13376747b715Smrg return rc; 133805b261ecSmrg 133905b261ecSmrg buffer = (CARD8 *) (stuff + 1); 134005b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 134105b261ecSmrg nglyph = 0; 134205b261ecSmrg nlist = 0; 134305b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 134405b261ecSmrg { 134505b261ecSmrg elt = (xGlyphElt *) buffer; 134605b261ecSmrg buffer += sizeof (xGlyphElt); 134705b261ecSmrg 134805b261ecSmrg if (elt->len == 0xff) 134905b261ecSmrg { 135005b261ecSmrg buffer += 4; 135105b261ecSmrg } 135205b261ecSmrg else 135305b261ecSmrg { 135405b261ecSmrg nlist++; 135505b261ecSmrg nglyph += elt->len; 135605b261ecSmrg space = size * elt->len; 135705b261ecSmrg if (space & 3) 135805b261ecSmrg space += 4 - (space & 3); 135905b261ecSmrg buffer += space; 136005b261ecSmrg } 136105b261ecSmrg } 136205b261ecSmrg if (nglyph <= NLOCALGLYPH) 136305b261ecSmrg glyphsBase = glyphsLocal; 136405b261ecSmrg else 136505b261ecSmrg { 13666747b715Smrg glyphsBase = (GlyphPtr *) malloc(nglyph * sizeof (GlyphPtr)); 136705b261ecSmrg if (!glyphsBase) 136805b261ecSmrg return BadAlloc; 136905b261ecSmrg } 137005b261ecSmrg if (nlist <= NLOCALDELTA) 137105b261ecSmrg listsBase = listsLocal; 137205b261ecSmrg else 137305b261ecSmrg { 13746747b715Smrg listsBase = (GlyphListPtr) malloc(nlist * sizeof (GlyphListRec)); 13759ace9065Smrg if (!listsBase) { 13769ace9065Smrg rc = BadAlloc; 13779ace9065Smrg goto bail; 13789ace9065Smrg } 137905b261ecSmrg } 138005b261ecSmrg buffer = (CARD8 *) (stuff + 1); 138105b261ecSmrg glyphs = glyphsBase; 138205b261ecSmrg lists = listsBase; 138305b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 138405b261ecSmrg { 138505b261ecSmrg elt = (xGlyphElt *) buffer; 138605b261ecSmrg buffer += sizeof (xGlyphElt); 138705b261ecSmrg 138805b261ecSmrg if (elt->len == 0xff) 138905b261ecSmrg { 139005b261ecSmrg if (buffer + sizeof (GlyphSet) < end) 139105b261ecSmrg { 139205b261ecSmrg memcpy(&gs, buffer, sizeof(GlyphSet)); 13936747b715Smrg rc = dixLookupResourceByType((pointer *)&glyphSet, gs, 13946747b715Smrg GlyphSetType, client, 13956747b715Smrg DixUseAccess); 13966747b715Smrg if (rc != Success) 13979ace9065Smrg goto bail; 139805b261ecSmrg } 139905b261ecSmrg buffer += 4; 140005b261ecSmrg } 140105b261ecSmrg else 140205b261ecSmrg { 140305b261ecSmrg lists->xOff = elt->deltax; 140405b261ecSmrg lists->yOff = elt->deltay; 140505b261ecSmrg lists->format = glyphSet->format; 140605b261ecSmrg lists->len = 0; 140705b261ecSmrg n = elt->len; 140805b261ecSmrg while (n--) 140905b261ecSmrg { 141005b261ecSmrg if (buffer + size <= end) 141105b261ecSmrg { 141205b261ecSmrg switch (size) { 141305b261ecSmrg case 1: 141405b261ecSmrg glyph = *((CARD8 *)buffer); break; 141505b261ecSmrg case 2: 141605b261ecSmrg glyph = *((CARD16 *)buffer); break; 141705b261ecSmrg case 4: 141805b261ecSmrg default: 141905b261ecSmrg glyph = *((CARD32 *)buffer); break; 142005b261ecSmrg } 142105b261ecSmrg if ((*glyphs = FindGlyph (glyphSet, glyph))) 142205b261ecSmrg { 142305b261ecSmrg lists->len++; 142405b261ecSmrg glyphs++; 142505b261ecSmrg } 142605b261ecSmrg } 142705b261ecSmrg buffer += size; 142805b261ecSmrg } 142905b261ecSmrg space = size * elt->len; 143005b261ecSmrg if (space & 3) 143105b261ecSmrg buffer += 4 - (space & 3); 143205b261ecSmrg lists++; 143305b261ecSmrg } 143405b261ecSmrg } 14359ace9065Smrg if (buffer > end) { 14369ace9065Smrg rc = BadLength; 14379ace9065Smrg goto bail; 14389ace9065Smrg } 143905b261ecSmrg 144005b261ecSmrg CompositeGlyphs (stuff->op, 144105b261ecSmrg pSrc, 144205b261ecSmrg pDst, 144305b261ecSmrg pFormat, 144405b261ecSmrg stuff->xSrc, 144505b261ecSmrg stuff->ySrc, 144605b261ecSmrg nlist, 144705b261ecSmrg listsBase, 144805b261ecSmrg glyphsBase); 14499ace9065Smrg rc = Success; 145005b261ecSmrg 14519ace9065Smrgbail: 145205b261ecSmrg if (glyphsBase != glyphsLocal) 14536747b715Smrg free(glyphsBase); 145405b261ecSmrg if (listsBase != listsLocal) 14556747b715Smrg free(listsBase); 14569ace9065Smrg return rc; 145705b261ecSmrg} 145805b261ecSmrg 145905b261ecSmrgstatic int 146005b261ecSmrgProcRenderFillRectangles (ClientPtr client) 146105b261ecSmrg{ 146205b261ecSmrg PicturePtr pDst; 146305b261ecSmrg int things; 146405b261ecSmrg REQUEST(xRenderFillRectanglesReq); 146505b261ecSmrg 146605b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 146705b261ecSmrg if (!PictOpValid (stuff->op)) 146805b261ecSmrg { 146905b261ecSmrg client->errorValue = stuff->op; 147005b261ecSmrg return BadValue; 147105b261ecSmrg } 14726747b715Smrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess); 147305b261ecSmrg if (!pDst->pDrawable) 147405b261ecSmrg return BadDrawable; 147505b261ecSmrg 147605b261ecSmrg things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq); 147705b261ecSmrg if (things & 4) 14786747b715Smrg return BadLength; 147905b261ecSmrg things >>= 3; 148005b261ecSmrg 148105b261ecSmrg CompositeRects (stuff->op, 148205b261ecSmrg pDst, 148305b261ecSmrg &stuff->color, 148405b261ecSmrg things, 148505b261ecSmrg (xRectangle *) &stuff[1]); 148605b261ecSmrg 14876747b715Smrg return Success; 148805b261ecSmrg} 148905b261ecSmrg 149005b261ecSmrgstatic void 14916747b715SmrgRenderSetBit (unsigned char *line, int x, int bit) 149205b261ecSmrg{ 149305b261ecSmrg unsigned char mask; 149405b261ecSmrg 149505b261ecSmrg if (screenInfo.bitmapBitOrder == LSBFirst) 149605b261ecSmrg mask = (1 << (x & 7)); 149705b261ecSmrg else 149805b261ecSmrg mask = (0x80 >> (x & 7)); 149905b261ecSmrg /* XXX assumes byte order is host byte order */ 150005b261ecSmrg line += (x >> 3); 150105b261ecSmrg if (bit) 150205b261ecSmrg *line |= mask; 150305b261ecSmrg else 150405b261ecSmrg *line &= ~mask; 150505b261ecSmrg} 150605b261ecSmrg 150705b261ecSmrg#define DITHER_DIM 2 150805b261ecSmrg 150905b261ecSmrgstatic CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = { 151005b261ecSmrg { 1, 3, }, 151105b261ecSmrg { 4, 2, }, 151205b261ecSmrg}; 151305b261ecSmrg 151405b261ecSmrg#define DITHER_SIZE ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1) 151505b261ecSmrg 151605b261ecSmrgstatic int 151705b261ecSmrgProcRenderCreateCursor (ClientPtr client) 151805b261ecSmrg{ 151905b261ecSmrg REQUEST(xRenderCreateCursorReq); 152005b261ecSmrg PicturePtr pSrc; 152105b261ecSmrg ScreenPtr pScreen; 152205b261ecSmrg unsigned short width, height; 152305b261ecSmrg CARD32 *argbbits, *argb; 152405b261ecSmrg unsigned char *srcbits, *srcline; 152505b261ecSmrg unsigned char *mskbits, *mskline; 152605b261ecSmrg int stride; 152705b261ecSmrg int x, y; 152805b261ecSmrg int nbytes_mono; 152905b261ecSmrg CursorMetricRec cm; 153005b261ecSmrg CursorPtr pCursor; 153105b261ecSmrg CARD32 twocolor[3]; 15324642e01fSmrg int rc, ncolor; 153305b261ecSmrg 153405b261ecSmrg REQUEST_SIZE_MATCH (xRenderCreateCursorReq); 153505b261ecSmrg LEGAL_NEW_RESOURCE(stuff->cid, client); 153605b261ecSmrg 15376747b715Smrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess); 153805b261ecSmrg if (!pSrc->pDrawable) 153905b261ecSmrg return BadDrawable; 154005b261ecSmrg pScreen = pSrc->pDrawable->pScreen; 154105b261ecSmrg width = pSrc->pDrawable->width; 154205b261ecSmrg height = pSrc->pDrawable->height; 154305b261ecSmrg if (height && width > UINT32_MAX/(height*sizeof(CARD32))) 154405b261ecSmrg return BadAlloc; 154505b261ecSmrg if ( stuff->x > width 154605b261ecSmrg || stuff->y > height ) 15476747b715Smrg return BadMatch; 15486747b715Smrg argbbits = malloc(width * height * sizeof (CARD32)); 154905b261ecSmrg if (!argbbits) 15506747b715Smrg return BadAlloc; 155105b261ecSmrg 155205b261ecSmrg stride = BitmapBytePad(width); 155305b261ecSmrg nbytes_mono = stride*height; 15546747b715Smrg srcbits = calloc(1, nbytes_mono); 155505b261ecSmrg if (!srcbits) 155605b261ecSmrg { 15576747b715Smrg free(argbbits); 15586747b715Smrg return BadAlloc; 155905b261ecSmrg } 15606747b715Smrg mskbits = calloc(1, nbytes_mono); 156105b261ecSmrg if (!mskbits) 156205b261ecSmrg { 15636747b715Smrg free(argbbits); 15646747b715Smrg free(srcbits); 15656747b715Smrg return BadAlloc; 156605b261ecSmrg } 156705b261ecSmrg 156805b261ecSmrg if (pSrc->format == PICT_a8r8g8b8) 156905b261ecSmrg { 157005b261ecSmrg (*pScreen->GetImage) (pSrc->pDrawable, 157105b261ecSmrg 0, 0, width, height, ZPixmap, 157205b261ecSmrg 0xffffffff, (pointer) argbbits); 157305b261ecSmrg } 157405b261ecSmrg else 157505b261ecSmrg { 157605b261ecSmrg PixmapPtr pPixmap; 157705b261ecSmrg PicturePtr pPicture; 157805b261ecSmrg PictFormatPtr pFormat; 157905b261ecSmrg int error; 158005b261ecSmrg 158105b261ecSmrg pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8); 158205b261ecSmrg if (!pFormat) 158305b261ecSmrg { 15846747b715Smrg free(argbbits); 15856747b715Smrg free(srcbits); 15866747b715Smrg free(mskbits); 15876747b715Smrg return BadImplementation; 158805b261ecSmrg } 15894642e01fSmrg pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32, 15904642e01fSmrg CREATE_PIXMAP_USAGE_SCRATCH); 159105b261ecSmrg if (!pPixmap) 159205b261ecSmrg { 15936747b715Smrg free(argbbits); 15946747b715Smrg free(srcbits); 15956747b715Smrg free(mskbits); 15966747b715Smrg return BadAlloc; 159705b261ecSmrg } 159805b261ecSmrg pPicture = CreatePicture (0, &pPixmap->drawable, pFormat, 0, 0, 159905b261ecSmrg client, &error); 160005b261ecSmrg if (!pPicture) 160105b261ecSmrg { 16026747b715Smrg free(argbbits); 16036747b715Smrg free(srcbits); 16046747b715Smrg free(mskbits); 160505b261ecSmrg return error; 160605b261ecSmrg } 160705b261ecSmrg (*pScreen->DestroyPixmap) (pPixmap); 160805b261ecSmrg CompositePicture (PictOpSrc, 160905b261ecSmrg pSrc, 0, pPicture, 161005b261ecSmrg 0, 0, 0, 0, 0, 0, width, height); 161105b261ecSmrg (*pScreen->GetImage) (pPicture->pDrawable, 161205b261ecSmrg 0, 0, width, height, ZPixmap, 161305b261ecSmrg 0xffffffff, (pointer) argbbits); 161405b261ecSmrg FreePicture (pPicture, 0); 161505b261ecSmrg } 161605b261ecSmrg /* 161705b261ecSmrg * Check whether the cursor can be directly supported by 161805b261ecSmrg * the core cursor code 161905b261ecSmrg */ 162005b261ecSmrg ncolor = 0; 162105b261ecSmrg argb = argbbits; 162205b261ecSmrg for (y = 0; ncolor <= 2 && y < height; y++) 162305b261ecSmrg { 162405b261ecSmrg for (x = 0; ncolor <= 2 && x < width; x++) 162505b261ecSmrg { 162605b261ecSmrg CARD32 p = *argb++; 162705b261ecSmrg CARD32 a = (p >> 24); 162805b261ecSmrg 162905b261ecSmrg if (a == 0) /* transparent */ 163005b261ecSmrg continue; 163105b261ecSmrg if (a == 0xff) /* opaque */ 163205b261ecSmrg { 163305b261ecSmrg int n; 163405b261ecSmrg for (n = 0; n < ncolor; n++) 163505b261ecSmrg if (p == twocolor[n]) 163605b261ecSmrg break; 163705b261ecSmrg if (n == ncolor) 163805b261ecSmrg twocolor[ncolor++] = p; 163905b261ecSmrg } 164005b261ecSmrg else 164105b261ecSmrg ncolor = 3; 164205b261ecSmrg } 164305b261ecSmrg } 164405b261ecSmrg 164505b261ecSmrg /* 164605b261ecSmrg * Convert argb image to two plane cursor 164705b261ecSmrg */ 164805b261ecSmrg srcline = srcbits; 164905b261ecSmrg mskline = mskbits; 165005b261ecSmrg argb = argbbits; 165105b261ecSmrg for (y = 0; y < height; y++) 165205b261ecSmrg { 165305b261ecSmrg for (x = 0; x < width; x++) 165405b261ecSmrg { 165505b261ecSmrg CARD32 p = *argb++; 165605b261ecSmrg 165705b261ecSmrg if (ncolor <= 2) 165805b261ecSmrg { 165905b261ecSmrg CARD32 a = ((p >> 24)); 166005b261ecSmrg 16616747b715Smrg RenderSetBit (mskline, x, a != 0); 16626747b715Smrg RenderSetBit (srcline, x, a != 0 && p == twocolor[0]); 166305b261ecSmrg } 166405b261ecSmrg else 166505b261ecSmrg { 166605b261ecSmrg CARD32 a = ((p >> 24) * DITHER_SIZE + 127) / 255; 166705b261ecSmrg CARD32 i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255; 166805b261ecSmrg CARD32 d = orderedDither[y&(DITHER_DIM-1)][x&(DITHER_DIM-1)]; 166905b261ecSmrg /* Set mask from dithered alpha value */ 16706747b715Smrg RenderSetBit(mskline, x, a > d); 167105b261ecSmrg /* Set src from dithered intensity value */ 16726747b715Smrg RenderSetBit(srcline, x, a > d && i <= d); 167305b261ecSmrg } 167405b261ecSmrg } 167505b261ecSmrg srcline += stride; 167605b261ecSmrg mskline += stride; 167705b261ecSmrg } 167805b261ecSmrg /* 167905b261ecSmrg * Dither to white and black if the cursor has more than two colors 168005b261ecSmrg */ 168105b261ecSmrg if (ncolor > 2) 168205b261ecSmrg { 168305b261ecSmrg twocolor[0] = 0xff000000; 168405b261ecSmrg twocolor[1] = 0xffffffff; 168505b261ecSmrg } 168605b261ecSmrg else 168705b261ecSmrg { 16886747b715Smrg free(argbbits); 168905b261ecSmrg argbbits = 0; 169005b261ecSmrg } 169105b261ecSmrg 169205b261ecSmrg#define GetByte(p,s) (((p) >> (s)) & 0xff) 169305b261ecSmrg#define GetColor(p,s) (GetByte(p,s) | (GetByte(p,s) << 8)) 169405b261ecSmrg 169505b261ecSmrg cm.width = width; 169605b261ecSmrg cm.height = height; 169705b261ecSmrg cm.xhot = stuff->x; 169805b261ecSmrg cm.yhot = stuff->y; 16994642e01fSmrg rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm, 17004642e01fSmrg GetColor(twocolor[0], 16), 17014642e01fSmrg GetColor(twocolor[0], 8), 17024642e01fSmrg GetColor(twocolor[0], 0), 17034642e01fSmrg GetColor(twocolor[1], 16), 17044642e01fSmrg GetColor(twocolor[1], 8), 17054642e01fSmrg GetColor(twocolor[1], 0), 17064642e01fSmrg &pCursor, client, stuff->cid); 17074642e01fSmrg if (rc != Success) 17084642e01fSmrg return rc; 17094642e01fSmrg if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor)) 17104642e01fSmrg return BadAlloc; 17114642e01fSmrg 17126747b715Smrg return Success; 171305b261ecSmrg} 171405b261ecSmrg 171505b261ecSmrgstatic int 171605b261ecSmrgProcRenderSetPictureTransform (ClientPtr client) 171705b261ecSmrg{ 171805b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 171905b261ecSmrg PicturePtr pPicture; 172005b261ecSmrg 172105b261ecSmrg REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq); 17226747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 17236747b715Smrg return SetPictureTransform (pPicture, (PictTransform *) &stuff->transform); 172405b261ecSmrg} 172505b261ecSmrg 172605b261ecSmrgstatic int 172705b261ecSmrgProcRenderQueryFilters (ClientPtr client) 172805b261ecSmrg{ 172905b261ecSmrg REQUEST (xRenderQueryFiltersReq); 173005b261ecSmrg DrawablePtr pDrawable; 173105b261ecSmrg xRenderQueryFiltersReply *reply; 173205b261ecSmrg int nbytesName; 173305b261ecSmrg int nnames; 173405b261ecSmrg ScreenPtr pScreen; 173505b261ecSmrg PictureScreenPtr ps; 173605b261ecSmrg int i, j, len, total_bytes, rc; 173705b261ecSmrg INT16 *aliases; 173805b261ecSmrg char *names; 173905b261ecSmrg 174005b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryFiltersReq); 174105b261ecSmrg rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0, 17424642e01fSmrg DixGetAttrAccess); 174305b261ecSmrg if (rc != Success) 174405b261ecSmrg return rc; 174505b261ecSmrg 174605b261ecSmrg pScreen = pDrawable->pScreen; 174705b261ecSmrg nbytesName = 0; 174805b261ecSmrg nnames = 0; 174905b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 175005b261ecSmrg if (ps) 175105b261ecSmrg { 175205b261ecSmrg for (i = 0; i < ps->nfilters; i++) 175305b261ecSmrg nbytesName += 1 + strlen (ps->filters[i].name); 175405b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 175505b261ecSmrg nbytesName += 1 + strlen (ps->filterAliases[i].alias); 175605b261ecSmrg nnames = ps->nfilters + ps->nfilterAliases; 175705b261ecSmrg } 17586747b715Smrg len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName); 175905b261ecSmrg total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2); 17606747b715Smrg reply = (xRenderQueryFiltersReply *) malloc(total_bytes); 176105b261ecSmrg if (!reply) 176205b261ecSmrg return BadAlloc; 176305b261ecSmrg aliases = (INT16 *) (reply + 1); 176405b261ecSmrg names = (char *) (aliases + ((nnames + 1) & ~1)); 176505b261ecSmrg 176605b261ecSmrg reply->type = X_Reply; 176705b261ecSmrg reply->sequenceNumber = client->sequence; 176805b261ecSmrg reply->length = len; 176905b261ecSmrg reply->numAliases = nnames; 177005b261ecSmrg reply->numFilters = nnames; 177105b261ecSmrg if (ps) 177205b261ecSmrg { 177305b261ecSmrg 177405b261ecSmrg /* fill in alias values */ 177505b261ecSmrg for (i = 0; i < ps->nfilters; i++) 177605b261ecSmrg aliases[i] = FilterAliasNone; 177705b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 177805b261ecSmrg { 177905b261ecSmrg for (j = 0; j < ps->nfilters; j++) 178005b261ecSmrg if (ps->filterAliases[i].filter_id == ps->filters[j].id) 178105b261ecSmrg break; 178205b261ecSmrg if (j == ps->nfilters) 178305b261ecSmrg { 178405b261ecSmrg for (j = 0; j < ps->nfilterAliases; j++) 178505b261ecSmrg if (ps->filterAliases[i].filter_id == 178605b261ecSmrg ps->filterAliases[j].alias_id) 178705b261ecSmrg { 178805b261ecSmrg break; 178905b261ecSmrg } 179005b261ecSmrg if (j == ps->nfilterAliases) 179105b261ecSmrg j = FilterAliasNone; 179205b261ecSmrg else 179305b261ecSmrg j = j + ps->nfilters; 179405b261ecSmrg } 179505b261ecSmrg aliases[i + ps->nfilters] = j; 179605b261ecSmrg } 179705b261ecSmrg 179805b261ecSmrg /* fill in filter names */ 179905b261ecSmrg for (i = 0; i < ps->nfilters; i++) 180005b261ecSmrg { 180105b261ecSmrg j = strlen (ps->filters[i].name); 180205b261ecSmrg *names++ = j; 180305b261ecSmrg strncpy (names, ps->filters[i].name, j); 180405b261ecSmrg names += j; 180505b261ecSmrg } 180605b261ecSmrg 180705b261ecSmrg /* fill in filter alias names */ 180805b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 180905b261ecSmrg { 181005b261ecSmrg j = strlen (ps->filterAliases[i].alias); 181105b261ecSmrg *names++ = j; 181205b261ecSmrg strncpy (names, ps->filterAliases[i].alias, j); 181305b261ecSmrg names += j; 181405b261ecSmrg } 181505b261ecSmrg } 181605b261ecSmrg 181705b261ecSmrg if (client->swapped) 181805b261ecSmrg { 181905b261ecSmrg register int n; 182005b261ecSmrg 182105b261ecSmrg for (i = 0; i < reply->numAliases; i++) 182205b261ecSmrg { 182305b261ecSmrg swaps (&aliases[i], n); 182405b261ecSmrg } 182505b261ecSmrg swaps(&reply->sequenceNumber, n); 182605b261ecSmrg swapl(&reply->length, n); 182705b261ecSmrg swapl(&reply->numAliases, n); 182805b261ecSmrg swapl(&reply->numFilters, n); 182905b261ecSmrg } 183005b261ecSmrg WriteToClient(client, total_bytes, (char *) reply); 18316747b715Smrg free(reply); 183205b261ecSmrg 18336747b715Smrg return Success; 183405b261ecSmrg} 183505b261ecSmrg 183605b261ecSmrgstatic int 183705b261ecSmrgProcRenderSetPictureFilter (ClientPtr client) 183805b261ecSmrg{ 183905b261ecSmrg REQUEST (xRenderSetPictureFilterReq); 184005b261ecSmrg PicturePtr pPicture; 184105b261ecSmrg int result; 184205b261ecSmrg xFixed *params; 184305b261ecSmrg int nparams; 184405b261ecSmrg char *name; 184505b261ecSmrg 184605b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq); 18476747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess); 184805b261ecSmrg name = (char *) (stuff + 1); 18496747b715Smrg params = (xFixed *) (name + pad_to_int32(stuff->nbytes)); 185005b261ecSmrg nparams = ((xFixed *) stuff + client->req_len) - params; 185105b261ecSmrg result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams); 185205b261ecSmrg return result; 185305b261ecSmrg} 185405b261ecSmrg 185505b261ecSmrgstatic int 185605b261ecSmrgProcRenderCreateAnimCursor (ClientPtr client) 185705b261ecSmrg{ 185805b261ecSmrg REQUEST(xRenderCreateAnimCursorReq); 185905b261ecSmrg CursorPtr *cursors; 186005b261ecSmrg CARD32 *deltas; 186105b261ecSmrg CursorPtr pCursor; 186205b261ecSmrg int ncursor; 186305b261ecSmrg xAnimCursorElt *elt; 186405b261ecSmrg int i; 186505b261ecSmrg int ret; 186605b261ecSmrg 186705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq); 186805b261ecSmrg LEGAL_NEW_RESOURCE(stuff->cid, client); 186905b261ecSmrg if (client->req_len & 1) 187005b261ecSmrg return BadLength; 18716747b715Smrg ncursor = (client->req_len - (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1; 18726747b715Smrg cursors = malloc(ncursor * (sizeof (CursorPtr) + sizeof (CARD32))); 187305b261ecSmrg if (!cursors) 187405b261ecSmrg return BadAlloc; 187505b261ecSmrg deltas = (CARD32 *) (cursors + ncursor); 187605b261ecSmrg elt = (xAnimCursorElt *) (stuff + 1); 187705b261ecSmrg for (i = 0; i < ncursor; i++) 187805b261ecSmrg { 18796747b715Smrg ret = dixLookupResourceByType((pointer *)(cursors + i), elt->cursor, 18806747b715Smrg RT_CURSOR, client, DixReadAccess); 18816747b715Smrg if (ret != Success) 188205b261ecSmrg { 18836747b715Smrg free(cursors); 18846747b715Smrg return ret; 188505b261ecSmrg } 188605b261ecSmrg deltas[i] = elt->delay; 188705b261ecSmrg elt++; 188805b261ecSmrg } 18894642e01fSmrg ret = AnimCursorCreate (cursors, deltas, ncursor, &pCursor, client, 18904642e01fSmrg stuff->cid); 18916747b715Smrg free(cursors); 189205b261ecSmrg if (ret != Success) 189305b261ecSmrg return ret; 189405b261ecSmrg 189505b261ecSmrg if (AddResource (stuff->cid, RT_CURSOR, (pointer)pCursor)) 18966747b715Smrg return Success; 189705b261ecSmrg return BadAlloc; 189805b261ecSmrg} 189905b261ecSmrg 190005b261ecSmrgstatic int 190105b261ecSmrgProcRenderAddTraps (ClientPtr client) 190205b261ecSmrg{ 190305b261ecSmrg int ntraps; 190405b261ecSmrg PicturePtr pPicture; 190505b261ecSmrg REQUEST(xRenderAddTrapsReq); 190605b261ecSmrg 190705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq); 19086747b715Smrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess); 190905b261ecSmrg if (!pPicture->pDrawable) 191005b261ecSmrg return BadDrawable; 191105b261ecSmrg ntraps = (client->req_len << 2) - sizeof (xRenderAddTrapsReq); 191205b261ecSmrg if (ntraps % sizeof (xTrap)) 191305b261ecSmrg return BadLength; 191405b261ecSmrg ntraps /= sizeof (xTrap); 191505b261ecSmrg if (ntraps) 191605b261ecSmrg AddTraps (pPicture, 191705b261ecSmrg stuff->xOff, stuff->yOff, 191805b261ecSmrg ntraps, (xTrap *) &stuff[1]); 19196747b715Smrg return Success; 192005b261ecSmrg} 192105b261ecSmrg 192205b261ecSmrgstatic int ProcRenderCreateSolidFill(ClientPtr client) 192305b261ecSmrg{ 192405b261ecSmrg PicturePtr pPicture; 192505b261ecSmrg int error = 0; 192605b261ecSmrg REQUEST(xRenderCreateSolidFillReq); 192705b261ecSmrg 192805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 192905b261ecSmrg 193005b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 193105b261ecSmrg 193205b261ecSmrg pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error); 193305b261ecSmrg if (!pPicture) 193405b261ecSmrg return error; 19354642e01fSmrg /* security creation/labeling check */ 19364642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 19374642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 19384642e01fSmrg if (error != Success) 19394642e01fSmrg return error; 194005b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 194105b261ecSmrg return BadAlloc; 194205b261ecSmrg return Success; 194305b261ecSmrg} 194405b261ecSmrg 194505b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr client) 194605b261ecSmrg{ 194705b261ecSmrg PicturePtr pPicture; 194805b261ecSmrg int len; 194905b261ecSmrg int error = 0; 195005b261ecSmrg xFixed *stops; 195105b261ecSmrg xRenderColor *colors; 195205b261ecSmrg REQUEST(xRenderCreateLinearGradientReq); 195305b261ecSmrg 195405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 195505b261ecSmrg 195605b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 195705b261ecSmrg 195805b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 195905b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 196005b261ecSmrg return BadLength; 196105b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 196205b261ecSmrg return BadLength; 196305b261ecSmrg 196405b261ecSmrg stops = (xFixed *)(stuff + 1); 196505b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 196605b261ecSmrg 196705b261ecSmrg pPicture = CreateLinearGradientPicture (stuff->pid, &stuff->p1, &stuff->p2, 196805b261ecSmrg stuff->nStops, stops, colors, &error); 196905b261ecSmrg if (!pPicture) 197005b261ecSmrg return error; 19714642e01fSmrg /* security creation/labeling check */ 19724642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 19734642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 19744642e01fSmrg if (error != Success) 19754642e01fSmrg return error; 197605b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 197705b261ecSmrg return BadAlloc; 197805b261ecSmrg return Success; 197905b261ecSmrg} 198005b261ecSmrg 198105b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr client) 198205b261ecSmrg{ 198305b261ecSmrg PicturePtr pPicture; 198405b261ecSmrg int len; 198505b261ecSmrg int error = 0; 198605b261ecSmrg xFixed *stops; 198705b261ecSmrg xRenderColor *colors; 198805b261ecSmrg REQUEST(xRenderCreateRadialGradientReq); 198905b261ecSmrg 199005b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 199105b261ecSmrg 199205b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 199305b261ecSmrg 199405b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 199505b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 199605b261ecSmrg return BadLength; 199705b261ecSmrg 199805b261ecSmrg stops = (xFixed *)(stuff + 1); 199905b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 200005b261ecSmrg 200105b261ecSmrg pPicture = CreateRadialGradientPicture (stuff->pid, &stuff->inner, &stuff->outer, 200205b261ecSmrg stuff->inner_radius, stuff->outer_radius, 200305b261ecSmrg stuff->nStops, stops, colors, &error); 200405b261ecSmrg if (!pPicture) 200505b261ecSmrg return error; 20064642e01fSmrg /* security creation/labeling check */ 20074642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 20084642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 20094642e01fSmrg if (error != Success) 20104642e01fSmrg return error; 201105b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 201205b261ecSmrg return BadAlloc; 201305b261ecSmrg return Success; 201405b261ecSmrg} 201505b261ecSmrg 201605b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr client) 201705b261ecSmrg{ 201805b261ecSmrg PicturePtr pPicture; 201905b261ecSmrg int len; 202005b261ecSmrg int error = 0; 202105b261ecSmrg xFixed *stops; 202205b261ecSmrg xRenderColor *colors; 202305b261ecSmrg REQUEST(xRenderCreateConicalGradientReq); 202405b261ecSmrg 202505b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 202605b261ecSmrg 202705b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 202805b261ecSmrg 202905b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 203005b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 203105b261ecSmrg return BadLength; 203205b261ecSmrg 203305b261ecSmrg stops = (xFixed *)(stuff + 1); 203405b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 203505b261ecSmrg 203605b261ecSmrg pPicture = CreateConicalGradientPicture (stuff->pid, &stuff->center, stuff->angle, 203705b261ecSmrg stuff->nStops, stops, colors, &error); 203805b261ecSmrg if (!pPicture) 203905b261ecSmrg return error; 20404642e01fSmrg /* security creation/labeling check */ 20414642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 20424642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 20434642e01fSmrg if (error != Success) 20444642e01fSmrg return error; 204505b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 204605b261ecSmrg return BadAlloc; 204705b261ecSmrg return Success; 204805b261ecSmrg} 204905b261ecSmrg 205005b261ecSmrg 205105b261ecSmrgstatic int 205205b261ecSmrgProcRenderDispatch (ClientPtr client) 205305b261ecSmrg{ 205405b261ecSmrg REQUEST(xReq); 205505b261ecSmrg 205605b261ecSmrg if (stuff->data < RenderNumberRequests) 205705b261ecSmrg return (*ProcRenderVector[stuff->data]) (client); 205805b261ecSmrg else 205905b261ecSmrg return BadRequest; 206005b261ecSmrg} 206105b261ecSmrg 206205b261ecSmrgstatic int 206305b261ecSmrgSProcRenderQueryVersion (ClientPtr client) 206405b261ecSmrg{ 206505b261ecSmrg register int n; 206605b261ecSmrg REQUEST(xRenderQueryVersionReq); 20670b0d8713Smrg REQUEST_SIZE_MATCH(xRenderQueryVersionReq); 206805b261ecSmrg 206905b261ecSmrg swaps(&stuff->length, n); 207005b261ecSmrg swapl(&stuff->majorVersion, n); 207105b261ecSmrg swapl(&stuff->minorVersion, n); 207205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType])(client); 207305b261ecSmrg} 207405b261ecSmrg 207505b261ecSmrgstatic int 207605b261ecSmrgSProcRenderQueryPictFormats (ClientPtr client) 207705b261ecSmrg{ 207805b261ecSmrg register int n; 207905b261ecSmrg REQUEST(xRenderQueryPictFormatsReq); 20800b0d8713Smrg REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq); 208105b261ecSmrg swaps(&stuff->length, n); 208205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 208305b261ecSmrg} 208405b261ecSmrg 208505b261ecSmrgstatic int 208605b261ecSmrgSProcRenderQueryPictIndexValues (ClientPtr client) 208705b261ecSmrg{ 208805b261ecSmrg register int n; 208905b261ecSmrg REQUEST(xRenderQueryPictIndexValuesReq); 20900b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq); 209105b261ecSmrg swaps(&stuff->length, n); 209205b261ecSmrg swapl(&stuff->format, n); 209305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 209405b261ecSmrg} 209505b261ecSmrg 209605b261ecSmrgstatic int 209705b261ecSmrgSProcRenderQueryDithers (ClientPtr client) 209805b261ecSmrg{ 209905b261ecSmrg return BadImplementation; 210005b261ecSmrg} 210105b261ecSmrg 210205b261ecSmrgstatic int 210305b261ecSmrgSProcRenderCreatePicture (ClientPtr client) 210405b261ecSmrg{ 210505b261ecSmrg register int n; 210605b261ecSmrg REQUEST(xRenderCreatePictureReq); 21070b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 210805b261ecSmrg swaps(&stuff->length, n); 210905b261ecSmrg swapl(&stuff->pid, n); 211005b261ecSmrg swapl(&stuff->drawable, n); 211105b261ecSmrg swapl(&stuff->format, n); 211205b261ecSmrg swapl(&stuff->mask, n); 211305b261ecSmrg SwapRestL(stuff); 211405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 211505b261ecSmrg} 211605b261ecSmrg 211705b261ecSmrgstatic int 211805b261ecSmrgSProcRenderChangePicture (ClientPtr client) 211905b261ecSmrg{ 212005b261ecSmrg register int n; 212105b261ecSmrg REQUEST(xRenderChangePictureReq); 21220b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 212305b261ecSmrg swaps(&stuff->length, n); 212405b261ecSmrg swapl(&stuff->picture, n); 212505b261ecSmrg swapl(&stuff->mask, n); 212605b261ecSmrg SwapRestL(stuff); 212705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 212805b261ecSmrg} 212905b261ecSmrg 213005b261ecSmrgstatic int 213105b261ecSmrgSProcRenderSetPictureClipRectangles (ClientPtr client) 213205b261ecSmrg{ 213305b261ecSmrg register int n; 213405b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 21350b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 213605b261ecSmrg swaps(&stuff->length, n); 213705b261ecSmrg swapl(&stuff->picture, n); 213805b261ecSmrg swaps(&stuff->xOrigin, n); 213905b261ecSmrg swaps(&stuff->yOrigin, n); 214005b261ecSmrg SwapRestS(stuff); 214105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 214205b261ecSmrg} 214305b261ecSmrg 214405b261ecSmrgstatic int 214505b261ecSmrgSProcRenderFreePicture (ClientPtr client) 214605b261ecSmrg{ 214705b261ecSmrg register int n; 214805b261ecSmrg REQUEST(xRenderFreePictureReq); 21490b0d8713Smrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 215005b261ecSmrg swaps(&stuff->length, n); 215105b261ecSmrg swapl(&stuff->picture, n); 215205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 215305b261ecSmrg} 215405b261ecSmrg 215505b261ecSmrgstatic int 215605b261ecSmrgSProcRenderComposite (ClientPtr client) 215705b261ecSmrg{ 215805b261ecSmrg register int n; 215905b261ecSmrg REQUEST(xRenderCompositeReq); 21600b0d8713Smrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 216105b261ecSmrg swaps(&stuff->length, n); 216205b261ecSmrg swapl(&stuff->src, n); 216305b261ecSmrg swapl(&stuff->mask, n); 216405b261ecSmrg swapl(&stuff->dst, n); 216505b261ecSmrg swaps(&stuff->xSrc, n); 216605b261ecSmrg swaps(&stuff->ySrc, n); 216705b261ecSmrg swaps(&stuff->xMask, n); 216805b261ecSmrg swaps(&stuff->yMask, n); 216905b261ecSmrg swaps(&stuff->xDst, n); 217005b261ecSmrg swaps(&stuff->yDst, n); 217105b261ecSmrg swaps(&stuff->width, n); 217205b261ecSmrg swaps(&stuff->height, n); 217305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 217405b261ecSmrg} 217505b261ecSmrg 217605b261ecSmrgstatic int 217705b261ecSmrgSProcRenderScale (ClientPtr client) 217805b261ecSmrg{ 217905b261ecSmrg register int n; 218005b261ecSmrg REQUEST(xRenderScaleReq); 21810b0d8713Smrg REQUEST_SIZE_MATCH(xRenderScaleReq); 218205b261ecSmrg swaps(&stuff->length, n); 218305b261ecSmrg swapl(&stuff->src, n); 218405b261ecSmrg swapl(&stuff->dst, n); 218505b261ecSmrg swapl(&stuff->colorScale, n); 218605b261ecSmrg swapl(&stuff->alphaScale, n); 218705b261ecSmrg swaps(&stuff->xSrc, n); 218805b261ecSmrg swaps(&stuff->ySrc, n); 218905b261ecSmrg swaps(&stuff->xDst, n); 219005b261ecSmrg swaps(&stuff->yDst, n); 219105b261ecSmrg swaps(&stuff->width, n); 219205b261ecSmrg swaps(&stuff->height, n); 219305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 219405b261ecSmrg} 219505b261ecSmrg 219605b261ecSmrgstatic int 219705b261ecSmrgSProcRenderTrapezoids (ClientPtr client) 219805b261ecSmrg{ 219905b261ecSmrg register int n; 220005b261ecSmrg REQUEST(xRenderTrapezoidsReq); 220105b261ecSmrg 220205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 220305b261ecSmrg swaps (&stuff->length, n); 220405b261ecSmrg swapl (&stuff->src, n); 220505b261ecSmrg swapl (&stuff->dst, n); 220605b261ecSmrg swapl (&stuff->maskFormat, n); 220705b261ecSmrg swaps (&stuff->xSrc, n); 220805b261ecSmrg swaps (&stuff->ySrc, n); 220905b261ecSmrg SwapRestL(stuff); 221005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 221105b261ecSmrg} 221205b261ecSmrg 221305b261ecSmrgstatic int 221405b261ecSmrgSProcRenderTriangles (ClientPtr client) 221505b261ecSmrg{ 221605b261ecSmrg register int n; 221705b261ecSmrg REQUEST(xRenderTrianglesReq); 221805b261ecSmrg 221905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 222005b261ecSmrg swaps (&stuff->length, n); 222105b261ecSmrg swapl (&stuff->src, n); 222205b261ecSmrg swapl (&stuff->dst, n); 222305b261ecSmrg swapl (&stuff->maskFormat, n); 222405b261ecSmrg swaps (&stuff->xSrc, n); 222505b261ecSmrg swaps (&stuff->ySrc, n); 222605b261ecSmrg SwapRestL(stuff); 222705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 222805b261ecSmrg} 222905b261ecSmrg 223005b261ecSmrgstatic int 223105b261ecSmrgSProcRenderTriStrip (ClientPtr client) 223205b261ecSmrg{ 223305b261ecSmrg register int n; 223405b261ecSmrg REQUEST(xRenderTriStripReq); 223505b261ecSmrg 223605b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriStripReq); 223705b261ecSmrg swaps (&stuff->length, n); 223805b261ecSmrg swapl (&stuff->src, n); 223905b261ecSmrg swapl (&stuff->dst, n); 224005b261ecSmrg swapl (&stuff->maskFormat, n); 224105b261ecSmrg swaps (&stuff->xSrc, n); 224205b261ecSmrg swaps (&stuff->ySrc, n); 224305b261ecSmrg SwapRestL(stuff); 224405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 224505b261ecSmrg} 224605b261ecSmrg 224705b261ecSmrgstatic int 224805b261ecSmrgSProcRenderTriFan (ClientPtr client) 224905b261ecSmrg{ 225005b261ecSmrg register int n; 225105b261ecSmrg REQUEST(xRenderTriFanReq); 225205b261ecSmrg 225305b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriFanReq); 225405b261ecSmrg swaps (&stuff->length, n); 225505b261ecSmrg swapl (&stuff->src, n); 225605b261ecSmrg swapl (&stuff->dst, n); 225705b261ecSmrg swapl (&stuff->maskFormat, n); 225805b261ecSmrg swaps (&stuff->xSrc, n); 225905b261ecSmrg swaps (&stuff->ySrc, n); 226005b261ecSmrg SwapRestL(stuff); 226105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 226205b261ecSmrg} 226305b261ecSmrg 226405b261ecSmrgstatic int 226505b261ecSmrgSProcRenderColorTrapezoids (ClientPtr client) 226605b261ecSmrg{ 226705b261ecSmrg return BadImplementation; 226805b261ecSmrg} 226905b261ecSmrg 227005b261ecSmrgstatic int 227105b261ecSmrgSProcRenderColorTriangles (ClientPtr client) 227205b261ecSmrg{ 227305b261ecSmrg return BadImplementation; 227405b261ecSmrg} 227505b261ecSmrg 227605b261ecSmrgstatic int 227705b261ecSmrgSProcRenderTransform (ClientPtr client) 227805b261ecSmrg{ 227905b261ecSmrg return BadImplementation; 228005b261ecSmrg} 228105b261ecSmrg 228205b261ecSmrgstatic int 228305b261ecSmrgSProcRenderCreateGlyphSet (ClientPtr client) 228405b261ecSmrg{ 228505b261ecSmrg register int n; 228605b261ecSmrg REQUEST(xRenderCreateGlyphSetReq); 22870b0d8713Smrg REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq); 228805b261ecSmrg swaps(&stuff->length, n); 228905b261ecSmrg swapl(&stuff->gsid, n); 229005b261ecSmrg swapl(&stuff->format, n); 229105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 229205b261ecSmrg} 229305b261ecSmrg 229405b261ecSmrgstatic int 229505b261ecSmrgSProcRenderReferenceGlyphSet (ClientPtr client) 229605b261ecSmrg{ 229705b261ecSmrg register int n; 229805b261ecSmrg REQUEST(xRenderReferenceGlyphSetReq); 22990b0d8713Smrg REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq); 230005b261ecSmrg swaps(&stuff->length, n); 230105b261ecSmrg swapl(&stuff->gsid, n); 230205b261ecSmrg swapl(&stuff->existing, n); 230305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 230405b261ecSmrg} 230505b261ecSmrg 230605b261ecSmrgstatic int 230705b261ecSmrgSProcRenderFreeGlyphSet (ClientPtr client) 230805b261ecSmrg{ 230905b261ecSmrg register int n; 231005b261ecSmrg REQUEST(xRenderFreeGlyphSetReq); 23110b0d8713Smrg REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq); 231205b261ecSmrg swaps(&stuff->length, n); 231305b261ecSmrg swapl(&stuff->glyphset, n); 231405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 231505b261ecSmrg} 231605b261ecSmrg 231705b261ecSmrgstatic int 231805b261ecSmrgSProcRenderAddGlyphs (ClientPtr client) 231905b261ecSmrg{ 232005b261ecSmrg register int n; 232105b261ecSmrg register int i; 232205b261ecSmrg CARD32 *gids; 232305b261ecSmrg void *end; 232405b261ecSmrg xGlyphInfo *gi; 232505b261ecSmrg REQUEST(xRenderAddGlyphsReq); 23260b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq); 232705b261ecSmrg swaps(&stuff->length, n); 232805b261ecSmrg swapl(&stuff->glyphset, n); 232905b261ecSmrg swapl(&stuff->nglyphs, n); 233005b261ecSmrg if (stuff->nglyphs & 0xe0000000) 233105b261ecSmrg return BadLength; 233205b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 233305b261ecSmrg gids = (CARD32 *) (stuff + 1); 233405b261ecSmrg gi = (xGlyphInfo *) (gids + stuff->nglyphs); 233505b261ecSmrg if ((char *) end - (char *) (gids + stuff->nglyphs) < 0) 233605b261ecSmrg return BadLength; 233705b261ecSmrg if ((char *) end - (char *) (gi + stuff->nglyphs) < 0) 233805b261ecSmrg return BadLength; 233905b261ecSmrg for (i = 0; i < stuff->nglyphs; i++) 234005b261ecSmrg { 234105b261ecSmrg swapl (&gids[i], n); 234205b261ecSmrg swaps (&gi[i].width, n); 234305b261ecSmrg swaps (&gi[i].height, n); 234405b261ecSmrg swaps (&gi[i].x, n); 234505b261ecSmrg swaps (&gi[i].y, n); 234605b261ecSmrg swaps (&gi[i].xOff, n); 234705b261ecSmrg swaps (&gi[i].yOff, n); 234805b261ecSmrg } 234905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 235005b261ecSmrg} 235105b261ecSmrg 235205b261ecSmrgstatic int 235305b261ecSmrgSProcRenderAddGlyphsFromPicture (ClientPtr client) 235405b261ecSmrg{ 235505b261ecSmrg return BadImplementation; 235605b261ecSmrg} 235705b261ecSmrg 235805b261ecSmrgstatic int 235905b261ecSmrgSProcRenderFreeGlyphs (ClientPtr client) 236005b261ecSmrg{ 236105b261ecSmrg register int n; 236205b261ecSmrg REQUEST(xRenderFreeGlyphsReq); 23630b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq); 236405b261ecSmrg swaps(&stuff->length, n); 236505b261ecSmrg swapl(&stuff->glyphset, n); 236605b261ecSmrg SwapRestL(stuff); 236705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 236805b261ecSmrg} 236905b261ecSmrg 237005b261ecSmrgstatic int 237105b261ecSmrgSProcRenderCompositeGlyphs (ClientPtr client) 237205b261ecSmrg{ 237305b261ecSmrg register int n; 237405b261ecSmrg xGlyphElt *elt; 237505b261ecSmrg CARD8 *buffer; 237605b261ecSmrg CARD8 *end; 237705b261ecSmrg int space; 237805b261ecSmrg int i; 237905b261ecSmrg int size; 238005b261ecSmrg 238105b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 23820b0d8713Smrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 238305b261ecSmrg 238405b261ecSmrg switch (stuff->renderReqType) { 238505b261ecSmrg default: size = 1; break; 238605b261ecSmrg case X_RenderCompositeGlyphs16: size = 2; break; 238705b261ecSmrg case X_RenderCompositeGlyphs32: size = 4; break; 238805b261ecSmrg } 238905b261ecSmrg 239005b261ecSmrg swaps(&stuff->length, n); 239105b261ecSmrg swapl(&stuff->src, n); 239205b261ecSmrg swapl(&stuff->dst, n); 239305b261ecSmrg swapl(&stuff->maskFormat, n); 239405b261ecSmrg swapl(&stuff->glyphset, n); 239505b261ecSmrg swaps(&stuff->xSrc, n); 239605b261ecSmrg swaps(&stuff->ySrc, n); 239705b261ecSmrg buffer = (CARD8 *) (stuff + 1); 239805b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 239905b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 240005b261ecSmrg { 240105b261ecSmrg elt = (xGlyphElt *) buffer; 240205b261ecSmrg buffer += sizeof (xGlyphElt); 240305b261ecSmrg 240405b261ecSmrg swaps (&elt->deltax, n); 240505b261ecSmrg swaps (&elt->deltay, n); 240605b261ecSmrg 240705b261ecSmrg i = elt->len; 240805b261ecSmrg if (i == 0xff) 240905b261ecSmrg { 241005b261ecSmrg swapl (buffer, n); 241105b261ecSmrg buffer += 4; 241205b261ecSmrg } 241305b261ecSmrg else 241405b261ecSmrg { 241505b261ecSmrg space = size * i; 241605b261ecSmrg switch (size) { 241705b261ecSmrg case 1: 241805b261ecSmrg buffer += i; 241905b261ecSmrg break; 242005b261ecSmrg case 2: 242105b261ecSmrg while (i--) 242205b261ecSmrg { 242305b261ecSmrg swaps (buffer, n); 242405b261ecSmrg buffer += 2; 242505b261ecSmrg } 242605b261ecSmrg break; 242705b261ecSmrg case 4: 242805b261ecSmrg while (i--) 242905b261ecSmrg { 243005b261ecSmrg swapl (buffer, n); 243105b261ecSmrg buffer += 4; 243205b261ecSmrg } 243305b261ecSmrg break; 243405b261ecSmrg } 243505b261ecSmrg if (space & 3) 243605b261ecSmrg buffer += 4 - (space & 3); 243705b261ecSmrg } 243805b261ecSmrg } 243905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 244005b261ecSmrg} 244105b261ecSmrg 244205b261ecSmrgstatic int 244305b261ecSmrgSProcRenderFillRectangles (ClientPtr client) 244405b261ecSmrg{ 244505b261ecSmrg register int n; 244605b261ecSmrg REQUEST(xRenderFillRectanglesReq); 244705b261ecSmrg 244805b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 244905b261ecSmrg swaps(&stuff->length, n); 245005b261ecSmrg swapl(&stuff->dst, n); 245105b261ecSmrg swaps(&stuff->color.red, n); 245205b261ecSmrg swaps(&stuff->color.green, n); 245305b261ecSmrg swaps(&stuff->color.blue, n); 245405b261ecSmrg swaps(&stuff->color.alpha, n); 245505b261ecSmrg SwapRestS(stuff); 245605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 245705b261ecSmrg} 245805b261ecSmrg 245905b261ecSmrgstatic int 246005b261ecSmrgSProcRenderCreateCursor (ClientPtr client) 246105b261ecSmrg{ 246205b261ecSmrg register int n; 246305b261ecSmrg REQUEST(xRenderCreateCursorReq); 246405b261ecSmrg REQUEST_SIZE_MATCH (xRenderCreateCursorReq); 246505b261ecSmrg 246605b261ecSmrg swaps(&stuff->length, n); 246705b261ecSmrg swapl(&stuff->cid, n); 246805b261ecSmrg swapl(&stuff->src, n); 246905b261ecSmrg swaps(&stuff->x, n); 247005b261ecSmrg swaps(&stuff->y, n); 247105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 247205b261ecSmrg} 247305b261ecSmrg 247405b261ecSmrgstatic int 247505b261ecSmrgSProcRenderSetPictureTransform (ClientPtr client) 247605b261ecSmrg{ 247705b261ecSmrg register int n; 247805b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 247905b261ecSmrg REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq); 248005b261ecSmrg 248105b261ecSmrg swaps(&stuff->length, n); 248205b261ecSmrg swapl(&stuff->picture, n); 248305b261ecSmrg swapl(&stuff->transform.matrix11, n); 248405b261ecSmrg swapl(&stuff->transform.matrix12, n); 248505b261ecSmrg swapl(&stuff->transform.matrix13, n); 248605b261ecSmrg swapl(&stuff->transform.matrix21, n); 248705b261ecSmrg swapl(&stuff->transform.matrix22, n); 248805b261ecSmrg swapl(&stuff->transform.matrix23, n); 248905b261ecSmrg swapl(&stuff->transform.matrix31, n); 249005b261ecSmrg swapl(&stuff->transform.matrix32, n); 249105b261ecSmrg swapl(&stuff->transform.matrix33, n); 249205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 249305b261ecSmrg} 249405b261ecSmrg 249505b261ecSmrgstatic int 249605b261ecSmrgSProcRenderQueryFilters (ClientPtr client) 249705b261ecSmrg{ 249805b261ecSmrg register int n; 249905b261ecSmrg REQUEST (xRenderQueryFiltersReq); 250005b261ecSmrg REQUEST_SIZE_MATCH (xRenderQueryFiltersReq); 250105b261ecSmrg 250205b261ecSmrg swaps(&stuff->length, n); 250305b261ecSmrg swapl(&stuff->drawable, n); 250405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 250505b261ecSmrg} 250605b261ecSmrg 250705b261ecSmrgstatic int 250805b261ecSmrgSProcRenderSetPictureFilter (ClientPtr client) 250905b261ecSmrg{ 251005b261ecSmrg register int n; 251105b261ecSmrg REQUEST (xRenderSetPictureFilterReq); 251205b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq); 251305b261ecSmrg 251405b261ecSmrg swaps(&stuff->length, n); 251505b261ecSmrg swapl(&stuff->picture, n); 251605b261ecSmrg swaps(&stuff->nbytes, n); 251705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 251805b261ecSmrg} 251905b261ecSmrg 252005b261ecSmrgstatic int 252105b261ecSmrgSProcRenderCreateAnimCursor (ClientPtr client) 252205b261ecSmrg{ 252305b261ecSmrg register int n; 252405b261ecSmrg REQUEST (xRenderCreateAnimCursorReq); 252505b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateAnimCursorReq); 252605b261ecSmrg 252705b261ecSmrg swaps(&stuff->length, n); 252805b261ecSmrg swapl(&stuff->cid, n); 252905b261ecSmrg SwapRestL(stuff); 253005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 253105b261ecSmrg} 253205b261ecSmrg 253305b261ecSmrgstatic int 253405b261ecSmrgSProcRenderAddTraps (ClientPtr client) 253505b261ecSmrg{ 253605b261ecSmrg register int n; 253705b261ecSmrg REQUEST (xRenderAddTrapsReq); 253805b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq); 253905b261ecSmrg 254005b261ecSmrg swaps(&stuff->length, n); 254105b261ecSmrg swapl(&stuff->picture, n); 254205b261ecSmrg swaps(&stuff->xOff, n); 254305b261ecSmrg swaps(&stuff->yOff, n); 254405b261ecSmrg SwapRestL(stuff); 254505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 254605b261ecSmrg} 254705b261ecSmrg 254805b261ecSmrgstatic int 254905b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client) 255005b261ecSmrg{ 255105b261ecSmrg register int n; 255205b261ecSmrg REQUEST (xRenderCreateSolidFillReq); 255305b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateSolidFillReq); 255405b261ecSmrg 255505b261ecSmrg swaps(&stuff->length, n); 255605b261ecSmrg swapl(&stuff->pid, n); 255705b261ecSmrg swaps(&stuff->color.alpha, n); 255805b261ecSmrg swaps(&stuff->color.red, n); 255905b261ecSmrg swaps(&stuff->color.green, n); 256005b261ecSmrg swaps(&stuff->color.blue, n); 256105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 256205b261ecSmrg} 256305b261ecSmrg 256405b261ecSmrgstatic void swapStops(void *stuff, int num) 256505b261ecSmrg{ 256605b261ecSmrg int i, n; 256705b261ecSmrg CARD32 *stops; 256805b261ecSmrg CARD16 *colors; 256905b261ecSmrg stops = (CARD32 *)(stuff); 257005b261ecSmrg for (i = 0; i < num; ++i) { 257105b261ecSmrg swapl(stops, n); 257205b261ecSmrg ++stops; 257305b261ecSmrg } 257405b261ecSmrg colors = (CARD16 *)(stops); 257505b261ecSmrg for (i = 0; i < 4*num; ++i) { 25768223e2f2Smrg swaps(colors, n); 25778223e2f2Smrg ++colors; 257805b261ecSmrg } 257905b261ecSmrg} 258005b261ecSmrg 258105b261ecSmrgstatic int 258205b261ecSmrgSProcRenderCreateLinearGradient (ClientPtr client) 258305b261ecSmrg{ 258405b261ecSmrg register int n; 258505b261ecSmrg int len; 258605b261ecSmrg REQUEST (xRenderCreateLinearGradientReq); 258705b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateLinearGradientReq); 258805b261ecSmrg 258905b261ecSmrg swaps(&stuff->length, n); 259005b261ecSmrg swapl(&stuff->pid, n); 259105b261ecSmrg swapl(&stuff->p1.x, n); 259205b261ecSmrg swapl(&stuff->p1.y, n); 259305b261ecSmrg swapl(&stuff->p2.x, n); 259405b261ecSmrg swapl(&stuff->p2.y, n); 259505b261ecSmrg swapl(&stuff->nStops, n); 259605b261ecSmrg 259705b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 259805b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 259905b261ecSmrg return BadLength; 260005b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 260105b261ecSmrg return BadLength; 260205b261ecSmrg 260305b261ecSmrg swapStops(stuff+1, stuff->nStops); 260405b261ecSmrg 260505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 260605b261ecSmrg} 260705b261ecSmrg 260805b261ecSmrgstatic int 260905b261ecSmrgSProcRenderCreateRadialGradient (ClientPtr client) 261005b261ecSmrg{ 261105b261ecSmrg register int n; 261205b261ecSmrg int len; 261305b261ecSmrg REQUEST (xRenderCreateRadialGradientReq); 261405b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateRadialGradientReq); 261505b261ecSmrg 261605b261ecSmrg swaps(&stuff->length, n); 261705b261ecSmrg swapl(&stuff->pid, n); 261805b261ecSmrg swapl(&stuff->inner.x, n); 261905b261ecSmrg swapl(&stuff->inner.y, n); 262005b261ecSmrg swapl(&stuff->outer.x, n); 262105b261ecSmrg swapl(&stuff->outer.y, n); 262205b261ecSmrg swapl(&stuff->inner_radius, n); 262305b261ecSmrg swapl(&stuff->outer_radius, n); 262405b261ecSmrg swapl(&stuff->nStops, n); 262505b261ecSmrg 262605b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 262705b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 262805b261ecSmrg return BadLength; 262905b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 263005b261ecSmrg return BadLength; 263105b261ecSmrg 263205b261ecSmrg swapStops(stuff+1, stuff->nStops); 263305b261ecSmrg 263405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 263505b261ecSmrg} 263605b261ecSmrg 263705b261ecSmrgstatic int 263805b261ecSmrgSProcRenderCreateConicalGradient (ClientPtr client) 263905b261ecSmrg{ 264005b261ecSmrg register int n; 264105b261ecSmrg int len; 264205b261ecSmrg REQUEST (xRenderCreateConicalGradientReq); 264305b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateConicalGradientReq); 264405b261ecSmrg 264505b261ecSmrg swaps(&stuff->length, n); 264605b261ecSmrg swapl(&stuff->pid, n); 264705b261ecSmrg swapl(&stuff->center.x, n); 264805b261ecSmrg swapl(&stuff->center.y, n); 264905b261ecSmrg swapl(&stuff->angle, n); 265005b261ecSmrg swapl(&stuff->nStops, n); 265105b261ecSmrg 265205b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 265305b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 265405b261ecSmrg return BadLength; 265505b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 265605b261ecSmrg return BadLength; 265705b261ecSmrg 265805b261ecSmrg swapStops(stuff+1, stuff->nStops); 265905b261ecSmrg 266005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 266105b261ecSmrg} 266205b261ecSmrg 266305b261ecSmrgstatic int 266405b261ecSmrgSProcRenderDispatch (ClientPtr client) 266505b261ecSmrg{ 266605b261ecSmrg REQUEST(xReq); 266705b261ecSmrg 266805b261ecSmrg if (stuff->data < RenderNumberRequests) 266905b261ecSmrg return (*SProcRenderVector[stuff->data]) (client); 267005b261ecSmrg else 267105b261ecSmrg return BadRequest; 267205b261ecSmrg} 267305b261ecSmrg 267405b261ecSmrg#ifdef PANORAMIX 26756747b715Smrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\ 26766747b715Smrg int rc = dixLookupResourceByType((pointer *)&(pPicture), pid,\ 26776747b715Smrg XRT_PICTURE, client, mode);\ 26786747b715Smrg if (rc != Success)\ 26796747b715Smrg return rc;\ 268005b261ecSmrg} 268105b261ecSmrg 26826747b715Smrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\ 268305b261ecSmrg if (pid == None) \ 268405b261ecSmrg pPicture = 0; \ 268505b261ecSmrg else { \ 26866747b715Smrg VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \ 268705b261ecSmrg } \ 268805b261ecSmrg} \ 268905b261ecSmrg 269005b261ecSmrgint (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr); 269105b261ecSmrg 269205b261ecSmrgstatic int 269305b261ecSmrgPanoramiXRenderCreatePicture (ClientPtr client) 269405b261ecSmrg{ 269505b261ecSmrg REQUEST(xRenderCreatePictureReq); 269605b261ecSmrg PanoramiXRes *refDraw, *newPict; 26976747b715Smrg int result, j; 269805b261ecSmrg 269905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 27006747b715Smrg result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable, 27016747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 27026747b715Smrg if (result != Success) 27036747b715Smrg return (result == BadValue) ? BadDrawable : result; 27046747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 270505b261ecSmrg return BadAlloc; 270605b261ecSmrg newPict->type = XRT_PICTURE; 270705b261ecSmrg newPict->info[0].id = stuff->pid; 270805b261ecSmrg 270905b261ecSmrg if (refDraw->type == XRT_WINDOW && 27106747b715Smrg stuff->drawable == screenInfo.screens[0]->root->drawable.id) 271105b261ecSmrg { 271205b261ecSmrg newPict->u.pict.root = TRUE; 271305b261ecSmrg } 271405b261ecSmrg else 271505b261ecSmrg newPict->u.pict.root = FALSE; 271605b261ecSmrg 271705b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 271805b261ecSmrg newPict->info[j].id = FakeClientID(client->index); 271905b261ecSmrg 272005b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 272105b261ecSmrg stuff->pid = newPict->info[j].id; 272205b261ecSmrg stuff->drawable = refDraw->info[j].id; 272305b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client); 272405b261ecSmrg if(result != Success) break; 272505b261ecSmrg } 272605b261ecSmrg 272705b261ecSmrg if (result == Success) 272805b261ecSmrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 272905b261ecSmrg else 27306747b715Smrg free(newPict); 273105b261ecSmrg 27326747b715Smrg return result; 273305b261ecSmrg} 273405b261ecSmrg 273505b261ecSmrgstatic int 273605b261ecSmrgPanoramiXRenderChangePicture (ClientPtr client) 273705b261ecSmrg{ 273805b261ecSmrg PanoramiXRes *pict; 273905b261ecSmrg int result = Success, j; 274005b261ecSmrg REQUEST(xRenderChangePictureReq); 274105b261ecSmrg 27426747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 274305b261ecSmrg 27446747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 274505b261ecSmrg 274605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 274705b261ecSmrg stuff->picture = pict->info[j].id; 274805b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client); 274905b261ecSmrg if(result != Success) break; 275005b261ecSmrg } 275105b261ecSmrg 27526747b715Smrg return result; 275305b261ecSmrg} 275405b261ecSmrg 275505b261ecSmrgstatic int 275605b261ecSmrgPanoramiXRenderSetPictureClipRectangles (ClientPtr client) 275705b261ecSmrg{ 275805b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 275905b261ecSmrg int result = Success, j; 276005b261ecSmrg PanoramiXRes *pict; 276105b261ecSmrg 276205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 276305b261ecSmrg 27646747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 276505b261ecSmrg 276605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 276705b261ecSmrg stuff->picture = pict->info[j].id; 276805b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) (client); 276905b261ecSmrg if(result != Success) break; 277005b261ecSmrg } 277105b261ecSmrg 27726747b715Smrg return result; 277305b261ecSmrg} 277405b261ecSmrg 277505b261ecSmrgstatic int 277605b261ecSmrgPanoramiXRenderSetPictureTransform (ClientPtr client) 277705b261ecSmrg{ 277805b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 277905b261ecSmrg int result = Success, j; 278005b261ecSmrg PanoramiXRes *pict; 278105b261ecSmrg 278205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq); 278305b261ecSmrg 27846747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 278505b261ecSmrg 278605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 278705b261ecSmrg stuff->picture = pict->info[j].id; 278805b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client); 278905b261ecSmrg if(result != Success) break; 279005b261ecSmrg } 279105b261ecSmrg 27926747b715Smrg return result; 279305b261ecSmrg} 279405b261ecSmrg 279505b261ecSmrgstatic int 279605b261ecSmrgPanoramiXRenderSetPictureFilter (ClientPtr client) 279705b261ecSmrg{ 279805b261ecSmrg REQUEST(xRenderSetPictureFilterReq); 279905b261ecSmrg int result = Success, j; 280005b261ecSmrg PanoramiXRes *pict; 280105b261ecSmrg 280205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq); 280305b261ecSmrg 28046747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess); 280505b261ecSmrg 280605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 280705b261ecSmrg stuff->picture = pict->info[j].id; 280805b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client); 280905b261ecSmrg if(result != Success) break; 281005b261ecSmrg } 281105b261ecSmrg 28126747b715Smrg return result; 281305b261ecSmrg} 281405b261ecSmrg 281505b261ecSmrgstatic int 281605b261ecSmrgPanoramiXRenderFreePicture (ClientPtr client) 281705b261ecSmrg{ 281805b261ecSmrg PanoramiXRes *pict; 281905b261ecSmrg int result = Success, j; 282005b261ecSmrg REQUEST(xRenderFreePictureReq); 282105b261ecSmrg 282205b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 282305b261ecSmrg 282405b261ecSmrg client->errorValue = stuff->picture; 282505b261ecSmrg 28266747b715Smrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess); 282705b261ecSmrg 282805b261ecSmrg 282905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 283005b261ecSmrg stuff->picture = pict->info[j].id; 283105b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client); 283205b261ecSmrg if(result != Success) break; 283305b261ecSmrg } 283405b261ecSmrg 283505b261ecSmrg /* Since ProcRenderFreePicture is using FreeResource, it will free 283605b261ecSmrg our resource for us on the last pass through the loop above */ 283705b261ecSmrg 28386747b715Smrg return result; 283905b261ecSmrg} 284005b261ecSmrg 284105b261ecSmrgstatic int 284205b261ecSmrgPanoramiXRenderComposite (ClientPtr client) 284305b261ecSmrg{ 284405b261ecSmrg PanoramiXRes *src, *msk, *dst; 284505b261ecSmrg int result = Success, j; 284605b261ecSmrg xRenderCompositeReq orig; 284705b261ecSmrg REQUEST(xRenderCompositeReq); 284805b261ecSmrg 284905b261ecSmrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 285005b261ecSmrg 28516747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 28526747b715Smrg VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess); 28536747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 285405b261ecSmrg 285505b261ecSmrg orig = *stuff; 285605b261ecSmrg 285705b261ecSmrg FOR_NSCREENS_FORWARD(j) { 285805b261ecSmrg stuff->src = src->info[j].id; 285905b261ecSmrg if (src->u.pict.root) 286005b261ecSmrg { 28616747b715Smrg stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x; 28626747b715Smrg stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y; 286305b261ecSmrg } 286405b261ecSmrg stuff->dst = dst->info[j].id; 286505b261ecSmrg if (dst->u.pict.root) 286605b261ecSmrg { 28676747b715Smrg stuff->xDst = orig.xDst - screenInfo.screens[j]->x; 28686747b715Smrg stuff->yDst = orig.yDst - screenInfo.screens[j]->y; 286905b261ecSmrg } 287005b261ecSmrg if (msk) 287105b261ecSmrg { 287205b261ecSmrg stuff->mask = msk->info[j].id; 287305b261ecSmrg if (msk->u.pict.root) 287405b261ecSmrg { 28756747b715Smrg stuff->xMask = orig.xMask - screenInfo.screens[j]->x; 28766747b715Smrg stuff->yMask = orig.yMask - screenInfo.screens[j]->y; 287705b261ecSmrg } 287805b261ecSmrg } 287905b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client); 288005b261ecSmrg if(result != Success) break; 288105b261ecSmrg } 288205b261ecSmrg 288305b261ecSmrg return result; 288405b261ecSmrg} 288505b261ecSmrg 288605b261ecSmrgstatic int 288705b261ecSmrgPanoramiXRenderCompositeGlyphs (ClientPtr client) 288805b261ecSmrg{ 288905b261ecSmrg PanoramiXRes *src, *dst; 289005b261ecSmrg int result = Success, j; 289105b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 289205b261ecSmrg xGlyphElt origElt, *elt; 289305b261ecSmrg INT16 xSrc, ySrc; 289405b261ecSmrg 289505b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 28966747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 28976747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 289805b261ecSmrg 289905b261ecSmrg if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) + 290005b261ecSmrg sizeof (xGlyphElt))) 290105b261ecSmrg { 290205b261ecSmrg elt = (xGlyphElt *) (stuff + 1); 290305b261ecSmrg origElt = *elt; 290405b261ecSmrg xSrc = stuff->xSrc; 290505b261ecSmrg ySrc = stuff->ySrc; 290605b261ecSmrg FOR_NSCREENS_FORWARD(j) { 290705b261ecSmrg stuff->src = src->info[j].id; 290805b261ecSmrg if (src->u.pict.root) 290905b261ecSmrg { 29106747b715Smrg stuff->xSrc = xSrc - screenInfo.screens[j]->x; 29116747b715Smrg stuff->ySrc = ySrc - screenInfo.screens[j]->y; 291205b261ecSmrg } 291305b261ecSmrg stuff->dst = dst->info[j].id; 291405b261ecSmrg if (dst->u.pict.root) 291505b261ecSmrg { 29166747b715Smrg elt->deltax = origElt.deltax - screenInfo.screens[j]->x; 29176747b715Smrg elt->deltay = origElt.deltay - screenInfo.screens[j]->y; 291805b261ecSmrg } 291905b261ecSmrg result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client); 292005b261ecSmrg if(result != Success) break; 292105b261ecSmrg } 292205b261ecSmrg } 292305b261ecSmrg 292405b261ecSmrg return result; 292505b261ecSmrg} 292605b261ecSmrg 292705b261ecSmrgstatic int 292805b261ecSmrgPanoramiXRenderFillRectangles (ClientPtr client) 292905b261ecSmrg{ 293005b261ecSmrg PanoramiXRes *dst; 293105b261ecSmrg int result = Success, j; 293205b261ecSmrg REQUEST(xRenderFillRectanglesReq); 293305b261ecSmrg char *extra; 293405b261ecSmrg int extra_len; 293505b261ecSmrg 293605b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 29376747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 293805b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq); 293905b261ecSmrg if (extra_len && 29406747b715Smrg (extra = (char *) malloc(extra_len))) 294105b261ecSmrg { 294205b261ecSmrg memcpy (extra, stuff + 1, extra_len); 294305b261ecSmrg FOR_NSCREENS_FORWARD(j) { 294405b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 294505b261ecSmrg if (dst->u.pict.root) 294605b261ecSmrg { 29476747b715Smrg int x_off = screenInfo.screens[j]->x; 29486747b715Smrg int y_off = screenInfo.screens[j]->y; 294905b261ecSmrg 295005b261ecSmrg if(x_off || y_off) { 295105b261ecSmrg xRectangle *rects = (xRectangle *) (stuff + 1); 295205b261ecSmrg int i = extra_len / sizeof (xRectangle); 295305b261ecSmrg 295405b261ecSmrg while (i--) 295505b261ecSmrg { 295605b261ecSmrg rects->x -= x_off; 295705b261ecSmrg rects->y -= y_off; 295805b261ecSmrg rects++; 295905b261ecSmrg } 296005b261ecSmrg } 296105b261ecSmrg } 296205b261ecSmrg stuff->dst = dst->info[j].id; 296305b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client); 296405b261ecSmrg if(result != Success) break; 296505b261ecSmrg } 29666747b715Smrg free(extra); 296705b261ecSmrg } 296805b261ecSmrg 296905b261ecSmrg return result; 297005b261ecSmrg} 297105b261ecSmrg 297205b261ecSmrgstatic int 297305b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client) 297405b261ecSmrg{ 297505b261ecSmrg PanoramiXRes *src, *dst; 297605b261ecSmrg int result = Success, j; 297705b261ecSmrg REQUEST(xRenderTrapezoidsReq); 297805b261ecSmrg char *extra; 297905b261ecSmrg int extra_len; 298005b261ecSmrg 298105b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq); 298205b261ecSmrg 29836747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 29846747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 298505b261ecSmrg 298605b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq); 298705b261ecSmrg 298805b261ecSmrg if (extra_len && 29896747b715Smrg (extra = (char *) malloc(extra_len))) { 299005b261ecSmrg memcpy (extra, stuff + 1, extra_len); 299105b261ecSmrg 299205b261ecSmrg FOR_NSCREENS_FORWARD(j) { 299305b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 299405b261ecSmrg if (dst->u.pict.root) { 29956747b715Smrg int x_off = screenInfo.screens[j]->x; 29966747b715Smrg int y_off = screenInfo.screens[j]->y; 299705b261ecSmrg 299805b261ecSmrg if(x_off || y_off) { 299905b261ecSmrg xTrapezoid *trap = (xTrapezoid *) (stuff + 1); 300005b261ecSmrg int i = extra_len / sizeof (xTrapezoid); 300105b261ecSmrg 300205b261ecSmrg while (i--) { 300305b261ecSmrg trap->top -= y_off; 300405b261ecSmrg trap->bottom -= y_off; 300505b261ecSmrg trap->left.p1.x -= x_off; 300605b261ecSmrg trap->left.p1.y -= y_off; 300705b261ecSmrg trap->left.p2.x -= x_off; 300805b261ecSmrg trap->left.p2.y -= y_off; 300905b261ecSmrg trap->right.p1.x -= x_off; 301005b261ecSmrg trap->right.p1.y -= y_off; 301105b261ecSmrg trap->right.p2.x -= x_off; 301205b261ecSmrg trap->right.p2.y -= y_off; 301305b261ecSmrg trap++; 301405b261ecSmrg } 301505b261ecSmrg } 301605b261ecSmrg } 301705b261ecSmrg 301805b261ecSmrg stuff->src = src->info[j].id; 301905b261ecSmrg stuff->dst = dst->info[j].id; 302005b261ecSmrg result = 302105b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client); 302205b261ecSmrg 302305b261ecSmrg if(result != Success) break; 302405b261ecSmrg } 302505b261ecSmrg 30266747b715Smrg free(extra); 302705b261ecSmrg } 302805b261ecSmrg 302905b261ecSmrg return result; 303005b261ecSmrg} 303105b261ecSmrg 303205b261ecSmrgstatic int 303305b261ecSmrgPanoramiXRenderTriangles(ClientPtr client) 303405b261ecSmrg{ 303505b261ecSmrg PanoramiXRes *src, *dst; 303605b261ecSmrg int result = Success, j; 303705b261ecSmrg REQUEST(xRenderTrianglesReq); 303805b261ecSmrg char *extra; 303905b261ecSmrg int extra_len; 304005b261ecSmrg 304105b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq); 304205b261ecSmrg 30436747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 30446747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 304505b261ecSmrg 304605b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq); 304705b261ecSmrg 304805b261ecSmrg if (extra_len && 30496747b715Smrg (extra = (char *) malloc(extra_len))) { 305005b261ecSmrg memcpy (extra, stuff + 1, extra_len); 305105b261ecSmrg 305205b261ecSmrg FOR_NSCREENS_FORWARD(j) { 305305b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 305405b261ecSmrg if (dst->u.pict.root) { 30556747b715Smrg int x_off = screenInfo.screens[j]->x; 30566747b715Smrg int y_off = screenInfo.screens[j]->y; 305705b261ecSmrg 305805b261ecSmrg if(x_off || y_off) { 305905b261ecSmrg xTriangle *tri = (xTriangle *) (stuff + 1); 306005b261ecSmrg int i = extra_len / sizeof (xTriangle); 306105b261ecSmrg 306205b261ecSmrg while (i--) { 306305b261ecSmrg tri->p1.x -= x_off; 306405b261ecSmrg tri->p1.y -= y_off; 306505b261ecSmrg tri->p2.x -= x_off; 306605b261ecSmrg tri->p2.y -= y_off; 306705b261ecSmrg tri->p3.x -= x_off; 306805b261ecSmrg tri->p3.y -= y_off; 306905b261ecSmrg tri++; 307005b261ecSmrg } 307105b261ecSmrg } 307205b261ecSmrg } 307305b261ecSmrg 307405b261ecSmrg stuff->src = src->info[j].id; 307505b261ecSmrg stuff->dst = dst->info[j].id; 307605b261ecSmrg result = 307705b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client); 307805b261ecSmrg 307905b261ecSmrg if(result != Success) break; 308005b261ecSmrg } 308105b261ecSmrg 30826747b715Smrg free(extra); 308305b261ecSmrg } 308405b261ecSmrg 308505b261ecSmrg return result; 308605b261ecSmrg} 308705b261ecSmrg 308805b261ecSmrgstatic int 308905b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client) 309005b261ecSmrg{ 309105b261ecSmrg PanoramiXRes *src, *dst; 309205b261ecSmrg int result = Success, j; 309305b261ecSmrg REQUEST(xRenderTriStripReq); 309405b261ecSmrg char *extra; 309505b261ecSmrg int extra_len; 309605b261ecSmrg 309705b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTriStripReq); 309805b261ecSmrg 30996747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 31006747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 310105b261ecSmrg 310205b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq); 310305b261ecSmrg 310405b261ecSmrg if (extra_len && 31056747b715Smrg (extra = (char *) malloc(extra_len))) { 310605b261ecSmrg memcpy (extra, stuff + 1, extra_len); 310705b261ecSmrg 310805b261ecSmrg FOR_NSCREENS_FORWARD(j) { 310905b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 311005b261ecSmrg if (dst->u.pict.root) { 31116747b715Smrg int x_off = screenInfo.screens[j]->x; 31126747b715Smrg int y_off = screenInfo.screens[j]->y; 311305b261ecSmrg 311405b261ecSmrg if(x_off || y_off) { 311505b261ecSmrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 311605b261ecSmrg int i = extra_len / sizeof (xPointFixed); 311705b261ecSmrg 311805b261ecSmrg while (i--) { 311905b261ecSmrg fixed->x -= x_off; 312005b261ecSmrg fixed->y -= y_off; 312105b261ecSmrg fixed++; 312205b261ecSmrg } 312305b261ecSmrg } 312405b261ecSmrg } 312505b261ecSmrg 312605b261ecSmrg stuff->src = src->info[j].id; 312705b261ecSmrg stuff->dst = dst->info[j].id; 312805b261ecSmrg result = 312905b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client); 313005b261ecSmrg 313105b261ecSmrg if(result != Success) break; 313205b261ecSmrg } 313305b261ecSmrg 31346747b715Smrg free(extra); 313505b261ecSmrg } 313605b261ecSmrg 313705b261ecSmrg return result; 313805b261ecSmrg} 313905b261ecSmrg 314005b261ecSmrgstatic int 314105b261ecSmrgPanoramiXRenderTriFan(ClientPtr client) 314205b261ecSmrg{ 314305b261ecSmrg PanoramiXRes *src, *dst; 314405b261ecSmrg int result = Success, j; 314505b261ecSmrg REQUEST(xRenderTriFanReq); 314605b261ecSmrg char *extra; 314705b261ecSmrg int extra_len; 314805b261ecSmrg 314905b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTriFanReq); 315005b261ecSmrg 31516747b715Smrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess); 31526747b715Smrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess); 315305b261ecSmrg 315405b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq); 315505b261ecSmrg 315605b261ecSmrg if (extra_len && 31576747b715Smrg (extra = (char *) malloc(extra_len))) { 315805b261ecSmrg memcpy (extra, stuff + 1, extra_len); 315905b261ecSmrg 316005b261ecSmrg FOR_NSCREENS_FORWARD(j) { 316105b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 316205b261ecSmrg if (dst->u.pict.root) { 31636747b715Smrg int x_off = screenInfo.screens[j]->x; 31646747b715Smrg int y_off = screenInfo.screens[j]->y; 316505b261ecSmrg 316605b261ecSmrg if(x_off || y_off) { 316705b261ecSmrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 316805b261ecSmrg int i = extra_len / sizeof (xPointFixed); 316905b261ecSmrg 317005b261ecSmrg while (i--) { 317105b261ecSmrg fixed->x -= x_off; 317205b261ecSmrg fixed->y -= y_off; 317305b261ecSmrg fixed++; 317405b261ecSmrg } 317505b261ecSmrg } 317605b261ecSmrg } 317705b261ecSmrg 317805b261ecSmrg stuff->src = src->info[j].id; 317905b261ecSmrg stuff->dst = dst->info[j].id; 318005b261ecSmrg result = 318105b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client); 318205b261ecSmrg 318305b261ecSmrg if(result != Success) break; 318405b261ecSmrg } 318505b261ecSmrg 31866747b715Smrg free(extra); 318705b261ecSmrg } 318805b261ecSmrg 318905b261ecSmrg return result; 319005b261ecSmrg} 319105b261ecSmrg 319205b261ecSmrgstatic int 319305b261ecSmrgPanoramiXRenderAddTraps (ClientPtr client) 319405b261ecSmrg{ 319505b261ecSmrg PanoramiXRes *picture; 319605b261ecSmrg int result = Success, j; 319705b261ecSmrg REQUEST(xRenderAddTrapsReq); 319805b261ecSmrg char *extra; 319905b261ecSmrg int extra_len; 320005b261ecSmrg INT16 x_off, y_off; 320105b261ecSmrg 320205b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq); 32036747b715Smrg VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess); 320405b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq); 320505b261ecSmrg if (extra_len && 32066747b715Smrg (extra = (char *) malloc(extra_len))) 320705b261ecSmrg { 320805b261ecSmrg memcpy (extra, stuff + 1, extra_len); 320905b261ecSmrg x_off = stuff->xOff; 321005b261ecSmrg y_off = stuff->yOff; 321105b261ecSmrg FOR_NSCREENS_FORWARD(j) { 321205b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 321305b261ecSmrg stuff->picture = picture->info[j].id; 321405b261ecSmrg 321505b261ecSmrg if (picture->u.pict.root) 321605b261ecSmrg { 32176747b715Smrg stuff->xOff = x_off + screenInfo.screens[j]->x; 32186747b715Smrg stuff->yOff = y_off + screenInfo.screens[j]->y; 321905b261ecSmrg } 322005b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client); 322105b261ecSmrg if(result != Success) break; 322205b261ecSmrg } 32236747b715Smrg free(extra); 32246747b715Smrg } 32256747b715Smrg 32266747b715Smrg return result; 32276747b715Smrg} 32286747b715Smrg 32296747b715Smrgstatic int 32306747b715SmrgPanoramiXRenderCreateSolidFill (ClientPtr client) 32316747b715Smrg{ 32326747b715Smrg REQUEST(xRenderCreateSolidFillReq); 32336747b715Smrg PanoramiXRes *newPict; 32346747b715Smrg int result = Success, j; 32356747b715Smrg 32366747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 32376747b715Smrg 32386747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 32396747b715Smrg return BadAlloc; 32406747b715Smrg 32416747b715Smrg newPict->type = XRT_PICTURE; 32426747b715Smrg newPict->info[0].id = stuff->pid; 32436747b715Smrg newPict->u.pict.root = FALSE; 32446747b715Smrg 32456747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 32466747b715Smrg newPict->info[j].id = FakeClientID(client->index); 32476747b715Smrg 32486747b715Smrg FOR_NSCREENS_BACKWARD(j) { 32496747b715Smrg stuff->pid = newPict->info[j].id; 32506747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client); 32516747b715Smrg if(result != Success) break; 32526747b715Smrg } 32536747b715Smrg 32546747b715Smrg if (result == Success) 32556747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 32566747b715Smrg else 32576747b715Smrg free(newPict); 32586747b715Smrg 32596747b715Smrg return result; 32606747b715Smrg} 32616747b715Smrg 32626747b715Smrgstatic int 32636747b715SmrgPanoramiXRenderCreateLinearGradient (ClientPtr client) 32646747b715Smrg{ 32656747b715Smrg REQUEST(xRenderCreateLinearGradientReq); 32666747b715Smrg PanoramiXRes *newPict; 32676747b715Smrg int result = Success, j; 32686747b715Smrg 32696747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 32706747b715Smrg 32716747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 32726747b715Smrg return BadAlloc; 32736747b715Smrg 32746747b715Smrg newPict->type = XRT_PICTURE; 32756747b715Smrg newPict->info[0].id = stuff->pid; 32766747b715Smrg newPict->u.pict.root = FALSE; 32776747b715Smrg 32786747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 32796747b715Smrg newPict->info[j].id = FakeClientID(client->index); 32806747b715Smrg 32816747b715Smrg FOR_NSCREENS_BACKWARD(j) { 32826747b715Smrg stuff->pid = newPict->info[j].id; 32836747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client); 32846747b715Smrg if(result != Success) break; 328505b261ecSmrg } 328605b261ecSmrg 32876747b715Smrg if (result == Success) 32886747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 32896747b715Smrg else 32906747b715Smrg free(newPict); 32916747b715Smrg 32926747b715Smrg return result; 32936747b715Smrg} 32946747b715Smrg 32956747b715Smrgstatic int 32966747b715SmrgPanoramiXRenderCreateRadialGradient (ClientPtr client) 32976747b715Smrg{ 32986747b715Smrg REQUEST(xRenderCreateRadialGradientReq); 32996747b715Smrg PanoramiXRes *newPict; 33006747b715Smrg int result = Success, j; 33016747b715Smrg 33026747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 33036747b715Smrg 33046747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 33056747b715Smrg return BadAlloc; 33066747b715Smrg 33076747b715Smrg newPict->type = XRT_PICTURE; 33086747b715Smrg newPict->info[0].id = stuff->pid; 33096747b715Smrg newPict->u.pict.root = FALSE; 33106747b715Smrg 33116747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 33126747b715Smrg newPict->info[j].id = FakeClientID(client->index); 33136747b715Smrg 33146747b715Smrg FOR_NSCREENS_BACKWARD(j) { 33156747b715Smrg stuff->pid = newPict->info[j].id; 33166747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client); 33176747b715Smrg if(result != Success) break; 33186747b715Smrg } 33196747b715Smrg 33206747b715Smrg if (result == Success) 33216747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 33226747b715Smrg else 33236747b715Smrg free(newPict); 33246747b715Smrg 33256747b715Smrg return result; 33266747b715Smrg} 33276747b715Smrg 33286747b715Smrgstatic int 33296747b715SmrgPanoramiXRenderCreateConicalGradient (ClientPtr client) 33306747b715Smrg{ 33316747b715Smrg REQUEST(xRenderCreateConicalGradientReq); 33326747b715Smrg PanoramiXRes *newPict; 33336747b715Smrg int result = Success, j; 33346747b715Smrg 33356747b715Smrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 33366747b715Smrg 33376747b715Smrg if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes)))) 33386747b715Smrg return BadAlloc; 33396747b715Smrg 33406747b715Smrg newPict->type = XRT_PICTURE; 33416747b715Smrg newPict->info[0].id = stuff->pid; 33426747b715Smrg newPict->u.pict.root = FALSE; 33436747b715Smrg 33446747b715Smrg for(j = 1; j < PanoramiXNumScreens; j++) 33456747b715Smrg newPict->info[j].id = FakeClientID(client->index); 33466747b715Smrg 33476747b715Smrg FOR_NSCREENS_BACKWARD(j) { 33486747b715Smrg stuff->pid = newPict->info[j].id; 33496747b715Smrg result = (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient]) (client); 33506747b715Smrg if(result != Success) break; 33516747b715Smrg } 33526747b715Smrg 33536747b715Smrg if (result == Success) 33546747b715Smrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 33556747b715Smrg else 33566747b715Smrg free(newPict); 33576747b715Smrg 335805b261ecSmrg return result; 335905b261ecSmrg} 336005b261ecSmrg 336105b261ecSmrgvoid 336205b261ecSmrgPanoramiXRenderInit (void) 336305b261ecSmrg{ 336405b261ecSmrg int i; 336505b261ecSmrg 33666747b715Smrg XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource, 33676747b715Smrg "XineramaPicture"); 33686747b715Smrg if (RenderErrBase) 33696747b715Smrg SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture); 337005b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 337105b261ecSmrg PanoramiXSaveRenderVector[i] = ProcRenderVector[i]; 337205b261ecSmrg /* 337305b261ecSmrg * Stuff in Xinerama aware request processing hooks 337405b261ecSmrg */ 337505b261ecSmrg ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture; 337605b261ecSmrg ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture; 337705b261ecSmrg ProcRenderVector[X_RenderSetPictureTransform] = PanoramiXRenderSetPictureTransform; 337805b261ecSmrg ProcRenderVector[X_RenderSetPictureFilter] = PanoramiXRenderSetPictureFilter; 337905b261ecSmrg ProcRenderVector[X_RenderSetPictureClipRectangles] = PanoramiXRenderSetPictureClipRectangles; 338005b261ecSmrg ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture; 338105b261ecSmrg ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite; 338205b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs; 338305b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs16] = PanoramiXRenderCompositeGlyphs; 338405b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs32] = PanoramiXRenderCompositeGlyphs; 338505b261ecSmrg ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles; 338605b261ecSmrg 338705b261ecSmrg ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids; 338805b261ecSmrg ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles; 338905b261ecSmrg ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip; 339005b261ecSmrg ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan; 339105b261ecSmrg ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps; 33926747b715Smrg 33936747b715Smrg ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill; 33946747b715Smrg ProcRenderVector[X_RenderCreateLinearGradient] = PanoramiXRenderCreateLinearGradient; 33956747b715Smrg ProcRenderVector[X_RenderCreateRadialGradient] = PanoramiXRenderCreateRadialGradient; 33966747b715Smrg ProcRenderVector[X_RenderCreateConicalGradient] = PanoramiXRenderCreateConicalGradient; 339705b261ecSmrg} 339805b261ecSmrg 339905b261ecSmrgvoid 340005b261ecSmrgPanoramiXRenderReset (void) 340105b261ecSmrg{ 340205b261ecSmrg int i; 340305b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 340405b261ecSmrg ProcRenderVector[i] = PanoramiXSaveRenderVector[i]; 34056747b715Smrg RenderErrBase = 0; 340605b261ecSmrg} 340705b261ecSmrg 340805b261ecSmrg#endif /* PANORAMIX */ 3409