[5/7] gdiplus: GdipGetImageThumbnail should return image in 32bppPARGB format. Resend.

Dmitry Timoshkov dmitry at baikal.ru
Sun Aug 19 22:08:17 CDT 2012


---
 dlls/gdiplus/image.c       |  2 +-
 dlls/gdiplus/tests/image.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 1ee5cbc..d6e9faf 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -4393,7 +4393,7 @@ GpStatus WINGDIPAPI GdipGetImageThumbnail(GpImage *image, UINT width, UINT heigh
     GdipGetImageWidth(image, &srcwidth);
     GdipGetImageHeight(image, &srcheight);
 
-    stat = GdipCreateBitmapFromScan0(width, height, 0, PixelFormat32bppARGB,
+    stat = GdipCreateBitmapFromScan0(width, height, 0, PixelFormat32bppPARGB,
         NULL, (GpBitmap**)ret_image);
 
     if (stat == Ok)
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 9e90cca..4e65b5e 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -3712,6 +3712,84 @@ static void test_GdipDrawImagePointRect(void)
     expect(Ok, status);
 }
 
+static void test_image_format(void)
+{
+    static const PixelFormat fmt[] =
+    {
+        PixelFormat1bppIndexed, PixelFormat4bppIndexed, PixelFormat8bppIndexed,
+        PixelFormat16bppGrayScale, PixelFormat16bppRGB555, PixelFormat16bppRGB565,
+        PixelFormat16bppARGB1555, PixelFormat24bppRGB, PixelFormat32bppRGB,
+        PixelFormat32bppARGB, PixelFormat32bppPARGB, PixelFormat48bppRGB,
+        PixelFormat64bppARGB, PixelFormat64bppPARGB, PixelFormat32bppCMYK
+    };
+    GpStatus status;
+    GpBitmap *bitmap;
+    GpImage *thumb;
+    HBITMAP hbitmap;
+    BITMAP bm;
+    PixelFormat format;
+    BitmapData data;
+    UINT i, ret;
+
+    for (i = 0; i < sizeof(fmt)/sizeof(fmt[0]); i++)
+    {
+        status = GdipCreateBitmapFromScan0(1, 1, 0, fmt[i], NULL, &bitmap);
+        ok(status == Ok || broken(status == InvalidParameter) /* before win7 */,
+           "GdipCreateBitmapFromScan0 error %d\n", status);
+        if (status != Ok) continue;
+
+        status = GdipGetImagePixelFormat((GpImage *)bitmap, &format);
+        expect(Ok, status);
+        expect(fmt[i], format);
+
+        status = GdipCreateHBITMAPFromBitmap(bitmap, &hbitmap, 0);
+        if (fmt[i] == PixelFormat16bppGrayScale || fmt[i] == PixelFormat32bppCMYK)
+            todo_wine expect(InvalidParameter, status);
+        else
+        {
+            expect(Ok, status);
+            ret = GetObject(hbitmap, sizeof(bm), &bm);
+            expect(sizeof(bm), ret);
+            expect(0, bm.bmType);
+            expect(1, bm.bmWidth);
+            expect(1, bm.bmHeight);
+            expect(4, bm.bmWidthBytes);
+            expect(1, bm.bmPlanes);
+            expect(32, bm.bmBitsPixel);
+            DeleteObject(hbitmap);
+        }
+
+        status = GdipGetImageThumbnail((GpImage *)bitmap, 0, 0, &thumb, NULL, NULL);
+        if (fmt[i] == PixelFormat16bppGrayScale || fmt[i] == PixelFormat32bppCMYK)
+            todo_wine
+            ok(status == OutOfMemory || broken(status == InvalidParameter) /* before win7 */,
+               "expected OutOfMemory, got %d\n", status);
+        else
+        {
+            expect(Ok, status);
+            status = GdipGetImagePixelFormat(thumb, &format);
+            expect(Ok, status);
+            ok(format == PixelFormat32bppPARGB || broken(format != PixelFormat32bppPARGB) /* before win7 */,
+               "expected PixelFormat32bppPARGB, got %#x\n", format);
+            status = GdipDisposeImage(thumb);
+            expect(Ok, status);
+        }
+
+        status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, PixelFormat32bppPARGB, &data);
+        if (fmt[i] == PixelFormat16bppGrayScale || fmt[i] == PixelFormat32bppCMYK)
+            todo_wine expect(InvalidParameter, status);
+        else
+        {
+            expect(Ok, status);
+            status = GdipBitmapUnlockBits(bitmap, &data);
+            expect(Ok, status);
+        }
+
+        status = GdipDisposeImage((GpImage *)bitmap);
+        expect(Ok, status);
+    }
+}
+
 START_TEST(image)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -3724,6 +3802,7 @@ START_TEST(image)
 
     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
+    test_image_format();
     test_DrawImage();
     test_GdipDrawImagePointRect();
     test_bitmapbits();
-- 
1.7.11.5




More information about the wine-patches mailing list