[prev in list] [next in list] [prev in thread] [next in thread]
List: xfree-xpert
Subject: Render QueryPictIndexValues Patch (was: Re: [Xpert]Colormap Allocation problems under Linux 7.3)
From: Olivier Chapuis <olivier.chapuis () free ! fr>
Date: 2002-10-26 16:24:51
[Download RAW message or body]
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
["qpiv_client.patch" (text/plain)]
? 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);
["qpiv_server.patch" (text/plain)]
? 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
_______________________________________________
Xpert mailing list
Xpert@XFree86.Org
http://XFree86.Org/mailman/listinfo/xpert
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic