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