[2/2] windowscodecs: Generate global GIF palette even a real one is missing.

Dmitry Timoshkov dmitry at baikal.ru
Fri Jul 19 01:29:58 CDT 2013


This matches behaviour of Windows including Win8 and recent Win7 service packs.
---
 dlls/windowscodecs/gifformat.c       | 39 ++++++++++++++++++++++++------------
 dlls/windowscodecs/tests/gifformat.c |  1 -
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
index 8ebcf3d..39de709 100644
--- a/dlls/windowscodecs/gifformat.c
+++ b/dlls/windowscodecs/gifformat.c
@@ -1180,26 +1180,39 @@ static HRESULT WINAPI GifDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalet
     GifDecoder *This = impl_from_IWICBitmapDecoder(iface);
     WICColor colors[256];
     ColorMapObject *cm;
-    int i, trans;
+    int i, trans, count;
     ExtensionBlock *eb;
 
     TRACE("(%p,%p)\n", iface, palette);
 
     cm = This->gif->SColorMap;
-    if (!cm) return WINCODEC_ERR_FRAMEMISSING;
-
-    if (cm->ColorCount > 256)
+    if (cm)
     {
-        ERR("GIF contains invalid number of colors: %d\n", cm->ColorCount);
-        return E_FAIL;
-    }
+        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++)
+        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;
+        }
+
+        count = cm->ColorCount;
+    }
+    else
     {
-        colors[i] = 0xff000000 | /* alpha */
-                    cm->Colors[i].Red << 16 |
-                    cm->Colors[i].Green << 8 |
-                    cm->Colors[i].Blue;
+        colors[0] = 0xff000000;
+        colors[1] = 0xffffffff;
+
+        for (i = 2; i < 256; i++)
+            colors[i] = 0xff000000;
+
+        count = 256;
     }
 
     /* look for the transparent color extension */
@@ -1217,7 +1230,7 @@ static HRESULT WINAPI GifDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalet
         }
     }
 
-    return IWICPalette_InitializeCustom(palette, colors, cm->ColorCount);
+    return IWICPalette_InitializeCustom(palette, colors, count);
 }
 
 static HRESULT WINAPI GifDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface,
diff --git a/dlls/windowscodecs/tests/gifformat.c b/dlls/windowscodecs/tests/gifformat.c
index 47a27dd..0ff0f61 100644
--- a/dlls/windowscodecs/tests/gifformat.c
+++ b/dlls/windowscodecs/tests/gifformat.c
@@ -284,7 +284,6 @@ static void test_local_gif_palette(void)
 
     /* global palette */
     hr = IWICBitmapDecoder_CopyPalette(decoder, palette);
-todo_wine
     ok(hr == S_OK || broken(hr == WINCODEC_ERR_FRAMEMISSING), "CopyPalette %#x\n", hr);
     if (hr == S_OK)
     {
-- 
1.8.3.3




More information about the wine-patches mailing list