Module: wine Branch: master Commit: 54800a80744768cef06c2f6d8b273950dfd11b1a URL: http://source.winehq.org/git/wine.git/?a=commit;h=54800a80744768cef06c2f6d8b...
Author: Dmitry Timoshkov dmitry@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);