Module: wine Branch: master Commit: f288ed99b06e5d3d411c615cccd2fc2406827496 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f288ed99b06e5d3d411c615ccc...
Author: Francois Gouget fgouget@free.fr Date: Fri Nov 9 12:45:58 2007 +0100
winex11: Add C alternatives to the assembly bits in X11DRV_DIB_SetImageBits_8().
---
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 */ }