On Wed, Oct 23, 2002 at 10:27:58PM +0200, Olivier Chapuis wrote: > > An other point, maybe XRender should has a function which > describes the colormap it uses (for depth <= 8 && PseudoColor). >
Ooops, the render protocol has such a function: QueryPictIndexValues. It is just not yet implemented. Attached to this message an implementation of this function. The patch is against the current cvs and done in two part. qpiv_server.patch done in xc/programs/Xserver/render qpiv_client.patch done in xc/lib/Xrender/ Regards, Olivier PS: Will be fare from my e-mails from the 10-27 to the 10-31
? Makefile ? unshared ? libXrender.so.1.1 ? libXrender.so.1.2 ? Xrender.c.choice ? current_diff ? qpiv_client.patch Index: Xrender.c =================================================================== RCS file: /cvs/xc/lib/Xrender/Xrender.c,v retrieving revision 1.12 diff -u -r1.12 Xrender.c --- Xrender.c 2002/09/29 23:39:44 1.12 +++ Xrender.c 2002/10/26 16:30:52 @@ -582,3 +582,72 @@ 0); return 0; } + + +XIndexValue *XRenderQueryPictIndexValues(Display *dpy, + _Xconst XRenderPictFormat *format, + int *num) +{ + xRenderQueryPictIndexValuesReq *req; + xRenderQueryPictIndexValuesReply rep; + XIndexValue *values; + int nbytes, rlength, i; + CARD32 l; + CARD16 m[4]; + XExtDisplayInfo *info = XRenderFindDisplay (dpy); + + RenderCheckExtension (dpy, info, 0); + *num = 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; + } + + nbytes = (long)rep.length << 2; + rlength = rep.numIndexValues * sizeof (XIndexValue); + if (nbytes < rlength) + { + /* bad length; should not happen */ + _XEatData (dpy, nbytes); + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + + values = (XIndexValue *)Xmalloc (rlength); + if (!values) + { + _XEatData (dpy, nbytes); + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + + *num = rep.numIndexValues; + for(i = 0; i < rep.numIndexValues; i++) + { + _XRead32 (dpy, &l, 4); + _XRead16 (dpy, m, 8); + values[i].pixel = l; + values[i].red = m[0]; + values[i].green = m[1]; + values[i].blue = m[2]; + values[i].alpha = m[3]; + } + if(nbytes > rlength) + { + /* strange implementation; should not happen with XFRee */ + _XEatData (dpy, (unsigned long) (nbytes - rlength)); + } + UnlockDisplay (dpy); + SyncHandle (); + return values; +} Index: Xrender.h =================================================================== RCS file: /cvs/xc/lib/Xrender/Xrender.h,v retrieving revision 1.16 diff -u -r1.16 Xrender.h --- Xrender.h 2002/09/29 23:39:44 1.16 +++ Xrender.h 2002/10/26 16:30:53 @@ -28,6 +28,7 @@ #include <X11/extensions/render.h> +#include <X11/Intrinsic.h> #include <X11/Xfuncproto.h> #include <X11/Xosdefs.h> #include <X11/Xutil.h> @@ -159,6 +160,15 @@ short *alias; } XFilters; +typedef struct _XIndexedValue { + Pixel pixel; + unsigned short red; + unsigned short green; + unsigned short blue; + unsigned short alpha; +} XIndexValue; + + _XFUNCPROTOBEGIN Bool XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep); @@ -168,6 +178,10 @@ int *minor_versionp); Status XRenderQueryFormats (Display *dpy); + +XIndexValue *XRenderQueryPictIndexValues(Display *dpy, + _Xconst XRenderPictFormat *format, + int *num); int XRenderQuerySubpixelOrder (Display *dpy, int screen);
? Makefile ? miindex.c.my ? patch.txt ? current_diff ? miindex.c.last ? qpiv_server.patch Index: miindex.c =================================================================== RCS file: /cvs/xc/programs/Xserver/render/miindex.c,v retrieving revision 1.5 diff -u -r1.5 miindex.c --- miindex.c 2002/05/13 05:25:11 1.5 +++ miindex.c 2002/10/26 16:31:55 @@ -217,6 +217,8 @@ } break; } + pIndexed->first = first; + pIndexed->last = last; pFormat->indexed = pIndexed; return TRUE; } Index: mipict.h =================================================================== RCS file: /cvs/xc/programs/Xserver/render/mipict.h,v retrieving revision 1.11 diff -u -r1.11 mipict.h --- mipict.h 2002/08/23 05:48:27 1.11 +++ mipict.h 2002/10/26 16:31:56 @@ -36,6 +36,8 @@ typedef struct _miIndexed { Bool color; + Pixel first; + Pixel last; CARD32 rgba[MI_MAX_INDEXED]; miIndexType ent[32768]; } miIndexedRec, *miIndexedPtr; Index: render.c =================================================================== RCS file: /cvs/xc/programs/Xserver/render/render.c,v retrieving revision 1.20 diff -u -r1.20 render.c --- render.c 2002/10/10 02:29:06 1.20 +++ render.c 2002/10/26 16:32:04 @@ -43,6 +43,7 @@ #include "glyphstr.h" #include "Xfuncproto.h" #include "cursorstr.h" +#include "mipict.h" #ifdef EXTMODULE #include "xf86_ansic.h" #endif @@ -510,7 +511,78 @@ static int ProcRenderQueryPictIndexValues (ClientPtr client) { - return BadImplementation; + PictFormatPtr pFormat; + miIndexedPtr pIndexed; + xIndexValue *values; + Pixel pix[MI_MAX_INDEXED]; + xrgb colors[MI_MAX_INDEXED]; + int num; + int rlength; + int i,j,n; + REQUEST(xRenderQueryPictIndexValuesReq); + xRenderQueryPictIndexValuesReply *reply; + + REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq); + + pFormat = (PictFormatPtr) SecurityLookupIDByType (client, + stuff->format, + PictFormatType, + SecurityReadAccess); + + if (!pFormat) + { + client->errorValue = stuff->format; + return RenderErrBase + BadPictFormat; + } + if (pFormat->type != PictTypeIndexed || !pFormat->indexed) + { + client->errorValue = stuff->format; + return BadMatch; + } + pIndexed = pFormat->indexed; + num = pIndexed->last - pIndexed->first + 1; + rlength = sizeof (xRenderQueryPictIndexValuesReply) + + num * sizeof(xIndexValue); + reply = (xRenderQueryPictIndexValuesReply *) xalloc (rlength); + if (!reply) + return BadAlloc; + + reply->type = X_Reply; + reply->sequenceNumber = client->sequence; + reply->length = (rlength - sizeof(xGenericReply)) >> 2; + reply->numIndexValues = num; + + values = (xIndexValue *) (reply + 1); + + for (i = pIndexed->first, j = 0; i <= pIndexed->last; i++,j++) + pix[j] = i; + QueryColors(pFormat->pColormap, num, pix, colors); + for (j = 0; j < num; j++) + { + values->pixel = pix[j]; + values->red = colors[j].red; + values->green = colors[j].green; + values->blue = colors[j].blue; + values->alpha = 0xffff; + if (client->swapped) + { + swapl (&values->pixel, n); + swaps (&values->red, n); + swaps (&values->green, n); + swaps (&values->blue, n); + swaps (&values->alpha, n); + } + values++; + } + if (client->swapped) + { + swaps (&reply->sequenceNumber, n); + swapl (&reply->length, n); + swapl (&reply->numIndexValues, n); + } + WriteToClient(client, rlength, (char *) reply); + xfree(reply); + return (client->noClientException); } static int @@ -1674,7 +1746,11 @@ static int SProcRenderQueryPictIndexValues (ClientPtr client) { - return BadImplementation; + register int n; + REQUEST(xRenderQueryPictIndexValuesReq); + swaps(&stuff->length, n); + swapl(&stuff->format, n); + return (*ProcRenderVector[stuff->renderReqType]) (client); } static int