>From baf071b73223b243e6f0312d2bb1abd59cca06ec Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 12 Mar 2015 11:43:06 +0100 Subject: [PATCH] gdiplus: Fixed palette flags setting To: wine-patches --- dlls/gdiplus/image.c | 34 ++++++++++++++++++++++++---------- dlls/gdiplus/tests/image.c | 24 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 4bce334..8eb1419 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -87,22 +87,36 @@ static ColorPalette *get_palette(IWICBitmapFrameDecode *frame, WICBitmapPaletteT } if (hr == S_OK) { + WICBitmapPaletteType type; + BOOL alpha; UINT count; - BOOL mono, gray; - - IWICPalette_IsBlackWhite(wic_palette, &mono); - IWICPalette_IsGrayscale(wic_palette, &gray); IWICPalette_GetColorCount(wic_palette, &count); palette = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(UINT) + count * sizeof(ARGB)); IWICPalette_GetColors(wic_palette, count, palette->Entries, &palette->Count); - if (mono) - palette->Flags = 0; - else if (gray) - palette->Flags = PaletteFlagsGrayScale; - else - palette->Flags = PaletteFlagsHalftone; + IWICPalette_GetType(wic_palette, &type); + switch(type) { + case WICBitmapPaletteTypeFixedGray4: + case WICBitmapPaletteTypeFixedGray16: + case WICBitmapPaletteTypeFixedGray256: + palette->Flags = PaletteFlagsGrayScale; + break; + case WICBitmapPaletteTypeFixedHalftone8: + case WICBitmapPaletteTypeFixedHalftone27: + case WICBitmapPaletteTypeFixedHalftone64: + case WICBitmapPaletteTypeFixedHalftone125: + case WICBitmapPaletteTypeFixedHalftone216: + case WICBitmapPaletteTypeFixedHalftone252: + case WICBitmapPaletteTypeFixedHalftone256: + palette->Flags = PaletteFlagsHalftone; + break; + default: + palette->Flags = 0; + } + IWICPalette_HasAlpha(wic_palette, &alpha); + if(alpha) + palette->Flags |= PaletteFlagsHasAlpha; } IWICPalette_Release(wic_palette); } diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 91f70b5..d5ebdd0 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -2487,6 +2487,9 @@ static void test_multiframegif(void) GUID dimension; PixelFormat pixel_format; INT palette_size, i, j; + char palette_buf[256]; + ColorPalette *palette; + ARGB *palette_entries; /* Test frame functions with an animated GIF */ hglob = GlobalAlloc (0, sizeof(gifanimation)); @@ -2644,6 +2647,27 @@ static void test_multiframegif(void) expect(Ok, stat); expect(PixelFormat8bppIndexed, pixel_format); + stat = GdipBitmapGetPixel(bmp, 0, 0, &color); + expect(Ok, stat); + expect(0, color); + + stat = GdipGetImagePaletteSize((GpImage*)bmp, &palette_size); + expect(Ok, stat); + ok(palette_size == sizeof(ColorPalette)+sizeof(ARGB), + "palette_size = %d\n", palette_size); + + memset(palette_buf, 0xfe, sizeof(palette_buf)); + palette = (ColorPalette*)palette_buf; + stat = GdipGetImagePalette((GpImage*)bmp, palette, + sizeof(ColorPalette)+sizeof(ARGB)); + palette_entries = palette->Entries; + expect(Ok, stat); + ok(palette->Flags==PaletteFlagsHasAlpha, + "palette->Flags = %x\n", palette->Flags); + expect(2, palette->Count); + expect(0, palette_entries[0]); + expect(0xff000000, palette_entries[1]); + count = 12345; stat = GdipImageGetFrameCount((GpImage*)bmp, &dimension, &count); expect(Ok, stat); -- 2.0.5