Dmitry Timoshkov : windowscodecs: GIF decoder should add header and trailer to extension blocks.

Alexandre Julliard julliard at winehq.org
Tue Sep 18 14:04:29 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at 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);
 }




More information about the wine-cvs mailing list