windowscodecs/tests: Add some tests for loading truncated GIF images.
This commit is contained in:
parent
f78a6dd15c
commit
51a3bc2d9d
|
@ -1055,10 +1055,13 @@ static ULONG WINAPI GifDecoder_Release(IWICBitmapDecoder *iface)
|
|||
|
||||
if (ref == 0)
|
||||
{
|
||||
IStream_Release(This->stream);
|
||||
if (This->stream)
|
||||
{
|
||||
IStream_Release(This->stream);
|
||||
DGifCloseFile(This->gif);
|
||||
}
|
||||
This->lock.DebugInfo->Spare[0] = 0;
|
||||
DeleteCriticalSection(&This->lock);
|
||||
DGifCloseFile(This->gif);
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
|
@ -1435,6 +1438,7 @@ HRESULT GifDecoder_CreateInstance(REFIID iid, void** ppv)
|
|||
|
||||
This->IWICBitmapDecoder_iface.lpVtbl = &GifDecoder_Vtbl;
|
||||
This->IWICMetadataBlockReader_iface.lpVtbl = &GifDecoder_BlockVtbl;
|
||||
This->stream = NULL;
|
||||
This->ref = 1;
|
||||
This->initialized = FALSE;
|
||||
This->gif = NULL;
|
||||
|
|
|
@ -80,15 +80,12 @@ static const char gif_frame_sizes[] = {
|
|||
|
||||
static IWICImagingFactory *factory;
|
||||
|
||||
static IWICBitmapDecoder *create_decoder(const void *image_data, UINT image_size)
|
||||
static IStream *create_stream(const void *image_data, UINT image_size)
|
||||
{
|
||||
HGLOBAL hmem;
|
||||
BYTE *data;
|
||||
HRESULT hr;
|
||||
IWICBitmapDecoder *decoder = NULL;
|
||||
IStream *stream;
|
||||
GUID format;
|
||||
LONG refcount;
|
||||
|
||||
hmem = GlobalAlloc(0, image_size);
|
||||
data = GlobalLock(hmem);
|
||||
|
@ -98,6 +95,20 @@ static IWICBitmapDecoder *create_decoder(const void *image_data, UINT image_size
|
|||
hr = CreateStreamOnHGlobal(hmem, TRUE, &stream);
|
||||
ok(hr == S_OK, "CreateStreamOnHGlobal error %#x\n", hr);
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
static IWICBitmapDecoder *create_decoder(const void *image_data, UINT image_size)
|
||||
{
|
||||
HRESULT hr;
|
||||
IWICBitmapDecoder *decoder;
|
||||
IStream *stream;
|
||||
GUID format;
|
||||
LONG refcount;
|
||||
|
||||
stream = create_stream(image_data, image_size);
|
||||
if (!stream) return NULL;
|
||||
|
||||
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||
|
||||
|
@ -402,6 +413,92 @@ static void test_gif_frame_sizes(void)
|
|||
IWICBitmapDecoder_Release(decoder);
|
||||
}
|
||||
|
||||
static const char gif_with_trailer_1[] = {
|
||||
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x80,0x00,0x00,
|
||||
/* palette */0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||
/* image data */0x02,0x02,0x44,0x01,0x00,0x3b
|
||||
};
|
||||
static const char gif_with_trailer_2[] = {
|
||||
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x00,0x00,0x00,
|
||||
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||
/* image data */0x02,0x02,0x44,0x3b
|
||||
};
|
||||
static const char gif_without_trailer_1[] = {
|
||||
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x80,0x00,0x00,
|
||||
/* palette */0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||
/* image data */0x02,0x02,0x44,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef
|
||||
};
|
||||
|
||||
static const char gif_without_trailer_2[] = {
|
||||
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0x00,0x00,0x00,
|
||||
/* IMD */0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,
|
||||
/* image data */0x02,0x02,0x44,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef
|
||||
};
|
||||
|
||||
static void test_truncated_gif(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
IStream *stream;
|
||||
IWICBitmapDecoder *decoder;
|
||||
GUID format;
|
||||
|
||||
stream = create_stream(gif_with_trailer_1, sizeof(gif_with_trailer_1));
|
||||
if (!stream) return;
|
||||
|
||||
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||
IWICBitmapDecoder_Release(decoder);
|
||||
IStream_Release(stream);
|
||||
|
||||
stream = create_stream(gif_with_trailer_2, sizeof(gif_with_trailer_2));
|
||||
if (!stream) return;
|
||||
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||
if (hr != S_OK) goto skip_1;
|
||||
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||
IWICBitmapDecoder_Release(decoder);
|
||||
skip_1:
|
||||
IStream_Release(stream);
|
||||
|
||||
stream = create_stream(gif_without_trailer_1, sizeof(gif_without_trailer_1));
|
||||
if (!stream) return;
|
||||
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||
if (hr != S_OK) goto skip_2;
|
||||
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||
IWICBitmapDecoder_Release(decoder);
|
||||
skip_2:
|
||||
IStream_Release(stream);
|
||||
|
||||
stream = create_stream(gif_without_trailer_2, sizeof(gif_without_trailer_2));
|
||||
if (!stream) return;
|
||||
hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
|
||||
if (hr != S_OK) goto skip_3;
|
||||
hr = IWICBitmapDecoder_GetContainerFormat(decoder, &format);
|
||||
ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
|
||||
ok(IsEqualGUID(&format, &GUID_ContainerFormatGif),
|
||||
"wrong container format %s\n", wine_dbgstr_guid(&format));
|
||||
IWICBitmapDecoder_Release(decoder);
|
||||
skip_3:
|
||||
IStream_Release(stream);
|
||||
}
|
||||
|
||||
START_TEST(gifformat)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
@ -428,6 +525,7 @@ START_TEST(gifformat)
|
|||
test_global_gif_palette_2frames();
|
||||
test_local_gif_palette();
|
||||
test_gif_frame_sizes();
|
||||
test_truncated_gif();
|
||||
|
||||
IWICImagingFactory_Release(factory);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue