Vincent Povirk : windowscodecs: Accept GIF files with no trailer.

Alexandre Julliard julliard at winehq.org
Mon Dec 7 10:26:11 CST 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Fri Dec  4 11:15:23 2009 -0600

windowscodecs: Accept GIF files with no trailer.

---

 dlls/windowscodecs/tests/bmpformat.c |   66 ++++++++++++++++++++++++++++++++++
 dlls/windowscodecs/ungif.c           |    5 ++-
 2 files changed, 70 insertions(+), 1 deletions(-)

diff --git a/dlls/windowscodecs/tests/bmpformat.c b/dlls/windowscodecs/tests/bmpformat.c
index 1f114a2..cf5a6f8 100644
--- a/dlls/windowscodecs/tests/bmpformat.c
+++ b/dlls/windowscodecs/tests/bmpformat.c
@@ -1034,6 +1034,71 @@ static void test_createfromstream(void)
     IWICImagingFactory_Release(factory);
 }
 
+/* 1x1 pixel gif, missing trailer */
+static unsigned char gifimage_notrailer[] = {
+0x47,0x49,0x46,0x38,0x37,0x61,0x01,0x00,0x01,0x00,0x80,0x00,0x00,0xff,0xff,0xff,
+0xff,0xff,0xff,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x02,0x02,0x44,
+0x01,0x00
+};
+
+static void test_gif_notrailer(void)
+{
+    IWICBitmapDecoder *decoder;
+    IWICImagingFactory *factory;
+    HRESULT hr;
+    IWICStream *gifstream;
+    IWICBitmapFrameDecode *framedecode;
+    UINT framecount;
+
+    hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
+        &IID_IWICImagingFactory, (void**)&factory);
+    ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
+    if (FAILED(hr)) return;
+
+    hr = IWICImagingFactory_CreateStream(factory, &gifstream);
+    ok(hr == S_OK, "CreateStream failed, hr=%x\n", hr);
+    if (SUCCEEDED(hr))
+    {
+        hr = IWICStream_InitializeFromMemory(gifstream, gifimage_notrailer,
+            sizeof(gifimage_notrailer));
+        ok(hr == S_OK, "InitializeFromMemory failed, hr=%x\n", hr);
+
+        if (SUCCEEDED(hr))
+        {
+            hr = CoCreateInstance(&CLSID_WICGifDecoder, NULL, CLSCTX_INPROC_SERVER,
+                &IID_IWICBitmapDecoder, (void**)&decoder);
+            ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
+        }
+
+        if (SUCCEEDED(hr))
+        {
+            hr = IWICBitmapDecoder_Initialize(decoder, (IStream*)gifstream,
+                WICDecodeMetadataCacheOnDemand);
+            ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
+
+            if (SUCCEEDED(hr))
+            {
+                hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
+                ok(hr == S_OK, "GetFrame failed, hr=%x\n", hr);
+                if (SUCCEEDED(hr)) IWICBitmapFrameDecode_Release(framedecode);
+            }
+
+            if (SUCCEEDED(hr))
+            {
+                hr = IWICBitmapDecoder_GetFrameCount(decoder, &framecount);
+                ok(hr == S_OK, "GetFrameCount failed, hr=%x\n", hr);
+                ok(framecount == 1, "framecount=%u\n", framecount);
+            }
+
+            IWICBitmapDecoder_Release(decoder);
+        }
+
+        IWICStream_Release(gifstream);
+    }
+
+    IWICImagingFactory_Release(factory);
+}
+
 START_TEST(bmpformat)
 {
     CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
@@ -1045,6 +1110,7 @@ START_TEST(bmpformat)
     test_decode_rle4();
     test_componentinfo();
     test_createfromstream();
+    test_gif_notrailer();
 
     CoUninitialize();
 }
diff --git a/dlls/windowscodecs/ungif.c b/dlls/windowscodecs/ungif.c
index c24f387..cfc7613 100644
--- a/dlls/windowscodecs/ungif.c
+++ b/dlls/windowscodecs/ungif.c
@@ -320,7 +320,10 @@ DGifGetRecordType(GifFileType * GifFile,
     GifByteType Buf;
 
     if (READ(GifFile, &Buf, 1) != 1) {
-        return GIF_ERROR;
+        /* Wine-specific behavior: Native accepts broken GIF files that have no
+         * terminator, so we match this by treating EOF as a terminator. */
+        *Type = TERMINATE_RECORD_TYPE;
+        return GIF_OK;
     }
 
     switch (Buf) {




More information about the wine-cvs mailing list