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