From: Ziqing Hui zhui@codeweavers.com
--- dlls/comctl32/tests/imagelist.c | 100 +++++++++++++++++++------------- 1 file changed, 61 insertions(+), 39 deletions(-)
diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c index e73e333931e..3b547732fd5 100644 --- a/dlls/comctl32/tests/imagelist.c +++ b/dlls/comctl32/tests/imagelist.c @@ -2506,7 +2506,7 @@ static void test_loadimage(void) pImageList_Destroy( list ); }
-static void test_alpha(void) +static void test_alpha(BOOL v6) { /* each line is a 2*1 bitmap */ const static UINT32 test_bitmaps[] = @@ -2529,10 +2529,10 @@ static void test_alpha(void) const static BYTE mask_bits = 0xAA;
IImageList2 *image_list_iface; + DWORD flag, expected_flag = 0; UINT32 bits[2], expected[2]; HBITMAP hbm_test, hbm_mask; const UINT32 *bitmap_bits; - DWORD flag, expected_flag; HIMAGELIST himl; BOOL has_alpha; HRESULT hr; @@ -2541,12 +2541,10 @@ static void test_alpha(void)
hdc = CreateCompatibleDC(0);
+ winetest_push_context(v6 ? "v6" : "v5"); + /* Test ImageList_AddMasked with alpha. */ himl = pImageList_Create(2, 1, ILC_COLOR32 | ILC_MASK, 0, 15); - - hr = pHIMAGELIST_QueryInterface(himl, &IID_IImageList2, (void **)&image_list_iface); - ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr); - for (i = 0; i < ARRAY_SIZE(test_bitmaps); i += 2) { bitmap_bits = test_bitmaps + i; @@ -2562,42 +2560,44 @@ static void test_alpha(void) expected[0] = get_premultiplied_argb(bitmap_bits[0]); expected[1] = get_premultiplied_argb(bitmap_bits[1]); expected_flag = ILIF_ALPHA; - /* If all alpha values are zero, the image is considered to have no alpha and gets masked. */ - if (!has_alpha) + /* v5: The image always gets masked. + * v6: If all alpha values are zero, the image is considered to have no alpha and gets masked. */ + if (!v6 || (v6 && !has_alpha)) { expected[0] = (bitmap_bits[0] == 0x654321 ? 0 : bitmap_bits[0]); expected[1] = (bitmap_bits[1] == 0x654321 ? 0 : bitmap_bits[1]); expected_flag = 0; }
- hr = IImageList2_GetItemFlags(image_list_iface, i / 2, &flag); - ok(hr == S_OK, "GetItemFlags returned %#lx.\n", hr); - ok(flag == expected_flag, "Unexpected flag %#lx, expected %#lx.\n", flag, expected_flag); + if (v6) + { + hr = pHIMAGELIST_QueryInterface(himl, &IID_IImageList2, (void **)&image_list_iface); + ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr); + hr = IImageList2_GetItemFlags(image_list_iface, i / 2, &flag); + ok(hr == S_OK, "GetItemFlags returned %#lx.\n", hr); + ok(flag == expected_flag, "Unexpected flag %#lx, expected %#lx.\n", flag, expected_flag); + IImageList2_Release(image_list_iface); + }
image_list_get_image_bits_by_bitmap(himl, i / 2, bits); - todo_wine_if(i != 0 && i != 2 && i != 4 && i != 6 && i != 12 && i != 18) + todo_wine_if(v6 && i != 0 && i != 2 && i != 4 && i != 6 && i != 12 && i != 18) ok(colour_match(bits[0], expected[0]) && colour_match(bits[1], expected[1]), "Got bits [%08X, %08X], expected [%08X, %08X].\n", bits[0], bits[1], expected[0], expected[1]);
image_list_get_image_bits_by_draw(himl, i / 2, bits); + todo_wine_if(!v6 && i != 0 && i != 2 && i != 4 && i != 6 && i != 12 && i != 18) ok(colour_match(bits[0], expected[0]) && colour_match(bits[1], expected[1]), "Got bits [%08X, %08X], expected [%08X, %08X].\n", bits[0], bits[1], expected[0], expected[1]);
winetest_pop_context(); } - - IImageList2_Release(image_list_iface); pImageList_Destroy(himl);
/* Test ImageList_Add with alpha. */ hbm_mask = CreateBitmap(2, 1, 1, 1, &mask_bits); himl = pImageList_Create(2, 1, ILC_COLOR32 | ILC_MASK, 0, 15); - - hr = pHIMAGELIST_QueryInterface(himl, &IID_IImageList2, (void **)&image_list_iface); - ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr); - for (i = 0; i < ARRAY_SIZE(test_bitmaps); i += 2) { bitmap_bits = test_bitmaps + i; @@ -2613,42 +2613,50 @@ static void test_alpha(void) expected[0] = get_premultiplied_argb(bitmap_bits[0]); expected[1] = get_premultiplied_argb(bitmap_bits[1]); expected_flag = ILIF_ALPHA; - /* If all alpha values are zero, the image is considered to have no alpha and gets masked. */ - if (!has_alpha) + + if (!v6) + { + /* v5: The image always gets masked, though the alpha value of the masked bit is kept. */ + expected[0] = bitmap_bits[0] & 0xff000000; + expected[1] = bitmap_bits[1]; + } + else if (!has_alpha) { + /* v6: If all alpha values are zero, the image is considered to have no alpha and gets masked. */ expected[0] = 0; expected[1] = bitmap_bits[1]; expected_flag = 0; }
- hr = IImageList2_GetItemFlags(image_list_iface, i / 2, &flag); - ok(hr == S_OK, "GetItemFlags returned %#lx.\n", hr); - ok(flag == expected_flag, "Unexpected flag %#lx, expected %#lx.\n", flag, expected_flag); + if (v6) + { + hr = pHIMAGELIST_QueryInterface(himl, &IID_IImageList2, (void **)&image_list_iface); + ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr); + hr = IImageList2_GetItemFlags(image_list_iface, i / 2, &flag); + ok(hr == S_OK, "GetItemFlags returned %#lx.\n", hr); + ok(flag == expected_flag, "Unexpected flag %#lx, expected %#lx.\n", flag, expected_flag); + IImageList2_Release(image_list_iface); + }
image_list_get_image_bits_by_bitmap(himl, i / 2, bits); - todo_wine_if(i != 0 && i != 2 && i != 4 && i != 6 && i != 18) + todo_wine_if(i != 0 && i != 2 && i != 4 && i != 6 && (!v6 || i != 18)) ok(colour_match(bits[0], expected[0]) && colour_match(bits[1], expected[1]), "Got bits [%08X, %08X], expected [%08X, %08X].\n", bits[0], bits[1], expected[0], expected[1]);
image_list_get_image_bits_by_draw(himl, i / 2, bits); + todo_wine_if(!v6 && i != 0 && i != 2 && i != 4 && i != 6 && i != 12) ok(colour_match(bits[0], expected[0]) && colour_match(bits[1], expected[1]), "Got bits [%08X, %08X], expected [%08X, %08X].\n", bits[0], bits[1], expected[0], expected[1]);
winetest_pop_context(); } - - IImageList2_Release(image_list_iface); pImageList_Destroy(himl); DeleteObject(hbm_mask);
/* Test adding 32bpp images with alpha to 24bpp image list. */ himl = pImageList_Create(2, 1, ILC_COLOR24 | ILC_MASK, 0, 15); - - hr = pHIMAGELIST_QueryInterface(himl, &IID_IImageList2, (void **)&image_list_iface); - ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr); - for (i = 0; i < ARRAY_SIZE(test_bitmaps); i += 2) { bitmap_bits = test_bitmaps + i; @@ -2662,34 +2670,47 @@ static void test_alpha(void)
expected[0] = bitmap_bits[0]; expected[1] = bitmap_bits[1]; - if (get_alpha(bitmap_bits[0]) || get_alpha(bitmap_bits[1])) + if (!v6) { + /* v5: Copy the bits to the image list. */ + expected[0] = bitmap_bits[0] & 0x00ffffff; + expected[1] = bitmap_bits[1] & 0x00ffffff; + } + else if (get_alpha(bitmap_bits[0]) || get_alpha(bitmap_bits[1])) + { + /* v6: Alpha blend the bits to the image list. */ expected[0] = get_alpha_blended(0x00ffffff, bitmap_bits[0]); expected[1] = get_alpha_blended(0x00ffffff, bitmap_bits[1]); }
- hr = IImageList2_GetItemFlags(image_list_iface, i / 2, &flag); - ok(hr == S_OK, "GetItemFlags returned %#lx.\n", hr); - ok(flag == 0, "Unexpected flag %#lx.\n", flag); + if (v6) + { + hr = pHIMAGELIST_QueryInterface(himl, &IID_IImageList2, (void **)&image_list_iface); + ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr); + hr = IImageList2_GetItemFlags(image_list_iface, i / 2, &flag); + ok(hr == S_OK, "GetItemFlags returned %#lx.\n", hr); + ok(flag == 0, "Unexpected flag %#lx.\n", flag); + IImageList2_Release(image_list_iface); + }
image_list_get_image_bits_by_bitmap(himl, i / 2, bits); - todo_wine_if(i != 0 && i != 2 && i != 4 && i != 6 && i != 18) + todo_wine_if(v6 && i != 0 && i != 2 && i != 4 && i != 6 && i != 18) ok(colour_match(bits[0], expected[0]) && colour_match(bits[1], expected[1]), "Got bits [%08X, %08X], expected [%08X, %08X].\n", bits[0], bits[1], expected[0], expected[1]);
image_list_get_image_bits_by_draw(himl, i / 2, bits); - todo_wine_if(i != 0 && i != 2 && i != 4 && i != 6 && i != 18) + todo_wine_if(v6 && i != 0 && i != 2 && i != 4 && i != 6 && i != 18) ok(colour_match(bits[0], expected[0]) && colour_match(bits[1], expected[1]), "Got bits [%08X, %08X], expected [%08X, %08X].\n", bits[0], bits[1], expected[0], expected[1]);
winetest_pop_context(); } - - IImageList2_Release(image_list_iface); pImageList_Destroy(himl);
+ winetest_pop_context(); + DeleteDC(hdc); }
@@ -2898,6 +2919,7 @@ START_TEST(imagelist) test_color_table(ILC_COLOR8); test_copy(); test_loadimage(); + test_alpha(FALSE);
/* Now perform v6 tests */ if (!load_v6_module(&ctx_cookie, &hCtx)) @@ -2918,7 +2940,7 @@ START_TEST(imagelist) test_color_table(ILC_COLOR8); test_copy(); test_loadimage(); - test_alpha(); + test_alpha(TRUE);
test_ImageList_DrawIndirect(); test_shell_imagelist();