Piotr Caban : gdiplus: Fixed palette flags setting.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 16 10:34:23 CDT 2015


Module: wine
Branch: master
Commit: 59eef10f345ec7162bca4c3e0bf8a436af7f2cef
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=59eef10f345ec7162bca4c3e0bf8a436af7f2cef

Author: Piotr Caban <piotr at 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);




More information about the wine-cvs mailing list