[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: X color problem



On Mon, 1 Sep 2003 07:13:26 +0200
Elie De Brauwer <elie.de.brauwer@pandora.be> wrote:

> brauwer.be/wastebasket/snapshot1.png

Well, there's definitely a bug in the FB layer of xfree86
when working with mixed BGR/RGB pixmaps when apps are using
the RENDER extension.  The following patch to Debian's xfree86
sources fix that up, you can apply it and rebuild to see if that
is the problem you're seeing.

--- xc-xserver-xfree86-dbg/programs/Xserver/fb/fbpict.c	2003-08-09 02:45:21.000000000 -0700
+++ xc/programs/Xserver/fb/fbpict.c	2003-08-29 00:24:34.000000000 -0700
@@ -99,7 +99,7 @@ fbIn (CARD32 x, CARD8 y)
     return m|n|o|p;
 }
 
-#define fbComposeGetSolid(pict, bits) { \
+#define fbComposeGetSolid(pict, bits, fmt) { \
     FbBits	*__bits__; \
     FbStride	__stride__; \
     int		__bpp__; \
@@ -120,6 +120,14 @@ fbIn (CARD32 x, CARD8 y)
     default: \
 	return; \
     } \
+    /* If necessary, convert RGB <--> BGR. */ \
+    if (PICT_FORMAT_TYPE((pict)->format) != PICT_FORMAT_TYPE(fmt)) \
+    { \
+        (bits) = (((bits) & 0xff000000) | \
+                  (((bits) & 0x00ff0000) >> 16) | \
+                  (((bits) & 0x0000ff00) >>  0) | \
+                  (((bits) & 0x000000ff) << 16)); \
+    } \
     /* manage missing src alpha */ \
     if ((pict)->pFormat->direct.alphaMask == 0) \
 	(bits) |= 0xff000000; \
@@ -162,13 +170,13 @@ fbCompositeSolidMask_nx8x8888 (CARD8    
     FbStride	dstStride, maskStride;
     CARD16	w;
 
-    fbComposeGetSolid(pSrc, src);
+    fbComposeGetSolid(pSrc, src, pDst->format);
     
     dstMask = FbFullMask (pDst->pDrawable->depth);
     srca = src >> 24;
     if (src == 0)
 	return;
-    
+
     fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
     fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
     
@@ -221,7 +229,7 @@ fbCompositeSolidMask_nx8888x8888C (CARD8
     CARD16	w;
     CARD32	m, n, o, p;
 
-    fbComposeGetSolid(pSrc, src);
+    fbComposeGetSolid(pSrc, src, pDst->format);
     
     dstMask = FbFullMask (pDst->pDrawable->depth);
     srca = src >> 24;
@@ -294,7 +302,7 @@ fbCompositeSolidMask_nx8x0888 (CARD8    
     FbStride	dstStride, maskStride;
     CARD16	w;
 
-    fbComposeGetSolid(pSrc, src);
+    fbComposeGetSolid(pSrc, src, pDst->format);
     
     srca = src >> 24;
     if (src == 0)
@@ -356,7 +364,7 @@ fbCompositeSolidMask_nx8x0565 (CARD8    
     FbStride	dstStride, maskStride;
     CARD16	w;
 
-    fbComposeGetSolid(pSrc, src);
+    fbComposeGetSolid(pSrc, src, pDst->format);
     
     srca = src >> 24;
     if (src == 0)
@@ -421,7 +429,7 @@ fbCompositeSolidMask_nx8888x0565C (CARD8
     CARD16	w;
     CARD32	m, n, o;
 
-    fbComposeGetSolid(pSrc, src);
+    fbComposeGetSolid(pSrc, src, pDst->format);
     
     srca = src >> 24;
     if (src == 0)
@@ -826,7 +834,7 @@ fbCompositeSolidMask_nx1xn (CARD8      o
     int		maskXoff, maskYoff;
     FbBits	src;
     
-    fbComposeGetSolid(pSrc, src);
+    fbComposeGetSolid(pSrc, src, pDst->format);
 
     fbGetStipDrawable (pMask->pDrawable, maskBits, maskStride, maskBpp, maskXoff, maskYoff);
     fbGetDrawable (pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff);



Reply to: