Module: wine Branch: master Commit: 5870431ad97173925a50561221669e6d75be6043 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5870431ad97173925a50561221...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Thu Aug 24 11:19:01 2017 -0500
gdiplus: Force conversion of 8 bpp grayscale PNG images to 32 bpp BGRA.
Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdiplus/image.c | 32 +++++++++++++++++++++++++++++++- dlls/gdiplus/tests/image.c | 1 - 2 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 0821658..e3bc70e 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -3961,7 +3961,37 @@ static GpStatus decode_image_jpeg(IStream* stream, GpImage **image)
static GpStatus decode_image_png(IStream* stream, GpImage **image) { - return decode_image_wic(stream, &GUID_ContainerFormatPng, png_metadata_reader, image); + IWICBitmapDecoder *decoder; + IWICBitmapFrameDecode *frame; + GpStatus status; + HRESULT hr; + GUID format; + BOOL force_conversion = FALSE; + + status = initialize_decoder_wic(stream, &GUID_ContainerFormatPng, &decoder); + if (status != Ok) + return status; + + hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); + if (hr == S_OK) + { + hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format); + if (hr == S_OK) + { + if (IsEqualGUID(&format, &GUID_WICPixelFormat8bppGray)) + force_conversion = TRUE; + status = decode_frame_wic(decoder, force_conversion, 0, png_metadata_reader, image); + } + else + status = hresult_to_status(hr); + + IWICBitmapFrameDecode_Release(frame); + } + else + status = hresult_to_status(hr); + + IWICBitmapDecoder_Release(decoder); + return status; }
static GpStatus decode_image_gif(IStream* stream, GpImage **image) diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 989c217..b9685c3 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -5014,7 +5014,6 @@ static void test_png_color_formats(void)
status = GdipGetImagePixelFormat(image, &format); expect(Ok, status); -todo_wine_if(td[i].bit_depth == 8 && td[i].color_type == 0) ok(format == td[i].format || broken(td[i].bit_depth == 1 && td[i].color_type == 0 && format == PixelFormat32bppARGB), /* XP */ "%d: expected %#x, got %#x\n", i, td[i].format, format);