[1/2] winex11: Add C alternatives to the assembly bits in X11DRV_DIB_SetImageBits_8().

Francois Gouget fgouget at free.fr
Fri Nov 9 05:45:58 CST 2007


---

It's pretty simple to implement the assembly bits in C and they should 
be much faster than the XPutPixel()-based fallback. I also removed two 
FIXMEs because I'm now convinced this works as expected.


 dlls/winex11.drv/dib.c |   28 +++++++++++++++++++++-------
 1 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c
index 5d4ac45..8fb61dd 100644
--- a/dlls/winex11.drv/dib.c
+++ b/dlls/winex11.drv/dib.c
@@ -1427,15 +1427,14 @@ static void X11DRV_DIB_SetImageBits_8( int lines, const BYTE *srcbits,
     switch (bmpImage->depth) {
     case 15:
     case 16:
-#if defined(__i386__) && defined(__GNUC__)
 	/* Some X servers might have 32 bit/ 16bit deep pixel */
 	if (lines && width && (bmpImage->bits_per_pixel == 16) &&
             (ImageByteOrder(gdi_display)==LSBFirst) )
 	{
-	    dstbits=(BYTE*)bmpImage->data+left*2+(lines-1)*bmpImage->bytes_per_line;
-	    /* FIXME: Does this really handle all these cases correctly? */
 	    /* ==== pal 8 dib -> rgb or bgr 555 or 565 bmp ==== */
+	    dstbits=(BYTE*)bmpImage->data+left*2+(lines-1)*bmpImage->bytes_per_line;
 	    for (h = lines ; h--; ) {
+#if defined(__i386__) && defined(__GNUC__)
 		int _cl1,_cl2; /* temp outputs for asm below */
 		/* Borrowed from DirectDraw */
 		__asm__ __volatile__(
@@ -1454,23 +1453,33 @@ static void X11DRV_DIB_SetImageBits_8( int lines, const BYTE *srcbits,
 		 "d" (colors)
 		:"eax", "cc", "memory"
 		);
+#else
+		DWORD* dstpixel=(DWORD*)dstbits;
+		for (x=0; x<width/2; x++) {
+		    /* Do 2 pixels at a time */
+		    *dstpixel++=(colors[srcbyte[1]] << 16) | colors[srcbyte[0]];
+		    srcbyte+=2;
+		}
+		if (width&1) {
+		    /* And then the odd pixel */
+		    *((WORD*)dstpixel)=colors[srcbyte[0]];
+		}
+#endif
 		srcbyte = (srcbits += linebytes);
 		dstbits -= bmpImage->bytes_per_line;
 	    }
 	    return;
 	}
 	break;
-#endif
     case 24:
     case 32:
-#if defined(__i386__) && defined(__GNUC__)
 	if (lines && width && (bmpImage->bits_per_pixel == 32) &&
             (ImageByteOrder(gdi_display)==LSBFirst) )
 	{
 	    dstbits=(BYTE*)bmpImage->data+left*4+(lines-1)*bmpImage->bytes_per_line;
-	    /* FIXME: Does this really handle both cases correctly? */
 	    /* ==== pal 8 dib -> rgb or bgr 0888 bmp ==== */
 	    for (h = lines ; h--; ) {
+#if defined(__i386__) && defined(__GNUC__)
 		int _cl1,_cl2; /* temp outputs for asm below */
 		/* Borrowed from DirectDraw */
 		__asm__ __volatile__(
@@ -1489,13 +1498,18 @@ static void X11DRV_DIB_SetImageBits_8( int lines, const BYTE *srcbits,
 		 "d" (colors)
 		:"eax", "cc", "memory"
 		);
+#else
+		DWORD* dstpixel=(DWORD*)dstbits;
+		for (x=0; x<width; x++) {
+		    *dstpixel++=colors[*srcbyte++];
+		}
+#endif
 		srcbyte = (srcbits += linebytes);
 		dstbits -= bmpImage->bytes_per_line;
 	    }
 	    return;
 	}
 	break;
-#endif
     default:
         break; /* use slow generic case below */
     }
-- 
1.5.3.4




More information about the wine-patches mailing list