windowscodecs: Accept GIF files with no trailer.

This commit is contained in:
Vincent Povirk 2009-12-04 11:15:23 -06:00 committed by Alexandre Julliard
parent b49cc56614
commit f1405ca0d2
2 changed files with 70 additions and 1 deletions

View File

@ -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();
}

View File

@ -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) {