windowscodecs: Implement GetPixelFormat for BMP decoder.
This commit is contained in:
parent
5574f0138e
commit
02d0462f06
|
@ -64,6 +64,8 @@ typedef struct {
|
||||||
IStream *stream;
|
IStream *stream;
|
||||||
BITMAPFILEHEADER bfh;
|
BITMAPFILEHEADER bfh;
|
||||||
BITMAPV5HEADER bih;
|
BITMAPV5HEADER bih;
|
||||||
|
const WICPixelFormatGUID *pixelformat;
|
||||||
|
int bitsperpixel;
|
||||||
} BmpFrameDecode;
|
} BmpFrameDecode;
|
||||||
|
|
||||||
static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
|
static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
|
||||||
|
@ -151,8 +153,12 @@ static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface,
|
||||||
static HRESULT WINAPI BmpFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface,
|
static HRESULT WINAPI BmpFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface,
|
||||||
WICPixelFormatGUID *pPixelFormat)
|
WICPixelFormatGUID *pPixelFormat)
|
||||||
{
|
{
|
||||||
FIXME("(%p,%p): stub\n", iface, pPixelFormat);
|
BmpFrameDecode *This = (BmpFrameDecode*)iface;
|
||||||
return E_NOTIMPL;
|
TRACE("(%p,%p)\n", iface, pPixelFormat);
|
||||||
|
|
||||||
|
memcpy(pPixelFormat, This->pixelformat, sizeof(GUID));
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT BmpHeader_GetResolution(BITMAPV5HEADER *bih, double *pDpiX, double *pDpiY)
|
static HRESULT BmpHeader_GetResolution(BITMAPV5HEADER *bih, double *pDpiX, double *pDpiY)
|
||||||
|
@ -241,6 +247,8 @@ typedef struct {
|
||||||
BITMAPFILEHEADER bfh;
|
BITMAPFILEHEADER bfh;
|
||||||
BITMAPV5HEADER bih;
|
BITMAPV5HEADER bih;
|
||||||
BmpFrameDecode *framedecode;
|
BmpFrameDecode *framedecode;
|
||||||
|
const WICPixelFormatGUID *pixelformat;
|
||||||
|
int bitsperpixel;
|
||||||
} BmpDecoder;
|
} BmpDecoder;
|
||||||
|
|
||||||
static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream)
|
static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream)
|
||||||
|
@ -269,6 +277,78 @@ static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream)
|
||||||
if (FAILED(hr)) return hr;
|
if (FAILED(hr)) return hr;
|
||||||
if (bytestoread != bytesread) return E_FAIL;
|
if (bytestoread != bytesread) return E_FAIL;
|
||||||
|
|
||||||
|
/* decide what kind of bitmap this is and how/if we can read it */
|
||||||
|
if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER))
|
||||||
|
{
|
||||||
|
BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih;
|
||||||
|
TRACE("BITMAPCOREHEADER with depth=%i\n", bch->bcBitCount);
|
||||||
|
This->bitsperpixel = bch->bcBitCount;
|
||||||
|
switch(bch->bcBitCount)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat1bppIndexed;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat2bppIndexed;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat4bppIndexed;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat8bppIndexed;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat24bppBGR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormatUndefined;
|
||||||
|
WARN("unsupported bit depth %i for BITMAPCOREHEADER\n", bch->bcBitCount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* struct is compatible with BITMAPINFOHEADER */
|
||||||
|
{
|
||||||
|
TRACE("bitmap header=%i compression=%i depth=%i\n", This->bih.bV5Size, This->bih.bV5Compression, This->bih.bV5BitCount);
|
||||||
|
switch(This->bih.bV5Compression)
|
||||||
|
{
|
||||||
|
case BI_RGB:
|
||||||
|
This->bitsperpixel = This->bih.bV5BitCount;
|
||||||
|
switch(This->bih.bV5BitCount)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat1bppIndexed;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat2bppIndexed;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat4bppIndexed;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat8bppIndexed;
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat16bppBGR555;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat24bppBGR;
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormat32bppBGR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
This->pixelformat = &GUID_WICPixelFormatUndefined;
|
||||||
|
FIXME("unsupported bit depth %i for uncompressed RGB\n", This->bih.bV5BitCount);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
This->bitsperpixel = 0;
|
||||||
|
This->pixelformat = &GUID_WICPixelFormatUndefined;
|
||||||
|
FIXME("unsupported bitmap type header=%i compression=%i depth=%i\n", This->bih.bV5Size, This->bih.bV5Compression, This->bih.bV5BitCount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
This->initialized = TRUE;
|
This->initialized = TRUE;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -423,6 +503,8 @@ static HRESULT WINAPI BmpDecoder_GetFrame(IWICBitmapDecoder *iface,
|
||||||
IStream_AddRef(This->stream);
|
IStream_AddRef(This->stream);
|
||||||
This->framedecode->bfh = This->bfh;
|
This->framedecode->bfh = This->bfh;
|
||||||
This->framedecode->bih = This->bih;
|
This->framedecode->bih = This->bih;
|
||||||
|
This->framedecode->pixelformat = This->pixelformat;
|
||||||
|
This->framedecode->bitsperpixel = This->bitsperpixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppIBitmapFrame = (IWICBitmapFrameDecode*)This->framedecode;
|
*ppIBitmapFrame = (IWICBitmapFrameDecode*)This->framedecode;
|
||||||
|
|
|
@ -102,6 +102,10 @@ static void test_decode_24bpp(void)
|
||||||
ok(dpiX == 96.0, "expected dpiX=96.0, got %f\n", dpiX);
|
ok(dpiX == 96.0, "expected dpiX=96.0, got %f\n", dpiX);
|
||||||
ok(dpiY == 96.0, "expected dpiY=96.0, got %f\n", dpiY);
|
ok(dpiY == 96.0, "expected dpiY=96.0, got %f\n", dpiY);
|
||||||
|
|
||||||
|
hr = IWICBitmapFrameDecode_GetPixelFormat(framedecode, &guidresult);
|
||||||
|
ok(SUCCEEDED(hr), "GetPixelFormat failed, hr=%x\n", hr);
|
||||||
|
ok(IsEqualGUID(&guidresult, &GUID_WICPixelFormat24bppBGR), "unexpected pixel format\n");
|
||||||
|
|
||||||
IWICBitmapFrameDecode_Release(framedecode);
|
IWICBitmapFrameDecode_Release(framedecode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue