From 4038cb79b4aedad38816fcfbee83920cc2bd5259 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 10 Sep 2012 15:23:43 -0500 Subject: [PATCH] windowscodecs: Only copy the palette to new bitmaps if they might be indexed. --- dlls/windowscodecs/imgfactory.c | 23 +++++++++++++- dlls/windowscodecs/tests/bitmap.c | 53 ++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 01ce03450da..8ba0a1d7d3c 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -474,6 +474,9 @@ static HRESULT WINAPI ComponentFactory_CreateBitmapFromSource(IWICComponentFacto HRESULT hr; WICRect rc; double dpix, dpiy; + IWICComponentInfo *info; + IWICPixelFormatInfo2 *formatinfo; + WICPixelFormatNumericRepresentation format_type; TRACE("(%p,%p,%u,%p)\n", iface, piBitmapSource, option, ppIBitmap); @@ -485,6 +488,23 @@ static HRESULT WINAPI ComponentFactory_CreateBitmapFromSource(IWICComponentFacto if (SUCCEEDED(hr)) hr = IWICBitmapSource_GetPixelFormat(piBitmapSource, &pixelformat); + if (SUCCEEDED(hr)) + hr = CreateComponentInfo(&pixelformat, &info); + + if (SUCCEEDED(hr)) + { + hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo2, (void**)&formatinfo); + + if (SUCCEEDED(hr)) + { + hr = IWICPixelFormatInfo2_GetNumericRepresentation(formatinfo, &format_type); + + IWICPixelFormatInfo2_Release(formatinfo); + } + + IWICComponentInfo_Release(info); + } + if (SUCCEEDED(hr)) hr = BitmapImpl_Create(width, height, &pixelformat, option, &result); @@ -514,7 +534,8 @@ static HRESULT WINAPI ComponentFactory_CreateBitmapFromSource(IWICComponentFacto if (SUCCEEDED(hr)) hr = PaletteImpl_Create(&palette); - if (SUCCEEDED(hr)) + if (SUCCEEDED(hr) && (format_type == WICPixelFormatNumericRepresentationUnspecified || + format_type == WICPixelFormatNumericRepresentationIndexed)) { hr = IWICBitmapSource_CopyPalette(piBitmapSource, palette); diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c index 91376ac0f61..c2ce1aa22d3 100644 --- a/dlls/windowscodecs/tests/bitmap.c +++ b/dlls/windowscodecs/tests/bitmap.c @@ -283,6 +283,8 @@ static void test_createbitmapfromsource(void) WICPixelFormatGUID pixelformat = {0}; UINT width=0, height=0; double dpix=10.0, dpiy=10.0; + UINT count; + WICBitmapPaletteType palette_type; hr = IWICImagingFactory_CreateBitmap(factory, 3, 3, &GUID_WICPixelFormat24bppBGR, WICBitmapCacheOnLoad, &bitmap); @@ -340,7 +342,7 @@ static void test_createbitmapfromsource(void) /* palette isn't copied for non-indexed formats? */ hr = IWICBitmap_CopyPalette(bitmap2, palette); - todo_wine ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "IWICBitmap_CopyPalette failed hr=%x\n", hr); + ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "IWICBitmap_CopyPalette failed hr=%x\n", hr); IWICPalette_Release(palette); @@ -365,6 +367,55 @@ static void test_createbitmapfromsource(void) ok(height == 3, "got %d, expected 3\n", height); IWICBitmap_Release(bitmap2); + + /* Ensure palette is copied for indexed formats */ + hr = IWICImagingFactory_CreateBitmap(factory, 3, 3, &GUID_WICPixelFormat4bppIndexed, + WICBitmapCacheOnLoad, &bitmap); + ok(hr == S_OK, "IWICImagingFactory_CreateBitmap failed hr=%x\n", hr); + + hr = IWICImagingFactory_CreatePalette(factory, &palette); + ok(hr == S_OK, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr); + + hr = IWICPalette_InitializePredefined(palette, WICBitmapPaletteTypeFixedGray256, FALSE); + ok(hr == S_OK, "IWICPalette_InitializePredefined failed hr=%x\n", hr); + + hr = IWICBitmap_SetPalette(bitmap, palette); + ok(hr == S_OK, "IWICBitmap_SetPalette failed hr=%x\n", hr); + + IWICPalette_Release(palette); + + hr = IWICImagingFactory_CreateBitmapFromSource(factory, (IWICBitmapSource*)bitmap, + WICBitmapCacheOnLoad, &bitmap2); + ok(hr == S_OK, "IWICImagingFactory_CreateBitmapFromSource failed hr=%x\n", hr); + + IWICBitmap_Release(bitmap); + + hr = IWICImagingFactory_CreatePalette(factory, &palette); + ok(hr == S_OK, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr); + + hr = IWICBitmap_CopyPalette(bitmap2, palette); + ok(hr == S_OK, "IWICBitmap_CopyPalette failed hr=%x\n", hr); + + hr = IWICPalette_GetColorCount(palette, &count); + ok(hr == S_OK, "IWICPalette_GetColorCount failed hr=%x\n", hr); + ok(count == 256, "unexpected count %d\n", count); + + hr = IWICPalette_GetType(palette, &palette_type); + ok(hr == S_OK, "IWICPalette_GetType failed hr=%x\n", hr); + ok(palette_type == WICBitmapPaletteTypeFixedGray256, "unexpected palette type %d\n", palette_type); + + IWICPalette_Release(palette); + + hr = IWICBitmap_GetPixelFormat(bitmap2, &pixelformat); + ok(hr == S_OK, "IWICBitmap_GetPixelFormat failed hr=%x\n", hr); + ok(IsEqualGUID(&pixelformat, &GUID_WICPixelFormat4bppIndexed), "unexpected pixel format\n"); + + hr = IWICBitmap_GetSize(bitmap2, &width, &height); + ok(hr == S_OK, "IWICBitmap_GetSize failed hr=%x\n", hr); + ok(width == 3, "got %d, expected 3\n", width); + ok(height == 3, "got %d, expected 3\n", height); + + IWICBitmap_Release(bitmap2); } START_TEST(bitmap)