Module: wine Branch: master Commit: 47864728792e14287f6619e05444afcc3dc940a9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=47864728792e14287f6619e054... Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Tue Sep 18 12:59:50 2012 +0900 windowscodecs: GIF decoder should add header and trailer to extension blocks. Metadata readers now have access to complete and correctly formatted data stream. --- dlls/windowscodecs/gifformat.c | 4 ++-- dlls/windowscodecs/ungif.c | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c index 05bf2db..7b88735 100644 --- a/dlls/windowscodecs/gifformat.c +++ b/dlls/windowscodecs/gifformat.c @@ -857,8 +857,8 @@ static const void *get_GCE_data(GifFrameDecode *This) for (i = 0; i < This->frame->Extensions.ExtensionBlockCount; i++) { if (This->frame->Extensions.ExtensionBlocks[i].Function == GRAPHICS_EXT_FUNC_CODE && - This->frame->Extensions.ExtensionBlocks[i].ByteCount == 4) - return This->frame->Extensions.ExtensionBlocks[i].Bytes; + This->frame->Extensions.ExtensionBlocks[i].ByteCount == 8) + return This->frame->Extensions.ExtensionBlocks[i].Bytes + 3; } return NULL; } diff --git a/dlls/windowscodecs/ungif.c b/dlls/windowscodecs/ungif.c index 2330192..0f55242 100644 --- a/dlls/windowscodecs/ungif.c +++ b/dlls/windowscodecs/ungif.c @@ -209,13 +209,18 @@ AddExtensionBlock(Extensions *New, ep = &New->ExtensionBlocks[New->ExtensionBlockCount++]; - ep->ByteCount=Len; - ep->Bytes = ungif_alloc(ep->ByteCount); + ep->ByteCount=Len + 3; + ep->Bytes = ungif_alloc(ep->ByteCount + 3); if (ep->Bytes == NULL) return (GIF_ERROR); + /* Extension Header */ + ep->Bytes[0] = 0x21; + ep->Bytes[1] = New->Function; + ep->Bytes[2] = Len; + if (ExtData) { - memcpy(ep->Bytes, ExtData, Len); + memcpy(ep->Bytes + 3, ExtData, Len); ep->Function = New->Function; } @@ -238,12 +243,12 @@ AppendExtensionBlock(Extensions *New, if (ep->Bytes == NULL) return (GIF_ERROR); + ep->Bytes[ep->ByteCount] = Len; + if (ExtData) - { - ep->Bytes[ep->ByteCount] = Len; memcpy(ep->Bytes + ep->ByteCount + 1, ExtData, Len); - ep->ByteCount += Len + 1; - } + + ep->ByteCount += Len + 1; return (GIF_OK); }