Module: wine Branch: master Commit: f1405ca0d20b24aeb2d49b6a8565f0a876cce460 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f1405ca0d20b24aeb2d49b6a85...
Author: Vincent Povirk vincent@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) {