Dmitry Timoshkov : windowscodecs: Implement IWICBitmapDecoder_CopyPalette for the GIF decoder.

Alexandre Julliard julliard at winehq.org
Mon Sep 24 16:04:25 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Sep 24 13:23:04 2012 +0900

windowscodecs: Implement IWICBitmapDecoder_CopyPalette for the GIF decoder.

---

 dlls/windowscodecs/gifformat.c       |   31 +++++++++++++++++++++++++++----
 dlls/windowscodecs/tests/gifformat.c |    6 ++----
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
index fc6909b..b27b3ad 100644
--- a/dlls/windowscodecs/gifformat.c
+++ b/dlls/windowscodecs/gifformat.c
@@ -1165,11 +1165,34 @@ static HRESULT WINAPI GifDecoder_GetDecoderInfo(IWICBitmapDecoder *iface,
     return hr;
 }
 
-static HRESULT WINAPI GifDecoder_CopyPalette(IWICBitmapDecoder *iface,
-    IWICPalette *pIPalette)
+static HRESULT WINAPI GifDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalette *palette)
 {
-    TRACE("(%p,%p)\n", iface, pIPalette);
-    return WINCODEC_ERR_FRAMEMISSING;
+    GifDecoder *This = impl_from_IWICBitmapDecoder(iface);
+    WICColor colors[256];
+    ColorMapObject *cm;
+    int i;
+
+    TRACE("(%p,%p)\n", iface, palette);
+
+    cm = This->gif->SColorMap;
+    if (!cm) return WINCODEC_ERR_FRAMEMISSING;
+
+    if (cm->ColorCount > 256)
+    {
+        ERR("GIF contains invalid number of colors: %d\n", cm->ColorCount);
+        return E_FAIL;
+    }
+
+    for (i = 0; i < cm->ColorCount; i++)
+    {
+        colors[i] = 0xff000000 | /* alpha */
+                    cm->Colors[i].Red << 16 |
+                    cm->Colors[i].Green << 8 |
+                    cm->Colors[i].Blue;
+    }
+
+    /* FIXME: transparent color? */
+    return IWICPalette_InitializeCustom(palette, colors, cm->ColorCount);
 }
 
 static HRESULT WINAPI GifDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface,
diff --git a/dlls/windowscodecs/tests/gifformat.c b/dlls/windowscodecs/tests/gifformat.c
index b633ad0..4a5ea5c 100644
--- a/dlls/windowscodecs/tests/gifformat.c
+++ b/dlls/windowscodecs/tests/gifformat.c
@@ -103,23 +103,21 @@ static void test_global_gif_palette(void)
 
     /* global palette */
     hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
-todo_wine
     ok(hr == S_OK, "CopyPalette error %#x\n", hr);
 
     hr = IWICPalette_GetColorCount(palette, &count);
     ok(hr == S_OK, "GetColorCount error %#x\n", hr);
-todo_wine
     ok(count == 4, "expected 4, got %u\n", count);
 
     hr = IWICPalette_GetColors(palette, count, color, &ret);
     ok(hr == S_OK, "GetColors error %#x\n", hr);
     ok(ret == count, "expected %u, got %u\n", count, ret);
-todo_wine {
     ok(color[0] == 0xff010203, "expected 0xff010203, got %#x\n", color[0]);
+todo_wine
     ok(color[1] == 0x00040506, "expected 0x00040506, got %#x\n", color[1]);
     ok(color[2] == 0xff070809, "expected 0xff070809, got %#x\n", color[2]);
     ok(color[3] == 0xff0a0b0c, "expected 0xff0a0b0c, got %#x\n", color[3]);
-}
+
     /* frame palette */
     hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
     ok(hr == S_OK, "GetFrame error %#x\n", hr);




More information about the wine-cvs mailing list