On Mon, 1 Sep 2003 07:13:26 +0200
Elie De Brauwer <[EMAIL PROTECTED]> 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 via email to