render.c revision 4642e01f
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#define NEED_REPLIES 2605b261ecSmrg#define NEED_EVENTS 2705b261ecSmrg#ifdef HAVE_DIX_CONFIG_H 2805b261ecSmrg#include <dix-config.h> 2905b261ecSmrg#endif 3005b261ecSmrg 3105b261ecSmrg#include <X11/X.h> 3205b261ecSmrg#include <X11/Xproto.h> 3305b261ecSmrg#include "misc.h" 3405b261ecSmrg#include "os.h" 3505b261ecSmrg#include "dixstruct.h" 3605b261ecSmrg#include "resource.h" 3705b261ecSmrg#include "scrnintstr.h" 3805b261ecSmrg#include "windowstr.h" 3905b261ecSmrg#include "pixmapstr.h" 4005b261ecSmrg#include "colormapst.h" 4105b261ecSmrg#include "extnsionst.h" 4205b261ecSmrg#include "servermd.h" 4305b261ecSmrg#include <X11/extensions/render.h> 4405b261ecSmrg#include <X11/extensions/renderproto.h> 4505b261ecSmrg#include "picturestr.h" 4605b261ecSmrg#include "glyphstr.h" 4705b261ecSmrg#include <X11/Xfuncproto.h> 4805b261ecSmrg#include "cursorstr.h" 494642e01fSmrg#include "xace.h" 5005b261ecSmrg 5105b261ecSmrg#if HAVE_STDINT_H 5205b261ecSmrg#include <stdint.h> 5305b261ecSmrg#elif !defined(UINT32_MAX) 5405b261ecSmrg#define UINT32_MAX 0xffffffffU 5505b261ecSmrg#endif 5605b261ecSmrg 5705b261ecSmrgstatic int ProcRenderQueryVersion (ClientPtr pClient); 5805b261ecSmrgstatic int ProcRenderQueryPictFormats (ClientPtr pClient); 5905b261ecSmrgstatic int ProcRenderQueryPictIndexValues (ClientPtr pClient); 6005b261ecSmrgstatic int ProcRenderQueryDithers (ClientPtr pClient); 6105b261ecSmrgstatic int ProcRenderCreatePicture (ClientPtr pClient); 6205b261ecSmrgstatic int ProcRenderChangePicture (ClientPtr pClient); 6305b261ecSmrgstatic int ProcRenderSetPictureClipRectangles (ClientPtr pClient); 6405b261ecSmrgstatic int ProcRenderFreePicture (ClientPtr pClient); 6505b261ecSmrgstatic int ProcRenderComposite (ClientPtr pClient); 6605b261ecSmrgstatic int ProcRenderScale (ClientPtr pClient); 6705b261ecSmrgstatic int ProcRenderTrapezoids (ClientPtr pClient); 6805b261ecSmrgstatic int ProcRenderTriangles (ClientPtr pClient); 6905b261ecSmrgstatic int ProcRenderTriStrip (ClientPtr pClient); 7005b261ecSmrgstatic int ProcRenderTriFan (ClientPtr pClient); 7105b261ecSmrgstatic int ProcRenderColorTrapezoids (ClientPtr pClient); 7205b261ecSmrgstatic int ProcRenderColorTriangles (ClientPtr pClient); 7305b261ecSmrgstatic int ProcRenderTransform (ClientPtr pClient); 7405b261ecSmrgstatic int ProcRenderCreateGlyphSet (ClientPtr pClient); 7505b261ecSmrgstatic int ProcRenderReferenceGlyphSet (ClientPtr pClient); 7605b261ecSmrgstatic int ProcRenderFreeGlyphSet (ClientPtr pClient); 7705b261ecSmrgstatic int ProcRenderAddGlyphs (ClientPtr pClient); 7805b261ecSmrgstatic int ProcRenderAddGlyphsFromPicture (ClientPtr pClient); 7905b261ecSmrgstatic int ProcRenderFreeGlyphs (ClientPtr pClient); 8005b261ecSmrgstatic int ProcRenderCompositeGlyphs (ClientPtr pClient); 8105b261ecSmrgstatic int ProcRenderFillRectangles (ClientPtr pClient); 8205b261ecSmrgstatic int ProcRenderCreateCursor (ClientPtr pClient); 8305b261ecSmrgstatic int ProcRenderSetPictureTransform (ClientPtr pClient); 8405b261ecSmrgstatic int ProcRenderQueryFilters (ClientPtr pClient); 8505b261ecSmrgstatic int ProcRenderSetPictureFilter (ClientPtr pClient); 8605b261ecSmrgstatic int ProcRenderCreateAnimCursor (ClientPtr pClient); 8705b261ecSmrgstatic int ProcRenderAddTraps (ClientPtr pClient); 8805b261ecSmrgstatic int ProcRenderCreateSolidFill (ClientPtr pClient); 8905b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr pClient); 9005b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr pClient); 9105b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr pClient); 9205b261ecSmrg 9305b261ecSmrgstatic int ProcRenderDispatch (ClientPtr pClient); 9405b261ecSmrg 9505b261ecSmrgstatic int SProcRenderQueryVersion (ClientPtr pClient); 9605b261ecSmrgstatic int SProcRenderQueryPictFormats (ClientPtr pClient); 9705b261ecSmrgstatic int SProcRenderQueryPictIndexValues (ClientPtr pClient); 9805b261ecSmrgstatic int SProcRenderQueryDithers (ClientPtr pClient); 9905b261ecSmrgstatic int SProcRenderCreatePicture (ClientPtr pClient); 10005b261ecSmrgstatic int SProcRenderChangePicture (ClientPtr pClient); 10105b261ecSmrgstatic int SProcRenderSetPictureClipRectangles (ClientPtr pClient); 10205b261ecSmrgstatic int SProcRenderFreePicture (ClientPtr pClient); 10305b261ecSmrgstatic int SProcRenderComposite (ClientPtr pClient); 10405b261ecSmrgstatic int SProcRenderScale (ClientPtr pClient); 10505b261ecSmrgstatic int SProcRenderTrapezoids (ClientPtr pClient); 10605b261ecSmrgstatic int SProcRenderTriangles (ClientPtr pClient); 10705b261ecSmrgstatic int SProcRenderTriStrip (ClientPtr pClient); 10805b261ecSmrgstatic int SProcRenderTriFan (ClientPtr pClient); 10905b261ecSmrgstatic int SProcRenderColorTrapezoids (ClientPtr pClient); 11005b261ecSmrgstatic int SProcRenderColorTriangles (ClientPtr pClient); 11105b261ecSmrgstatic int SProcRenderTransform (ClientPtr pClient); 11205b261ecSmrgstatic int SProcRenderCreateGlyphSet (ClientPtr pClient); 11305b261ecSmrgstatic int SProcRenderReferenceGlyphSet (ClientPtr pClient); 11405b261ecSmrgstatic int SProcRenderFreeGlyphSet (ClientPtr pClient); 11505b261ecSmrgstatic int SProcRenderAddGlyphs (ClientPtr pClient); 11605b261ecSmrgstatic int SProcRenderAddGlyphsFromPicture (ClientPtr pClient); 11705b261ecSmrgstatic int SProcRenderFreeGlyphs (ClientPtr pClient); 11805b261ecSmrgstatic int SProcRenderCompositeGlyphs (ClientPtr pClient); 11905b261ecSmrgstatic int SProcRenderFillRectangles (ClientPtr pClient); 12005b261ecSmrgstatic int SProcRenderCreateCursor (ClientPtr pClient); 12105b261ecSmrgstatic int SProcRenderSetPictureTransform (ClientPtr pClient); 12205b261ecSmrgstatic int SProcRenderQueryFilters (ClientPtr pClient); 12305b261ecSmrgstatic int SProcRenderSetPictureFilter (ClientPtr pClient); 12405b261ecSmrgstatic int SProcRenderCreateAnimCursor (ClientPtr pClient); 12505b261ecSmrgstatic int SProcRenderAddTraps (ClientPtr pClient); 12605b261ecSmrgstatic int SProcRenderCreateSolidFill (ClientPtr pClient); 12705b261ecSmrgstatic int SProcRenderCreateLinearGradient (ClientPtr pClient); 12805b261ecSmrgstatic int SProcRenderCreateRadialGradient (ClientPtr pClient); 12905b261ecSmrgstatic int SProcRenderCreateConicalGradient (ClientPtr pClient); 13005b261ecSmrg 13105b261ecSmrgstatic int SProcRenderDispatch (ClientPtr pClient); 13205b261ecSmrg 13305b261ecSmrgint (*ProcRenderVector[RenderNumberRequests])(ClientPtr) = { 13405b261ecSmrg ProcRenderQueryVersion, 13505b261ecSmrg ProcRenderQueryPictFormats, 13605b261ecSmrg ProcRenderQueryPictIndexValues, 13705b261ecSmrg ProcRenderQueryDithers, 13805b261ecSmrg ProcRenderCreatePicture, 13905b261ecSmrg ProcRenderChangePicture, 14005b261ecSmrg ProcRenderSetPictureClipRectangles, 14105b261ecSmrg ProcRenderFreePicture, 14205b261ecSmrg ProcRenderComposite, 14305b261ecSmrg ProcRenderScale, 14405b261ecSmrg ProcRenderTrapezoids, 14505b261ecSmrg ProcRenderTriangles, 14605b261ecSmrg ProcRenderTriStrip, 14705b261ecSmrg ProcRenderTriFan, 14805b261ecSmrg ProcRenderColorTrapezoids, 14905b261ecSmrg ProcRenderColorTriangles, 15005b261ecSmrg ProcRenderTransform, 15105b261ecSmrg ProcRenderCreateGlyphSet, 15205b261ecSmrg ProcRenderReferenceGlyphSet, 15305b261ecSmrg ProcRenderFreeGlyphSet, 15405b261ecSmrg ProcRenderAddGlyphs, 15505b261ecSmrg ProcRenderAddGlyphsFromPicture, 15605b261ecSmrg ProcRenderFreeGlyphs, 15705b261ecSmrg ProcRenderCompositeGlyphs, 15805b261ecSmrg ProcRenderCompositeGlyphs, 15905b261ecSmrg ProcRenderCompositeGlyphs, 16005b261ecSmrg ProcRenderFillRectangles, 16105b261ecSmrg ProcRenderCreateCursor, 16205b261ecSmrg ProcRenderSetPictureTransform, 16305b261ecSmrg ProcRenderQueryFilters, 16405b261ecSmrg ProcRenderSetPictureFilter, 16505b261ecSmrg ProcRenderCreateAnimCursor, 16605b261ecSmrg ProcRenderAddTraps, 16705b261ecSmrg ProcRenderCreateSolidFill, 16805b261ecSmrg ProcRenderCreateLinearGradient, 16905b261ecSmrg ProcRenderCreateRadialGradient, 17005b261ecSmrg ProcRenderCreateConicalGradient 17105b261ecSmrg}; 17205b261ecSmrg 17305b261ecSmrgint (*SProcRenderVector[RenderNumberRequests])(ClientPtr) = { 17405b261ecSmrg SProcRenderQueryVersion, 17505b261ecSmrg SProcRenderQueryPictFormats, 17605b261ecSmrg SProcRenderQueryPictIndexValues, 17705b261ecSmrg SProcRenderQueryDithers, 17805b261ecSmrg SProcRenderCreatePicture, 17905b261ecSmrg SProcRenderChangePicture, 18005b261ecSmrg SProcRenderSetPictureClipRectangles, 18105b261ecSmrg SProcRenderFreePicture, 18205b261ecSmrg SProcRenderComposite, 18305b261ecSmrg SProcRenderScale, 18405b261ecSmrg SProcRenderTrapezoids, 18505b261ecSmrg SProcRenderTriangles, 18605b261ecSmrg SProcRenderTriStrip, 18705b261ecSmrg SProcRenderTriFan, 18805b261ecSmrg SProcRenderColorTrapezoids, 18905b261ecSmrg SProcRenderColorTriangles, 19005b261ecSmrg SProcRenderTransform, 19105b261ecSmrg SProcRenderCreateGlyphSet, 19205b261ecSmrg SProcRenderReferenceGlyphSet, 19305b261ecSmrg SProcRenderFreeGlyphSet, 19405b261ecSmrg SProcRenderAddGlyphs, 19505b261ecSmrg SProcRenderAddGlyphsFromPicture, 19605b261ecSmrg SProcRenderFreeGlyphs, 19705b261ecSmrg SProcRenderCompositeGlyphs, 19805b261ecSmrg SProcRenderCompositeGlyphs, 19905b261ecSmrg SProcRenderCompositeGlyphs, 20005b261ecSmrg SProcRenderFillRectangles, 20105b261ecSmrg SProcRenderCreateCursor, 20205b261ecSmrg SProcRenderSetPictureTransform, 20305b261ecSmrg SProcRenderQueryFilters, 20405b261ecSmrg SProcRenderSetPictureFilter, 20505b261ecSmrg SProcRenderCreateAnimCursor, 20605b261ecSmrg SProcRenderAddTraps, 20705b261ecSmrg SProcRenderCreateSolidFill, 20805b261ecSmrg SProcRenderCreateLinearGradient, 20905b261ecSmrg SProcRenderCreateRadialGradient, 21005b261ecSmrg SProcRenderCreateConicalGradient 21105b261ecSmrg}; 21205b261ecSmrg 21305b261ecSmrgint RenderErrBase; 2144642e01fSmrgstatic int RenderClientPrivateKeyIndex; 2154642e01fSmrgDevPrivateKey RenderClientPrivateKey = &RenderClientPrivateKeyIndex; 21605b261ecSmrg 21705b261ecSmrgtypedef struct _RenderClient { 21805b261ecSmrg int major_version; 21905b261ecSmrg int minor_version; 22005b261ecSmrg} RenderClientRec, *RenderClientPtr; 22105b261ecSmrg 2224642e01fSmrg#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey)) 22305b261ecSmrg 22405b261ecSmrgstatic void 22505b261ecSmrgRenderClientCallback (CallbackListPtr *list, 22605b261ecSmrg pointer closure, 22705b261ecSmrg pointer data) 22805b261ecSmrg{ 22905b261ecSmrg NewClientInfoRec *clientinfo = (NewClientInfoRec *) data; 23005b261ecSmrg ClientPtr pClient = clientinfo->client; 23105b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (pClient); 23205b261ecSmrg 23305b261ecSmrg pRenderClient->major_version = 0; 23405b261ecSmrg pRenderClient->minor_version = 0; 23505b261ecSmrg} 23605b261ecSmrg 23705b261ecSmrgvoid 23805b261ecSmrgRenderExtensionInit (void) 23905b261ecSmrg{ 24005b261ecSmrg ExtensionEntry *extEntry; 24105b261ecSmrg 24205b261ecSmrg if (!PictureType) 24305b261ecSmrg return; 24405b261ecSmrg if (!PictureFinishInit ()) 24505b261ecSmrg return; 2464642e01fSmrg if (!dixRequestPrivate(RenderClientPrivateKey, sizeof(RenderClientRec))) 24705b261ecSmrg return; 24805b261ecSmrg if (!AddCallback (&ClientStateCallback, RenderClientCallback, 0)) 24905b261ecSmrg return; 25005b261ecSmrg 25105b261ecSmrg extEntry = AddExtension (RENDER_NAME, 0, RenderNumberErrors, 25205b261ecSmrg ProcRenderDispatch, SProcRenderDispatch, 2534642e01fSmrg NULL, StandardMinorOpcode); 25405b261ecSmrg if (!extEntry) 25505b261ecSmrg return; 25605b261ecSmrg RenderErrBase = extEntry->errorBase; 25705b261ecSmrg} 25805b261ecSmrg 25905b261ecSmrgstatic int 26005b261ecSmrgProcRenderQueryVersion (ClientPtr client) 26105b261ecSmrg{ 26205b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (client); 26305b261ecSmrg xRenderQueryVersionReply rep; 26405b261ecSmrg register int n; 26505b261ecSmrg REQUEST(xRenderQueryVersionReq); 26605b261ecSmrg 26705b261ecSmrg pRenderClient->major_version = stuff->majorVersion; 26805b261ecSmrg pRenderClient->minor_version = stuff->minorVersion; 26905b261ecSmrg 27005b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryVersionReq); 27105b261ecSmrg rep.type = X_Reply; 27205b261ecSmrg rep.length = 0; 27305b261ecSmrg rep.sequenceNumber = client->sequence; 27405b261ecSmrg rep.majorVersion = RENDER_MAJOR; 27505b261ecSmrg rep.minorVersion = RENDER_MINOR; 27605b261ecSmrg if (client->swapped) { 27705b261ecSmrg swaps(&rep.sequenceNumber, n); 27805b261ecSmrg swapl(&rep.length, n); 27905b261ecSmrg swapl(&rep.majorVersion, n); 28005b261ecSmrg swapl(&rep.minorVersion, n); 28105b261ecSmrg } 28205b261ecSmrg WriteToClient(client, sizeof(xRenderQueryVersionReply), (char *)&rep); 28305b261ecSmrg return (client->noClientException); 28405b261ecSmrg} 28505b261ecSmrg 28605b261ecSmrgstatic VisualPtr 28705b261ecSmrgfindVisual (ScreenPtr pScreen, VisualID vid) 28805b261ecSmrg{ 28905b261ecSmrg VisualPtr pVisual; 29005b261ecSmrg int v; 29105b261ecSmrg 29205b261ecSmrg for (v = 0; v < pScreen->numVisuals; v++) 29305b261ecSmrg { 29405b261ecSmrg pVisual = pScreen->visuals + v; 29505b261ecSmrg if (pVisual->vid == vid) 29605b261ecSmrg return pVisual; 29705b261ecSmrg } 29805b261ecSmrg return 0; 29905b261ecSmrg} 30005b261ecSmrg 30105b261ecSmrgstatic int 30205b261ecSmrgProcRenderQueryPictFormats (ClientPtr client) 30305b261ecSmrg{ 30405b261ecSmrg RenderClientPtr pRenderClient = GetRenderClient (client); 30505b261ecSmrg xRenderQueryPictFormatsReply *reply; 30605b261ecSmrg xPictScreen *pictScreen; 30705b261ecSmrg xPictDepth *pictDepth; 30805b261ecSmrg xPictVisual *pictVisual; 30905b261ecSmrg xPictFormInfo *pictForm; 31005b261ecSmrg CARD32 *pictSubpixel; 31105b261ecSmrg ScreenPtr pScreen; 31205b261ecSmrg VisualPtr pVisual; 31305b261ecSmrg DepthPtr pDepth; 31405b261ecSmrg int v, d; 31505b261ecSmrg PictureScreenPtr ps; 31605b261ecSmrg PictFormatPtr pFormat; 31705b261ecSmrg int nformat; 31805b261ecSmrg int ndepth; 31905b261ecSmrg int nvisual; 32005b261ecSmrg int rlength; 32105b261ecSmrg int s; 32205b261ecSmrg int n; 32305b261ecSmrg int numScreens; 32405b261ecSmrg int numSubpixel; 32505b261ecSmrg/* REQUEST(xRenderQueryPictFormatsReq); */ 32605b261ecSmrg 32705b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq); 32805b261ecSmrg 32905b261ecSmrg#ifdef PANORAMIX 33005b261ecSmrg if (noPanoramiXExtension) 33105b261ecSmrg numScreens = screenInfo.numScreens; 33205b261ecSmrg else 33305b261ecSmrg numScreens = ((xConnSetup *)ConnectionInfo)->numRoots; 33405b261ecSmrg#else 33505b261ecSmrg numScreens = screenInfo.numScreens; 33605b261ecSmrg#endif 33705b261ecSmrg ndepth = nformat = nvisual = 0; 33805b261ecSmrg for (s = 0; s < numScreens; s++) 33905b261ecSmrg { 34005b261ecSmrg pScreen = screenInfo.screens[s]; 34105b261ecSmrg for (d = 0; d < pScreen->numDepths; d++) 34205b261ecSmrg { 34305b261ecSmrg pDepth = pScreen->allowedDepths + d; 34405b261ecSmrg ++ndepth; 34505b261ecSmrg 34605b261ecSmrg for (v = 0; v < pDepth->numVids; v++) 34705b261ecSmrg { 34805b261ecSmrg pVisual = findVisual (pScreen, pDepth->vids[v]); 34905b261ecSmrg if (pVisual && PictureMatchVisual (pScreen, pDepth->depth, pVisual)) 35005b261ecSmrg ++nvisual; 35105b261ecSmrg } 35205b261ecSmrg } 35305b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 35405b261ecSmrg if (ps) 35505b261ecSmrg nformat += ps->nformats; 35605b261ecSmrg } 35705b261ecSmrg if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6) 35805b261ecSmrg numSubpixel = 0; 35905b261ecSmrg else 36005b261ecSmrg numSubpixel = numScreens; 36105b261ecSmrg 36205b261ecSmrg rlength = (sizeof (xRenderQueryPictFormatsReply) + 36305b261ecSmrg nformat * sizeof (xPictFormInfo) + 36405b261ecSmrg numScreens * sizeof (xPictScreen) + 36505b261ecSmrg ndepth * sizeof (xPictDepth) + 36605b261ecSmrg nvisual * sizeof (xPictVisual) + 36705b261ecSmrg numSubpixel * sizeof (CARD32)); 36805b261ecSmrg reply = (xRenderQueryPictFormatsReply *) xalloc (rlength); 36905b261ecSmrg if (!reply) 37005b261ecSmrg return BadAlloc; 37105b261ecSmrg reply->type = X_Reply; 37205b261ecSmrg reply->sequenceNumber = client->sequence; 37305b261ecSmrg reply->length = (rlength - sizeof(xGenericReply)) >> 2; 37405b261ecSmrg reply->numFormats = nformat; 37505b261ecSmrg reply->numScreens = numScreens; 37605b261ecSmrg reply->numDepths = ndepth; 37705b261ecSmrg reply->numVisuals = nvisual; 37805b261ecSmrg reply->numSubpixel = numSubpixel; 37905b261ecSmrg 38005b261ecSmrg pictForm = (xPictFormInfo *) (reply + 1); 38105b261ecSmrg 38205b261ecSmrg for (s = 0; s < numScreens; s++) 38305b261ecSmrg { 38405b261ecSmrg pScreen = screenInfo.screens[s]; 38505b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 38605b261ecSmrg if (ps) 38705b261ecSmrg { 38805b261ecSmrg for (nformat = 0, pFormat = ps->formats; 38905b261ecSmrg nformat < ps->nformats; 39005b261ecSmrg nformat++, pFormat++) 39105b261ecSmrg { 39205b261ecSmrg pictForm->id = pFormat->id; 39305b261ecSmrg pictForm->type = pFormat->type; 39405b261ecSmrg pictForm->depth = pFormat->depth; 39505b261ecSmrg pictForm->direct.red = pFormat->direct.red; 39605b261ecSmrg pictForm->direct.redMask = pFormat->direct.redMask; 39705b261ecSmrg pictForm->direct.green = pFormat->direct.green; 39805b261ecSmrg pictForm->direct.greenMask = pFormat->direct.greenMask; 39905b261ecSmrg pictForm->direct.blue = pFormat->direct.blue; 40005b261ecSmrg pictForm->direct.blueMask = pFormat->direct.blueMask; 40105b261ecSmrg pictForm->direct.alpha = pFormat->direct.alpha; 40205b261ecSmrg pictForm->direct.alphaMask = pFormat->direct.alphaMask; 40305b261ecSmrg if (pFormat->type == PictTypeIndexed && pFormat->index.pColormap) 40405b261ecSmrg pictForm->colormap = pFormat->index.pColormap->mid; 40505b261ecSmrg else 40605b261ecSmrg pictForm->colormap = None; 40705b261ecSmrg if (client->swapped) 40805b261ecSmrg { 40905b261ecSmrg swapl (&pictForm->id, n); 41005b261ecSmrg swaps (&pictForm->direct.red, n); 41105b261ecSmrg swaps (&pictForm->direct.redMask, n); 41205b261ecSmrg swaps (&pictForm->direct.green, n); 41305b261ecSmrg swaps (&pictForm->direct.greenMask, n); 41405b261ecSmrg swaps (&pictForm->direct.blue, n); 41505b261ecSmrg swaps (&pictForm->direct.blueMask, n); 41605b261ecSmrg swaps (&pictForm->direct.alpha, n); 41705b261ecSmrg swaps (&pictForm->direct.alphaMask, n); 41805b261ecSmrg swapl (&pictForm->colormap, n); 41905b261ecSmrg } 42005b261ecSmrg pictForm++; 42105b261ecSmrg } 42205b261ecSmrg } 42305b261ecSmrg } 42405b261ecSmrg 42505b261ecSmrg pictScreen = (xPictScreen *) pictForm; 42605b261ecSmrg for (s = 0; s < numScreens; s++) 42705b261ecSmrg { 42805b261ecSmrg pScreen = screenInfo.screens[s]; 42905b261ecSmrg pictDepth = (xPictDepth *) (pictScreen + 1); 43005b261ecSmrg ndepth = 0; 43105b261ecSmrg for (d = 0; d < pScreen->numDepths; d++) 43205b261ecSmrg { 43305b261ecSmrg pictVisual = (xPictVisual *) (pictDepth + 1); 43405b261ecSmrg pDepth = pScreen->allowedDepths + d; 43505b261ecSmrg 43605b261ecSmrg nvisual = 0; 43705b261ecSmrg for (v = 0; v < pDepth->numVids; v++) 43805b261ecSmrg { 43905b261ecSmrg pVisual = findVisual (pScreen, pDepth->vids[v]); 44005b261ecSmrg if (pVisual && (pFormat = PictureMatchVisual (pScreen, 44105b261ecSmrg pDepth->depth, 44205b261ecSmrg pVisual))) 44305b261ecSmrg { 44405b261ecSmrg pictVisual->visual = pVisual->vid; 44505b261ecSmrg pictVisual->format = pFormat->id; 44605b261ecSmrg if (client->swapped) 44705b261ecSmrg { 44805b261ecSmrg swapl (&pictVisual->visual, n); 44905b261ecSmrg swapl (&pictVisual->format, n); 45005b261ecSmrg } 45105b261ecSmrg pictVisual++; 45205b261ecSmrg nvisual++; 45305b261ecSmrg } 45405b261ecSmrg } 45505b261ecSmrg pictDepth->depth = pDepth->depth; 45605b261ecSmrg pictDepth->nPictVisuals = nvisual; 45705b261ecSmrg if (client->swapped) 45805b261ecSmrg { 45905b261ecSmrg swaps (&pictDepth->nPictVisuals, n); 46005b261ecSmrg } 46105b261ecSmrg ndepth++; 46205b261ecSmrg pictDepth = (xPictDepth *) pictVisual; 46305b261ecSmrg } 46405b261ecSmrg pictScreen->nDepth = ndepth; 46505b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 46605b261ecSmrg if (ps) 46705b261ecSmrg pictScreen->fallback = ps->fallback->id; 46805b261ecSmrg else 46905b261ecSmrg pictScreen->fallback = 0; 47005b261ecSmrg if (client->swapped) 47105b261ecSmrg { 47205b261ecSmrg swapl (&pictScreen->nDepth, n); 47305b261ecSmrg swapl (&pictScreen->fallback, n); 47405b261ecSmrg } 47505b261ecSmrg pictScreen = (xPictScreen *) pictDepth; 47605b261ecSmrg } 47705b261ecSmrg pictSubpixel = (CARD32 *) pictScreen; 47805b261ecSmrg 47905b261ecSmrg for (s = 0; s < numSubpixel; s++) 48005b261ecSmrg { 48105b261ecSmrg pScreen = screenInfo.screens[s]; 48205b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 48305b261ecSmrg if (ps) 48405b261ecSmrg *pictSubpixel = ps->subpixel; 48505b261ecSmrg else 48605b261ecSmrg *pictSubpixel = SubPixelUnknown; 48705b261ecSmrg if (client->swapped) 48805b261ecSmrg { 48905b261ecSmrg swapl (pictSubpixel, n); 49005b261ecSmrg } 49105b261ecSmrg ++pictSubpixel; 49205b261ecSmrg } 49305b261ecSmrg 49405b261ecSmrg if (client->swapped) 49505b261ecSmrg { 49605b261ecSmrg swaps (&reply->sequenceNumber, n); 49705b261ecSmrg swapl (&reply->length, n); 49805b261ecSmrg swapl (&reply->numFormats, n); 49905b261ecSmrg swapl (&reply->numScreens, n); 50005b261ecSmrg swapl (&reply->numDepths, n); 50105b261ecSmrg swapl (&reply->numVisuals, n); 50205b261ecSmrg swapl (&reply->numSubpixel, n); 50305b261ecSmrg } 50405b261ecSmrg WriteToClient(client, rlength, (char *) reply); 50505b261ecSmrg xfree (reply); 50605b261ecSmrg return client->noClientException; 50705b261ecSmrg} 50805b261ecSmrg 50905b261ecSmrgstatic int 51005b261ecSmrgProcRenderQueryPictIndexValues (ClientPtr client) 51105b261ecSmrg{ 51205b261ecSmrg PictFormatPtr pFormat; 51305b261ecSmrg int num; 51405b261ecSmrg int rlength; 51505b261ecSmrg int i, n; 51605b261ecSmrg REQUEST(xRenderQueryPictIndexValuesReq); 51705b261ecSmrg xRenderQueryPictIndexValuesReply *reply; 51805b261ecSmrg xIndexValue *values; 51905b261ecSmrg 52005b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq); 52105b261ecSmrg 52205b261ecSmrg pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 52305b261ecSmrg stuff->format, 52405b261ecSmrg PictFormatType, 52505b261ecSmrg DixReadAccess); 52605b261ecSmrg 52705b261ecSmrg if (!pFormat) 52805b261ecSmrg { 52905b261ecSmrg client->errorValue = stuff->format; 53005b261ecSmrg return RenderErrBase + BadPictFormat; 53105b261ecSmrg } 53205b261ecSmrg if (pFormat->type != PictTypeIndexed) 53305b261ecSmrg { 53405b261ecSmrg client->errorValue = stuff->format; 53505b261ecSmrg return BadMatch; 53605b261ecSmrg } 53705b261ecSmrg num = pFormat->index.nvalues; 53805b261ecSmrg rlength = (sizeof (xRenderQueryPictIndexValuesReply) + 53905b261ecSmrg num * sizeof(xIndexValue)); 54005b261ecSmrg reply = (xRenderQueryPictIndexValuesReply *) xalloc (rlength); 54105b261ecSmrg if (!reply) 54205b261ecSmrg return BadAlloc; 54305b261ecSmrg 54405b261ecSmrg reply->type = X_Reply; 54505b261ecSmrg reply->sequenceNumber = client->sequence; 54605b261ecSmrg reply->length = (rlength - sizeof(xGenericReply)) >> 2; 54705b261ecSmrg reply->numIndexValues = num; 54805b261ecSmrg 54905b261ecSmrg values = (xIndexValue *) (reply + 1); 55005b261ecSmrg 55105b261ecSmrg memcpy (reply + 1, pFormat->index.pValues, num * sizeof (xIndexValue)); 55205b261ecSmrg 55305b261ecSmrg if (client->swapped) 55405b261ecSmrg { 55505b261ecSmrg for (i = 0; i < num; i++) 55605b261ecSmrg { 55705b261ecSmrg swapl (&values[i].pixel, n); 55805b261ecSmrg swaps (&values[i].red, n); 55905b261ecSmrg swaps (&values[i].green, n); 56005b261ecSmrg swaps (&values[i].blue, n); 56105b261ecSmrg swaps (&values[i].alpha, n); 56205b261ecSmrg } 56305b261ecSmrg swaps (&reply->sequenceNumber, n); 56405b261ecSmrg swapl (&reply->length, n); 56505b261ecSmrg swapl (&reply->numIndexValues, n); 56605b261ecSmrg } 56705b261ecSmrg 56805b261ecSmrg WriteToClient(client, rlength, (char *) reply); 56905b261ecSmrg xfree(reply); 57005b261ecSmrg return (client->noClientException); 57105b261ecSmrg} 57205b261ecSmrg 57305b261ecSmrgstatic int 57405b261ecSmrgProcRenderQueryDithers (ClientPtr client) 57505b261ecSmrg{ 57605b261ecSmrg return BadImplementation; 57705b261ecSmrg} 57805b261ecSmrg 57905b261ecSmrgstatic int 58005b261ecSmrgProcRenderCreatePicture (ClientPtr client) 58105b261ecSmrg{ 58205b261ecSmrg PicturePtr pPicture; 58305b261ecSmrg DrawablePtr pDrawable; 58405b261ecSmrg PictFormatPtr pFormat; 58505b261ecSmrg int len, error, rc; 58605b261ecSmrg REQUEST(xRenderCreatePictureReq); 58705b261ecSmrg 58805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 58905b261ecSmrg 59005b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 59105b261ecSmrg rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0, 5924642e01fSmrg DixReadAccess|DixAddAccess); 59305b261ecSmrg if (rc != Success) 59405b261ecSmrg return rc; 59505b261ecSmrg 59605b261ecSmrg pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 59705b261ecSmrg stuff->format, 59805b261ecSmrg PictFormatType, 59905b261ecSmrg DixReadAccess); 60005b261ecSmrg if (!pFormat) 60105b261ecSmrg { 60205b261ecSmrg client->errorValue = stuff->format; 60305b261ecSmrg return RenderErrBase + BadPictFormat; 60405b261ecSmrg } 60505b261ecSmrg if (pFormat->depth != pDrawable->depth) 60605b261ecSmrg return BadMatch; 60705b261ecSmrg len = client->req_len - (sizeof(xRenderCreatePictureReq) >> 2); 60805b261ecSmrg if (Ones(stuff->mask) != len) 60905b261ecSmrg return BadLength; 61005b261ecSmrg 61105b261ecSmrg pPicture = CreatePicture (stuff->pid, 61205b261ecSmrg pDrawable, 61305b261ecSmrg pFormat, 61405b261ecSmrg stuff->mask, 61505b261ecSmrg (XID *) (stuff + 1), 61605b261ecSmrg client, 61705b261ecSmrg &error); 61805b261ecSmrg if (!pPicture) 61905b261ecSmrg return error; 62005b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 62105b261ecSmrg return BadAlloc; 62205b261ecSmrg return Success; 62305b261ecSmrg} 62405b261ecSmrg 62505b261ecSmrgstatic int 62605b261ecSmrgProcRenderChangePicture (ClientPtr client) 62705b261ecSmrg{ 62805b261ecSmrg PicturePtr pPicture; 62905b261ecSmrg REQUEST(xRenderChangePictureReq); 63005b261ecSmrg int len; 63105b261ecSmrg 63205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); 6334642e01fSmrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess, 63405b261ecSmrg RenderErrBase + BadPicture); 63505b261ecSmrg 63605b261ecSmrg len = client->req_len - (sizeof(xRenderChangePictureReq) >> 2); 63705b261ecSmrg if (Ones(stuff->mask) != len) 63805b261ecSmrg return BadLength; 63905b261ecSmrg 64005b261ecSmrg return ChangePicture (pPicture, stuff->mask, (XID *) (stuff + 1), 64105b261ecSmrg (DevUnion *) 0, client); 64205b261ecSmrg} 64305b261ecSmrg 64405b261ecSmrgstatic int 64505b261ecSmrgProcRenderSetPictureClipRectangles (ClientPtr client) 64605b261ecSmrg{ 64705b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 64805b261ecSmrg PicturePtr pPicture; 64905b261ecSmrg int nr; 65005b261ecSmrg int result; 65105b261ecSmrg 65205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 6534642e01fSmrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess, 65405b261ecSmrg RenderErrBase + BadPicture); 65505b261ecSmrg if (!pPicture->pDrawable) 65605b261ecSmrg return BadDrawable; 65705b261ecSmrg 65805b261ecSmrg nr = (client->req_len << 2) - sizeof(xRenderChangePictureReq); 65905b261ecSmrg if (nr & 4) 66005b261ecSmrg return BadLength; 66105b261ecSmrg nr >>= 3; 66205b261ecSmrg result = SetPictureClipRects (pPicture, 66305b261ecSmrg stuff->xOrigin, stuff->yOrigin, 66405b261ecSmrg nr, (xRectangle *) &stuff[1]); 66505b261ecSmrg if (client->noClientException != Success) 66605b261ecSmrg return(client->noClientException); 66705b261ecSmrg else 66805b261ecSmrg return(result); 66905b261ecSmrg} 67005b261ecSmrg 67105b261ecSmrgstatic int 67205b261ecSmrgProcRenderFreePicture (ClientPtr client) 67305b261ecSmrg{ 67405b261ecSmrg PicturePtr pPicture; 67505b261ecSmrg REQUEST(xRenderFreePictureReq); 67605b261ecSmrg 67705b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 67805b261ecSmrg 67905b261ecSmrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess, 68005b261ecSmrg RenderErrBase + BadPicture); 68105b261ecSmrg FreeResource (stuff->picture, RT_NONE); 68205b261ecSmrg return(client->noClientException); 68305b261ecSmrg} 68405b261ecSmrg 68505b261ecSmrgstatic Bool 68605b261ecSmrgPictOpValid (CARD8 op) 68705b261ecSmrg{ 68805b261ecSmrg if (/*PictOpMinimum <= op && */ op <= PictOpMaximum) 68905b261ecSmrg return TRUE; 69005b261ecSmrg if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum) 69105b261ecSmrg return TRUE; 69205b261ecSmrg if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum) 69305b261ecSmrg return TRUE; 69405b261ecSmrg return FALSE; 69505b261ecSmrg} 69605b261ecSmrg 69705b261ecSmrgstatic int 69805b261ecSmrgProcRenderComposite (ClientPtr client) 69905b261ecSmrg{ 70005b261ecSmrg PicturePtr pSrc, pMask, pDst; 70105b261ecSmrg REQUEST(xRenderCompositeReq); 70205b261ecSmrg 70305b261ecSmrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 70405b261ecSmrg if (!PictOpValid (stuff->op)) 70505b261ecSmrg { 70605b261ecSmrg client->errorValue = stuff->op; 70705b261ecSmrg return BadValue; 70805b261ecSmrg } 70905b261ecSmrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 71005b261ecSmrg RenderErrBase + BadPicture); 71105b261ecSmrg if (!pDst->pDrawable) 71205b261ecSmrg return BadDrawable; 71305b261ecSmrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 71405b261ecSmrg RenderErrBase + BadPicture); 71505b261ecSmrg VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess, 71605b261ecSmrg RenderErrBase + BadPicture); 71705b261ecSmrg if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) || 71805b261ecSmrg (pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen)) 71905b261ecSmrg return BadMatch; 72005b261ecSmrg CompositePicture (stuff->op, 72105b261ecSmrg pSrc, 72205b261ecSmrg pMask, 72305b261ecSmrg pDst, 72405b261ecSmrg stuff->xSrc, 72505b261ecSmrg stuff->ySrc, 72605b261ecSmrg stuff->xMask, 72705b261ecSmrg stuff->yMask, 72805b261ecSmrg stuff->xDst, 72905b261ecSmrg stuff->yDst, 73005b261ecSmrg stuff->width, 73105b261ecSmrg stuff->height); 73205b261ecSmrg return Success; 73305b261ecSmrg} 73405b261ecSmrg 73505b261ecSmrgstatic int 73605b261ecSmrgProcRenderScale (ClientPtr client) 73705b261ecSmrg{ 73805b261ecSmrg return BadImplementation; 73905b261ecSmrg} 74005b261ecSmrg 74105b261ecSmrgstatic int 74205b261ecSmrgProcRenderTrapezoids (ClientPtr client) 74305b261ecSmrg{ 74405b261ecSmrg int ntraps; 74505b261ecSmrg PicturePtr pSrc, pDst; 74605b261ecSmrg PictFormatPtr pFormat; 74705b261ecSmrg REQUEST(xRenderTrapezoidsReq); 74805b261ecSmrg 74905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 75005b261ecSmrg if (!PictOpValid (stuff->op)) 75105b261ecSmrg { 75205b261ecSmrg client->errorValue = stuff->op; 75305b261ecSmrg return BadValue; 75405b261ecSmrg } 75505b261ecSmrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 75605b261ecSmrg RenderErrBase + BadPicture); 75705b261ecSmrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 75805b261ecSmrg RenderErrBase + BadPicture); 75905b261ecSmrg if (!pDst->pDrawable) 76005b261ecSmrg return BadDrawable; 76105b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 76205b261ecSmrg return BadMatch; 76305b261ecSmrg if (stuff->maskFormat) 76405b261ecSmrg { 76505b261ecSmrg pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 76605b261ecSmrg stuff->maskFormat, 76705b261ecSmrg PictFormatType, 76805b261ecSmrg DixReadAccess); 76905b261ecSmrg if (!pFormat) 77005b261ecSmrg { 77105b261ecSmrg client->errorValue = stuff->maskFormat; 77205b261ecSmrg return RenderErrBase + BadPictFormat; 77305b261ecSmrg } 77405b261ecSmrg } 77505b261ecSmrg else 77605b261ecSmrg pFormat = 0; 77705b261ecSmrg ntraps = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq); 77805b261ecSmrg if (ntraps % sizeof (xTrapezoid)) 77905b261ecSmrg return BadLength; 78005b261ecSmrg ntraps /= sizeof (xTrapezoid); 78105b261ecSmrg if (ntraps) 78205b261ecSmrg CompositeTrapezoids (stuff->op, pSrc, pDst, pFormat, 78305b261ecSmrg stuff->xSrc, stuff->ySrc, 78405b261ecSmrg ntraps, (xTrapezoid *) &stuff[1]); 78505b261ecSmrg return client->noClientException; 78605b261ecSmrg} 78705b261ecSmrg 78805b261ecSmrgstatic int 78905b261ecSmrgProcRenderTriangles (ClientPtr client) 79005b261ecSmrg{ 79105b261ecSmrg int ntris; 79205b261ecSmrg PicturePtr pSrc, pDst; 79305b261ecSmrg PictFormatPtr pFormat; 79405b261ecSmrg REQUEST(xRenderTrianglesReq); 79505b261ecSmrg 79605b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 79705b261ecSmrg if (!PictOpValid (stuff->op)) 79805b261ecSmrg { 79905b261ecSmrg client->errorValue = stuff->op; 80005b261ecSmrg return BadValue; 80105b261ecSmrg } 80205b261ecSmrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 80305b261ecSmrg RenderErrBase + BadPicture); 80405b261ecSmrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 80505b261ecSmrg RenderErrBase + BadPicture); 80605b261ecSmrg if (!pDst->pDrawable) 80705b261ecSmrg return BadDrawable; 80805b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 80905b261ecSmrg return BadMatch; 81005b261ecSmrg if (stuff->maskFormat) 81105b261ecSmrg { 81205b261ecSmrg pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 81305b261ecSmrg stuff->maskFormat, 81405b261ecSmrg PictFormatType, 81505b261ecSmrg DixReadAccess); 81605b261ecSmrg if (!pFormat) 81705b261ecSmrg { 81805b261ecSmrg client->errorValue = stuff->maskFormat; 81905b261ecSmrg return RenderErrBase + BadPictFormat; 82005b261ecSmrg } 82105b261ecSmrg } 82205b261ecSmrg else 82305b261ecSmrg pFormat = 0; 82405b261ecSmrg ntris = (client->req_len << 2) - sizeof (xRenderTrianglesReq); 82505b261ecSmrg if (ntris % sizeof (xTriangle)) 82605b261ecSmrg return BadLength; 82705b261ecSmrg ntris /= sizeof (xTriangle); 82805b261ecSmrg if (ntris) 82905b261ecSmrg CompositeTriangles (stuff->op, pSrc, pDst, pFormat, 83005b261ecSmrg stuff->xSrc, stuff->ySrc, 83105b261ecSmrg ntris, (xTriangle *) &stuff[1]); 83205b261ecSmrg return client->noClientException; 83305b261ecSmrg} 83405b261ecSmrg 83505b261ecSmrgstatic int 83605b261ecSmrgProcRenderTriStrip (ClientPtr client) 83705b261ecSmrg{ 83805b261ecSmrg int npoints; 83905b261ecSmrg PicturePtr pSrc, pDst; 84005b261ecSmrg PictFormatPtr pFormat; 84105b261ecSmrg REQUEST(xRenderTrianglesReq); 84205b261ecSmrg 84305b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 84405b261ecSmrg if (!PictOpValid (stuff->op)) 84505b261ecSmrg { 84605b261ecSmrg client->errorValue = stuff->op; 84705b261ecSmrg return BadValue; 84805b261ecSmrg } 84905b261ecSmrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 85005b261ecSmrg RenderErrBase + BadPicture); 85105b261ecSmrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 85205b261ecSmrg RenderErrBase + BadPicture); 85305b261ecSmrg if (!pDst->pDrawable) 85405b261ecSmrg return BadDrawable; 85505b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 85605b261ecSmrg return BadMatch; 85705b261ecSmrg if (stuff->maskFormat) 85805b261ecSmrg { 85905b261ecSmrg pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 86005b261ecSmrg stuff->maskFormat, 86105b261ecSmrg PictFormatType, 86205b261ecSmrg DixReadAccess); 86305b261ecSmrg if (!pFormat) 86405b261ecSmrg { 86505b261ecSmrg client->errorValue = stuff->maskFormat; 86605b261ecSmrg return RenderErrBase + BadPictFormat; 86705b261ecSmrg } 86805b261ecSmrg } 86905b261ecSmrg else 87005b261ecSmrg pFormat = 0; 87105b261ecSmrg npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq)); 87205b261ecSmrg if (npoints & 4) 87305b261ecSmrg return(BadLength); 87405b261ecSmrg npoints >>= 3; 87505b261ecSmrg if (npoints >= 3) 87605b261ecSmrg CompositeTriStrip (stuff->op, pSrc, pDst, pFormat, 87705b261ecSmrg stuff->xSrc, stuff->ySrc, 87805b261ecSmrg npoints, (xPointFixed *) &stuff[1]); 87905b261ecSmrg return client->noClientException; 88005b261ecSmrg} 88105b261ecSmrg 88205b261ecSmrgstatic int 88305b261ecSmrgProcRenderTriFan (ClientPtr client) 88405b261ecSmrg{ 88505b261ecSmrg int npoints; 88605b261ecSmrg PicturePtr pSrc, pDst; 88705b261ecSmrg PictFormatPtr pFormat; 88805b261ecSmrg REQUEST(xRenderTrianglesReq); 88905b261ecSmrg 89005b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 89105b261ecSmrg if (!PictOpValid (stuff->op)) 89205b261ecSmrg { 89305b261ecSmrg client->errorValue = stuff->op; 89405b261ecSmrg return BadValue; 89505b261ecSmrg } 89605b261ecSmrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 89705b261ecSmrg RenderErrBase + BadPicture); 89805b261ecSmrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 89905b261ecSmrg RenderErrBase + BadPicture); 90005b261ecSmrg if (!pDst->pDrawable) 90105b261ecSmrg return BadDrawable; 90205b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 90305b261ecSmrg return BadMatch; 90405b261ecSmrg if (stuff->maskFormat) 90505b261ecSmrg { 90605b261ecSmrg pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 90705b261ecSmrg stuff->maskFormat, 90805b261ecSmrg PictFormatType, 90905b261ecSmrg DixReadAccess); 91005b261ecSmrg if (!pFormat) 91105b261ecSmrg { 91205b261ecSmrg client->errorValue = stuff->maskFormat; 91305b261ecSmrg return RenderErrBase + BadPictFormat; 91405b261ecSmrg } 91505b261ecSmrg } 91605b261ecSmrg else 91705b261ecSmrg pFormat = 0; 91805b261ecSmrg npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq)); 91905b261ecSmrg if (npoints & 4) 92005b261ecSmrg return(BadLength); 92105b261ecSmrg npoints >>= 3; 92205b261ecSmrg if (npoints >= 3) 92305b261ecSmrg CompositeTriFan (stuff->op, pSrc, pDst, pFormat, 92405b261ecSmrg stuff->xSrc, stuff->ySrc, 92505b261ecSmrg npoints, (xPointFixed *) &stuff[1]); 92605b261ecSmrg return client->noClientException; 92705b261ecSmrg} 92805b261ecSmrg 92905b261ecSmrgstatic int 93005b261ecSmrgProcRenderColorTrapezoids (ClientPtr client) 93105b261ecSmrg{ 93205b261ecSmrg return BadImplementation; 93305b261ecSmrg} 93405b261ecSmrg 93505b261ecSmrgstatic int 93605b261ecSmrgProcRenderColorTriangles (ClientPtr client) 93705b261ecSmrg{ 93805b261ecSmrg return BadImplementation; 93905b261ecSmrg} 94005b261ecSmrg 94105b261ecSmrgstatic int 94205b261ecSmrgProcRenderTransform (ClientPtr client) 94305b261ecSmrg{ 94405b261ecSmrg return BadImplementation; 94505b261ecSmrg} 94605b261ecSmrg 94705b261ecSmrgstatic int 94805b261ecSmrgProcRenderCreateGlyphSet (ClientPtr client) 94905b261ecSmrg{ 95005b261ecSmrg GlyphSetPtr glyphSet; 95105b261ecSmrg PictFormatPtr format; 9524642e01fSmrg int rc, f; 95305b261ecSmrg REQUEST(xRenderCreateGlyphSetReq); 95405b261ecSmrg 95505b261ecSmrg REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq); 95605b261ecSmrg 95705b261ecSmrg LEGAL_NEW_RESOURCE(stuff->gsid, client); 95805b261ecSmrg format = (PictFormatPtr) SecurityLookupIDByType (client, 95905b261ecSmrg stuff->format, 96005b261ecSmrg PictFormatType, 96105b261ecSmrg DixReadAccess); 96205b261ecSmrg if (!format) 96305b261ecSmrg { 96405b261ecSmrg client->errorValue = stuff->format; 96505b261ecSmrg return RenderErrBase + BadPictFormat; 96605b261ecSmrg } 96705b261ecSmrg switch (format->depth) { 96805b261ecSmrg case 1: 96905b261ecSmrg f = GlyphFormat1; 97005b261ecSmrg break; 97105b261ecSmrg case 4: 97205b261ecSmrg f = GlyphFormat4; 97305b261ecSmrg break; 97405b261ecSmrg case 8: 97505b261ecSmrg f = GlyphFormat8; 97605b261ecSmrg break; 97705b261ecSmrg case 16: 97805b261ecSmrg f = GlyphFormat16; 97905b261ecSmrg break; 98005b261ecSmrg case 32: 98105b261ecSmrg f = GlyphFormat32; 98205b261ecSmrg break; 98305b261ecSmrg default: 98405b261ecSmrg return BadMatch; 98505b261ecSmrg } 98605b261ecSmrg if (format->type != PictTypeDirect) 98705b261ecSmrg return BadMatch; 98805b261ecSmrg glyphSet = AllocateGlyphSet (f, format); 98905b261ecSmrg if (!glyphSet) 99005b261ecSmrg return BadAlloc; 9914642e01fSmrg /* security creation/labeling check */ 9924642e01fSmrg rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType, 9934642e01fSmrg glyphSet, RT_NONE, NULL, DixCreateAccess); 9944642e01fSmrg if (rc != Success) 9954642e01fSmrg return rc; 99605b261ecSmrg if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet)) 99705b261ecSmrg return BadAlloc; 99805b261ecSmrg return Success; 99905b261ecSmrg} 100005b261ecSmrg 100105b261ecSmrgstatic int 100205b261ecSmrgProcRenderReferenceGlyphSet (ClientPtr client) 100305b261ecSmrg{ 100405b261ecSmrg GlyphSetPtr glyphSet; 10054642e01fSmrg int rc; 100605b261ecSmrg REQUEST(xRenderReferenceGlyphSetReq); 100705b261ecSmrg 100805b261ecSmrg REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq); 100905b261ecSmrg 101005b261ecSmrg LEGAL_NEW_RESOURCE(stuff->gsid, client); 101105b261ecSmrg 10124642e01fSmrg rc = dixLookupResource((pointer *)&glyphSet, stuff->existing, GlyphSetType, 10134642e01fSmrg client, DixGetAttrAccess); 10144642e01fSmrg if (rc != Success) 101505b261ecSmrg { 101605b261ecSmrg client->errorValue = stuff->existing; 10174642e01fSmrg return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc; 101805b261ecSmrg } 101905b261ecSmrg glyphSet->refcnt++; 102005b261ecSmrg if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet)) 102105b261ecSmrg return BadAlloc; 102205b261ecSmrg return client->noClientException; 102305b261ecSmrg} 102405b261ecSmrg 102505b261ecSmrg#define NLOCALDELTA 64 102605b261ecSmrg#define NLOCALGLYPH 256 102705b261ecSmrg 102805b261ecSmrgstatic int 102905b261ecSmrgProcRenderFreeGlyphSet (ClientPtr client) 103005b261ecSmrg{ 103105b261ecSmrg GlyphSetPtr glyphSet; 10324642e01fSmrg int rc; 103305b261ecSmrg REQUEST(xRenderFreeGlyphSetReq); 103405b261ecSmrg 103505b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq); 10364642e01fSmrg rc = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 10374642e01fSmrg client, DixDestroyAccess); 10384642e01fSmrg if (rc != Success) 103905b261ecSmrg { 104005b261ecSmrg client->errorValue = stuff->glyphset; 10414642e01fSmrg return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc; 104205b261ecSmrg } 104305b261ecSmrg FreeResource (stuff->glyphset, RT_NONE); 104405b261ecSmrg return client->noClientException; 104505b261ecSmrg} 104605b261ecSmrg 104705b261ecSmrgtypedef struct _GlyphNew { 10484642e01fSmrg Glyph id; 10494642e01fSmrg GlyphPtr glyph; 10504642e01fSmrg Bool found; 10514642e01fSmrg unsigned char sha1[20]; 105205b261ecSmrg} GlyphNewRec, *GlyphNewPtr; 105305b261ecSmrg 10544642e01fSmrg#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0) 10554642e01fSmrg 105605b261ecSmrgstatic int 105705b261ecSmrgProcRenderAddGlyphs (ClientPtr client) 105805b261ecSmrg{ 105905b261ecSmrg GlyphSetPtr glyphSet; 106005b261ecSmrg REQUEST(xRenderAddGlyphsReq); 106105b261ecSmrg GlyphNewRec glyphsLocal[NLOCALGLYPH]; 10624642e01fSmrg GlyphNewPtr glyphsBase, glyphs, glyph_new; 106305b261ecSmrg int remain, nglyphs; 106405b261ecSmrg CARD32 *gids; 106505b261ecSmrg xGlyphInfo *gi; 106605b261ecSmrg CARD8 *bits; 106705b261ecSmrg int size; 10684642e01fSmrg int err; 10694642e01fSmrg int i, screen; 10704642e01fSmrg PicturePtr pSrc = NULL, pDst = NULL; 10714642e01fSmrg PixmapPtr pSrcPix = NULL, pDstPix = NULL; 10724642e01fSmrg CARD32 component_alpha; 107305b261ecSmrg 107405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq); 10754642e01fSmrg err = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 10764642e01fSmrg client, DixAddAccess); 10774642e01fSmrg if (err != Success) 107805b261ecSmrg { 107905b261ecSmrg client->errorValue = stuff->glyphset; 10804642e01fSmrg return (err == BadValue) ? RenderErrBase + BadGlyphSet : err; 108105b261ecSmrg } 108205b261ecSmrg 10834642e01fSmrg err = BadAlloc; 108405b261ecSmrg nglyphs = stuff->nglyphs; 108505b261ecSmrg if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec)) 108605b261ecSmrg return BadAlloc; 108705b261ecSmrg 10884642e01fSmrg component_alpha = NeedsComponent (glyphSet->format->format); 10894642e01fSmrg 10904642e01fSmrg if (nglyphs <= NLOCALGLYPH) { 10914642e01fSmrg memset (glyphsLocal, 0, sizeof (glyphsLocal)); 109205b261ecSmrg glyphsBase = glyphsLocal; 10934642e01fSmrg } 109405b261ecSmrg else 109505b261ecSmrg { 10964642e01fSmrg glyphsBase = (GlyphNewPtr) Xcalloc (nglyphs * sizeof (GlyphNewRec)); 109705b261ecSmrg if (!glyphsBase) 109805b261ecSmrg return BadAlloc; 109905b261ecSmrg } 110005b261ecSmrg 110105b261ecSmrg remain = (client->req_len << 2) - sizeof (xRenderAddGlyphsReq); 110205b261ecSmrg 110305b261ecSmrg glyphs = glyphsBase; 110405b261ecSmrg 110505b261ecSmrg gids = (CARD32 *) (stuff + 1); 110605b261ecSmrg gi = (xGlyphInfo *) (gids + nglyphs); 110705b261ecSmrg bits = (CARD8 *) (gi + nglyphs); 110805b261ecSmrg remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs; 11094642e01fSmrg for (i = 0; i < nglyphs; i++) 111005b261ecSmrg { 11114642e01fSmrg size_t padded_width; 11124642e01fSmrg glyph_new = &glyphs[i]; 11134642e01fSmrg 11144642e01fSmrg padded_width = PixmapBytePad (gi[i].width, 11154642e01fSmrg glyphSet->format->depth); 11164642e01fSmrg 11174642e01fSmrg if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height) 11184642e01fSmrg break; 111905b261ecSmrg 11204642e01fSmrg size = gi[i].height * padded_width; 112105b261ecSmrg if (remain < size) 112205b261ecSmrg break; 11234642e01fSmrg 11244642e01fSmrg err = HashGlyph (&gi[i], bits, size, glyph_new->sha1); 11254642e01fSmrg if (err) 11264642e01fSmrg goto bail; 11274642e01fSmrg 11284642e01fSmrg glyph_new->glyph = FindGlyphByHash (glyph_new->sha1, 11294642e01fSmrg glyphSet->fdepth); 11304642e01fSmrg 11314642e01fSmrg if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph) 11324642e01fSmrg { 11334642e01fSmrg glyph_new->found = TRUE; 11344642e01fSmrg } 11354642e01fSmrg else 11364642e01fSmrg { 11374642e01fSmrg GlyphPtr glyph; 11384642e01fSmrg 11394642e01fSmrg glyph_new->found = FALSE; 11404642e01fSmrg glyph_new->glyph = glyph = AllocateGlyph (&gi[i], glyphSet->fdepth); 11414642e01fSmrg if (! glyph) 11424642e01fSmrg { 11434642e01fSmrg err = BadAlloc; 11444642e01fSmrg goto bail; 11454642e01fSmrg } 11464642e01fSmrg 11474642e01fSmrg for (screen = 0; screen < screenInfo.numScreens; screen++) 11484642e01fSmrg { 11494642e01fSmrg int width = gi[i].width; 11504642e01fSmrg int height = gi[i].height; 11514642e01fSmrg int depth = glyphSet->format->depth; 11524642e01fSmrg ScreenPtr pScreen; 11534642e01fSmrg int error; 11544642e01fSmrg 11554642e01fSmrg pScreen = screenInfo.screens[screen]; 11564642e01fSmrg pSrcPix = GetScratchPixmapHeader (pScreen, 11574642e01fSmrg width, height, 11584642e01fSmrg depth, depth, 11594642e01fSmrg -1, bits); 11604642e01fSmrg if (! pSrcPix) 11614642e01fSmrg { 11624642e01fSmrg err = BadAlloc; 11634642e01fSmrg goto bail; 11644642e01fSmrg } 11654642e01fSmrg 11664642e01fSmrg pSrc = CreatePicture (0, &pSrcPix->drawable, 11674642e01fSmrg glyphSet->format, 0, NULL, 11684642e01fSmrg serverClient, &error); 11694642e01fSmrg if (! pSrc) 11704642e01fSmrg { 11714642e01fSmrg err = BadAlloc; 11724642e01fSmrg goto bail; 11734642e01fSmrg } 11744642e01fSmrg 11754642e01fSmrg pDstPix = (pScreen->CreatePixmap) (pScreen, 11764642e01fSmrg width, height, depth, 11774642e01fSmrg CREATE_PIXMAP_USAGE_GLYPH_PICTURE); 11784642e01fSmrg 11794642e01fSmrg GlyphPicture (glyph)[screen] = pDst = 11804642e01fSmrg CreatePicture (0, &pDstPix->drawable, 11814642e01fSmrg glyphSet->format, 11824642e01fSmrg CPComponentAlpha, &component_alpha, 11834642e01fSmrg serverClient, &error); 11844642e01fSmrg 11854642e01fSmrg /* The picture takes a reference to the pixmap, so we 11864642e01fSmrg drop ours. */ 11874642e01fSmrg (pScreen->DestroyPixmap) (pDstPix); 11884642e01fSmrg 11894642e01fSmrg if (! pDst) 11904642e01fSmrg { 11914642e01fSmrg err = BadAlloc; 11924642e01fSmrg goto bail; 11934642e01fSmrg } 11944642e01fSmrg 11954642e01fSmrg CompositePicture (PictOpSrc, 11964642e01fSmrg pSrc, 11974642e01fSmrg None, 11984642e01fSmrg pDst, 11994642e01fSmrg 0, 0, 12004642e01fSmrg 0, 0, 12014642e01fSmrg 0, 0, 12024642e01fSmrg width, height); 12034642e01fSmrg 12044642e01fSmrg FreePicture ((pointer) pSrc, 0); 12054642e01fSmrg pSrc = NULL; 12064642e01fSmrg FreeScratchPixmapHeader (pSrcPix); 12074642e01fSmrg pSrcPix = NULL; 12084642e01fSmrg } 12094642e01fSmrg 12104642e01fSmrg memcpy (glyph_new->glyph->sha1, glyph_new->sha1, 20); 12114642e01fSmrg } 12124642e01fSmrg 12134642e01fSmrg glyph_new->id = gids[i]; 121405b261ecSmrg 121505b261ecSmrg if (size & 3) 121605b261ecSmrg size += 4 - (size & 3); 121705b261ecSmrg bits += size; 121805b261ecSmrg remain -= size; 121905b261ecSmrg } 12204642e01fSmrg if (remain || i < nglyphs) 122105b261ecSmrg { 122205b261ecSmrg err = BadLength; 122305b261ecSmrg goto bail; 122405b261ecSmrg } 122505b261ecSmrg if (!ResizeGlyphSet (glyphSet, nglyphs)) 122605b261ecSmrg { 122705b261ecSmrg err = BadAlloc; 122805b261ecSmrg goto bail; 122905b261ecSmrg } 12304642e01fSmrg for (i = 0; i < nglyphs; i++) 12314642e01fSmrg AddGlyph (glyphSet, glyphs[i].glyph, glyphs[i].id); 123205b261ecSmrg 123305b261ecSmrg if (glyphsBase != glyphsLocal) 123405b261ecSmrg Xfree (glyphsBase); 123505b261ecSmrg return client->noClientException; 123605b261ecSmrgbail: 12374642e01fSmrg if (pSrc) 12384642e01fSmrg FreePicture ((pointer) pSrc, 0); 12394642e01fSmrg if (pSrcPix) 12404642e01fSmrg FreeScratchPixmapHeader (pSrcPix); 12414642e01fSmrg for (i = 0; i < nglyphs; i++) 12424642e01fSmrg if (glyphs[i].glyph && ! glyphs[i].found) 12434642e01fSmrg xfree (glyphs[i].glyph); 124405b261ecSmrg if (glyphsBase != glyphsLocal) 124505b261ecSmrg Xfree (glyphsBase); 124605b261ecSmrg return err; 124705b261ecSmrg} 124805b261ecSmrg 124905b261ecSmrgstatic int 125005b261ecSmrgProcRenderAddGlyphsFromPicture (ClientPtr client) 125105b261ecSmrg{ 125205b261ecSmrg return BadImplementation; 125305b261ecSmrg} 125405b261ecSmrg 125505b261ecSmrgstatic int 125605b261ecSmrgProcRenderFreeGlyphs (ClientPtr client) 125705b261ecSmrg{ 125805b261ecSmrg REQUEST(xRenderFreeGlyphsReq); 125905b261ecSmrg GlyphSetPtr glyphSet; 12604642e01fSmrg int rc, nglyph; 126105b261ecSmrg CARD32 *gids; 126205b261ecSmrg CARD32 glyph; 126305b261ecSmrg 126405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq); 12654642e01fSmrg rc = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, 12664642e01fSmrg client, DixRemoveAccess); 12674642e01fSmrg if (rc != Success) 126805b261ecSmrg { 126905b261ecSmrg client->errorValue = stuff->glyphset; 12704642e01fSmrg return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc; 127105b261ecSmrg } 127205b261ecSmrg nglyph = ((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq)) >> 2; 127305b261ecSmrg gids = (CARD32 *) (stuff + 1); 127405b261ecSmrg while (nglyph-- > 0) 127505b261ecSmrg { 127605b261ecSmrg glyph = *gids++; 127705b261ecSmrg if (!DeleteGlyph (glyphSet, glyph)) 127805b261ecSmrg { 127905b261ecSmrg client->errorValue = glyph; 128005b261ecSmrg return RenderErrBase + BadGlyph; 128105b261ecSmrg } 128205b261ecSmrg } 128305b261ecSmrg return client->noClientException; 128405b261ecSmrg} 128505b261ecSmrg 128605b261ecSmrgstatic int 128705b261ecSmrgProcRenderCompositeGlyphs (ClientPtr client) 128805b261ecSmrg{ 128905b261ecSmrg GlyphSetPtr glyphSet; 129005b261ecSmrg GlyphSet gs; 129105b261ecSmrg PicturePtr pSrc, pDst; 129205b261ecSmrg PictFormatPtr pFormat; 129305b261ecSmrg GlyphListRec listsLocal[NLOCALDELTA]; 129405b261ecSmrg GlyphListPtr lists, listsBase; 129505b261ecSmrg GlyphPtr glyphsLocal[NLOCALGLYPH]; 129605b261ecSmrg Glyph glyph; 129705b261ecSmrg GlyphPtr *glyphs, *glyphsBase; 129805b261ecSmrg xGlyphElt *elt; 129905b261ecSmrg CARD8 *buffer, *end; 130005b261ecSmrg int nglyph; 130105b261ecSmrg int nlist; 130205b261ecSmrg int space; 130305b261ecSmrg int size; 130405b261ecSmrg int n; 130505b261ecSmrg 130605b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 130705b261ecSmrg 130805b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 130905b261ecSmrg 131005b261ecSmrg switch (stuff->renderReqType) { 131105b261ecSmrg default: size = 1; break; 131205b261ecSmrg case X_RenderCompositeGlyphs16: size = 2; break; 131305b261ecSmrg case X_RenderCompositeGlyphs32: size = 4; break; 131405b261ecSmrg } 131505b261ecSmrg 131605b261ecSmrg if (!PictOpValid (stuff->op)) 131705b261ecSmrg { 131805b261ecSmrg client->errorValue = stuff->op; 131905b261ecSmrg return BadValue; 132005b261ecSmrg } 132105b261ecSmrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 132205b261ecSmrg RenderErrBase + BadPicture); 132305b261ecSmrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 132405b261ecSmrg RenderErrBase + BadPicture); 132505b261ecSmrg if (!pDst->pDrawable) 132605b261ecSmrg return BadDrawable; 132705b261ecSmrg if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) 132805b261ecSmrg return BadMatch; 132905b261ecSmrg if (stuff->maskFormat) 133005b261ecSmrg { 133105b261ecSmrg pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 133205b261ecSmrg stuff->maskFormat, 133305b261ecSmrg PictFormatType, 133405b261ecSmrg DixReadAccess); 133505b261ecSmrg if (!pFormat) 133605b261ecSmrg { 133705b261ecSmrg client->errorValue = stuff->maskFormat; 133805b261ecSmrg return RenderErrBase + BadPictFormat; 133905b261ecSmrg } 134005b261ecSmrg } 134105b261ecSmrg else 134205b261ecSmrg pFormat = 0; 134305b261ecSmrg 134405b261ecSmrg glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client, 134505b261ecSmrg stuff->glyphset, 134605b261ecSmrg GlyphSetType, 13474642e01fSmrg DixUseAccess); 134805b261ecSmrg if (!glyphSet) 134905b261ecSmrg { 135005b261ecSmrg client->errorValue = stuff->glyphset; 135105b261ecSmrg return RenderErrBase + BadGlyphSet; 135205b261ecSmrg } 135305b261ecSmrg 135405b261ecSmrg buffer = (CARD8 *) (stuff + 1); 135505b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 135605b261ecSmrg nglyph = 0; 135705b261ecSmrg nlist = 0; 135805b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 135905b261ecSmrg { 136005b261ecSmrg elt = (xGlyphElt *) buffer; 136105b261ecSmrg buffer += sizeof (xGlyphElt); 136205b261ecSmrg 136305b261ecSmrg if (elt->len == 0xff) 136405b261ecSmrg { 136505b261ecSmrg buffer += 4; 136605b261ecSmrg } 136705b261ecSmrg else 136805b261ecSmrg { 136905b261ecSmrg nlist++; 137005b261ecSmrg nglyph += elt->len; 137105b261ecSmrg space = size * elt->len; 137205b261ecSmrg if (space & 3) 137305b261ecSmrg space += 4 - (space & 3); 137405b261ecSmrg buffer += space; 137505b261ecSmrg } 137605b261ecSmrg } 137705b261ecSmrg if (nglyph <= NLOCALGLYPH) 137805b261ecSmrg glyphsBase = glyphsLocal; 137905b261ecSmrg else 138005b261ecSmrg { 13814642e01fSmrg glyphsBase = (GlyphPtr *) xalloc (nglyph * sizeof (GlyphPtr)); 138205b261ecSmrg if (!glyphsBase) 138305b261ecSmrg return BadAlloc; 138405b261ecSmrg } 138505b261ecSmrg if (nlist <= NLOCALDELTA) 138605b261ecSmrg listsBase = listsLocal; 138705b261ecSmrg else 138805b261ecSmrg { 13894642e01fSmrg listsBase = (GlyphListPtr) xalloc (nlist * sizeof (GlyphListRec)); 139005b261ecSmrg if (!listsBase) 139105b261ecSmrg return BadAlloc; 139205b261ecSmrg } 139305b261ecSmrg buffer = (CARD8 *) (stuff + 1); 139405b261ecSmrg glyphs = glyphsBase; 139505b261ecSmrg lists = listsBase; 139605b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 139705b261ecSmrg { 139805b261ecSmrg elt = (xGlyphElt *) buffer; 139905b261ecSmrg buffer += sizeof (xGlyphElt); 140005b261ecSmrg 140105b261ecSmrg if (elt->len == 0xff) 140205b261ecSmrg { 140305b261ecSmrg if (buffer + sizeof (GlyphSet) < end) 140405b261ecSmrg { 140505b261ecSmrg memcpy(&gs, buffer, sizeof(GlyphSet)); 140605b261ecSmrg glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client, 140705b261ecSmrg gs, 140805b261ecSmrg GlyphSetType, 14094642e01fSmrg DixUseAccess); 141005b261ecSmrg if (!glyphSet) 141105b261ecSmrg { 141205b261ecSmrg client->errorValue = gs; 141305b261ecSmrg if (glyphsBase != glyphsLocal) 14144642e01fSmrg xfree (glyphsBase); 141505b261ecSmrg if (listsBase != listsLocal) 14164642e01fSmrg xfree (listsBase); 141705b261ecSmrg return RenderErrBase + BadGlyphSet; 141805b261ecSmrg } 141905b261ecSmrg } 142005b261ecSmrg buffer += 4; 142105b261ecSmrg } 142205b261ecSmrg else 142305b261ecSmrg { 142405b261ecSmrg lists->xOff = elt->deltax; 142505b261ecSmrg lists->yOff = elt->deltay; 142605b261ecSmrg lists->format = glyphSet->format; 142705b261ecSmrg lists->len = 0; 142805b261ecSmrg n = elt->len; 142905b261ecSmrg while (n--) 143005b261ecSmrg { 143105b261ecSmrg if (buffer + size <= end) 143205b261ecSmrg { 143305b261ecSmrg switch (size) { 143405b261ecSmrg case 1: 143505b261ecSmrg glyph = *((CARD8 *)buffer); break; 143605b261ecSmrg case 2: 143705b261ecSmrg glyph = *((CARD16 *)buffer); break; 143805b261ecSmrg case 4: 143905b261ecSmrg default: 144005b261ecSmrg glyph = *((CARD32 *)buffer); break; 144105b261ecSmrg } 144205b261ecSmrg if ((*glyphs = FindGlyph (glyphSet, glyph))) 144305b261ecSmrg { 144405b261ecSmrg lists->len++; 144505b261ecSmrg glyphs++; 144605b261ecSmrg } 144705b261ecSmrg } 144805b261ecSmrg buffer += size; 144905b261ecSmrg } 145005b261ecSmrg space = size * elt->len; 145105b261ecSmrg if (space & 3) 145205b261ecSmrg buffer += 4 - (space & 3); 145305b261ecSmrg lists++; 145405b261ecSmrg } 145505b261ecSmrg } 145605b261ecSmrg if (buffer > end) 145705b261ecSmrg return BadLength; 145805b261ecSmrg 145905b261ecSmrg CompositeGlyphs (stuff->op, 146005b261ecSmrg pSrc, 146105b261ecSmrg pDst, 146205b261ecSmrg pFormat, 146305b261ecSmrg stuff->xSrc, 146405b261ecSmrg stuff->ySrc, 146505b261ecSmrg nlist, 146605b261ecSmrg listsBase, 146705b261ecSmrg glyphsBase); 146805b261ecSmrg 146905b261ecSmrg if (glyphsBase != glyphsLocal) 14704642e01fSmrg xfree (glyphsBase); 147105b261ecSmrg if (listsBase != listsLocal) 14724642e01fSmrg xfree (listsBase); 147305b261ecSmrg 147405b261ecSmrg return client->noClientException; 147505b261ecSmrg} 147605b261ecSmrg 147705b261ecSmrgstatic int 147805b261ecSmrgProcRenderFillRectangles (ClientPtr client) 147905b261ecSmrg{ 148005b261ecSmrg PicturePtr pDst; 148105b261ecSmrg int things; 148205b261ecSmrg REQUEST(xRenderFillRectanglesReq); 148305b261ecSmrg 148405b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 148505b261ecSmrg if (!PictOpValid (stuff->op)) 148605b261ecSmrg { 148705b261ecSmrg client->errorValue = stuff->op; 148805b261ecSmrg return BadValue; 148905b261ecSmrg } 149005b261ecSmrg VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 149105b261ecSmrg RenderErrBase + BadPicture); 149205b261ecSmrg if (!pDst->pDrawable) 149305b261ecSmrg return BadDrawable; 149405b261ecSmrg 149505b261ecSmrg things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq); 149605b261ecSmrg if (things & 4) 149705b261ecSmrg return(BadLength); 149805b261ecSmrg things >>= 3; 149905b261ecSmrg 150005b261ecSmrg CompositeRects (stuff->op, 150105b261ecSmrg pDst, 150205b261ecSmrg &stuff->color, 150305b261ecSmrg things, 150405b261ecSmrg (xRectangle *) &stuff[1]); 150505b261ecSmrg 150605b261ecSmrg return client->noClientException; 150705b261ecSmrg} 150805b261ecSmrg 150905b261ecSmrgstatic void 151005b261ecSmrgSetBit (unsigned char *line, int x, int bit) 151105b261ecSmrg{ 151205b261ecSmrg unsigned char mask; 151305b261ecSmrg 151405b261ecSmrg if (screenInfo.bitmapBitOrder == LSBFirst) 151505b261ecSmrg mask = (1 << (x & 7)); 151605b261ecSmrg else 151705b261ecSmrg mask = (0x80 >> (x & 7)); 151805b261ecSmrg /* XXX assumes byte order is host byte order */ 151905b261ecSmrg line += (x >> 3); 152005b261ecSmrg if (bit) 152105b261ecSmrg *line |= mask; 152205b261ecSmrg else 152305b261ecSmrg *line &= ~mask; 152405b261ecSmrg} 152505b261ecSmrg 152605b261ecSmrg#define DITHER_DIM 2 152705b261ecSmrg 152805b261ecSmrgstatic CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = { 152905b261ecSmrg { 1, 3, }, 153005b261ecSmrg { 4, 2, }, 153105b261ecSmrg}; 153205b261ecSmrg 153305b261ecSmrg#define DITHER_SIZE ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1) 153405b261ecSmrg 153505b261ecSmrgstatic int 153605b261ecSmrgProcRenderCreateCursor (ClientPtr client) 153705b261ecSmrg{ 153805b261ecSmrg REQUEST(xRenderCreateCursorReq); 153905b261ecSmrg PicturePtr pSrc; 154005b261ecSmrg ScreenPtr pScreen; 154105b261ecSmrg unsigned short width, height; 154205b261ecSmrg CARD32 *argbbits, *argb; 154305b261ecSmrg unsigned char *srcbits, *srcline; 154405b261ecSmrg unsigned char *mskbits, *mskline; 154505b261ecSmrg int stride; 154605b261ecSmrg int x, y; 154705b261ecSmrg int nbytes_mono; 154805b261ecSmrg CursorMetricRec cm; 154905b261ecSmrg CursorPtr pCursor; 155005b261ecSmrg CARD32 twocolor[3]; 15514642e01fSmrg int rc, ncolor; 155205b261ecSmrg 155305b261ecSmrg REQUEST_SIZE_MATCH (xRenderCreateCursorReq); 155405b261ecSmrg LEGAL_NEW_RESOURCE(stuff->cid, client); 155505b261ecSmrg 155605b261ecSmrg VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 155705b261ecSmrg RenderErrBase + BadPicture); 155805b261ecSmrg if (!pSrc->pDrawable) 155905b261ecSmrg return BadDrawable; 156005b261ecSmrg pScreen = pSrc->pDrawable->pScreen; 156105b261ecSmrg width = pSrc->pDrawable->width; 156205b261ecSmrg height = pSrc->pDrawable->height; 156305b261ecSmrg if (height && width > UINT32_MAX/(height*sizeof(CARD32))) 156405b261ecSmrg return BadAlloc; 156505b261ecSmrg if ( stuff->x > width 156605b261ecSmrg || stuff->y > height ) 156705b261ecSmrg return (BadMatch); 156805b261ecSmrg argbbits = xalloc (width * height * sizeof (CARD32)); 156905b261ecSmrg if (!argbbits) 157005b261ecSmrg return (BadAlloc); 157105b261ecSmrg 157205b261ecSmrg stride = BitmapBytePad(width); 157305b261ecSmrg nbytes_mono = stride*height; 15744642e01fSmrg srcbits = xcalloc(1, nbytes_mono); 157505b261ecSmrg if (!srcbits) 157605b261ecSmrg { 157705b261ecSmrg xfree (argbbits); 157805b261ecSmrg return (BadAlloc); 157905b261ecSmrg } 15804642e01fSmrg mskbits = xcalloc(1, nbytes_mono); 158105b261ecSmrg if (!mskbits) 158205b261ecSmrg { 158305b261ecSmrg xfree(argbbits); 158405b261ecSmrg xfree(srcbits); 158505b261ecSmrg return (BadAlloc); 158605b261ecSmrg } 158705b261ecSmrg 158805b261ecSmrg if (pSrc->format == PICT_a8r8g8b8) 158905b261ecSmrg { 159005b261ecSmrg (*pScreen->GetImage) (pSrc->pDrawable, 159105b261ecSmrg 0, 0, width, height, ZPixmap, 159205b261ecSmrg 0xffffffff, (pointer) argbbits); 159305b261ecSmrg } 159405b261ecSmrg else 159505b261ecSmrg { 159605b261ecSmrg PixmapPtr pPixmap; 159705b261ecSmrg PicturePtr pPicture; 159805b261ecSmrg PictFormatPtr pFormat; 159905b261ecSmrg int error; 160005b261ecSmrg 160105b261ecSmrg pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8); 160205b261ecSmrg if (!pFormat) 160305b261ecSmrg { 160405b261ecSmrg xfree (argbbits); 160505b261ecSmrg xfree (srcbits); 160605b261ecSmrg xfree (mskbits); 160705b261ecSmrg return (BadImplementation); 160805b261ecSmrg } 16094642e01fSmrg pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32, 16104642e01fSmrg CREATE_PIXMAP_USAGE_SCRATCH); 161105b261ecSmrg if (!pPixmap) 161205b261ecSmrg { 161305b261ecSmrg xfree (argbbits); 161405b261ecSmrg xfree (srcbits); 161505b261ecSmrg xfree (mskbits); 161605b261ecSmrg return (BadAlloc); 161705b261ecSmrg } 161805b261ecSmrg pPicture = CreatePicture (0, &pPixmap->drawable, pFormat, 0, 0, 161905b261ecSmrg client, &error); 162005b261ecSmrg if (!pPicture) 162105b261ecSmrg { 162205b261ecSmrg xfree (argbbits); 162305b261ecSmrg xfree (srcbits); 162405b261ecSmrg xfree (mskbits); 162505b261ecSmrg return error; 162605b261ecSmrg } 162705b261ecSmrg (*pScreen->DestroyPixmap) (pPixmap); 162805b261ecSmrg CompositePicture (PictOpSrc, 162905b261ecSmrg pSrc, 0, pPicture, 163005b261ecSmrg 0, 0, 0, 0, 0, 0, width, height); 163105b261ecSmrg (*pScreen->GetImage) (pPicture->pDrawable, 163205b261ecSmrg 0, 0, width, height, ZPixmap, 163305b261ecSmrg 0xffffffff, (pointer) argbbits); 163405b261ecSmrg FreePicture (pPicture, 0); 163505b261ecSmrg } 163605b261ecSmrg /* 163705b261ecSmrg * Check whether the cursor can be directly supported by 163805b261ecSmrg * the core cursor code 163905b261ecSmrg */ 164005b261ecSmrg ncolor = 0; 164105b261ecSmrg argb = argbbits; 164205b261ecSmrg for (y = 0; ncolor <= 2 && y < height; y++) 164305b261ecSmrg { 164405b261ecSmrg for (x = 0; ncolor <= 2 && x < width; x++) 164505b261ecSmrg { 164605b261ecSmrg CARD32 p = *argb++; 164705b261ecSmrg CARD32 a = (p >> 24); 164805b261ecSmrg 164905b261ecSmrg if (a == 0) /* transparent */ 165005b261ecSmrg continue; 165105b261ecSmrg if (a == 0xff) /* opaque */ 165205b261ecSmrg { 165305b261ecSmrg int n; 165405b261ecSmrg for (n = 0; n < ncolor; n++) 165505b261ecSmrg if (p == twocolor[n]) 165605b261ecSmrg break; 165705b261ecSmrg if (n == ncolor) 165805b261ecSmrg twocolor[ncolor++] = p; 165905b261ecSmrg } 166005b261ecSmrg else 166105b261ecSmrg ncolor = 3; 166205b261ecSmrg } 166305b261ecSmrg } 166405b261ecSmrg 166505b261ecSmrg /* 166605b261ecSmrg * Convert argb image to two plane cursor 166705b261ecSmrg */ 166805b261ecSmrg srcline = srcbits; 166905b261ecSmrg mskline = mskbits; 167005b261ecSmrg argb = argbbits; 167105b261ecSmrg for (y = 0; y < height; y++) 167205b261ecSmrg { 167305b261ecSmrg for (x = 0; x < width; x++) 167405b261ecSmrg { 167505b261ecSmrg CARD32 p = *argb++; 167605b261ecSmrg 167705b261ecSmrg if (ncolor <= 2) 167805b261ecSmrg { 167905b261ecSmrg CARD32 a = ((p >> 24)); 168005b261ecSmrg 168105b261ecSmrg SetBit (mskline, x, a != 0); 168205b261ecSmrg SetBit (srcline, x, a != 0 && p == twocolor[0]); 168305b261ecSmrg } 168405b261ecSmrg else 168505b261ecSmrg { 168605b261ecSmrg CARD32 a = ((p >> 24) * DITHER_SIZE + 127) / 255; 168705b261ecSmrg CARD32 i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255; 168805b261ecSmrg CARD32 d = orderedDither[y&(DITHER_DIM-1)][x&(DITHER_DIM-1)]; 168905b261ecSmrg /* Set mask from dithered alpha value */ 169005b261ecSmrg SetBit(mskline, x, a > d); 169105b261ecSmrg /* Set src from dithered intensity value */ 169205b261ecSmrg SetBit(srcline, x, a > d && i <= d); 169305b261ecSmrg } 169405b261ecSmrg } 169505b261ecSmrg srcline += stride; 169605b261ecSmrg mskline += stride; 169705b261ecSmrg } 169805b261ecSmrg /* 169905b261ecSmrg * Dither to white and black if the cursor has more than two colors 170005b261ecSmrg */ 170105b261ecSmrg if (ncolor > 2) 170205b261ecSmrg { 170305b261ecSmrg twocolor[0] = 0xff000000; 170405b261ecSmrg twocolor[1] = 0xffffffff; 170505b261ecSmrg } 170605b261ecSmrg else 170705b261ecSmrg { 170805b261ecSmrg xfree (argbbits); 170905b261ecSmrg argbbits = 0; 171005b261ecSmrg } 171105b261ecSmrg 171205b261ecSmrg#define GetByte(p,s) (((p) >> (s)) & 0xff) 171305b261ecSmrg#define GetColor(p,s) (GetByte(p,s) | (GetByte(p,s) << 8)) 171405b261ecSmrg 171505b261ecSmrg cm.width = width; 171605b261ecSmrg cm.height = height; 171705b261ecSmrg cm.xhot = stuff->x; 171805b261ecSmrg cm.yhot = stuff->y; 17194642e01fSmrg rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm, 17204642e01fSmrg GetColor(twocolor[0], 16), 17214642e01fSmrg GetColor(twocolor[0], 8), 17224642e01fSmrg GetColor(twocolor[0], 0), 17234642e01fSmrg GetColor(twocolor[1], 16), 17244642e01fSmrg GetColor(twocolor[1], 8), 17254642e01fSmrg GetColor(twocolor[1], 0), 17264642e01fSmrg &pCursor, client, stuff->cid); 17274642e01fSmrg if (rc != Success) 17284642e01fSmrg return rc; 17294642e01fSmrg if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor)) 17304642e01fSmrg return BadAlloc; 17314642e01fSmrg 17324642e01fSmrg return client->noClientException; 173305b261ecSmrg} 173405b261ecSmrg 173505b261ecSmrgstatic int 173605b261ecSmrgProcRenderSetPictureTransform (ClientPtr client) 173705b261ecSmrg{ 173805b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 173905b261ecSmrg PicturePtr pPicture; 174005b261ecSmrg int result; 174105b261ecSmrg 174205b261ecSmrg REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq); 17434642e01fSmrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess, 174405b261ecSmrg RenderErrBase + BadPicture); 174505b261ecSmrg result = SetPictureTransform (pPicture, (PictTransform *) &stuff->transform); 174605b261ecSmrg if (client->noClientException != Success) 174705b261ecSmrg return(client->noClientException); 174805b261ecSmrg else 174905b261ecSmrg return(result); 175005b261ecSmrg} 175105b261ecSmrg 175205b261ecSmrgstatic int 175305b261ecSmrgProcRenderQueryFilters (ClientPtr client) 175405b261ecSmrg{ 175505b261ecSmrg REQUEST (xRenderQueryFiltersReq); 175605b261ecSmrg DrawablePtr pDrawable; 175705b261ecSmrg xRenderQueryFiltersReply *reply; 175805b261ecSmrg int nbytesName; 175905b261ecSmrg int nnames; 176005b261ecSmrg ScreenPtr pScreen; 176105b261ecSmrg PictureScreenPtr ps; 176205b261ecSmrg int i, j, len, total_bytes, rc; 176305b261ecSmrg INT16 *aliases; 176405b261ecSmrg char *names; 176505b261ecSmrg 176605b261ecSmrg REQUEST_SIZE_MATCH(xRenderQueryFiltersReq); 176705b261ecSmrg rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0, 17684642e01fSmrg DixGetAttrAccess); 176905b261ecSmrg if (rc != Success) 177005b261ecSmrg return rc; 177105b261ecSmrg 177205b261ecSmrg pScreen = pDrawable->pScreen; 177305b261ecSmrg nbytesName = 0; 177405b261ecSmrg nnames = 0; 177505b261ecSmrg ps = GetPictureScreenIfSet(pScreen); 177605b261ecSmrg if (ps) 177705b261ecSmrg { 177805b261ecSmrg for (i = 0; i < ps->nfilters; i++) 177905b261ecSmrg nbytesName += 1 + strlen (ps->filters[i].name); 178005b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 178105b261ecSmrg nbytesName += 1 + strlen (ps->filterAliases[i].alias); 178205b261ecSmrg nnames = ps->nfilters + ps->nfilterAliases; 178305b261ecSmrg } 178405b261ecSmrg len = ((nnames + 1) >> 1) + ((nbytesName + 3) >> 2); 178505b261ecSmrg total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2); 178605b261ecSmrg reply = (xRenderQueryFiltersReply *) xalloc (total_bytes); 178705b261ecSmrg if (!reply) 178805b261ecSmrg return BadAlloc; 178905b261ecSmrg aliases = (INT16 *) (reply + 1); 179005b261ecSmrg names = (char *) (aliases + ((nnames + 1) & ~1)); 179105b261ecSmrg 179205b261ecSmrg reply->type = X_Reply; 179305b261ecSmrg reply->sequenceNumber = client->sequence; 179405b261ecSmrg reply->length = len; 179505b261ecSmrg reply->numAliases = nnames; 179605b261ecSmrg reply->numFilters = nnames; 179705b261ecSmrg if (ps) 179805b261ecSmrg { 179905b261ecSmrg 180005b261ecSmrg /* fill in alias values */ 180105b261ecSmrg for (i = 0; i < ps->nfilters; i++) 180205b261ecSmrg aliases[i] = FilterAliasNone; 180305b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 180405b261ecSmrg { 180505b261ecSmrg for (j = 0; j < ps->nfilters; j++) 180605b261ecSmrg if (ps->filterAliases[i].filter_id == ps->filters[j].id) 180705b261ecSmrg break; 180805b261ecSmrg if (j == ps->nfilters) 180905b261ecSmrg { 181005b261ecSmrg for (j = 0; j < ps->nfilterAliases; j++) 181105b261ecSmrg if (ps->filterAliases[i].filter_id == 181205b261ecSmrg ps->filterAliases[j].alias_id) 181305b261ecSmrg { 181405b261ecSmrg break; 181505b261ecSmrg } 181605b261ecSmrg if (j == ps->nfilterAliases) 181705b261ecSmrg j = FilterAliasNone; 181805b261ecSmrg else 181905b261ecSmrg j = j + ps->nfilters; 182005b261ecSmrg } 182105b261ecSmrg aliases[i + ps->nfilters] = j; 182205b261ecSmrg } 182305b261ecSmrg 182405b261ecSmrg /* fill in filter names */ 182505b261ecSmrg for (i = 0; i < ps->nfilters; i++) 182605b261ecSmrg { 182705b261ecSmrg j = strlen (ps->filters[i].name); 182805b261ecSmrg *names++ = j; 182905b261ecSmrg strncpy (names, ps->filters[i].name, j); 183005b261ecSmrg names += j; 183105b261ecSmrg } 183205b261ecSmrg 183305b261ecSmrg /* fill in filter alias names */ 183405b261ecSmrg for (i = 0; i < ps->nfilterAliases; i++) 183505b261ecSmrg { 183605b261ecSmrg j = strlen (ps->filterAliases[i].alias); 183705b261ecSmrg *names++ = j; 183805b261ecSmrg strncpy (names, ps->filterAliases[i].alias, j); 183905b261ecSmrg names += j; 184005b261ecSmrg } 184105b261ecSmrg } 184205b261ecSmrg 184305b261ecSmrg if (client->swapped) 184405b261ecSmrg { 184505b261ecSmrg register int n; 184605b261ecSmrg 184705b261ecSmrg for (i = 0; i < reply->numAliases; i++) 184805b261ecSmrg { 184905b261ecSmrg swaps (&aliases[i], n); 185005b261ecSmrg } 185105b261ecSmrg swaps(&reply->sequenceNumber, n); 185205b261ecSmrg swapl(&reply->length, n); 185305b261ecSmrg swapl(&reply->numAliases, n); 185405b261ecSmrg swapl(&reply->numFilters, n); 185505b261ecSmrg } 185605b261ecSmrg WriteToClient(client, total_bytes, (char *) reply); 185705b261ecSmrg xfree (reply); 185805b261ecSmrg 185905b261ecSmrg return(client->noClientException); 186005b261ecSmrg} 186105b261ecSmrg 186205b261ecSmrgstatic int 186305b261ecSmrgProcRenderSetPictureFilter (ClientPtr client) 186405b261ecSmrg{ 186505b261ecSmrg REQUEST (xRenderSetPictureFilterReq); 186605b261ecSmrg PicturePtr pPicture; 186705b261ecSmrg int result; 186805b261ecSmrg xFixed *params; 186905b261ecSmrg int nparams; 187005b261ecSmrg char *name; 187105b261ecSmrg 187205b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq); 18734642e01fSmrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess, 187405b261ecSmrg RenderErrBase + BadPicture); 187505b261ecSmrg name = (char *) (stuff + 1); 187605b261ecSmrg params = (xFixed *) (name + ((stuff->nbytes + 3) & ~3)); 187705b261ecSmrg nparams = ((xFixed *) stuff + client->req_len) - params; 187805b261ecSmrg result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams); 187905b261ecSmrg return result; 188005b261ecSmrg} 188105b261ecSmrg 188205b261ecSmrgstatic int 188305b261ecSmrgProcRenderCreateAnimCursor (ClientPtr client) 188405b261ecSmrg{ 188505b261ecSmrg REQUEST(xRenderCreateAnimCursorReq); 188605b261ecSmrg CursorPtr *cursors; 188705b261ecSmrg CARD32 *deltas; 188805b261ecSmrg CursorPtr pCursor; 188905b261ecSmrg int ncursor; 189005b261ecSmrg xAnimCursorElt *elt; 189105b261ecSmrg int i; 189205b261ecSmrg int ret; 189305b261ecSmrg 189405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq); 189505b261ecSmrg LEGAL_NEW_RESOURCE(stuff->cid, client); 189605b261ecSmrg if (client->req_len & 1) 189705b261ecSmrg return BadLength; 189805b261ecSmrg ncursor = (client->req_len - (SIZEOF(xRenderCreateAnimCursorReq) >> 2)) >> 1; 189905b261ecSmrg cursors = xalloc (ncursor * (sizeof (CursorPtr) + sizeof (CARD32))); 190005b261ecSmrg if (!cursors) 190105b261ecSmrg return BadAlloc; 190205b261ecSmrg deltas = (CARD32 *) (cursors + ncursor); 190305b261ecSmrg elt = (xAnimCursorElt *) (stuff + 1); 190405b261ecSmrg for (i = 0; i < ncursor; i++) 190505b261ecSmrg { 190605b261ecSmrg cursors[i] = (CursorPtr)SecurityLookupIDByType(client, elt->cursor, 190705b261ecSmrg RT_CURSOR, DixReadAccess); 190805b261ecSmrg if (!cursors[i]) 190905b261ecSmrg { 191005b261ecSmrg xfree (cursors); 191105b261ecSmrg client->errorValue = elt->cursor; 191205b261ecSmrg return BadCursor; 191305b261ecSmrg } 191405b261ecSmrg deltas[i] = elt->delay; 191505b261ecSmrg elt++; 191605b261ecSmrg } 19174642e01fSmrg ret = AnimCursorCreate (cursors, deltas, ncursor, &pCursor, client, 19184642e01fSmrg stuff->cid); 191905b261ecSmrg xfree (cursors); 192005b261ecSmrg if (ret != Success) 192105b261ecSmrg return ret; 192205b261ecSmrg 192305b261ecSmrg if (AddResource (stuff->cid, RT_CURSOR, (pointer)pCursor)) 192405b261ecSmrg return client->noClientException; 192505b261ecSmrg return BadAlloc; 192605b261ecSmrg} 192705b261ecSmrg 192805b261ecSmrgstatic int 192905b261ecSmrgProcRenderAddTraps (ClientPtr client) 193005b261ecSmrg{ 193105b261ecSmrg int ntraps; 193205b261ecSmrg PicturePtr pPicture; 193305b261ecSmrg REQUEST(xRenderAddTrapsReq); 193405b261ecSmrg 193505b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq); 193605b261ecSmrg VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess, 193705b261ecSmrg RenderErrBase + BadPicture); 193805b261ecSmrg if (!pPicture->pDrawable) 193905b261ecSmrg return BadDrawable; 194005b261ecSmrg ntraps = (client->req_len << 2) - sizeof (xRenderAddTrapsReq); 194105b261ecSmrg if (ntraps % sizeof (xTrap)) 194205b261ecSmrg return BadLength; 194305b261ecSmrg ntraps /= sizeof (xTrap); 194405b261ecSmrg if (ntraps) 194505b261ecSmrg AddTraps (pPicture, 194605b261ecSmrg stuff->xOff, stuff->yOff, 194705b261ecSmrg ntraps, (xTrap *) &stuff[1]); 194805b261ecSmrg return client->noClientException; 194905b261ecSmrg} 195005b261ecSmrg 195105b261ecSmrgstatic int ProcRenderCreateSolidFill(ClientPtr client) 195205b261ecSmrg{ 195305b261ecSmrg PicturePtr pPicture; 195405b261ecSmrg int error = 0; 195505b261ecSmrg REQUEST(xRenderCreateSolidFillReq); 195605b261ecSmrg 195705b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq); 195805b261ecSmrg 195905b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 196005b261ecSmrg 196105b261ecSmrg pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error); 196205b261ecSmrg if (!pPicture) 196305b261ecSmrg return error; 19644642e01fSmrg /* security creation/labeling check */ 19654642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 19664642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 19674642e01fSmrg if (error != Success) 19684642e01fSmrg return error; 196905b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 197005b261ecSmrg return BadAlloc; 197105b261ecSmrg return Success; 197205b261ecSmrg} 197305b261ecSmrg 197405b261ecSmrgstatic int ProcRenderCreateLinearGradient (ClientPtr client) 197505b261ecSmrg{ 197605b261ecSmrg PicturePtr pPicture; 197705b261ecSmrg int len; 197805b261ecSmrg int error = 0; 197905b261ecSmrg xFixed *stops; 198005b261ecSmrg xRenderColor *colors; 198105b261ecSmrg REQUEST(xRenderCreateLinearGradientReq); 198205b261ecSmrg 198305b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq); 198405b261ecSmrg 198505b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 198605b261ecSmrg 198705b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 198805b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 198905b261ecSmrg return BadLength; 199005b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 199105b261ecSmrg return BadLength; 199205b261ecSmrg 199305b261ecSmrg stops = (xFixed *)(stuff + 1); 199405b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 199505b261ecSmrg 199605b261ecSmrg pPicture = CreateLinearGradientPicture (stuff->pid, &stuff->p1, &stuff->p2, 199705b261ecSmrg stuff->nStops, stops, colors, &error); 199805b261ecSmrg if (!pPicture) 199905b261ecSmrg return error; 20004642e01fSmrg /* security creation/labeling check */ 20014642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 20024642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 20034642e01fSmrg if (error != Success) 20044642e01fSmrg return error; 200505b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 200605b261ecSmrg return BadAlloc; 200705b261ecSmrg return Success; 200805b261ecSmrg} 200905b261ecSmrg 201005b261ecSmrgstatic int ProcRenderCreateRadialGradient (ClientPtr client) 201105b261ecSmrg{ 201205b261ecSmrg PicturePtr pPicture; 201305b261ecSmrg int len; 201405b261ecSmrg int error = 0; 201505b261ecSmrg xFixed *stops; 201605b261ecSmrg xRenderColor *colors; 201705b261ecSmrg REQUEST(xRenderCreateRadialGradientReq); 201805b261ecSmrg 201905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); 202005b261ecSmrg 202105b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 202205b261ecSmrg 202305b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 202405b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 202505b261ecSmrg return BadLength; 202605b261ecSmrg 202705b261ecSmrg stops = (xFixed *)(stuff + 1); 202805b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 202905b261ecSmrg 203005b261ecSmrg pPicture = CreateRadialGradientPicture (stuff->pid, &stuff->inner, &stuff->outer, 203105b261ecSmrg stuff->inner_radius, stuff->outer_radius, 203205b261ecSmrg stuff->nStops, stops, colors, &error); 203305b261ecSmrg if (!pPicture) 203405b261ecSmrg return error; 20354642e01fSmrg /* security creation/labeling check */ 20364642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 20374642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 20384642e01fSmrg if (error != Success) 20394642e01fSmrg return error; 204005b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 204105b261ecSmrg return BadAlloc; 204205b261ecSmrg return Success; 204305b261ecSmrg} 204405b261ecSmrg 204505b261ecSmrgstatic int ProcRenderCreateConicalGradient (ClientPtr client) 204605b261ecSmrg{ 204705b261ecSmrg PicturePtr pPicture; 204805b261ecSmrg int len; 204905b261ecSmrg int error = 0; 205005b261ecSmrg xFixed *stops; 205105b261ecSmrg xRenderColor *colors; 205205b261ecSmrg REQUEST(xRenderCreateConicalGradientReq); 205305b261ecSmrg 205405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq); 205505b261ecSmrg 205605b261ecSmrg LEGAL_NEW_RESOURCE(stuff->pid, client); 205705b261ecSmrg 205805b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 205905b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 206005b261ecSmrg return BadLength; 206105b261ecSmrg 206205b261ecSmrg stops = (xFixed *)(stuff + 1); 206305b261ecSmrg colors = (xRenderColor *)(stops + stuff->nStops); 206405b261ecSmrg 206505b261ecSmrg pPicture = CreateConicalGradientPicture (stuff->pid, &stuff->center, stuff->angle, 206605b261ecSmrg stuff->nStops, stops, colors, &error); 206705b261ecSmrg if (!pPicture) 206805b261ecSmrg return error; 20694642e01fSmrg /* security creation/labeling check */ 20704642e01fSmrg error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType, 20714642e01fSmrg pPicture, RT_NONE, NULL, DixCreateAccess); 20724642e01fSmrg if (error != Success) 20734642e01fSmrg return error; 207405b261ecSmrg if (!AddResource (stuff->pid, PictureType, (pointer)pPicture)) 207505b261ecSmrg return BadAlloc; 207605b261ecSmrg return Success; 207705b261ecSmrg} 207805b261ecSmrg 207905b261ecSmrg 208005b261ecSmrgstatic int 208105b261ecSmrgProcRenderDispatch (ClientPtr client) 208205b261ecSmrg{ 208305b261ecSmrg REQUEST(xReq); 208405b261ecSmrg 208505b261ecSmrg if (stuff->data < RenderNumberRequests) 208605b261ecSmrg return (*ProcRenderVector[stuff->data]) (client); 208705b261ecSmrg else 208805b261ecSmrg return BadRequest; 208905b261ecSmrg} 209005b261ecSmrg 209105b261ecSmrgstatic int 209205b261ecSmrgSProcRenderQueryVersion (ClientPtr client) 209305b261ecSmrg{ 209405b261ecSmrg register int n; 209505b261ecSmrg REQUEST(xRenderQueryVersionReq); 209605b261ecSmrg 209705b261ecSmrg swaps(&stuff->length, n); 209805b261ecSmrg swapl(&stuff->majorVersion, n); 209905b261ecSmrg swapl(&stuff->minorVersion, n); 210005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType])(client); 210105b261ecSmrg} 210205b261ecSmrg 210305b261ecSmrgstatic int 210405b261ecSmrgSProcRenderQueryPictFormats (ClientPtr client) 210505b261ecSmrg{ 210605b261ecSmrg register int n; 210705b261ecSmrg REQUEST(xRenderQueryPictFormatsReq); 210805b261ecSmrg swaps(&stuff->length, n); 210905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 211005b261ecSmrg} 211105b261ecSmrg 211205b261ecSmrgstatic int 211305b261ecSmrgSProcRenderQueryPictIndexValues (ClientPtr client) 211405b261ecSmrg{ 211505b261ecSmrg register int n; 211605b261ecSmrg REQUEST(xRenderQueryPictIndexValuesReq); 211705b261ecSmrg swaps(&stuff->length, n); 211805b261ecSmrg swapl(&stuff->format, n); 211905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 212005b261ecSmrg} 212105b261ecSmrg 212205b261ecSmrgstatic int 212305b261ecSmrgSProcRenderQueryDithers (ClientPtr client) 212405b261ecSmrg{ 212505b261ecSmrg return BadImplementation; 212605b261ecSmrg} 212705b261ecSmrg 212805b261ecSmrgstatic int 212905b261ecSmrgSProcRenderCreatePicture (ClientPtr client) 213005b261ecSmrg{ 213105b261ecSmrg register int n; 213205b261ecSmrg REQUEST(xRenderCreatePictureReq); 213305b261ecSmrg swaps(&stuff->length, n); 213405b261ecSmrg swapl(&stuff->pid, n); 213505b261ecSmrg swapl(&stuff->drawable, n); 213605b261ecSmrg swapl(&stuff->format, n); 213705b261ecSmrg swapl(&stuff->mask, n); 213805b261ecSmrg SwapRestL(stuff); 213905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 214005b261ecSmrg} 214105b261ecSmrg 214205b261ecSmrgstatic int 214305b261ecSmrgSProcRenderChangePicture (ClientPtr client) 214405b261ecSmrg{ 214505b261ecSmrg register int n; 214605b261ecSmrg REQUEST(xRenderChangePictureReq); 214705b261ecSmrg swaps(&stuff->length, n); 214805b261ecSmrg swapl(&stuff->picture, n); 214905b261ecSmrg swapl(&stuff->mask, n); 215005b261ecSmrg SwapRestL(stuff); 215105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 215205b261ecSmrg} 215305b261ecSmrg 215405b261ecSmrgstatic int 215505b261ecSmrgSProcRenderSetPictureClipRectangles (ClientPtr client) 215605b261ecSmrg{ 215705b261ecSmrg register int n; 215805b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 215905b261ecSmrg swaps(&stuff->length, n); 216005b261ecSmrg swapl(&stuff->picture, n); 216105b261ecSmrg swaps(&stuff->xOrigin, n); 216205b261ecSmrg swaps(&stuff->yOrigin, n); 216305b261ecSmrg SwapRestS(stuff); 216405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 216505b261ecSmrg} 216605b261ecSmrg 216705b261ecSmrgstatic int 216805b261ecSmrgSProcRenderFreePicture (ClientPtr client) 216905b261ecSmrg{ 217005b261ecSmrg register int n; 217105b261ecSmrg REQUEST(xRenderFreePictureReq); 217205b261ecSmrg swaps(&stuff->length, n); 217305b261ecSmrg swapl(&stuff->picture, n); 217405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 217505b261ecSmrg} 217605b261ecSmrg 217705b261ecSmrgstatic int 217805b261ecSmrgSProcRenderComposite (ClientPtr client) 217905b261ecSmrg{ 218005b261ecSmrg register int n; 218105b261ecSmrg REQUEST(xRenderCompositeReq); 218205b261ecSmrg swaps(&stuff->length, n); 218305b261ecSmrg swapl(&stuff->src, n); 218405b261ecSmrg swapl(&stuff->mask, n); 218505b261ecSmrg swapl(&stuff->dst, n); 218605b261ecSmrg swaps(&stuff->xSrc, n); 218705b261ecSmrg swaps(&stuff->ySrc, n); 218805b261ecSmrg swaps(&stuff->xMask, n); 218905b261ecSmrg swaps(&stuff->yMask, n); 219005b261ecSmrg swaps(&stuff->xDst, n); 219105b261ecSmrg swaps(&stuff->yDst, n); 219205b261ecSmrg swaps(&stuff->width, n); 219305b261ecSmrg swaps(&stuff->height, n); 219405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 219505b261ecSmrg} 219605b261ecSmrg 219705b261ecSmrgstatic int 219805b261ecSmrgSProcRenderScale (ClientPtr client) 219905b261ecSmrg{ 220005b261ecSmrg register int n; 220105b261ecSmrg REQUEST(xRenderScaleReq); 220205b261ecSmrg swaps(&stuff->length, n); 220305b261ecSmrg swapl(&stuff->src, n); 220405b261ecSmrg swapl(&stuff->dst, n); 220505b261ecSmrg swapl(&stuff->colorScale, n); 220605b261ecSmrg swapl(&stuff->alphaScale, n); 220705b261ecSmrg swaps(&stuff->xSrc, n); 220805b261ecSmrg swaps(&stuff->ySrc, n); 220905b261ecSmrg swaps(&stuff->xDst, n); 221005b261ecSmrg swaps(&stuff->yDst, n); 221105b261ecSmrg swaps(&stuff->width, n); 221205b261ecSmrg swaps(&stuff->height, n); 221305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 221405b261ecSmrg} 221505b261ecSmrg 221605b261ecSmrgstatic int 221705b261ecSmrgSProcRenderTrapezoids (ClientPtr client) 221805b261ecSmrg{ 221905b261ecSmrg register int n; 222005b261ecSmrg REQUEST(xRenderTrapezoidsReq); 222105b261ecSmrg 222205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq); 222305b261ecSmrg swaps (&stuff->length, n); 222405b261ecSmrg swapl (&stuff->src, n); 222505b261ecSmrg swapl (&stuff->dst, n); 222605b261ecSmrg swapl (&stuff->maskFormat, n); 222705b261ecSmrg swaps (&stuff->xSrc, n); 222805b261ecSmrg swaps (&stuff->ySrc, n); 222905b261ecSmrg SwapRestL(stuff); 223005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 223105b261ecSmrg} 223205b261ecSmrg 223305b261ecSmrgstatic int 223405b261ecSmrgSProcRenderTriangles (ClientPtr client) 223505b261ecSmrg{ 223605b261ecSmrg register int n; 223705b261ecSmrg REQUEST(xRenderTrianglesReq); 223805b261ecSmrg 223905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq); 224005b261ecSmrg swaps (&stuff->length, n); 224105b261ecSmrg swapl (&stuff->src, n); 224205b261ecSmrg swapl (&stuff->dst, n); 224305b261ecSmrg swapl (&stuff->maskFormat, n); 224405b261ecSmrg swaps (&stuff->xSrc, n); 224505b261ecSmrg swaps (&stuff->ySrc, n); 224605b261ecSmrg SwapRestL(stuff); 224705b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 224805b261ecSmrg} 224905b261ecSmrg 225005b261ecSmrgstatic int 225105b261ecSmrgSProcRenderTriStrip (ClientPtr client) 225205b261ecSmrg{ 225305b261ecSmrg register int n; 225405b261ecSmrg REQUEST(xRenderTriStripReq); 225505b261ecSmrg 225605b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriStripReq); 225705b261ecSmrg swaps (&stuff->length, n); 225805b261ecSmrg swapl (&stuff->src, n); 225905b261ecSmrg swapl (&stuff->dst, n); 226005b261ecSmrg swapl (&stuff->maskFormat, n); 226105b261ecSmrg swaps (&stuff->xSrc, n); 226205b261ecSmrg swaps (&stuff->ySrc, n); 226305b261ecSmrg SwapRestL(stuff); 226405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 226505b261ecSmrg} 226605b261ecSmrg 226705b261ecSmrgstatic int 226805b261ecSmrgSProcRenderTriFan (ClientPtr client) 226905b261ecSmrg{ 227005b261ecSmrg register int n; 227105b261ecSmrg REQUEST(xRenderTriFanReq); 227205b261ecSmrg 227305b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderTriFanReq); 227405b261ecSmrg swaps (&stuff->length, n); 227505b261ecSmrg swapl (&stuff->src, n); 227605b261ecSmrg swapl (&stuff->dst, n); 227705b261ecSmrg swapl (&stuff->maskFormat, n); 227805b261ecSmrg swaps (&stuff->xSrc, n); 227905b261ecSmrg swaps (&stuff->ySrc, n); 228005b261ecSmrg SwapRestL(stuff); 228105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 228205b261ecSmrg} 228305b261ecSmrg 228405b261ecSmrgstatic int 228505b261ecSmrgSProcRenderColorTrapezoids (ClientPtr client) 228605b261ecSmrg{ 228705b261ecSmrg return BadImplementation; 228805b261ecSmrg} 228905b261ecSmrg 229005b261ecSmrgstatic int 229105b261ecSmrgSProcRenderColorTriangles (ClientPtr client) 229205b261ecSmrg{ 229305b261ecSmrg return BadImplementation; 229405b261ecSmrg} 229505b261ecSmrg 229605b261ecSmrgstatic int 229705b261ecSmrgSProcRenderTransform (ClientPtr client) 229805b261ecSmrg{ 229905b261ecSmrg return BadImplementation; 230005b261ecSmrg} 230105b261ecSmrg 230205b261ecSmrgstatic int 230305b261ecSmrgSProcRenderCreateGlyphSet (ClientPtr client) 230405b261ecSmrg{ 230505b261ecSmrg register int n; 230605b261ecSmrg REQUEST(xRenderCreateGlyphSetReq); 230705b261ecSmrg swaps(&stuff->length, n); 230805b261ecSmrg swapl(&stuff->gsid, n); 230905b261ecSmrg swapl(&stuff->format, n); 231005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 231105b261ecSmrg} 231205b261ecSmrg 231305b261ecSmrgstatic int 231405b261ecSmrgSProcRenderReferenceGlyphSet (ClientPtr client) 231505b261ecSmrg{ 231605b261ecSmrg register int n; 231705b261ecSmrg REQUEST(xRenderReferenceGlyphSetReq); 231805b261ecSmrg swaps(&stuff->length, n); 231905b261ecSmrg swapl(&stuff->gsid, n); 232005b261ecSmrg swapl(&stuff->existing, n); 232105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 232205b261ecSmrg} 232305b261ecSmrg 232405b261ecSmrgstatic int 232505b261ecSmrgSProcRenderFreeGlyphSet (ClientPtr client) 232605b261ecSmrg{ 232705b261ecSmrg register int n; 232805b261ecSmrg REQUEST(xRenderFreeGlyphSetReq); 232905b261ecSmrg swaps(&stuff->length, n); 233005b261ecSmrg swapl(&stuff->glyphset, n); 233105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 233205b261ecSmrg} 233305b261ecSmrg 233405b261ecSmrgstatic int 233505b261ecSmrgSProcRenderAddGlyphs (ClientPtr client) 233605b261ecSmrg{ 233705b261ecSmrg register int n; 233805b261ecSmrg register int i; 233905b261ecSmrg CARD32 *gids; 234005b261ecSmrg void *end; 234105b261ecSmrg xGlyphInfo *gi; 234205b261ecSmrg REQUEST(xRenderAddGlyphsReq); 234305b261ecSmrg swaps(&stuff->length, n); 234405b261ecSmrg swapl(&stuff->glyphset, n); 234505b261ecSmrg swapl(&stuff->nglyphs, n); 234605b261ecSmrg if (stuff->nglyphs & 0xe0000000) 234705b261ecSmrg return BadLength; 234805b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 234905b261ecSmrg gids = (CARD32 *) (stuff + 1); 235005b261ecSmrg gi = (xGlyphInfo *) (gids + stuff->nglyphs); 235105b261ecSmrg if ((char *) end - (char *) (gids + stuff->nglyphs) < 0) 235205b261ecSmrg return BadLength; 235305b261ecSmrg if ((char *) end - (char *) (gi + stuff->nglyphs) < 0) 235405b261ecSmrg return BadLength; 235505b261ecSmrg for (i = 0; i < stuff->nglyphs; i++) 235605b261ecSmrg { 235705b261ecSmrg swapl (&gids[i], n); 235805b261ecSmrg swaps (&gi[i].width, n); 235905b261ecSmrg swaps (&gi[i].height, n); 236005b261ecSmrg swaps (&gi[i].x, n); 236105b261ecSmrg swaps (&gi[i].y, n); 236205b261ecSmrg swaps (&gi[i].xOff, n); 236305b261ecSmrg swaps (&gi[i].yOff, n); 236405b261ecSmrg } 236505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 236605b261ecSmrg} 236705b261ecSmrg 236805b261ecSmrgstatic int 236905b261ecSmrgSProcRenderAddGlyphsFromPicture (ClientPtr client) 237005b261ecSmrg{ 237105b261ecSmrg return BadImplementation; 237205b261ecSmrg} 237305b261ecSmrg 237405b261ecSmrgstatic int 237505b261ecSmrgSProcRenderFreeGlyphs (ClientPtr client) 237605b261ecSmrg{ 237705b261ecSmrg register int n; 237805b261ecSmrg REQUEST(xRenderFreeGlyphsReq); 237905b261ecSmrg swaps(&stuff->length, n); 238005b261ecSmrg swapl(&stuff->glyphset, n); 238105b261ecSmrg SwapRestL(stuff); 238205b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 238305b261ecSmrg} 238405b261ecSmrg 238505b261ecSmrgstatic int 238605b261ecSmrgSProcRenderCompositeGlyphs (ClientPtr client) 238705b261ecSmrg{ 238805b261ecSmrg register int n; 238905b261ecSmrg xGlyphElt *elt; 239005b261ecSmrg CARD8 *buffer; 239105b261ecSmrg CARD8 *end; 239205b261ecSmrg int space; 239305b261ecSmrg int i; 239405b261ecSmrg int size; 239505b261ecSmrg 239605b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 239705b261ecSmrg 239805b261ecSmrg switch (stuff->renderReqType) { 239905b261ecSmrg default: size = 1; break; 240005b261ecSmrg case X_RenderCompositeGlyphs16: size = 2; break; 240105b261ecSmrg case X_RenderCompositeGlyphs32: size = 4; break; 240205b261ecSmrg } 240305b261ecSmrg 240405b261ecSmrg swaps(&stuff->length, n); 240505b261ecSmrg swapl(&stuff->src, n); 240605b261ecSmrg swapl(&stuff->dst, n); 240705b261ecSmrg swapl(&stuff->maskFormat, n); 240805b261ecSmrg swapl(&stuff->glyphset, n); 240905b261ecSmrg swaps(&stuff->xSrc, n); 241005b261ecSmrg swaps(&stuff->ySrc, n); 241105b261ecSmrg buffer = (CARD8 *) (stuff + 1); 241205b261ecSmrg end = (CARD8 *) stuff + (client->req_len << 2); 241305b261ecSmrg while (buffer + sizeof (xGlyphElt) < end) 241405b261ecSmrg { 241505b261ecSmrg elt = (xGlyphElt *) buffer; 241605b261ecSmrg buffer += sizeof (xGlyphElt); 241705b261ecSmrg 241805b261ecSmrg swaps (&elt->deltax, n); 241905b261ecSmrg swaps (&elt->deltay, n); 242005b261ecSmrg 242105b261ecSmrg i = elt->len; 242205b261ecSmrg if (i == 0xff) 242305b261ecSmrg { 242405b261ecSmrg swapl (buffer, n); 242505b261ecSmrg buffer += 4; 242605b261ecSmrg } 242705b261ecSmrg else 242805b261ecSmrg { 242905b261ecSmrg space = size * i; 243005b261ecSmrg switch (size) { 243105b261ecSmrg case 1: 243205b261ecSmrg buffer += i; 243305b261ecSmrg break; 243405b261ecSmrg case 2: 243505b261ecSmrg while (i--) 243605b261ecSmrg { 243705b261ecSmrg swaps (buffer, n); 243805b261ecSmrg buffer += 2; 243905b261ecSmrg } 244005b261ecSmrg break; 244105b261ecSmrg case 4: 244205b261ecSmrg while (i--) 244305b261ecSmrg { 244405b261ecSmrg swapl (buffer, n); 244505b261ecSmrg buffer += 4; 244605b261ecSmrg } 244705b261ecSmrg break; 244805b261ecSmrg } 244905b261ecSmrg if (space & 3) 245005b261ecSmrg buffer += 4 - (space & 3); 245105b261ecSmrg } 245205b261ecSmrg } 245305b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 245405b261ecSmrg} 245505b261ecSmrg 245605b261ecSmrgstatic int 245705b261ecSmrgSProcRenderFillRectangles (ClientPtr client) 245805b261ecSmrg{ 245905b261ecSmrg register int n; 246005b261ecSmrg REQUEST(xRenderFillRectanglesReq); 246105b261ecSmrg 246205b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 246305b261ecSmrg swaps(&stuff->length, n); 246405b261ecSmrg swapl(&stuff->dst, n); 246505b261ecSmrg swaps(&stuff->color.red, n); 246605b261ecSmrg swaps(&stuff->color.green, n); 246705b261ecSmrg swaps(&stuff->color.blue, n); 246805b261ecSmrg swaps(&stuff->color.alpha, n); 246905b261ecSmrg SwapRestS(stuff); 247005b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 247105b261ecSmrg} 247205b261ecSmrg 247305b261ecSmrgstatic int 247405b261ecSmrgSProcRenderCreateCursor (ClientPtr client) 247505b261ecSmrg{ 247605b261ecSmrg register int n; 247705b261ecSmrg REQUEST(xRenderCreateCursorReq); 247805b261ecSmrg REQUEST_SIZE_MATCH (xRenderCreateCursorReq); 247905b261ecSmrg 248005b261ecSmrg swaps(&stuff->length, n); 248105b261ecSmrg swapl(&stuff->cid, n); 248205b261ecSmrg swapl(&stuff->src, n); 248305b261ecSmrg swaps(&stuff->x, n); 248405b261ecSmrg swaps(&stuff->y, n); 248505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 248605b261ecSmrg} 248705b261ecSmrg 248805b261ecSmrgstatic int 248905b261ecSmrgSProcRenderSetPictureTransform (ClientPtr client) 249005b261ecSmrg{ 249105b261ecSmrg register int n; 249205b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 249305b261ecSmrg REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq); 249405b261ecSmrg 249505b261ecSmrg swaps(&stuff->length, n); 249605b261ecSmrg swapl(&stuff->picture, n); 249705b261ecSmrg swapl(&stuff->transform.matrix11, n); 249805b261ecSmrg swapl(&stuff->transform.matrix12, n); 249905b261ecSmrg swapl(&stuff->transform.matrix13, n); 250005b261ecSmrg swapl(&stuff->transform.matrix21, n); 250105b261ecSmrg swapl(&stuff->transform.matrix22, n); 250205b261ecSmrg swapl(&stuff->transform.matrix23, n); 250305b261ecSmrg swapl(&stuff->transform.matrix31, n); 250405b261ecSmrg swapl(&stuff->transform.matrix32, n); 250505b261ecSmrg swapl(&stuff->transform.matrix33, n); 250605b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 250705b261ecSmrg} 250805b261ecSmrg 250905b261ecSmrgstatic int 251005b261ecSmrgSProcRenderQueryFilters (ClientPtr client) 251105b261ecSmrg{ 251205b261ecSmrg register int n; 251305b261ecSmrg REQUEST (xRenderQueryFiltersReq); 251405b261ecSmrg REQUEST_SIZE_MATCH (xRenderQueryFiltersReq); 251505b261ecSmrg 251605b261ecSmrg swaps(&stuff->length, n); 251705b261ecSmrg swapl(&stuff->drawable, n); 251805b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 251905b261ecSmrg} 252005b261ecSmrg 252105b261ecSmrgstatic int 252205b261ecSmrgSProcRenderSetPictureFilter (ClientPtr client) 252305b261ecSmrg{ 252405b261ecSmrg register int n; 252505b261ecSmrg REQUEST (xRenderSetPictureFilterReq); 252605b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq); 252705b261ecSmrg 252805b261ecSmrg swaps(&stuff->length, n); 252905b261ecSmrg swapl(&stuff->picture, n); 253005b261ecSmrg swaps(&stuff->nbytes, n); 253105b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 253205b261ecSmrg} 253305b261ecSmrg 253405b261ecSmrgstatic int 253505b261ecSmrgSProcRenderCreateAnimCursor (ClientPtr client) 253605b261ecSmrg{ 253705b261ecSmrg register int n; 253805b261ecSmrg REQUEST (xRenderCreateAnimCursorReq); 253905b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateAnimCursorReq); 254005b261ecSmrg 254105b261ecSmrg swaps(&stuff->length, n); 254205b261ecSmrg swapl(&stuff->cid, n); 254305b261ecSmrg SwapRestL(stuff); 254405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 254505b261ecSmrg} 254605b261ecSmrg 254705b261ecSmrgstatic int 254805b261ecSmrgSProcRenderAddTraps (ClientPtr client) 254905b261ecSmrg{ 255005b261ecSmrg register int n; 255105b261ecSmrg REQUEST (xRenderAddTrapsReq); 255205b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq); 255305b261ecSmrg 255405b261ecSmrg swaps(&stuff->length, n); 255505b261ecSmrg swapl(&stuff->picture, n); 255605b261ecSmrg swaps(&stuff->xOff, n); 255705b261ecSmrg swaps(&stuff->yOff, n); 255805b261ecSmrg SwapRestL(stuff); 255905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 256005b261ecSmrg} 256105b261ecSmrg 256205b261ecSmrgstatic int 256305b261ecSmrgSProcRenderCreateSolidFill(ClientPtr client) 256405b261ecSmrg{ 256505b261ecSmrg register int n; 256605b261ecSmrg REQUEST (xRenderCreateSolidFillReq); 256705b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateSolidFillReq); 256805b261ecSmrg 256905b261ecSmrg swaps(&stuff->length, n); 257005b261ecSmrg swapl(&stuff->pid, n); 257105b261ecSmrg swaps(&stuff->color.alpha, n); 257205b261ecSmrg swaps(&stuff->color.red, n); 257305b261ecSmrg swaps(&stuff->color.green, n); 257405b261ecSmrg swaps(&stuff->color.blue, n); 257505b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 257605b261ecSmrg} 257705b261ecSmrg 257805b261ecSmrgstatic void swapStops(void *stuff, int num) 257905b261ecSmrg{ 258005b261ecSmrg int i, n; 258105b261ecSmrg CARD32 *stops; 258205b261ecSmrg CARD16 *colors; 258305b261ecSmrg stops = (CARD32 *)(stuff); 258405b261ecSmrg for (i = 0; i < num; ++i) { 258505b261ecSmrg swapl(stops, n); 258605b261ecSmrg ++stops; 258705b261ecSmrg } 258805b261ecSmrg colors = (CARD16 *)(stops); 258905b261ecSmrg for (i = 0; i < 4*num; ++i) { 259005b261ecSmrg swaps(stops, n); 259105b261ecSmrg ++stops; 259205b261ecSmrg } 259305b261ecSmrg} 259405b261ecSmrg 259505b261ecSmrgstatic int 259605b261ecSmrgSProcRenderCreateLinearGradient (ClientPtr client) 259705b261ecSmrg{ 259805b261ecSmrg register int n; 259905b261ecSmrg int len; 260005b261ecSmrg REQUEST (xRenderCreateLinearGradientReq); 260105b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateLinearGradientReq); 260205b261ecSmrg 260305b261ecSmrg swaps(&stuff->length, n); 260405b261ecSmrg swapl(&stuff->pid, n); 260505b261ecSmrg swapl(&stuff->p1.x, n); 260605b261ecSmrg swapl(&stuff->p1.y, n); 260705b261ecSmrg swapl(&stuff->p2.x, n); 260805b261ecSmrg swapl(&stuff->p2.y, n); 260905b261ecSmrg swapl(&stuff->nStops, n); 261005b261ecSmrg 261105b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq); 261205b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 261305b261ecSmrg return BadLength; 261405b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 261505b261ecSmrg return BadLength; 261605b261ecSmrg 261705b261ecSmrg swapStops(stuff+1, stuff->nStops); 261805b261ecSmrg 261905b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 262005b261ecSmrg} 262105b261ecSmrg 262205b261ecSmrgstatic int 262305b261ecSmrgSProcRenderCreateRadialGradient (ClientPtr client) 262405b261ecSmrg{ 262505b261ecSmrg register int n; 262605b261ecSmrg int len; 262705b261ecSmrg REQUEST (xRenderCreateRadialGradientReq); 262805b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateRadialGradientReq); 262905b261ecSmrg 263005b261ecSmrg swaps(&stuff->length, n); 263105b261ecSmrg swapl(&stuff->pid, n); 263205b261ecSmrg swapl(&stuff->inner.x, n); 263305b261ecSmrg swapl(&stuff->inner.y, n); 263405b261ecSmrg swapl(&stuff->outer.x, n); 263505b261ecSmrg swapl(&stuff->outer.y, n); 263605b261ecSmrg swapl(&stuff->inner_radius, n); 263705b261ecSmrg swapl(&stuff->outer_radius, n); 263805b261ecSmrg swapl(&stuff->nStops, n); 263905b261ecSmrg 264005b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); 264105b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 264205b261ecSmrg return BadLength; 264305b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 264405b261ecSmrg return BadLength; 264505b261ecSmrg 264605b261ecSmrg swapStops(stuff+1, stuff->nStops); 264705b261ecSmrg 264805b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 264905b261ecSmrg} 265005b261ecSmrg 265105b261ecSmrgstatic int 265205b261ecSmrgSProcRenderCreateConicalGradient (ClientPtr client) 265305b261ecSmrg{ 265405b261ecSmrg register int n; 265505b261ecSmrg int len; 265605b261ecSmrg REQUEST (xRenderCreateConicalGradientReq); 265705b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderCreateConicalGradientReq); 265805b261ecSmrg 265905b261ecSmrg swaps(&stuff->length, n); 266005b261ecSmrg swapl(&stuff->pid, n); 266105b261ecSmrg swapl(&stuff->center.x, n); 266205b261ecSmrg swapl(&stuff->center.y, n); 266305b261ecSmrg swapl(&stuff->angle, n); 266405b261ecSmrg swapl(&stuff->nStops, n); 266505b261ecSmrg 266605b261ecSmrg len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq); 266705b261ecSmrg if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor))) 266805b261ecSmrg return BadLength; 266905b261ecSmrg if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor))) 267005b261ecSmrg return BadLength; 267105b261ecSmrg 267205b261ecSmrg swapStops(stuff+1, stuff->nStops); 267305b261ecSmrg 267405b261ecSmrg return (*ProcRenderVector[stuff->renderReqType]) (client); 267505b261ecSmrg} 267605b261ecSmrg 267705b261ecSmrgstatic int 267805b261ecSmrgSProcRenderDispatch (ClientPtr client) 267905b261ecSmrg{ 268005b261ecSmrg REQUEST(xReq); 268105b261ecSmrg 268205b261ecSmrg if (stuff->data < RenderNumberRequests) 268305b261ecSmrg return (*SProcRenderVector[stuff->data]) (client); 268405b261ecSmrg else 268505b261ecSmrg return BadRequest; 268605b261ecSmrg} 268705b261ecSmrg 268805b261ecSmrg#ifdef PANORAMIX 268905b261ecSmrg#include "panoramiX.h" 269005b261ecSmrg#include "panoramiXsrv.h" 269105b261ecSmrg 269205b261ecSmrg#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode, err) {\ 269305b261ecSmrg pPicture = SecurityLookupIDByType(client, pid, XRT_PICTURE, mode);\ 269405b261ecSmrg if (!pPicture) { \ 269505b261ecSmrg client->errorValue = pid; \ 269605b261ecSmrg return err; \ 269705b261ecSmrg } \ 269805b261ecSmrg} 269905b261ecSmrg 270005b261ecSmrg#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode, err) {\ 270105b261ecSmrg if (pid == None) \ 270205b261ecSmrg pPicture = 0; \ 270305b261ecSmrg else { \ 270405b261ecSmrg VERIFY_XIN_PICTURE(pPicture, pid, client, mode, err); \ 270505b261ecSmrg } \ 270605b261ecSmrg} \ 270705b261ecSmrg 270805b261ecSmrgint (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr); 270905b261ecSmrg 271005b261ecSmrgunsigned long XRT_PICTURE; 271105b261ecSmrg 271205b261ecSmrgstatic int 271305b261ecSmrgPanoramiXRenderCreatePicture (ClientPtr client) 271405b261ecSmrg{ 271505b261ecSmrg REQUEST(xRenderCreatePictureReq); 271605b261ecSmrg PanoramiXRes *refDraw, *newPict; 271705b261ecSmrg int result = Success, j; 271805b261ecSmrg 271905b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); 272005b261ecSmrg if(!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass( 272105b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 272205b261ecSmrg return BadDrawable; 272305b261ecSmrg if(!(newPict = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes)))) 272405b261ecSmrg return BadAlloc; 272505b261ecSmrg newPict->type = XRT_PICTURE; 272605b261ecSmrg newPict->info[0].id = stuff->pid; 272705b261ecSmrg 272805b261ecSmrg if (refDraw->type == XRT_WINDOW && 272905b261ecSmrg stuff->drawable == WindowTable[0]->drawable.id) 273005b261ecSmrg { 273105b261ecSmrg newPict->u.pict.root = TRUE; 273205b261ecSmrg } 273305b261ecSmrg else 273405b261ecSmrg newPict->u.pict.root = FALSE; 273505b261ecSmrg 273605b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 273705b261ecSmrg newPict->info[j].id = FakeClientID(client->index); 273805b261ecSmrg 273905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 274005b261ecSmrg stuff->pid = newPict->info[j].id; 274105b261ecSmrg stuff->drawable = refDraw->info[j].id; 274205b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client); 274305b261ecSmrg if(result != Success) break; 274405b261ecSmrg } 274505b261ecSmrg 274605b261ecSmrg if (result == Success) 274705b261ecSmrg AddResource(newPict->info[0].id, XRT_PICTURE, newPict); 274805b261ecSmrg else 274905b261ecSmrg xfree(newPict); 275005b261ecSmrg 275105b261ecSmrg return (result); 275205b261ecSmrg} 275305b261ecSmrg 275405b261ecSmrgstatic int 275505b261ecSmrgPanoramiXRenderChangePicture (ClientPtr client) 275605b261ecSmrg{ 275705b261ecSmrg PanoramiXRes *pict; 275805b261ecSmrg int result = Success, j; 275905b261ecSmrg REQUEST(xRenderChangePictureReq); 276005b261ecSmrg 276105b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq); 276205b261ecSmrg 276305b261ecSmrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess, 276405b261ecSmrg RenderErrBase + BadPicture); 276505b261ecSmrg 276605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 276705b261ecSmrg stuff->picture = pict->info[j].id; 276805b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client); 276905b261ecSmrg if(result != Success) break; 277005b261ecSmrg } 277105b261ecSmrg 277205b261ecSmrg return (result); 277305b261ecSmrg} 277405b261ecSmrg 277505b261ecSmrgstatic int 277605b261ecSmrgPanoramiXRenderSetPictureClipRectangles (ClientPtr client) 277705b261ecSmrg{ 277805b261ecSmrg REQUEST(xRenderSetPictureClipRectanglesReq); 277905b261ecSmrg int result = Success, j; 278005b261ecSmrg PanoramiXRes *pict; 278105b261ecSmrg 278205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); 278305b261ecSmrg 278405b261ecSmrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess, 278505b261ecSmrg RenderErrBase + BadPicture); 278605b261ecSmrg 278705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 278805b261ecSmrg stuff->picture = pict->info[j].id; 278905b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) (client); 279005b261ecSmrg if(result != Success) break; 279105b261ecSmrg } 279205b261ecSmrg 279305b261ecSmrg return (result); 279405b261ecSmrg} 279505b261ecSmrg 279605b261ecSmrgstatic int 279705b261ecSmrgPanoramiXRenderSetPictureTransform (ClientPtr client) 279805b261ecSmrg{ 279905b261ecSmrg REQUEST(xRenderSetPictureTransformReq); 280005b261ecSmrg int result = Success, j; 280105b261ecSmrg PanoramiXRes *pict; 280205b261ecSmrg 280305b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq); 280405b261ecSmrg 280505b261ecSmrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess, 280605b261ecSmrg RenderErrBase + BadPicture); 280705b261ecSmrg 280805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 280905b261ecSmrg stuff->picture = pict->info[j].id; 281005b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client); 281105b261ecSmrg if(result != Success) break; 281205b261ecSmrg } 281305b261ecSmrg 281405b261ecSmrg return (result); 281505b261ecSmrg} 281605b261ecSmrg 281705b261ecSmrgstatic int 281805b261ecSmrgPanoramiXRenderSetPictureFilter (ClientPtr client) 281905b261ecSmrg{ 282005b261ecSmrg REQUEST(xRenderSetPictureFilterReq); 282105b261ecSmrg int result = Success, j; 282205b261ecSmrg PanoramiXRes *pict; 282305b261ecSmrg 282405b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq); 282505b261ecSmrg 282605b261ecSmrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess, 282705b261ecSmrg RenderErrBase + BadPicture); 282805b261ecSmrg 282905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 283005b261ecSmrg stuff->picture = pict->info[j].id; 283105b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client); 283205b261ecSmrg if(result != Success) break; 283305b261ecSmrg } 283405b261ecSmrg 283505b261ecSmrg return (result); 283605b261ecSmrg} 283705b261ecSmrg 283805b261ecSmrgstatic int 283905b261ecSmrgPanoramiXRenderFreePicture (ClientPtr client) 284005b261ecSmrg{ 284105b261ecSmrg PanoramiXRes *pict; 284205b261ecSmrg int result = Success, j; 284305b261ecSmrg REQUEST(xRenderFreePictureReq); 284405b261ecSmrg 284505b261ecSmrg REQUEST_SIZE_MATCH(xRenderFreePictureReq); 284605b261ecSmrg 284705b261ecSmrg client->errorValue = stuff->picture; 284805b261ecSmrg 284905b261ecSmrg VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess, 285005b261ecSmrg RenderErrBase + BadPicture); 285105b261ecSmrg 285205b261ecSmrg 285305b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 285405b261ecSmrg stuff->picture = pict->info[j].id; 285505b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client); 285605b261ecSmrg if(result != Success) break; 285705b261ecSmrg } 285805b261ecSmrg 285905b261ecSmrg /* Since ProcRenderFreePicture is using FreeResource, it will free 286005b261ecSmrg our resource for us on the last pass through the loop above */ 286105b261ecSmrg 286205b261ecSmrg return (result); 286305b261ecSmrg} 286405b261ecSmrg 286505b261ecSmrgstatic int 286605b261ecSmrgPanoramiXRenderComposite (ClientPtr client) 286705b261ecSmrg{ 286805b261ecSmrg PanoramiXRes *src, *msk, *dst; 286905b261ecSmrg int result = Success, j; 287005b261ecSmrg xRenderCompositeReq orig; 287105b261ecSmrg REQUEST(xRenderCompositeReq); 287205b261ecSmrg 287305b261ecSmrg REQUEST_SIZE_MATCH(xRenderCompositeReq); 287405b261ecSmrg 287505b261ecSmrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 287605b261ecSmrg RenderErrBase + BadPicture); 287705b261ecSmrg VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess, 287805b261ecSmrg RenderErrBase + BadPicture); 287905b261ecSmrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 288005b261ecSmrg RenderErrBase + BadPicture); 288105b261ecSmrg 288205b261ecSmrg orig = *stuff; 288305b261ecSmrg 288405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 288505b261ecSmrg stuff->src = src->info[j].id; 288605b261ecSmrg if (src->u.pict.root) 288705b261ecSmrg { 288805b261ecSmrg stuff->xSrc = orig.xSrc - panoramiXdataPtr[j].x; 288905b261ecSmrg stuff->ySrc = orig.ySrc - panoramiXdataPtr[j].y; 289005b261ecSmrg } 289105b261ecSmrg stuff->dst = dst->info[j].id; 289205b261ecSmrg if (dst->u.pict.root) 289305b261ecSmrg { 289405b261ecSmrg stuff->xDst = orig.xDst - panoramiXdataPtr[j].x; 289505b261ecSmrg stuff->yDst = orig.yDst - panoramiXdataPtr[j].y; 289605b261ecSmrg } 289705b261ecSmrg if (msk) 289805b261ecSmrg { 289905b261ecSmrg stuff->mask = msk->info[j].id; 290005b261ecSmrg if (msk->u.pict.root) 290105b261ecSmrg { 290205b261ecSmrg stuff->xMask = orig.xMask - panoramiXdataPtr[j].x; 290305b261ecSmrg stuff->yMask = orig.yMask - panoramiXdataPtr[j].y; 290405b261ecSmrg } 290505b261ecSmrg } 290605b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client); 290705b261ecSmrg if(result != Success) break; 290805b261ecSmrg } 290905b261ecSmrg 291005b261ecSmrg return result; 291105b261ecSmrg} 291205b261ecSmrg 291305b261ecSmrgstatic int 291405b261ecSmrgPanoramiXRenderCompositeGlyphs (ClientPtr client) 291505b261ecSmrg{ 291605b261ecSmrg PanoramiXRes *src, *dst; 291705b261ecSmrg int result = Success, j; 291805b261ecSmrg REQUEST(xRenderCompositeGlyphsReq); 291905b261ecSmrg xGlyphElt origElt, *elt; 292005b261ecSmrg INT16 xSrc, ySrc; 292105b261ecSmrg 292205b261ecSmrg REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); 292305b261ecSmrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 292405b261ecSmrg RenderErrBase + BadPicture); 292505b261ecSmrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 292605b261ecSmrg RenderErrBase + BadPicture); 292705b261ecSmrg 292805b261ecSmrg if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) + 292905b261ecSmrg sizeof (xGlyphElt))) 293005b261ecSmrg { 293105b261ecSmrg elt = (xGlyphElt *) (stuff + 1); 293205b261ecSmrg origElt = *elt; 293305b261ecSmrg xSrc = stuff->xSrc; 293405b261ecSmrg ySrc = stuff->ySrc; 293505b261ecSmrg FOR_NSCREENS_FORWARD(j) { 293605b261ecSmrg stuff->src = src->info[j].id; 293705b261ecSmrg if (src->u.pict.root) 293805b261ecSmrg { 293905b261ecSmrg stuff->xSrc = xSrc - panoramiXdataPtr[j].x; 294005b261ecSmrg stuff->ySrc = ySrc - panoramiXdataPtr[j].y; 294105b261ecSmrg } 294205b261ecSmrg stuff->dst = dst->info[j].id; 294305b261ecSmrg if (dst->u.pict.root) 294405b261ecSmrg { 294505b261ecSmrg elt->deltax = origElt.deltax - panoramiXdataPtr[j].x; 294605b261ecSmrg elt->deltay = origElt.deltay - panoramiXdataPtr[j].y; 294705b261ecSmrg } 294805b261ecSmrg result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client); 294905b261ecSmrg if(result != Success) break; 295005b261ecSmrg } 295105b261ecSmrg } 295205b261ecSmrg 295305b261ecSmrg return result; 295405b261ecSmrg} 295505b261ecSmrg 295605b261ecSmrgstatic int 295705b261ecSmrgPanoramiXRenderFillRectangles (ClientPtr client) 295805b261ecSmrg{ 295905b261ecSmrg PanoramiXRes *dst; 296005b261ecSmrg int result = Success, j; 296105b261ecSmrg REQUEST(xRenderFillRectanglesReq); 296205b261ecSmrg char *extra; 296305b261ecSmrg int extra_len; 296405b261ecSmrg 296505b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq); 296605b261ecSmrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 296705b261ecSmrg RenderErrBase + BadPicture); 296805b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq); 296905b261ecSmrg if (extra_len && 29704642e01fSmrg (extra = (char *) xalloc (extra_len))) 297105b261ecSmrg { 297205b261ecSmrg memcpy (extra, stuff + 1, extra_len); 297305b261ecSmrg FOR_NSCREENS_FORWARD(j) { 297405b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 297505b261ecSmrg if (dst->u.pict.root) 297605b261ecSmrg { 297705b261ecSmrg int x_off = panoramiXdataPtr[j].x; 297805b261ecSmrg int y_off = panoramiXdataPtr[j].y; 297905b261ecSmrg 298005b261ecSmrg if(x_off || y_off) { 298105b261ecSmrg xRectangle *rects = (xRectangle *) (stuff + 1); 298205b261ecSmrg int i = extra_len / sizeof (xRectangle); 298305b261ecSmrg 298405b261ecSmrg while (i--) 298505b261ecSmrg { 298605b261ecSmrg rects->x -= x_off; 298705b261ecSmrg rects->y -= y_off; 298805b261ecSmrg rects++; 298905b261ecSmrg } 299005b261ecSmrg } 299105b261ecSmrg } 299205b261ecSmrg stuff->dst = dst->info[j].id; 299305b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client); 299405b261ecSmrg if(result != Success) break; 299505b261ecSmrg } 29964642e01fSmrg xfree(extra); 299705b261ecSmrg } 299805b261ecSmrg 299905b261ecSmrg return result; 300005b261ecSmrg} 300105b261ecSmrg 300205b261ecSmrgstatic int 300305b261ecSmrgPanoramiXRenderTrapezoids(ClientPtr client) 300405b261ecSmrg{ 300505b261ecSmrg PanoramiXRes *src, *dst; 300605b261ecSmrg int result = Success, j; 300705b261ecSmrg REQUEST(xRenderTrapezoidsReq); 300805b261ecSmrg char *extra; 300905b261ecSmrg int extra_len; 301005b261ecSmrg 301105b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq); 301205b261ecSmrg 301305b261ecSmrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 301405b261ecSmrg RenderErrBase + BadPicture); 301505b261ecSmrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 301605b261ecSmrg RenderErrBase + BadPicture); 301705b261ecSmrg 301805b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq); 301905b261ecSmrg 302005b261ecSmrg if (extra_len && 30214642e01fSmrg (extra = (char *) xalloc (extra_len))) { 302205b261ecSmrg memcpy (extra, stuff + 1, extra_len); 302305b261ecSmrg 302405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 302505b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 302605b261ecSmrg if (dst->u.pict.root) { 302705b261ecSmrg int x_off = panoramiXdataPtr[j].x; 302805b261ecSmrg int y_off = panoramiXdataPtr[j].y; 302905b261ecSmrg 303005b261ecSmrg if(x_off || y_off) { 303105b261ecSmrg xTrapezoid *trap = (xTrapezoid *) (stuff + 1); 303205b261ecSmrg int i = extra_len / sizeof (xTrapezoid); 303305b261ecSmrg 303405b261ecSmrg while (i--) { 303505b261ecSmrg trap->top -= y_off; 303605b261ecSmrg trap->bottom -= y_off; 303705b261ecSmrg trap->left.p1.x -= x_off; 303805b261ecSmrg trap->left.p1.y -= y_off; 303905b261ecSmrg trap->left.p2.x -= x_off; 304005b261ecSmrg trap->left.p2.y -= y_off; 304105b261ecSmrg trap->right.p1.x -= x_off; 304205b261ecSmrg trap->right.p1.y -= y_off; 304305b261ecSmrg trap->right.p2.x -= x_off; 304405b261ecSmrg trap->right.p2.y -= y_off; 304505b261ecSmrg trap++; 304605b261ecSmrg } 304705b261ecSmrg } 304805b261ecSmrg } 304905b261ecSmrg 305005b261ecSmrg stuff->src = src->info[j].id; 305105b261ecSmrg stuff->dst = dst->info[j].id; 305205b261ecSmrg result = 305305b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client); 305405b261ecSmrg 305505b261ecSmrg if(result != Success) break; 305605b261ecSmrg } 305705b261ecSmrg 30584642e01fSmrg xfree(extra); 305905b261ecSmrg } 306005b261ecSmrg 306105b261ecSmrg return result; 306205b261ecSmrg} 306305b261ecSmrg 306405b261ecSmrgstatic int 306505b261ecSmrgPanoramiXRenderTriangles(ClientPtr client) 306605b261ecSmrg{ 306705b261ecSmrg PanoramiXRes *src, *dst; 306805b261ecSmrg int result = Success, j; 306905b261ecSmrg REQUEST(xRenderTrianglesReq); 307005b261ecSmrg char *extra; 307105b261ecSmrg int extra_len; 307205b261ecSmrg 307305b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq); 307405b261ecSmrg 307505b261ecSmrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 307605b261ecSmrg RenderErrBase + BadPicture); 307705b261ecSmrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 307805b261ecSmrg RenderErrBase + BadPicture); 307905b261ecSmrg 308005b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq); 308105b261ecSmrg 308205b261ecSmrg if (extra_len && 30834642e01fSmrg (extra = (char *) xalloc (extra_len))) { 308405b261ecSmrg memcpy (extra, stuff + 1, extra_len); 308505b261ecSmrg 308605b261ecSmrg FOR_NSCREENS_FORWARD(j) { 308705b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 308805b261ecSmrg if (dst->u.pict.root) { 308905b261ecSmrg int x_off = panoramiXdataPtr[j].x; 309005b261ecSmrg int y_off = panoramiXdataPtr[j].y; 309105b261ecSmrg 309205b261ecSmrg if(x_off || y_off) { 309305b261ecSmrg xTriangle *tri = (xTriangle *) (stuff + 1); 309405b261ecSmrg int i = extra_len / sizeof (xTriangle); 309505b261ecSmrg 309605b261ecSmrg while (i--) { 309705b261ecSmrg tri->p1.x -= x_off; 309805b261ecSmrg tri->p1.y -= y_off; 309905b261ecSmrg tri->p2.x -= x_off; 310005b261ecSmrg tri->p2.y -= y_off; 310105b261ecSmrg tri->p3.x -= x_off; 310205b261ecSmrg tri->p3.y -= y_off; 310305b261ecSmrg tri++; 310405b261ecSmrg } 310505b261ecSmrg } 310605b261ecSmrg } 310705b261ecSmrg 310805b261ecSmrg stuff->src = src->info[j].id; 310905b261ecSmrg stuff->dst = dst->info[j].id; 311005b261ecSmrg result = 311105b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client); 311205b261ecSmrg 311305b261ecSmrg if(result != Success) break; 311405b261ecSmrg } 311505b261ecSmrg 31164642e01fSmrg xfree(extra); 311705b261ecSmrg } 311805b261ecSmrg 311905b261ecSmrg return result; 312005b261ecSmrg} 312105b261ecSmrg 312205b261ecSmrgstatic int 312305b261ecSmrgPanoramiXRenderTriStrip(ClientPtr client) 312405b261ecSmrg{ 312505b261ecSmrg PanoramiXRes *src, *dst; 312605b261ecSmrg int result = Success, j; 312705b261ecSmrg REQUEST(xRenderTriStripReq); 312805b261ecSmrg char *extra; 312905b261ecSmrg int extra_len; 313005b261ecSmrg 313105b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTriStripReq); 313205b261ecSmrg 313305b261ecSmrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 313405b261ecSmrg RenderErrBase + BadPicture); 313505b261ecSmrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 313605b261ecSmrg RenderErrBase + BadPicture); 313705b261ecSmrg 313805b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq); 313905b261ecSmrg 314005b261ecSmrg if (extra_len && 31414642e01fSmrg (extra = (char *) xalloc (extra_len))) { 314205b261ecSmrg memcpy (extra, stuff + 1, extra_len); 314305b261ecSmrg 314405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 314505b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 314605b261ecSmrg if (dst->u.pict.root) { 314705b261ecSmrg int x_off = panoramiXdataPtr[j].x; 314805b261ecSmrg int y_off = panoramiXdataPtr[j].y; 314905b261ecSmrg 315005b261ecSmrg if(x_off || y_off) { 315105b261ecSmrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 315205b261ecSmrg int i = extra_len / sizeof (xPointFixed); 315305b261ecSmrg 315405b261ecSmrg while (i--) { 315505b261ecSmrg fixed->x -= x_off; 315605b261ecSmrg fixed->y -= y_off; 315705b261ecSmrg fixed++; 315805b261ecSmrg } 315905b261ecSmrg } 316005b261ecSmrg } 316105b261ecSmrg 316205b261ecSmrg stuff->src = src->info[j].id; 316305b261ecSmrg stuff->dst = dst->info[j].id; 316405b261ecSmrg result = 316505b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client); 316605b261ecSmrg 316705b261ecSmrg if(result != Success) break; 316805b261ecSmrg } 316905b261ecSmrg 31704642e01fSmrg xfree(extra); 317105b261ecSmrg } 317205b261ecSmrg 317305b261ecSmrg return result; 317405b261ecSmrg} 317505b261ecSmrg 317605b261ecSmrgstatic int 317705b261ecSmrgPanoramiXRenderTriFan(ClientPtr client) 317805b261ecSmrg{ 317905b261ecSmrg PanoramiXRes *src, *dst; 318005b261ecSmrg int result = Success, j; 318105b261ecSmrg REQUEST(xRenderTriFanReq); 318205b261ecSmrg char *extra; 318305b261ecSmrg int extra_len; 318405b261ecSmrg 318505b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderTriFanReq); 318605b261ecSmrg 318705b261ecSmrg VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 318805b261ecSmrg RenderErrBase + BadPicture); 318905b261ecSmrg VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 319005b261ecSmrg RenderErrBase + BadPicture); 319105b261ecSmrg 319205b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq); 319305b261ecSmrg 319405b261ecSmrg if (extra_len && 31954642e01fSmrg (extra = (char *) xalloc (extra_len))) { 319605b261ecSmrg memcpy (extra, stuff + 1, extra_len); 319705b261ecSmrg 319805b261ecSmrg FOR_NSCREENS_FORWARD(j) { 319905b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 320005b261ecSmrg if (dst->u.pict.root) { 320105b261ecSmrg int x_off = panoramiXdataPtr[j].x; 320205b261ecSmrg int y_off = panoramiXdataPtr[j].y; 320305b261ecSmrg 320405b261ecSmrg if(x_off || y_off) { 320505b261ecSmrg xPointFixed *fixed = (xPointFixed *) (stuff + 1); 320605b261ecSmrg int i = extra_len / sizeof (xPointFixed); 320705b261ecSmrg 320805b261ecSmrg while (i--) { 320905b261ecSmrg fixed->x -= x_off; 321005b261ecSmrg fixed->y -= y_off; 321105b261ecSmrg fixed++; 321205b261ecSmrg } 321305b261ecSmrg } 321405b261ecSmrg } 321505b261ecSmrg 321605b261ecSmrg stuff->src = src->info[j].id; 321705b261ecSmrg stuff->dst = dst->info[j].id; 321805b261ecSmrg result = 321905b261ecSmrg (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client); 322005b261ecSmrg 322105b261ecSmrg if(result != Success) break; 322205b261ecSmrg } 322305b261ecSmrg 32244642e01fSmrg xfree(extra); 322505b261ecSmrg } 322605b261ecSmrg 322705b261ecSmrg return result; 322805b261ecSmrg} 322905b261ecSmrg 323005b261ecSmrgstatic int 323105b261ecSmrgPanoramiXRenderAddTraps (ClientPtr client) 323205b261ecSmrg{ 323305b261ecSmrg PanoramiXRes *picture; 323405b261ecSmrg int result = Success, j; 323505b261ecSmrg REQUEST(xRenderAddTrapsReq); 323605b261ecSmrg char *extra; 323705b261ecSmrg int extra_len; 323805b261ecSmrg INT16 x_off, y_off; 323905b261ecSmrg 324005b261ecSmrg REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq); 324105b261ecSmrg VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess, 324205b261ecSmrg RenderErrBase + BadPicture); 324305b261ecSmrg extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq); 324405b261ecSmrg if (extra_len && 32454642e01fSmrg (extra = (char *) xalloc (extra_len))) 324605b261ecSmrg { 324705b261ecSmrg memcpy (extra, stuff + 1, extra_len); 324805b261ecSmrg x_off = stuff->xOff; 324905b261ecSmrg y_off = stuff->yOff; 325005b261ecSmrg FOR_NSCREENS_FORWARD(j) { 325105b261ecSmrg if (j) memcpy (stuff + 1, extra, extra_len); 325205b261ecSmrg stuff->picture = picture->info[j].id; 325305b261ecSmrg 325405b261ecSmrg if (picture->u.pict.root) 325505b261ecSmrg { 325605b261ecSmrg stuff->xOff = x_off + panoramiXdataPtr[j].x; 325705b261ecSmrg stuff->yOff = y_off + panoramiXdataPtr[j].y; 325805b261ecSmrg } 325905b261ecSmrg result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client); 326005b261ecSmrg if(result != Success) break; 326105b261ecSmrg } 32624642e01fSmrg xfree(extra); 326305b261ecSmrg } 326405b261ecSmrg 326505b261ecSmrg return result; 326605b261ecSmrg} 326705b261ecSmrg 326805b261ecSmrgvoid 326905b261ecSmrgPanoramiXRenderInit (void) 327005b261ecSmrg{ 327105b261ecSmrg int i; 327205b261ecSmrg 327305b261ecSmrg XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource); 327405b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 327505b261ecSmrg PanoramiXSaveRenderVector[i] = ProcRenderVector[i]; 327605b261ecSmrg /* 327705b261ecSmrg * Stuff in Xinerama aware request processing hooks 327805b261ecSmrg */ 327905b261ecSmrg ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture; 328005b261ecSmrg ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture; 328105b261ecSmrg ProcRenderVector[X_RenderSetPictureTransform] = PanoramiXRenderSetPictureTransform; 328205b261ecSmrg ProcRenderVector[X_RenderSetPictureFilter] = PanoramiXRenderSetPictureFilter; 328305b261ecSmrg ProcRenderVector[X_RenderSetPictureClipRectangles] = PanoramiXRenderSetPictureClipRectangles; 328405b261ecSmrg ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture; 328505b261ecSmrg ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite; 328605b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs; 328705b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs16] = PanoramiXRenderCompositeGlyphs; 328805b261ecSmrg ProcRenderVector[X_RenderCompositeGlyphs32] = PanoramiXRenderCompositeGlyphs; 328905b261ecSmrg ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles; 329005b261ecSmrg 329105b261ecSmrg ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids; 329205b261ecSmrg ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles; 329305b261ecSmrg ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip; 329405b261ecSmrg ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan; 329505b261ecSmrg ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps; 329605b261ecSmrg} 329705b261ecSmrg 329805b261ecSmrgvoid 329905b261ecSmrgPanoramiXRenderReset (void) 330005b261ecSmrg{ 330105b261ecSmrg int i; 330205b261ecSmrg for (i = 0; i < RenderNumberRequests; i++) 330305b261ecSmrg ProcRenderVector[i] = PanoramiXSaveRenderVector[i]; 330405b261ecSmrg} 330505b261ecSmrg 330605b261ecSmrg#endif /* PANORAMIX */ 3307