Module: wine Branch: master Commit: 548cd05ceb018314228a60d384e461cca6b02d26 URL: http://source.winehq.org/git/wine.git/?a=commit;h=548cd05ceb018314228a60d384...
Author: Vincent Povirk vincent@codeweavers.com Date: Mon Aug 17 10:56:34 2009 -0500
windowscodecs: Implement CopyPalette for the GIF decoder.
---
dlls/windowscodecs/gifformat.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c index a900043..9423ec3 100644 --- a/dlls/windowscodecs/gifformat.c +++ b/dlls/windowscodecs/gifformat.c @@ -129,8 +129,43 @@ static HRESULT WINAPI GifFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, static HRESULT WINAPI GifFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette) { - FIXME("(%p,%p): stub\n", iface, pIPalette); - return E_NOTIMPL; + GifFrameDecode *This = (GifFrameDecode*)iface; + WICColor colors[256]; + ColorMapObject *cm = This->frame->ImageDesc.ColorMap; + int i, trans; + ExtensionBlock *eb; + TRACE("(%p,%p)\n", iface, pIPalette); + + if (!cm) cm = This->parent->gif->SColorMap; + + if (cm->ColorCount > 256) + { + ERR("GIF contains %i colors???\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; + } + + /* look for the transparent color extension */ + for (i = 0; i < This->frame->ExtensionBlockCount; ++i) { + eb = This->frame->ExtensionBlocks + i; + if (eb->Function == 0xF9 && eb->ByteCount == 4) { + if ((eb->Bytes[0] & 1) == 1) { + trans = (unsigned char)eb->Bytes[3]; + colors[trans] &= 0xffffff; /* set alpha to 0 */ + break; + } + } + } + + IWICPalette_InitializeCustom(pIPalette, colors, cm->ColorCount); + + return S_OK; }
static HRESULT WINAPI GifFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface,