Vincent Povirk : gdiplus: Add tests for multi-frame GIF images.
Alexandre Julliard
julliard at winehq.org
Mon Dec 28 09:16:03 CST 2009
Module: wine
Branch: master
Commit: d41f68fdb8c79c75891bda45fe46135e6638cd07
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d41f68fdb8c79c75891bda45fe46135e6638cd07
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu Dec 24 15:49:23 2009 -0500
gdiplus: Add tests for multi-frame GIF images.
---
dlls/gdiplus/tests/image.c | 137 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 137 insertions(+), 0 deletions(-)
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index e090de9..60d8027 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -1195,6 +1195,142 @@ static void test_colormatrix(void)
GdipDisposeImageAttributes(imageattr);
}
+/* 1x1 pixel gif, 2 frames; first frame is white, second is black */
+static const unsigned char gifanimation[72] = {
+0x47,0x49,0x46,0x38,0x39,0x61,0x01,0x00,0x01,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,
+0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0xf9,0x04,0x00,0x0a,0x00,0xff,
+0x00,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x02,0x02,0x4c,0x01,0x00,
+0x21,0xf9,0x04,0x01,0x0a,0x00,0x01,0x00,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,
+0x00,0x00,0x02,0x02,0x44,0x01,0x00,0x3b
+};
+
+static void test_multiframegif(void)
+{
+ LPSTREAM stream;
+ HGLOBAL hglob;
+ LPBYTE data;
+ HRESULT hres;
+ GpStatus stat;
+ GpBitmap *bmp;
+ ARGB color;
+ UINT count;
+ GUID dimension;
+
+ /* Test frame functions with an animated GIF */
+ hglob = GlobalAlloc (0, sizeof(gifanimation));
+ data = GlobalLock (hglob);
+ memcpy(data, gifanimation, sizeof(gifanimation));
+ GlobalUnlock(hglob);
+
+ hres = CreateStreamOnHGlobal(hglob, TRUE, &stream);
+ ok(hres == S_OK, "Failed to create a stream\n");
+ if(hres != S_OK) return;
+
+ stat = GdipCreateBitmapFromStream(stream, &bmp);
+ ok(stat == Ok, "Failed to create a Bitmap\n");
+ if(stat != Ok){
+ IStream_Release(stream);
+ return;
+ }
+
+ /* Bitmap starts at frame 0 */
+ color = 0xdeadbeef;
+ stat = GdipBitmapGetPixel(bmp, 0, 0, &color);
+ expect(Ok, stat);
+ expect(0xffffffff, color);
+
+ /* Check that we get correct metadata */
+ stat = GdipImageGetFrameDimensionsCount((GpImage*)bmp,&count);
+ expect(Ok, stat);
+ expect(1, count);
+
+ stat = GdipImageGetFrameDimensionsList((GpImage*)bmp, &dimension, 1);
+ expect(Ok, stat);
+ expect_guid(&FrameDimensionTime, &dimension, __LINE__, TRUE);
+
+ count = 12345;
+ stat = GdipImageGetFrameCount((GpImage*)bmp, &dimension, &count);
+ todo_wine expect(Ok, stat);
+ todo_wine expect(2, count);
+
+ /* SelectActiveFrame overwrites our current data */
+ stat = GdipImageSelectActiveFrame((GpImage*)bmp, &dimension, 1);
+ expect(Ok, stat);
+
+ color = 0xdeadbeef;
+ GdipBitmapGetPixel(bmp, 0, 0, &color);
+ expect(Ok, stat);
+ todo_wine expect(0xff000000, color);
+
+ stat = GdipImageSelectActiveFrame((GpImage*)bmp, &dimension, 0);
+ expect(Ok, stat);
+
+ color = 0xdeadbeef;
+ GdipBitmapGetPixel(bmp, 0, 0, &color);
+ expect(Ok, stat);
+ expect(0xffffffff, color);
+
+ /* Write over the image data */
+ stat = GdipBitmapSetPixel(bmp, 0, 0, 0xff000000);
+ expect(Ok, stat);
+
+ /* Switching to the same frame does not overwrite our changes */
+ stat = GdipImageSelectActiveFrame((GpImage*)bmp, &dimension, 0);
+ expect(Ok, stat);
+
+ stat = GdipBitmapGetPixel(bmp, 0, 0, &color);
+ expect(Ok, stat);
+ expect(0xff000000, color);
+
+ /* But switching to another frame and back does */
+ stat = GdipImageSelectActiveFrame((GpImage*)bmp, &dimension, 1);
+ expect(Ok, stat);
+
+ stat = GdipImageSelectActiveFrame((GpImage*)bmp, &dimension, 0);
+ expect(Ok, stat);
+
+ stat = GdipBitmapGetPixel(bmp, 0, 0, &color);
+ expect(Ok, stat);
+ todo_wine expect(0xffffffff, color);
+
+ GdipDisposeImage((GpImage*)bmp);
+ IStream_Release(stream);
+
+ /* Test with a non-animated gif */
+ hglob = GlobalAlloc (0, sizeof(gifimage));
+ data = GlobalLock (hglob);
+ memcpy(data, gifimage, sizeof(gifimage));
+ GlobalUnlock(hglob);
+
+ hres = CreateStreamOnHGlobal(hglob, TRUE, &stream);
+ ok(hres == S_OK, "Failed to create a stream\n");
+ if(hres != S_OK) return;
+
+ stat = GdipCreateBitmapFromStream(stream, &bmp);
+ ok(stat == Ok, "Failed to create a Bitmap\n");
+ if(stat != Ok){
+ IStream_Release(stream);
+ return;
+ }
+
+ /* Check metadata */
+ stat = GdipImageGetFrameDimensionsCount((GpImage*)bmp,&count);
+ expect(Ok, stat);
+ expect(1, count);
+
+ stat = GdipImageGetFrameDimensionsList((GpImage*)bmp, &dimension, 1);
+ expect(Ok, stat);
+ expect_guid(&FrameDimensionTime, &dimension, __LINE__, TRUE);
+
+ count = 12345;
+ stat = GdipImageGetFrameCount((GpImage*)bmp, &dimension, &count);
+ todo_wine expect(Ok, stat);
+ todo_wine expect(1, count);
+
+ GdipDisposeImage((GpImage*)bmp);
+ IStream_Release(stream);
+}
+
START_TEST(image)
{
struct GdiplusStartupInput gdiplusStartupInput;
@@ -1224,6 +1360,7 @@ START_TEST(image)
test_getsetpixel();
test_palette();
test_colormatrix();
+ test_multiframegif();
GdiplusShutdown(gdiplusToken);
}
More information about the wine-cvs
mailing list