Dmitry Timoshkov : windowscodecs: Generate global GIF palette even a real one is missing.

Alexandre Julliard julliard at winehq.org
Fri Jul 19 13:19:41 CDT 2013


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Fri Jul 19 15:29:58 2013 +0900

windowscodecs: Generate global GIF palette even a real one is missing.

---

 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)
     {




More information about the wine-cvs mailing list