Vincent Povirk : windowscodecs: Add support for BI_BITFIELDS compressed BMP files.
Alexandre Julliard
julliard at winehq.org
Mon Aug 10 10:34:56 CDT 2009
Module: wine
Branch: master
Commit: b364bc005d2daae3867f94e91e9985382a2ba3c7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b364bc005d2daae3867f94e91e9985382a2ba3c7
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Tue Jul 14 14:16:03 2009 -0500
windowscodecs: Add support for BI_BITFIELDS compressed BMP files.
---
dlls/windowscodecs/bmpdecode.c | 64 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/dlls/windowscodecs/bmpdecode.c b/dlls/windowscodecs/bmpdecode.c
index 1c63253..5c805c8 100644
--- a/dlls/windowscodecs/bmpdecode.c
+++ b/dlls/windowscodecs/bmpdecode.c
@@ -619,6 +619,24 @@ static HRESULT BmpFrameDecode_ReadUnsupported(BmpFrameDecode* This)
return E_FAIL;
}
+struct bitfields_format {
+ WORD bitcount; /* 0 for end of list */
+ DWORD redmask;
+ DWORD greenmask;
+ DWORD bluemask;
+ DWORD alphamask;
+ const WICPixelFormatGUID *pixelformat;
+ ReadDataFunc read_data_func;
+};
+
+static const struct bitfields_format bitfields_formats[] = {
+ {16,0x7c00,0x3e0,0x1f,0,&GUID_WICPixelFormat16bppBGR555,BmpFrameDecode_ReadUncompressed},
+ {16,0xf800,0x7e0,0x1f,0,&GUID_WICPixelFormat16bppBGR565,BmpFrameDecode_ReadUncompressed},
+ {32,0xff0000,0xff00,0xff,0,&GUID_WICPixelFormat32bppBGR,BmpFrameDecode_ReadUncompressed},
+ {32,0xff0000,0xff00,0xff,0xff000000,&GUID_WICPixelFormat32bppBGRA,BmpFrameDecode_ReadUncompressed},
+ {0}
+};
+
static const IWICBitmapFrameDecodeVtbl BmpFrameDecode_Vtbl = {
BmpFrameDecode_QueryInterface,
BmpFrameDecode_AddRef,
@@ -677,6 +695,17 @@ static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream)
if (FAILED(hr)) return hr;
if (bytestoread != bytesread) return E_FAIL;
+ /* if this is a BITMAPINFOHEADER with BI_BITFIELDS compression, we need to
+ read the extra fields */
+ if (This->bih.bV5Size == sizeof(BITMAPINFOHEADER) &&
+ This->bih.bV5Compression == BI_BITFIELDS)
+ {
+ hr = IStream_Read(stream, &This->bih.bV5RedMask, 12, &bytesread);
+ if (FAILED(hr)) return hr;
+ if (bytesread != 12) return E_FAIL;
+ This->bih.bV5AlphaMask = 0;
+ }
+
/* decide what kind of bitmap this is and how/if we can read it */
if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER))
{
@@ -753,6 +782,41 @@ static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream)
This->read_data_func = BmpFrameDecode_ReadRLE4;
This->pixelformat = &GUID_WICPixelFormat32bppBGR;
break;
+ case BI_BITFIELDS:
+ {
+ const struct bitfields_format *format;
+ if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER2))
+ {
+ /* BCH2 doesn't support bitfields; this is Huffman 1D compression */
+ This->bitsperpixel = 0;
+ This->read_data_func = BmpFrameDecode_ReadUnsupported;
+ This->pixelformat = &GUID_WICPixelFormatUndefined;
+ FIXME("Huffman 1D compression is unsupported\n");
+ break;
+ }
+ This->bitsperpixel = This->bih.bV5BitCount;
+ for (format = bitfields_formats; format->bitcount; format++)
+ {
+ if ((format->bitcount == This->bih.bV5BitCount) &&
+ (format->redmask == This->bih.bV5RedMask) &&
+ (format->greenmask == This->bih.bV5GreenMask) &&
+ (format->bluemask == This->bih.bV5BlueMask) &&
+ (format->alphamask == This->bih.bV5AlphaMask))
+ {
+ This->read_data_func = format->read_data_func;
+ This->pixelformat = format->pixelformat;
+ break;
+ }
+ }
+ if (!format->bitcount)
+ {
+ This->read_data_func = BmpFrameDecode_ReadUncompressed;
+ This->pixelformat = &GUID_WICPixelFormatUndefined;
+ FIXME("unsupported bitfields type depth=%i red=%x green=%x blue=%x alpha=%x\n",
+ This->bih.bV5BitCount, This->bih.bV5RedMask, This->bih.bV5GreenMask, This->bih.bV5BlueMask, This->bih.bV5AlphaMask);
+ }
+ break;
+ }
default:
This->bitsperpixel = 0;
This->read_data_func = BmpFrameDecode_ReadUnsupported;
More information about the wine-cvs
mailing list