[PATCH v3 0/2] MR10835: gdiplus: Add support for CMYK to ARGB pixel format conversion.
Add conversion from PixelFormat32bppCMYK to PixelFormat32bppARGB in convert_pixels(), using the standard subtractive color model formula where RGB = (255 - CMY) * (255 - K) / 255. -- v3: gdiplus: Fix return code for pixel format convertion. gdiplus/tests: Add test for pixel format conversion. https://gitlab.winehq.org/wine/wine/-/merge_requests/10835
From: yaoyongjie <yaoyongjie@uniontech.com> Change-Id: I9a1a2499e6998c428ecdcf399de19a7e55d2ace6 --- dlls/gdiplus/tests/image.c | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index a1b81c8eda7..7bbfeb3f986 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -5481,6 +5481,44 @@ static void test_PARGB_conversion(void) GdipDisposeImage((GpImage *)bitmap); } +static void test_CMYK_conversion(void) +{ + static const BYTE cmyk_bits[16] = + { + /* pixel 0: C=0,M=0,Y=0,K=0 -> white */ + 0x00,0x00,0x00,0x00, + /* pixel 1: C=0,M=0,Y=0,K=255 -> black */ + 0x00,0x00,0x00,0xff, + /* pixel 2: C=128,M=64,Y=32,K=16 -> R=119,G=179,B=209 */ + 0x80,0x40,0x20,0x10, + /* pixel 3: C=255,M=255,Y=255,K=0 -> black */ + 0xff,0xff,0xff,0x00 + }; + GpBitmap *bitmap; + BitmapData data; + GpStatus status; + + status = GdipCreateBitmapFromScan0(4, 1, 16, PixelFormat32bppCMYK, + (BYTE*)cmyk_bits, &bitmap); + ok(status == Ok, "GdipCreateBitmapFromScan0(CMYK) failed, status=%d\n", status); + if (status != Ok) return; + + memset(&data, 0, sizeof(data)); + status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, + PixelFormat32bppARGB, &data); + todo_wine ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat32bppARGB\n"); + + status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, + PixelFormat8bppIndexed, &data); + todo_wine ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat8bppIndexed\n"); + + status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, + PixelFormat16bppGrayScale, &data); + todo_wine ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat16bppGrayScale\n"); + + GdipDisposeImage((GpImage *)bitmap); +} + static void test_CloneBitmapArea(void) { @@ -6863,6 +6901,7 @@ START_TEST(image) test_CloneBitmapArea(); test_ARGB_conversion(); test_PARGB_conversion(); + test_CMYK_conversion(); test_DrawImage_scale(); test_image_format(); test_DrawImage(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10835
From: yaoyongjie <yaoyongjie@uniontech.com> Change-Id: I4dca5a2b5d1f913b71421dd932036f87dd0c82de --- dlls/gdiplus/image.c | 5 +++++ dlls/gdiplus/tests/image.c | 11 +++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 17e1437eb5f..f764e523579 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -608,6 +608,11 @@ GpStatus convert_pixels(INT width, INT height, return Ok; } + /* gdiplus rejectes CMYK convertion on Win7 and WIN11 */ + if (src_format == PixelFormat32bppCMYK || dst_format == PixelFormat32bppCMYK || + src_format == PixelFormat16bppGrayScale || dst_format == PixelFormat16bppGrayScale) + return InvalidParameter; + #define convert_indexed_to_rgb(getpixel_function, setpixel_function) do { \ for (y=0; y<height; y++) \ for (x=0; x<width; x++) { \ diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 7bbfeb3f986..796fb057676 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -4970,7 +4970,7 @@ static void test_image_format(void) status = GdipCreateHBITMAPFromBitmap(bitmap, &hbitmap, 0); if (fmt[i] == PixelFormat16bppGrayScale || fmt[i] == PixelFormat32bppCMYK) - todo_wine expect(InvalidParameter, status); + expect(InvalidParameter, status); else { expect(Ok, status); @@ -5004,7 +5004,7 @@ static void test_image_format(void) status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, PixelFormat32bppPARGB, &data); if (fmt[i] == PixelFormat16bppGrayScale || fmt[i] == PixelFormat32bppCMYK) - todo_wine expect(InvalidParameter, status); + expect(InvalidParameter, status); else { expect(Ok, status); @@ -5506,15 +5506,15 @@ static void test_CMYK_conversion(void) memset(&data, 0, sizeof(data)); status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, PixelFormat32bppARGB, &data); - todo_wine ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat32bppARGB\n"); + ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat32bppARGB\n"); status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, PixelFormat8bppIndexed, &data); - todo_wine ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat8bppIndexed\n"); + ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat8bppIndexed\n"); status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, PixelFormat16bppGrayScale, &data); - todo_wine ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat16bppGrayScale\n"); + ok(status == InvalidParameter, "gdiplus rejectes PixelFormat32bppCMYK -> PixelFormat16bppGrayScale\n"); GdipDisposeImage((GpImage *)bitmap); } @@ -6260,7 +6260,6 @@ static void test_png_save_palette(void) status = GdipSaveImageToStream((GpImage *)bitmap, stream, &clsid, NULL); GdipDisposeImage((GpImage*)bitmap); - todo_wine_if(formats[i] == PixelFormat16bppGrayScale) ok(formats[i] == PixelFormat16bppGrayScale ? (status == GenericError || status == Win32Error) : status == Ok, "Unexpected return value %d saving image for PixelFormat %#x\n", status, formats[i]); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10835
participants (2)
-
yaoyongjie -
Yongjie Yao (@yaoyongjie)