$Id$ Fix up case where we need to convert RGB->BGR (fixes SDL under sunffb, for example). This patch by David S. Miller via Ben Collins. Forward-ported by Fabio M. Di Nitto. Not submitted to XFree86. diff -ruN xc-old/programs/Xserver/fb/fbmmx.c xc/programs/Xserver/fb/fbmmx.c --- xc-old/programs/Xserver/fb/fbmmx.c 2004-07-22 19:24:50.000000000 +0000 +++ xc/programs/Xserver/fb/fbmmx.c 2004-10-20 12:57:11.435058096 +0000 @@ -375,7 +375,7 @@ CHECKPOINT(); - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); if (src >> 24 == 0) return; @@ -453,7 +453,7 @@ CHECKPOINT(); - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); if (src >> 24 == 0) return; @@ -538,7 +538,7 @@ CHECKPOINT(); - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); srca = src >> 24; if (srca == 0) @@ -643,7 +643,7 @@ CHECKPOINT(); - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); srca = src >> 24; if (srca == 0) @@ -759,7 +759,7 @@ CHECKPOINT(); - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); srca = src >> 24; if (srca == 0) @@ -1100,7 +1100,7 @@ CHECKPOINT(); - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); srca = src >> 24; if (srca == 0) diff -ruN xc-old/programs/Xserver/fb/fbpict.c xc/programs/Xserver/fb/fbpict.c --- xc-old/programs/Xserver/fb/fbpict.c 2004-08-06 23:42:10.000000000 +0000 +++ xc/programs/Xserver/fb/fbpict.c 2004-10-20 12:56:31.282162264 +0000 @@ -99,7 +99,7 @@ FbStride dstStride, maskStride; CARD16 w; - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); dstMask = FbFullMask (pDst->pDrawable->depth); srca = src >> 24; @@ -158,7 +158,7 @@ CARD16 w; CARD32 m, n, o, p; - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); dstMask = FbFullMask (pDst->pDrawable->depth); srca = src >> 24; @@ -231,7 +231,7 @@ FbStride dstStride, maskStride; CARD16 w; - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); srca = src >> 24; if (src == 0) @@ -293,7 +293,7 @@ FbStride dstStride, maskStride; CARD16 w; - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); srca = src >> 24; if (src == 0) @@ -358,7 +358,7 @@ CARD16 w; CARD32 m, n, o; - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); srca = src >> 24; if (src == 0) @@ -763,7 +763,7 @@ int maskXoff, maskYoff; FbBits src; - fbComposeGetSolid(pSrc, src); + fbComposeGetSolid(pSrc, src, pDst->format); if ((src & 0xff000000) != 0xff000000) { diff -ruN xc-old/programs/Xserver/fb/fbpict.h xc/programs/Xserver/fb/fbpict.h --- xc-old/programs/Xserver/fb/fbpict.h 2004-08-13 08:16:14.000000000 +0000 +++ xc/programs/Xserver/fb/fbpict.h 2004-10-20 12:55:00.103023600 +0000 @@ -72,7 +72,7 @@ CARD16 width, CARD16 height); -#define fbComposeGetSolid(pict, bits) { \ +#define fbComposeGetSolid(pict, bits, fmt) { \ FbBits *__bits__; \ FbStride __stride__; \ int __bpp__; \ @@ -93,6 +93,14 @@ 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; \