[PATCH v2 0/2] MR10745: gdiplus: Fix returned flags and add transparency support to GdipInitializePalette
-- v2: gdiplus: Fix returned flags and add transparency to GdipInitializePalette gdiplus/tests: Extend GdipInitializePalette tests with transparent color https://gitlab.winehq.org/wine/wine/-/merge_requests/10745
From: Bartosz Kosiorek <gang65@poczta.onet.pl> --- dlls/gdiplus/tests/image.c | 56 ++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 7346ba94880..41b929b21d4 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -6486,29 +6486,29 @@ static void test_GdipInitializePalette(void) palette = GdipAlloc(sizeof(*palette) + sizeof(ARGB) * 255); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 15; status = pGdipInitializePalette(palette, PaletteTypeOptimal, 16, FALSE, bitmap); expect(GenericError, status); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeOptimal, 16, FALSE, NULL); expect(InvalidParameter, status); memset(palette->Entries, 0x11, sizeof(ARGB) * 256); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeCustom, 16, FALSE, NULL); expect(Ok, status); - expect(0, palette->Flags); + expect(9999, palette->Flags); expect(256, palette->Count); expect(0x11111111, palette->Entries[0]); expect(0x11111111, palette->Entries[128]); expect(0x11111111, palette->Entries[255]); memset(palette->Entries, 0x11, sizeof(ARGB) * 256); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedBW, 0, FALSE, bitmap); expect(Ok, status); @@ -6519,7 +6519,7 @@ static void test_GdipInitializePalette(void) expect(0xffffffff, palette->Entries[1]); memset(palette->Entries, 0x11, sizeof(ARGB) * 256); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone8, 1, FALSE, NULL); expect(Ok, status); @@ -6530,8 +6530,9 @@ static void test_GdipInitializePalette(void) expect(0xffc0c0c0, palette->Entries[8]); expect(0xff008080, palette->Entries[15]); + /* With bitmap */ memset(palette->Entries, 0x11, sizeof(ARGB) * 256); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone8, 1, FALSE, bitmap); expect(Ok, status); @@ -6542,8 +6543,41 @@ static void test_GdipInitializePalette(void) expect(0xffc0c0c0, palette->Entries[8]); expect(0xff008080, palette->Entries[15]); + /* With transparent color and bitmap */ + memset(palette->Entries, 0x11, sizeof(ARGB) * 256); + palette->Flags = 9999; + palette->Count = 256; + status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone8, 1, TRUE, bitmap); + expect(Ok, status); + todo_wine + expect(0x300, palette->Flags); + todo_wine + expect(17, palette->Count); + expect(0xff000000, palette->Entries[0]); + expect(0xffc0c0c0, palette->Entries[8]); + expect(0xff008080, palette->Entries[15]); + todo_wine + expect(0x00000000, palette->Entries[16]); + + memset(palette->Entries, 0x11, sizeof(ARGB) * 256); + palette->Flags = 9999; + palette->Count = 256; + status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone64, 1, TRUE, bitmap); + expect(Ok, status); + todo_wine + expect(0x500, palette->Flags); + todo_wine + expect(73, palette->Count); + expect(0xff000000, palette->Entries[0]); + expect(0xff00aa00, palette->Entries[8]); + expect(0xff00ffff, palette->Entries[15]); + expect(0xffaa0000, palette->Entries[32]); + expect(0xff008080, palette->Entries[71]); + todo_wine + expect(0x00000000, palette->Entries[72]); + memset(palette->Entries, 0x11, sizeof(ARGB) * 256); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone252, 1, FALSE, bitmap); expect(Ok, status); @@ -6554,19 +6588,19 @@ static void test_GdipInitializePalette(void) expect(0xff990066, palette->Entries[128]); expect(0xffffffff, palette->Entries[251]); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeOptimal, 1, FALSE, bitmap); expect(InvalidParameter, status); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeOptimal, 2, FALSE, bitmap); expect(Ok, status); expect(0, palette->Flags); expect(2, palette->Count); - palette->Flags = 0; + palette->Flags = 9999; palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeOptimal, 16, FALSE, bitmap); expect(Ok, status); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10745
From: Bartosz Kosiorek <gang65@poczta.onet.pl> --- dlls/gdiplus/image.c | 10 ++++++++-- dlls/gdiplus/tests/image.c | 10 ---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 68eaa177163..17e1437eb5f 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -6220,11 +6220,17 @@ GpStatus WINGDIPAPI GdipInitializePalette(ColorPalette *palette, wic_palette = get_palette(NULL, (WICBitmapPaletteType)type); if (!wic_palette) return OutOfMemory; - if (palette->Count >= wic_palette->Count) + if (palette->Count >= wic_palette->Count + (transparent ? 1 : 0)) { - palette->Flags = wic_palette->Flags; + palette->Flags = (UINT)type << 8; palette->Count = wic_palette->Count; memcpy(palette->Entries, wic_palette->Entries, wic_palette->Count * sizeof(wic_palette->Entries[0])); + if (transparent) + { + /* If there is transparent color, add additional entry to palette */ + palette->Entries[palette->Count] = 0x00000000; + palette->Count++; + } } else status = GenericError; diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 41b929b21d4..a1b81c8eda7 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -6512,7 +6512,6 @@ static void test_GdipInitializePalette(void) palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedBW, 0, FALSE, bitmap); expect(Ok, status); - todo_wine expect(0x200, palette->Flags); expect(2, palette->Count); expect(0xff000000, palette->Entries[0]); @@ -6523,7 +6522,6 @@ static void test_GdipInitializePalette(void) palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone8, 1, FALSE, NULL); expect(Ok, status); - todo_wine expect(0x300, palette->Flags); expect(16, palette->Count); expect(0xff000000, palette->Entries[0]); @@ -6536,7 +6534,6 @@ static void test_GdipInitializePalette(void) palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone8, 1, FALSE, bitmap); expect(Ok, status); - todo_wine expect(0x300, palette->Flags); expect(16, palette->Count); expect(0xff000000, palette->Entries[0]); @@ -6549,14 +6546,11 @@ static void test_GdipInitializePalette(void) palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone8, 1, TRUE, bitmap); expect(Ok, status); - todo_wine expect(0x300, palette->Flags); - todo_wine expect(17, palette->Count); expect(0xff000000, palette->Entries[0]); expect(0xffc0c0c0, palette->Entries[8]); expect(0xff008080, palette->Entries[15]); - todo_wine expect(0x00000000, palette->Entries[16]); memset(palette->Entries, 0x11, sizeof(ARGB) * 256); @@ -6564,16 +6558,13 @@ static void test_GdipInitializePalette(void) palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone64, 1, TRUE, bitmap); expect(Ok, status); - todo_wine expect(0x500, palette->Flags); - todo_wine expect(73, palette->Count); expect(0xff000000, palette->Entries[0]); expect(0xff00aa00, palette->Entries[8]); expect(0xff00ffff, palette->Entries[15]); expect(0xffaa0000, palette->Entries[32]); expect(0xff008080, palette->Entries[71]); - todo_wine expect(0x00000000, palette->Entries[72]); memset(palette->Entries, 0x11, sizeof(ARGB) * 256); @@ -6581,7 +6572,6 @@ static void test_GdipInitializePalette(void) palette->Count = 256; status = pGdipInitializePalette(palette, PaletteTypeFixedHalftone252, 1, FALSE, bitmap); expect(Ok, status); - todo_wine expect(0x800, palette->Flags); expect(252, palette->Count); expect(0xff000000, palette->Entries[0]); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10745
This merge request was approved by Esme Povirk. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10745
participants (3)
-
Bartosz Kosiorek -
Bartosz Kosiorek (@gang65) -
Esme Povirk (@madewokherd)