Dmitry Timoshkov : windowscodecs: Calculate transparent color index for global GIF palette.

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


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

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

windowscodecs: Calculate transparent color index for global GIF palette.

---

 dlls/windowscodecs/gifformat.c       |   22 ++++++++++++++++++++--
 dlls/windowscodecs/tests/gifformat.c |    3 ---
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
index b27b3ad..0594a86 100644
--- a/dlls/windowscodecs/gifformat.c
+++ b/dlls/windowscodecs/gifformat.c
@@ -582,6 +582,7 @@ typedef struct {
     LONG ref;
     BOOL initialized;
     GifFileType *gif;
+    UINT current_frame;
     CRITICAL_SECTION lock;
 } GifDecoder;
 
@@ -1170,7 +1171,8 @@ static HRESULT WINAPI GifDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalet
     GifDecoder *This = impl_from_IWICBitmapDecoder(iface);
     WICColor colors[256];
     ColorMapObject *cm;
-    int i;
+    int i, trans;
+    ExtensionBlock *eb;
 
     TRACE("(%p,%p)\n", iface, palette);
 
@@ -1191,7 +1193,21 @@ static HRESULT WINAPI GifDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalet
                     cm->Colors[i].Blue;
     }
 
-    /* FIXME: transparent color? */
+    /* look for the transparent color extension */
+    for (i = 0; i < This->gif->SavedImages[This->current_frame].Extensions.ExtensionBlockCount; i++)
+    {
+        eb = This->gif->SavedImages[This->current_frame].Extensions.ExtensionBlocks + i;
+        if (eb->Function == GRAPHICS_EXT_FUNC_CODE && eb->ByteCount == 8)
+        {
+            if (eb->Bytes[3] & 1)
+            {
+                trans = (unsigned char)eb->Bytes[6];
+                colors[trans] &= 0xffffff; /* set alpha to 0 */
+                break;
+            }
+        }
+    }
+
     return IWICPalette_InitializeCustom(palette, colors, cm->ColorCount);
 }
 
@@ -1258,6 +1274,7 @@ static HRESULT WINAPI GifDecoder_GetFrame(IWICBitmapDecoder *iface,
     result->frame = &This->gif->SavedImages[index];
     IWICBitmapDecoder_AddRef(iface);
     result->parent = This;
+    This->current_frame = index;
 
     *ppIBitmapFrame = &result->IWICBitmapFrameDecode_iface;
 
@@ -1396,6 +1413,7 @@ HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
     This->ref = 1;
     This->initialized = FALSE;
     This->gif = NULL;
+    This->current_frame = 0;
     InitializeCriticalSection(&This->lock);
     This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": GifDecoder.lock");
 
diff --git a/dlls/windowscodecs/tests/gifformat.c b/dlls/windowscodecs/tests/gifformat.c
index 549cf2b..9ff1d90 100644
--- a/dlls/windowscodecs/tests/gifformat.c
+++ b/dlls/windowscodecs/tests/gifformat.c
@@ -127,7 +127,6 @@ static void test_global_gif_palette(void)
     ok(hr == S_OK, "GetColors error %#x\n", hr);
     ok(ret == count, "expected %u, got %u\n", count, ret);
     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]);
@@ -193,7 +192,6 @@ static void test_global_gif_palette_2frames(void)
     ok(hr == S_OK, "GetColors error %#x\n", hr);
     ok(ret == count, "expected %u, got %u\n", count, ret);
     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]);
@@ -238,7 +236,6 @@ todo_wine
     ok(ret == count, "expected %u, got %u\n", count, ret);
     ok(color[0] == 0xff010203, "expected 0xff010203, got %#x\n", color[0]);
     ok(color[1] == 0xff040506 || broken(color[1] == 0x00040506) /* XP */, "expected 0xff040506, got %#x\n", color[1]);
-todo_wine
     ok(color[2] == 0x00070809 || broken(color[2] == 0xff070809) /* XP */, "expected 0x00070809, got %#x\n", color[2]);
     ok(color[3] == 0xff0a0b0c, "expected 0xff0a0b0c, got %#x\n", color[3]);
 




More information about the wine-cvs mailing list