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: