[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