[06/10] gdiplus: GdipGetImageThumbnail should return image in 32bppPARGB format.
Dmitry Timoshkov
dmitry at baikal.ru
Thu Aug 16 23:42:22 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