diff options
Diffstat (limited to 'nx-X11/lib/Xrender/Xrender.c')
-rw-r--r-- | nx-X11/lib/Xrender/Xrender.c | 889 |
1 files changed, 0 insertions, 889 deletions
diff --git a/nx-X11/lib/Xrender/Xrender.c b/nx-X11/lib/Xrender/Xrender.c deleted file mode 100644 index 8d8aeb979..000000000 --- a/nx-X11/lib/Xrender/Xrender.c +++ /dev/null @@ -1,889 +0,0 @@ -/* - * - * Copyright © 2000 SuSE, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of SuSE not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. SuSE makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE - * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Keith Packard, SuSE, Inc. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include "Xrenderint.h" - -XRenderExtInfo XRenderExtensionInfo; -char XRenderExtensionName[] = RENDER_NAME; - -static int XRenderCloseDisplay (Display *dpy, XExtCodes *codes); - -/* - * XRenderExtFindDisplay - look for a display in this extension; keeps a - * cache of the most-recently used for efficiency. (Replaces - * XextFindDisplay.) - */ -static XRenderExtDisplayInfo * -XRenderExtFindDisplay (XRenderExtInfo *extinfo, - Display *dpy) -{ - XRenderExtDisplayInfo *dpyinfo; - - /* - * see if this was the most recently accessed display - */ - if ((dpyinfo = extinfo->cur) && dpyinfo->display == dpy) - return dpyinfo; - - /* - * look for display in list - */ - _XLockMutex(_Xglobal_lock); - for (dpyinfo = extinfo->head; dpyinfo; dpyinfo = dpyinfo->next) { - if (dpyinfo->display == dpy) { - extinfo->cur = dpyinfo; /* cache most recently used */ - _XUnlockMutex(_Xglobal_lock); - return dpyinfo; - } - } - _XUnlockMutex(_Xglobal_lock); - - return NULL; -} - -/* - * If the server is missing support for any of the required depths on - * any screen, tell the application that Render is not present. - */ - -#define DEPTH_MASK(d) (1 << ((d) - 1)) - -/* - * Render requires support for depth 1, 4, 8, 24 and 32 pixmaps - */ - -#define REQUIRED_DEPTHS (DEPTH_MASK(1) | \ - DEPTH_MASK(4) | \ - DEPTH_MASK(8) | \ - DEPTH_MASK(24) | \ - DEPTH_MASK(32)) - -typedef struct _DepthCheckRec { - struct _DepthCheckRec *next; - Display *dpy; - CARD32 missing; - unsigned long serial; -} DepthCheckRec, *DepthCheckPtr; - -static DepthCheckPtr depthChecks; - -static int -XRenderDepthCheckErrorHandler (Display *dpy, XErrorEvent *evt) -{ - if (evt->request_code == X_CreatePixmap && evt->error_code == BadValue) - { - DepthCheckPtr d; - _XLockMutex(_Xglobal_lock); - for (d = depthChecks; d; d = d->next) - if (d->dpy == dpy) - { - if ((long) (evt->serial - d->serial) >= 0) - d->missing |= DEPTH_MASK(evt->resourceid); - break; - } - _XUnlockMutex (_Xglobal_lock); - } - return 0; -} - -static Bool -XRenderHasDepths (Display *dpy) -{ - int s; - - for (s = 0; s < ScreenCount (dpy); s++) - { - CARD32 depths = 0; - CARD32 missing; - Screen *scr = ScreenOfDisplay (dpy, s); - int d; - - for (d = 0; d < scr->ndepths; d++) - depths |= DEPTH_MASK(scr->depths[d].depth); - missing = ~depths & REQUIRED_DEPTHS; - if (missing) - { - DepthCheckRec dc, **dp; - XErrorHandler previousHandler; - - /* - * Ok, this is ugly. It should be sufficient at this - * point to just return False, but Xinerama is broken at - * this point and only advertises depths which have an - * associated visual. Of course, the other depths still - * work, but the only way to find out is to try them. - */ - dc.dpy = dpy; - dc.missing = 0; - dc.serial = XNextRequest (dpy); - _XLockMutex(_Xglobal_lock); - dc.next = depthChecks; - depthChecks = &dc; - _XUnlockMutex (_Xglobal_lock); - /* - * I suspect this is not really thread safe, but Xlib doesn't - * provide a lot of options here - */ - previousHandler = XSetErrorHandler (XRenderDepthCheckErrorHandler); - /* - * Try each missing depth and see if pixmap creation succeeds - */ - for (d = 1; d <= 32; d++) - /* don't check depth 1 == Xcursor recurses... */ - if ((missing & DEPTH_MASK(d)) && d != 1) - { - Pixmap p; - p = XCreatePixmap (dpy, RootWindow (dpy, s), 1, 1, d); - XFreePixmap (dpy, p); - } - XSync (dpy, False); - XSetErrorHandler (previousHandler); - /* - * Unhook from the list of depth check records - */ - _XLockMutex(_Xglobal_lock); - for (dp = &depthChecks; *dp; dp = &(*dp)->next) - { - if (*dp == &dc) - { - *dp = dc.next; - break; - } - } - _XUnlockMutex (_Xglobal_lock); - if (dc.missing) - return False; - } - } - return True; -} - -/* - * XRenderExtAddDisplay - add a display to this extension. (Replaces - * XextAddDisplay) - */ -static XRenderExtDisplayInfo * -XRenderExtAddDisplay (XRenderExtInfo *extinfo, - Display *dpy, - char *ext_name) -{ - XRenderExtDisplayInfo *dpyinfo; - - dpyinfo = (XRenderExtDisplayInfo *) Xmalloc (sizeof (XRenderExtDisplayInfo)); - if (!dpyinfo) return NULL; - dpyinfo->display = dpy; - dpyinfo->info = NULL; - - if (XRenderHasDepths (dpy)) - dpyinfo->codes = XInitExtension (dpy, ext_name); - else - dpyinfo->codes = NULL; - - /* - * if the server has the extension, then we can initialize the - * appropriate function vectors - */ - if (dpyinfo->codes) { - XESetCloseDisplay (dpy, dpyinfo->codes->extension, - XRenderCloseDisplay); - } else { - /* The server doesn't have this extension. - * Use a private Xlib-internal extension to hang the close_display - * hook on so that the "cache" (extinfo->cur) is properly cleaned. - * (XBUG 7955) - */ - XExtCodes *codes = XAddExtension(dpy); - if (!codes) { - XFree(dpyinfo); - return NULL; - } - XESetCloseDisplay (dpy, codes->extension, XRenderCloseDisplay); - } - - /* - * now, chain it onto the list - */ - _XLockMutex(_Xglobal_lock); - dpyinfo->next = extinfo->head; - extinfo->head = dpyinfo; - extinfo->cur = dpyinfo; - extinfo->ndisplays++; - _XUnlockMutex(_Xglobal_lock); - return dpyinfo; -} - - -/* - * XRenderExtRemoveDisplay - remove the indicated display from the - * extension object. (Replaces XextRemoveDisplay.) - */ -static int -XRenderExtRemoveDisplay (XRenderExtInfo *extinfo, Display *dpy) -{ - XRenderExtDisplayInfo *dpyinfo, *prev; - - /* - * locate this display and its back link so that it can be removed - */ - _XLockMutex(_Xglobal_lock); - prev = NULL; - for (dpyinfo = extinfo->head; dpyinfo; dpyinfo = dpyinfo->next) { - if (dpyinfo->display == dpy) break; - prev = dpyinfo; - } - if (!dpyinfo) { - _XUnlockMutex(_Xglobal_lock); - return 0; /* hmm, actually an error */ - } - - /* - * remove the display from the list; handles going to zero - */ - if (prev) - prev->next = dpyinfo->next; - else - extinfo->head = dpyinfo->next; - - extinfo->ndisplays--; - if (dpyinfo == extinfo->cur) extinfo->cur = NULL; /* flush cache */ - _XUnlockMutex(_Xglobal_lock); - - Xfree ((char *) dpyinfo); - return 1; -} - - - -XRenderExtDisplayInfo * -XRenderFindDisplay (Display *dpy) -{ - XRenderExtDisplayInfo *dpyinfo; - - dpyinfo = XRenderExtFindDisplay (&XRenderExtensionInfo, dpy); - if (!dpyinfo) - dpyinfo = XRenderExtAddDisplay (&XRenderExtensionInfo, dpy, - XRenderExtensionName); - return dpyinfo; -} - -static int -XRenderCloseDisplay (Display *dpy, XExtCodes *codes) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - if (info->info) XFree (info->info); - - return XRenderExtRemoveDisplay (&XRenderExtensionInfo, dpy); -} - -/**************************************************************************** - * * - * Render public interfaces * - * * - ****************************************************************************/ - -Bool XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - - if (RenderHasExtension(info)) { - *event_basep = info->codes->first_event; - *error_basep = info->codes->first_error; - return True; - } else { - return False; - } -} - - -Status XRenderQueryVersion (Display *dpy, - int *major_versionp, - int *minor_versionp) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - XRenderInfo *xri; - - if (!RenderHasExtension (info)) - return 0; - - if (!XRenderQueryFormats (dpy)) - return 0; - - xri = info->info; - *major_versionp = xri->major_version; - *minor_versionp = xri->minor_version; - return 1; -} - -static XRenderPictFormat * -_XRenderFindFormat (XRenderInfo *xri, PictFormat format) -{ - int nf; - - for (nf = 0; nf < xri->nformat; nf++) - if (xri->format[nf].id == format) - return &xri->format[nf]; - return 0; -} - -static Visual * -_XRenderFindVisual (Display *dpy, VisualID vid) -{ - return _XVIDtoVisual (dpy, vid); -} - -typedef struct _renderVersionState { - unsigned long version_seq; - Bool error; - int major_version; - int minor_version; - -} _XrenderVersionState; - -static Bool -_XRenderVersionHandler (Display *dpy, - xReply *rep, - char *buf, - int len, - XPointer data) -{ - xRenderQueryVersionReply replbuf; - xRenderQueryVersionReply *repl; - _XrenderVersionState *state = (_XrenderVersionState *) data; - - if (dpy->last_request_read != state->version_seq) - return False; - if (rep->generic.type == X_Error) - { - state->error = True; - return False; - } - repl = (xRenderQueryVersionReply *) - _XGetAsyncReply(dpy, (char *)&replbuf, rep, buf, len, - (SIZEOF(xRenderQueryVersionReply) - SIZEOF(xReply)) >> 2, - True); - state->major_version = repl->majorVersion; - state->minor_version = repl->minorVersion; - return True; -} - -Status -XRenderQueryFormats (Display *dpy) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - _XAsyncHandler async; - _XrenderVersionState async_state; - xRenderQueryVersionReq *vreq; - xRenderQueryPictFormatsReply rep; - xRenderQueryPictFormatsReq *req; - XRenderInfo *xri; - XRenderPictFormat *format; - XRenderScreen *screen; - XRenderDepth *depth; - XRenderVisual *visual; - xPictFormInfo *xFormat; - xPictScreen *xScreen; - xPictDepth *xDepth; - xPictVisual *xVisual; - CARD32 *xSubpixel; - void *xData; - int nf, ns, nd, nv; - int rlength; - int nbytes; - - RenderCheckExtension (dpy, info, 0); - LockDisplay (dpy); - if (info->info) - { - UnlockDisplay (dpy); - return 1; - } - GetReq (RenderQueryVersion, vreq); - vreq->reqType = info->codes->major_opcode; - vreq->renderReqType = X_RenderQueryVersion; - vreq->majorVersion = RENDER_MAJOR; - vreq->minorVersion = RENDER_MINOR; - - async_state.version_seq = dpy->request; - async_state.error = False; - async.next = dpy->async_handlers; - async.handler = _XRenderVersionHandler; - async.data = (XPointer) &async_state; - dpy->async_handlers = &async; - - GetReq (RenderQueryPictFormats, req); - req->reqType = info->codes->major_opcode; - req->renderReqType = X_RenderQueryPictFormats; - - if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) - { - DeqAsyncHandler (dpy, &async); - UnlockDisplay (dpy); - SyncHandle (); - return 0; - } - DeqAsyncHandler (dpy, &async); - if (async_state.error) - { - UnlockDisplay(dpy); - SyncHandle(); - return 0; - } - /* - * Check for the lack of sub-pixel data - */ - if (async_state.major_version == 0 && async_state.minor_version < 6) - rep.numSubpixel = 0; - - xri = (XRenderInfo *) Xmalloc (sizeof (XRenderInfo) + - rep.numFormats * sizeof (XRenderPictFormat) + - rep.numScreens * sizeof (XRenderScreen) + - rep.numDepths * sizeof (XRenderDepth) + - rep.numVisuals * sizeof (XRenderVisual)); - xri->major_version = async_state.major_version; - xri->minor_version = async_state.minor_version; - xri->format = (XRenderPictFormat *) (xri + 1); - xri->nformat = rep.numFormats; - xri->screen = (XRenderScreen *) (xri->format + rep.numFormats); - xri->nscreen = rep.numScreens; - xri->depth = (XRenderDepth *) (xri->screen + rep.numScreens); - xri->ndepth = rep.numDepths; - xri->visual = (XRenderVisual *) (xri->depth + rep.numDepths); - xri->nvisual = rep.numVisuals; - rlength = (rep.numFormats * sizeof (xPictFormInfo) + - rep.numScreens * sizeof (xPictScreen) + - rep.numDepths * sizeof (xPictDepth) + - rep.numVisuals * sizeof (xPictVisual) + - rep.numSubpixel * 4); - xData = (void *) Xmalloc (rlength); - nbytes = (int) rep.length << 2; - - if (!xri || !xData || nbytes < rlength) - { - if (xri) Xfree (xri); - if (xData) Xfree (xData); - _XEatData (dpy, nbytes); - UnlockDisplay (dpy); - SyncHandle (); - return 0; - } - _XRead (dpy, (char *) xData, rlength); - format = xri->format; - xFormat = (xPictFormInfo *) xData; - for (nf = 0; nf < rep.numFormats; nf++) - { - format->id = xFormat->id; - format->type = xFormat->type; - format->depth = xFormat->depth; - format->direct.red = xFormat->direct.red; - format->direct.redMask = xFormat->direct.redMask; - format->direct.green = xFormat->direct.green; - format->direct.greenMask = xFormat->direct.greenMask; - format->direct.blue = xFormat->direct.blue; - format->direct.blueMask = xFormat->direct.blueMask; - format->direct.alpha = xFormat->direct.alpha; - format->direct.alphaMask = xFormat->direct.alphaMask; - format->colormap = xFormat->colormap; - format++; - xFormat++; - } - xScreen = (xPictScreen *) xFormat; - screen = xri->screen; - depth = xri->depth; - visual = xri->visual; - for (ns = 0; ns < xri->nscreen; ns++) - { - screen->depths = depth; - screen->ndepths = xScreen->nDepth; - screen->fallback = _XRenderFindFormat (xri, xScreen->fallback); - screen->subpixel = SubPixelUnknown; - xDepth = (xPictDepth *) (xScreen + 1); - for (nd = 0; nd < screen->ndepths; nd++) - { - depth->depth = xDepth->depth; - depth->nvisuals = xDepth->nPictVisuals; - depth->visuals = visual; - xVisual = (xPictVisual *) (xDepth + 1); - for (nv = 0; nv < depth->nvisuals; nv++) - { - visual->visual = _XRenderFindVisual (dpy, xVisual->visual); - visual->format = _XRenderFindFormat (xri, xVisual->format); - visual++; - xVisual++; - } - depth++; - xDepth = (xPictDepth *) xVisual; - } - screen++; - xScreen = (xPictScreen *) xDepth; - } - xSubpixel = (CARD32 *) xScreen; - screen = xri->screen; - for (ns = 0; ns < rep.numSubpixel; ns++) - { - screen->subpixel = *xSubpixel; - xSubpixel++; - screen++; - } - info->info = xri; - /* - * Skip any extra data - */ - if (nbytes > rlength) - _XEatData (dpy, (unsigned long) (nbytes - rlength)); - - UnlockDisplay (dpy); - SyncHandle (); - Xfree (xData); - return 1; -} - -int -XRenderQuerySubpixelOrder (Display *dpy, int screen) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - XRenderInfo *xri; - - if (!RenderHasExtension (info)) - return SubPixelUnknown; - - if (!XRenderQueryFormats (dpy)) - return SubPixelUnknown; - - xri = info->info; - return xri->screen[screen].subpixel; -} - -Bool -XRenderSetSubpixelOrder (Display *dpy, int screen, int subpixel) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - XRenderInfo *xri; - - if (!RenderHasExtension (info)) - return False; - - if (!XRenderQueryFormats (dpy)) - return False; - - xri = info->info; - xri->screen[screen].subpixel = subpixel; - return True; -} - -XRenderPictFormat * -XRenderFindVisualFormat (Display *dpy, _Xconst Visual *visual) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - int nv; - XRenderInfo *xri; - XRenderVisual *xrv; - - RenderCheckExtension (dpy, info, 0); - if (!XRenderQueryFormats (dpy)) - return 0; - xri = info->info; - for (nv = 0, xrv = xri->visual; nv < xri->nvisual; nv++, xrv++) - if (xrv->visual == visual) - return xrv->format; - return 0; -} - -XRenderPictFormat * -XRenderFindFormat (Display *dpy, - unsigned long mask, - _Xconst XRenderPictFormat *template, - int count) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - int nf; - XRenderInfo *xri; - - RenderCheckExtension (dpy, info, 0); - if (!XRenderQueryFormats (dpy)) - return 0; - xri = info->info; - for (nf = 0; nf < xri->nformat; nf++) - { - if (mask & PictFormatID) - if (template->id != xri->format[nf].id) - continue; - if (mask & PictFormatType) - if (template->type != xri->format[nf].type) - continue; - if (mask & PictFormatDepth) - if (template->depth != xri->format[nf].depth) - continue; - if (mask & PictFormatRed) - if (template->direct.red != xri->format[nf].direct.red) - continue; - if (mask & PictFormatRedMask) - if (template->direct.redMask != xri->format[nf].direct.redMask) - continue; - if (mask & PictFormatGreen) - if (template->direct.green != xri->format[nf].direct.green) - continue; - if (mask & PictFormatGreenMask) - if (template->direct.greenMask != xri->format[nf].direct.greenMask) - continue; - if (mask & PictFormatBlue) - if (template->direct.blue != xri->format[nf].direct.blue) - continue; - if (mask & PictFormatBlueMask) - if (template->direct.blueMask != xri->format[nf].direct.blueMask) - continue; - if (mask & PictFormatAlpha) - if (template->direct.alpha != xri->format[nf].direct.alpha) - continue; - if (mask & PictFormatAlphaMask) - if (template->direct.alphaMask != xri->format[nf].direct.alphaMask) - continue; - if (mask & PictFormatColormap) - if (template->colormap != xri->format[nf].colormap) - continue; - if (count-- == 0) - return &xri->format[nf]; - } - return 0; -} - -XRenderPictFormat * -XRenderFindStandardFormat (Display *dpy, - int format) -{ - static struct { - XRenderPictFormat templ; - unsigned long mask; - } standardFormats[PictStandardNUM] = { - /* PictStandardARGB32 */ - { - { - 0, /* id */ - PictTypeDirect, /* type */ - 32, /* depth */ - { /* direct */ - 16, /* direct.red */ - 0xff, /* direct.redMask */ - 8, /* direct.green */ - 0xff, /* direct.greenMask */ - 0, /* direct.blue */ - 0xff, /* direct.blueMask */ - 24, /* direct.alpha */ - 0xff, /* direct.alphaMask */ - }, - 0, /* colormap */ - }, - PictFormatType | - PictFormatDepth | - PictFormatRed | - PictFormatRedMask | - PictFormatGreen | - PictFormatGreenMask | - PictFormatBlue | - PictFormatBlueMask | - PictFormatAlpha | - PictFormatAlphaMask, - }, - /* PictStandardRGB24 */ - { - { - 0, /* id */ - PictTypeDirect, /* type */ - 24, /* depth */ - { /* direct */ - 16, /* direct.red */ - 0xff, /* direct.redMask */ - 8, /* direct.green */ - 0xff, /* direct.greenMask */ - 0, /* direct.blue */ - 0xff, /* direct.blueMask */ - 0, /* direct.alpha */ - 0x00, /* direct.alphaMask */ - }, - 0, /* colormap */ - }, - PictFormatType | - PictFormatDepth | - PictFormatRed | - PictFormatRedMask | - PictFormatGreen | - PictFormatGreenMask | - PictFormatBlue | - PictFormatBlueMask | - PictFormatAlphaMask, - }, - /* PictStandardA8 */ - { - { - 0, /* id */ - PictTypeDirect, /* type */ - 8, /* depth */ - { /* direct */ - 0, /* direct.red */ - 0x00, /* direct.redMask */ - 0, /* direct.green */ - 0x00, /* direct.greenMask */ - 0, /* direct.blue */ - 0x00, /* direct.blueMask */ - 0, /* direct.alpha */ - 0xff, /* direct.alphaMask */ - }, - 0, /* colormap */ - }, - PictFormatType | - PictFormatDepth | - PictFormatRedMask | - PictFormatGreenMask | - PictFormatBlueMask | - PictFormatAlpha | - PictFormatAlphaMask, - }, - /* PictStandardA4 */ - { - { - 0, /* id */ - PictTypeDirect, /* type */ - 4, /* depth */ - { /* direct */ - 0, /* direct.red */ - 0x00, /* direct.redMask */ - 0, /* direct.green */ - 0x00, /* direct.greenMask */ - 0, /* direct.blue */ - 0x00, /* direct.blueMask */ - 0, /* direct.alpha */ - 0x0f, /* direct.alphaMask */ - }, - 0, /* colormap */ - }, - PictFormatType | - PictFormatDepth | - PictFormatRedMask | - PictFormatGreenMask | - PictFormatBlueMask | - PictFormatAlpha | - PictFormatAlphaMask, - }, - /* PictStandardA1 */ - { - { - 0, /* id */ - PictTypeDirect, /* type */ - 1, /* depth */ - { /* direct */ - 0, /* direct.red */ - 0x00, /* direct.redMask */ - 0, /* direct.green */ - 0x00, /* direct.greenMask */ - 0, /* direct.blue */ - 0x00, /* direct.blueMask */ - 0, /* direct.alpha */ - 0x01, /* direct.alphaMask */ - }, - 0, /* colormap */ - }, - PictFormatType | - PictFormatDepth | - PictFormatRedMask | - PictFormatGreenMask | - PictFormatBlueMask | - PictFormatAlpha | - PictFormatAlphaMask, - }, - }; - - if (0 <= format && format < PictStandardNUM) - return XRenderFindFormat (dpy, - standardFormats[format].mask, - &standardFormats[format].templ, - 0); - return 0; -} - -XIndexValue * -XRenderQueryPictIndexValues(Display *dpy, - _Xconst XRenderPictFormat *format, - int *num) -{ - XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); - xRenderQueryPictIndexValuesReq *req; - xRenderQueryPictIndexValuesReply rep; - XIndexValue *values; - int nbytes, nread, rlength, i; - - RenderCheckExtension (dpy, info, 0); - - LockDisplay (dpy); - GetReq (RenderQueryPictIndexValues, req); - req->reqType = info->codes->major_opcode; - req->renderReqType = X_RenderQueryPictIndexValues; - req->format = format->id; - if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) - { - UnlockDisplay (dpy); - SyncHandle (); - return 0; - } - - /* request data length */ - nbytes = (long)rep.length << 2; - /* bytes of actual data in the request */ - nread = rep.numIndexValues * SIZEOF (xIndexValue); - /* size of array returned to application */ - rlength = rep.numIndexValues * sizeof (XIndexValue); - - /* allocate returned data */ - values = (XIndexValue *)Xmalloc (rlength); - if (!values) - { - _XEatData (dpy, nbytes); - UnlockDisplay (dpy); - SyncHandle (); - return 0; - } - - /* read the values one at a time and convert */ - *num = rep.numIndexValues; - for(i = 0; i < rep.numIndexValues; i++) - { - xIndexValue value; - - _XRead (dpy, (char *) &value, SIZEOF (xIndexValue)); - values[i].pixel = value.pixel; - values[i].red = value.red; - values[i].green = value.green; - values[i].blue = value.blue; - values[i].alpha = value.alpha; - } - /* skip any padding */ - if(nbytes > nread) - { - _XEatData (dpy, (unsigned long) (nbytes - nread)); - } - UnlockDisplay (dpy); - SyncHandle (); - return values; -} |