* Introduced PaletteConverter::IndexForRGBA32() which checks if the alpha

component of a 32 bit color is below 128 and returns the special CMAP8 index
   for indicating transparency.
 * Changed the WriteCMAP() color conversion function to expext a 32bit RGBA
   value and use IndexForRGBA32().
 * Adapted B_CMAP8 target color space case of ConvertBits() to the new
   semantics.

This allows transparency in bitmaps when converting B_RGBA32 bitmaps to
B_CMAP8, tested only for this case and working as expected.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36549 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2010-04-30 11:29:14 +00:00
parent 8cd3dac13e
commit 59d0c2e45e
2 changed files with 24 additions and 6 deletions

View File

@ -38,6 +38,7 @@ public:
inline uint8 IndexForRGB16(uint8 red, uint8 green, uint8 blue) const;
inline uint8 IndexForRGB24(uint32 rgb) const;
inline uint8 IndexForRGB24(uint8 red, uint8 green, uint8 blue) const;
inline uint8 IndexForRGBA32(uint32 rgba) const;
inline uint8 IndexForGray(uint8 gray) const;
inline const rgb_color &RGBColorForIndex(uint8 index) const;

View File

@ -308,6 +308,23 @@ PaletteConverter::IndexForRGB24(uint8 red, uint8 green, uint8 blue) const
}
/*! \brief Returns the palette color index closest to a given RGBA 32 color.
The object must be properly initialized.
\param rgb The RGB 32A color value (R[31:24]G[23:16]B[15:8]A[7:0]).
\return The palette color index for the supplied color.
*/
inline
uint8
PaletteConverter::IndexForRGBA32(uint32 rgba) const
{
if ((rgba & 0x000000ff) < 128)
return B_TRANSPARENT_MAGIC_CMAP8;
return IndexForRGB24(rgba);
}
/*! \brief Returns the palette color index closest to a given Gray 8 color.
The object must be properly initialized.
@ -539,7 +556,7 @@ ReadGray1(const uint8 **source, int32 index)
void
WriteCMAP8(uint8 **dest, uint8 *data, int32 index)
{
**dest = sPaletteConverter.IndexForRGB15(*(uint16 *)data);
**dest = sPaletteConverter.IndexForRGBA32(*(uint32 *)data);
(*dest)++;
}
@ -836,11 +853,11 @@ ConvertBits(const srcByte *srcBits, void *dstBits, int32 srcBitsLength,
case B_CMAP8:
PaletteConverter::InitializeDefault();
ConvertBits(srcBits, (uint8 *)dstBits, srcBitsLength,
dstBitsLength, redShift - 15, greenShift - 10, blueShift - 5,
0, 0, 0x7c00, 0x03e0, 0x001f, 0x0000, srcBytesPerRow,
dstBytesPerRow, srcBitsPerPixel, 8, srcColorSpace,
dstColorSpace, srcOffset, dstOffset, width, height, srcSwap,
false, srcFunc, WriteCMAP8);
dstBitsLength, redShift - 32, greenShift - 24, blueShift - 16,
alphaShift - 8, alphaBits, 0xff000000, 0x00ff0000, 0x0000ff00,
0x000000ff, srcBytesPerRow, dstBytesPerRow, srcBitsPerPixel, 8,
srcColorSpace, dstColorSpace, srcOffset, dstOffset,
width, height, srcSwap, false, srcFunc, WriteCMAP8);
break;
default: