x11drv: question about byte-swapping for DIBs

Eric Frias efrias at syncad.com
Wed Apr 19 15:50:47 CDT 2006


I'm trying to debug a problem in which 24-bit .bmps don't display 
correctly from a winelib application on a big-endian sparc host when 
displaying on a little-endian intel PC.  In this case, the image is 
garbled, with most of the colors being wrong and a pattern of vertical 
stripes over the image.  The code passes through 
convert_888_to_0888_reverse_dst_byteswap which is what mangles the image 
data.

I looked through the other conversion functions, and it seems the 
corresponding 'src' function (convert_888_to_0888_reverse_src_byteswap) 
actually does the correct transformation.  I don't have a very good 
grasp of why the conversions are chosen, but it seemed like a likely fix 
would be to edit dib.c and make the lines in the SetImageBits functions 
that select the conversion structure look like:

#ifdef WORDS_BIGENDIAN
    const dib_conversions *convs = (bmpImage->byte_order == LSBFirst) ? 
&dib_normal : &dib_src_byteswap;
#else
    const dib_conversions *convs = (bmpImage->byte_order == LSBFirst) ? 
&dib_normal : &dib_dst_byteswap;
#endif

Doing this fixed my problem and didn't seem to cause any others, but I'm 
wondering whether this fix is correct or if I just got lucky.  Can 
someone who knows this code tell me if this makes logical sense?

(If it's correct, there probably needs to be a related patch in the 
GetImageBits functions, just going in the other direction).

Eric



More information about the wine-devel mailing list