From ae65558ba180808c7ea7f802e13878e720f72a85 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 21 Aug 2017 11:12:30 -0500 Subject: [PATCH] gdiplus/tests: Add a test for loading PNG grayscale images. Signed-off-by: Vincent Povirk Signed-off-by: Alexandre Julliard --- dlls/gdiplus/tests/image.c | 60 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 225dc5461ba..989c2179bbd 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -2,7 +2,7 @@ * Unit test suite for images * * Copyright (C) 2007 Google (Evan Stade) - * Copyright (C) 2012 Dmitry Timoshkov + * Copyright (C) 2012, 2016 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -4966,6 +4966,63 @@ static void test_imageabort(void) GdipDisposeImage((GpImage*)bm); } +/* RGB 24 bpp 1x1 pixel PNG image */ +static const char png_1x1_data[] = { + 0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a, + 0x00,0x00,0x00,0x0d,'I','H','D','R',0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x02,0x00,0x00,0x00,0x90,0x77,0x53,0xde, + 0x00,0x00,0x00,0x0c,'I','D','A','T',0x08,0xd7,0x63,0xf8,0xff,0xff,0x3f,0x00,0x05,0xfe,0x02,0xfe,0xdc,0xcc,0x59,0xe7, + 0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82 +}; + +static void test_png_color_formats(void) +{ + static const struct + { + char bit_depth, color_type; + PixelFormat format; + } td[] = + { + /* 2 - PNG_COLOR_TYPE_RGB */ + { 8, 2, PixelFormat24bppRGB }, + /* 0 - PNG_COLOR_TYPE_GRAY */ + { 1, 0, PixelFormat1bppIndexed }, + { 2, 0, PixelFormat32bppARGB }, + { 4, 0, PixelFormat32bppARGB }, + { 8, 0, PixelFormat32bppARGB }, + { 16, 0, PixelFormat32bppARGB }, + }; + BYTE buf[sizeof(png_1x1_data)]; + GpStatus status; + GpImage *image; + ImageType type; + PixelFormat format; + int i; + + for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) + { + memcpy(buf, png_1x1_data, sizeof(png_1x1_data)); + buf[24] = td[i].bit_depth; + buf[25] = td[i].color_type; + + image = load_image(buf, sizeof(buf)); + ok(image != NULL, "%d: failed to load image data\n", i); + if (!image) continue; + + status = GdipGetImageType(image, &type); + ok(status == Ok, "%u: GdipGetImageType error %d\n", i, status); + ok(type == ImageTypeBitmap, "%d: wrong image type %d\n", i, type); + + status = GdipGetImagePixelFormat(image, &format); + expect(Ok, status); +todo_wine_if(td[i].bit_depth == 8 && td[i].color_type == 0) + ok(format == td[i].format || + broken(td[i].bit_depth == 1 && td[i].color_type == 0 && format == PixelFormat32bppARGB), /* XP */ + "%d: expected %#x, got %#x\n", i, td[i].format, format); + + GdipDisposeImage(image); + } +} + START_TEST(image) { HMODULE mod = GetModuleHandleA("gdiplus.dll"); @@ -4990,6 +5047,7 @@ START_TEST(image) pGdipBitmapGetHistogram = (void*)GetProcAddress(mod, "GdipBitmapGetHistogram"); pGdipImageSetAbort = (void*)GetProcAddress(mod, "GdipImageSetAbort"); + test_png_color_formats(); test_supported_encoders(); test_CloneBitmapArea(); test_ARGB_conversion(); -- 2.11.4.GIT