Dmitry Timoshkov : gdiplus: Add GIF palette to the image properties.

Alexandre Julliard julliard at winehq.org
Tue Sep 25 15:13:38 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Tue Sep 25 12:55:57 2012 +0900

gdiplus: Add GIF palette to the image properties.

---

 dlls/gdiplus/image.c       |   63 +++++++++++++++++++++++++++++++++++++++++++-
 dlls/gdiplus/tests/image.c |    1 -
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index b71b35b..5e0b1ea 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -3275,6 +3275,62 @@ static PropertyItem *get_gif_background(IWICMetadataReader *reader)
     return background;
 }
 
+static PropertyItem *get_gif_palette(IWICBitmapDecoder *decoder, IWICMetadataReader *reader)
+{
+    static const WCHAR global_flagW[] = { 'G','l','o','b','a','l','C','o','l','o','r','T','a','b','l','e','F','l','a','g',0 };
+    HRESULT hr;
+    IWICImagingFactory *factory;
+    IWICPalette *palette;
+    UINT count = 0;
+    WICColor colors[256];
+
+    if (!get_bool_property(reader, &GUID_MetadataFormatLSD, global_flagW))
+        return NULL;
+
+    hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
+                          &IID_IWICImagingFactory, (void **)&factory);
+    if (hr != S_OK) return NULL;
+
+    hr = IWICImagingFactory_CreatePalette(factory, &palette);
+    if (hr == S_OK)
+    {
+        hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
+        if (hr == S_OK)
+            IWICPalette_GetColors(palette, 256, colors, &count);
+
+        IWICPalette_Release(palette);
+    }
+
+    IWICImagingFactory_Release(factory);
+
+    if (count)
+    {
+        PropertyItem *pal;
+        UINT i;
+        BYTE *rgb;
+
+        pal = GdipAlloc(sizeof(*pal) + count * 3);
+        if (!pal) return NULL;
+        pal->type = PropertyTagTypeByte;
+        pal->id = PropertyTagGlobalPalette;
+        pal->value = pal + 1;
+        pal->length = count * 3;
+
+        rgb = pal->value;
+
+        for (i = 0; i < count; i++)
+        {
+            rgb[i*3] = (colors[i] >> 16) & 0xff;
+            rgb[i*3 + 1] = (colors[i] >> 8) & 0xff;
+            rgb[i*3 + 2] = colors[i] & 0xff;
+        }
+
+        return pal;
+    }
+
+    return NULL;
+}
+
 static PropertyItem *get_gif_transparent_idx(IWICMetadataReader *reader)
 {
     static const WCHAR transparency_flagW[] = { 'T','r','a','n','s','p','a','r','e','n','c','y','F','l','a','g',0 };
@@ -3337,7 +3393,7 @@ static void gif_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI
     IWICMetadataReader *reader;
     UINT frame_count, block_count, i;
     PropertyItem *delay = NULL, *comment = NULL, *background = NULL;
-    PropertyItem *transparent_idx = NULL, *loop = NULL;
+    PropertyItem *transparent_idx = NULL, *loop = NULL, *palette = NULL;
 
     IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
     if (frame_count > 1)
@@ -3387,6 +3443,9 @@ static void gif_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI
                     if (!background)
                         background = get_gif_background(reader);
 
+                    if (!palette)
+                        palette = get_gif_palette(decoder, reader);
+
                     IWICMetadataReader_Release(reader);
                 }
             }
@@ -3410,11 +3469,13 @@ static void gif_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI
     if (delay) add_property(bitmap, delay);
     if (comment) add_property(bitmap, comment);
     if (loop) add_property(bitmap, loop);
+    if (palette) add_property(bitmap, palette);
     if (background) add_property(bitmap, background);
 
     GdipFree(delay);
     GdipFree(comment);
     GdipFree(loop);
+    GdipFree(palette);
     GdipFree(background);
 
     /* Win7 gdiplus always returns transparent color index from frame 0 */
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 9313f2c..62bc48b 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -3988,7 +3988,6 @@ static void test_gif_properties(void)
 
     status = GdipGetPropertyCount(image, &prop_count);
     expect(Ok, status);
-todo_wine
     ok(prop_count == sizeof(td)/sizeof(td[0]) || broken(prop_count == 1) /* before win7 */,
        "expected property count %u, got %u\n", (UINT)(sizeof(td)/sizeof(td[0])), prop_count);
 




More information about the wine-cvs mailing list