Module: wine Branch: master Commit: 59eef10f345ec7162bca4c3e0bf8a436af7f2cef URL: http://source.winehq.org/git/wine.git/?a=commit;h=59eef10f345ec7162bca4c3e0b...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Mar 13 15:14:37 2015 +0100
gdiplus: Fixed palette flags setting.
---
dlls/gdiplus/image.c | 34 ++++++++++++++++++++++++---------- dlls/gdiplus/tests/image.c | 23 +++++++++++++++++++++++ 2 files changed, 47 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..68a06c4 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,26 @@ 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); + expect(PaletteFlagsHasAlpha, 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);