diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c index b27b3ade1e5..0594a864c8c 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 549cf2b9ddf..9ff1d90b74e 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]);