[PATCH v2 1/2] comctl32/tests: Add more tests for 32bpp bitmaps with and without alpha, and masks.

Gabriel Ivăncescu gabrielopcode at gmail.com
Tue Jan 5 11:53:17 CST 2021


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/comctl32/tests/imagelist.c | 67 +++++++++++++++++++++++++++------
 1 file changed, 55 insertions(+), 12 deletions(-)

diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c
index a580906..c74acb2 100644
--- a/dlls/comctl32/tests/imagelist.c
+++ b/dlls/comctl32/tests/imagelist.c
@@ -2346,9 +2346,8 @@ static void test_loadimage(void)
 
 #define GetAValue(argb) ((BYTE) ((argb) >> 24))
 
-static void get_image_alpha(HIMAGELIST himl, int index, int width, int height, UINT32 *alpha)
+static void get_image_bits(HIMAGELIST himl, int index, int width, int height, UINT32 *bits)
 {
-    int i;
     HBITMAP hbm_dst;
     void *bitmap_bits;
     BITMAPINFO bitmap_info = {{sizeof(BITMAPINFOHEADER), width, height, 1, 32, BI_RGB, 0, 0, 0, 0, 0}};
@@ -2358,9 +2357,7 @@ static void get_image_alpha(HIMAGELIST himl, int index, int width, int height, U
     SelectObject(hdc_dst, hbm_dst);
 
     pImageList_Draw(himl, index, hdc_dst, 0, 0, ILD_TRANSPARENT);
-    memcpy(alpha, bitmap_bits, (size_t)(width * height * 32 / 8));
-    for (i = 0; i < width * height; i++)
-        alpha[i] = GetAValue(alpha[i]);
+    memcpy(bits, bitmap_bits, (size_t)(width * height * 32 / 8));
 
     DeleteObject(hbm_dst);
     DeleteDC(hdc_dst);
@@ -2372,6 +2369,11 @@ static void test_alpha(void)
     const static UINT32 test_bitmaps[] =
     {
         0x00654321, 0x00ABCDEF,
+        0x00654321, 0x00654321,
+        0x00ABCDEF, 0x00654321,
+        0x00ABCDEF, 0x00ABCDEF,
+        0x00654321, 0x01ABCDEF,
+        0x01654321, 0x00ABCDEF,
         0x00654321, 0xFFABCDEF,
         0x00654321, 0x89ABCDEF,
         0xFF654321, 0x00ABCDEF,
@@ -2381,31 +2383,72 @@ static void test_alpha(void)
         0x87654321, 0xFFABCDEF,
         0x87654321, 0x89ABCDEF
     };
+    const static BYTE mask_bits = 0xAA;
 
     int i, ret;
     HDC hdc;
-    HBITMAP hbm_test;
+    HBITMAP hbm_test, hbm_mask;
     HIMAGELIST himl;
-    UINT32 alpha[2];
+    UINT32 bits[2];
 
     hdc = CreateCompatibleDC(0);
-    himl = pImageList_Create(2, 1, ILC_COLOR32 | ILC_MASK, 0, 10);
+    himl = pImageList_Create(2, 1, ILC_COLOR32 | ILC_MASK, 0, 15);
 
     for (i = 0; i < ARRAY_SIZE(test_bitmaps); i += 2)
     {
         hbm_test = create_test_bitmap(hdc, 2, 1, 32, test_bitmaps + i);
-        ret = pImageList_AddMasked(himl, hbm_test, CLR_NONE);
+        ret = pImageList_AddMasked(himl, hbm_test, RGB(0x65,0x43,0x21));
         ok(ret == i / 2, "ImageList_AddMasked returned %d, expected %d\n", ret, i / 2);
         DeleteObject(hbm_test);
 
-        get_image_alpha(himl, i / 2, 2, 1, alpha);
-        ok(alpha[0] == GetAValue(test_bitmaps[i]) && alpha[1] == GetAValue(test_bitmaps[i + 1]),
+        get_image_bits(himl, i / 2, 2, 1, bits);
+        ok(GetAValue(bits[0]) == GetAValue(test_bitmaps[i]) && GetAValue(bits[1]) == GetAValue(test_bitmaps[i + 1]),
+           "Bitmap [%08X, %08X] returned alpha value [%02X, %02X], expected [%02X, %02X]\n",
+           test_bitmaps[i], test_bitmaps[i + 1], GetAValue(bits[0]), GetAValue(bits[1]),
+           GetAValue(test_bitmaps[i]), GetAValue(test_bitmaps[i + 1]));
+
+        /* If all alpha values are zero, the image is considered to have no alpha and gets masked */
+        if (!GetAValue(bits[0]) && !GetAValue(bits[1]))
+            ok(bits[0] == (test_bitmaps[i] == 0x654321 ? 0 : test_bitmaps[i]) &&
+               bits[1] == (test_bitmaps[i + 1] == 0x654321 ? 0 : test_bitmaps[i + 1]),
+               "Bitmap [%08X, %08X] returned [%08X, %08X], expected [%08X, %08X]\n",
+               test_bitmaps[i], test_bitmaps[i + 1], bits[0], bits[1],
+               test_bitmaps[i] == 0x654321 ? 0 : test_bitmaps[i],
+               test_bitmaps[i + 1] == 0x654321 ? 0 : test_bitmaps[i + 1]);
+    }
+
+    pImageList_Destroy(himl);
+    hbm_mask = CreateBitmap(2, 1, 1, 1, &mask_bits);
+    himl = pImageList_Create(2, 1, ILC_COLOR32 | ILC_MASK, 0, 15);
+
+    for (i = 0; i < ARRAY_SIZE(test_bitmaps); i += 2)
+    {
+        hbm_test = create_test_bitmap(hdc, 2, 1, 32, test_bitmaps + i);
+        ret = pImageList_Add(himl, hbm_test, hbm_mask);
+        ok(ret == i / 2, "ImageList_Add returned %d, expected %d\n", ret, i / 2);
+        DeleteObject(hbm_test);
+
+        get_image_bits(himl, i / 2, 2, 1, bits);
+        ok(GetAValue(bits[0]) == GetAValue(test_bitmaps[i]) && GetAValue(bits[1]) == GetAValue(test_bitmaps[i + 1]),
            "Bitmap [%08X, %08X] returned alpha value [%02X, %02X], expected [%02X, %02X]\n",
-           test_bitmaps[i], test_bitmaps[i + 1], alpha[0], alpha[1],
+           test_bitmaps[i], test_bitmaps[i + 1], GetAValue(bits[0]), GetAValue(bits[1]),
            GetAValue(test_bitmaps[i]), GetAValue(test_bitmaps[i + 1]));
+
+        /* If all alpha values are zero, the image is considered to have no alpha and gets masked */
+        if (!GetAValue(bits[0]) && !GetAValue(bits[1]))
+            todo_wine ok(!bits[0] && bits[1] == test_bitmaps[i + 1],
+               "Bitmap [%08X, %08X] returned [%08X, %08X], expected [%08X, %08X]\n",
+               test_bitmaps[i], test_bitmaps[i + 1], bits[0], bits[1], 0, test_bitmaps[i + 1]);
+        else
+        {
+            if (GetAValue(bits[0]) >= 0x80)
+                ok(bits[0] & 0x00FFFFFF, "Bitmap [%08X, %08X] has alpha and masked first pixel [%08X]\n",
+                   test_bitmaps[i], test_bitmaps[i + 1], bits[0]);
+        }
     }
 
     pImageList_Destroy(himl);
+    DeleteObject(hbm_mask);
     DeleteDC(hdc);
 }
 
-- 
2.29.2




More information about the wine-devel mailing list