Ziqing Hui : comctl32/tests: Add tests for alpha channel of imagelist.

Alexandre Julliard julliard at winehq.org
Tue Mar 3 16:24:51 CST 2020


Module: wine
Branch: master
Commit: 5784343db8e81006f411f114f10e5c78a96169e7
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5784343db8e81006f411f114f10e5c78a96169e7

Author: Ziqing Hui <zhui at codeweavers.com>
Date:   Mon Mar  2 10:30:44 2020 +0800

comctl32/tests: Add tests for alpha channel of imagelist.

Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/tests/imagelist.c | 70 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c
index daa1715e7e..9271354edb 100644
--- a/dlls/comctl32/tests/imagelist.c
+++ b/dlls/comctl32/tests/imagelist.c
@@ -63,6 +63,7 @@ typedef struct _ILHEAD
 static HIMAGELIST (WINAPI *pImageList_Create)(int, int, UINT, int, int);
 static BOOL (WINAPI *pImageList_Destroy)(HIMAGELIST);
 static int (WINAPI *pImageList_Add)(HIMAGELIST, HBITMAP, HBITMAP);
+static int (WINAPI *pImageList_AddMasked)(HIMAGELIST, HBITMAP, COLORREF);
 static BOOL (WINAPI *pImageList_DrawIndirect)(IMAGELISTDRAWPARAMS*);
 static BOOL (WINAPI *pImageList_SetImageCount)(HIMAGELIST,UINT);
 static HRESULT (WINAPI *pImageList_CoCreateInstance)(REFCLSID,const IUnknown *,
@@ -2260,6 +2261,73 @@ static void test_loadimage(void)
     pImageList_Destroy( list );
 }
 
+#define GetAValue(argb) ((BYTE) ((argb) >> 24))
+
+static void get_image_alpha(HIMAGELIST himl, int index, int width, int height, UINT32 *alpha)
+{
+    int i;
+    HBITMAP hbm_dst;
+    void *bitmap_bits;
+    BITMAPINFO bitmap_info = {{sizeof(BITMAPINFOHEADER), width, height, 1, 32, BI_RGB, 0, 0, 0, 0, 0}};
+
+    HDC hdc_dst = CreateCompatibleDC(0);
+    hbm_dst = CreateDIBSection(hdc_dst, &bitmap_info, DIB_RGB_COLORS, &bitmap_bits, NULL, 0);
+    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]);
+
+    DeleteObject(hbm_dst);
+    DeleteDC(hdc_dst);
+}
+
+static void test_alpha(void)
+{
+    /* each line is a 2*1 bitmap */
+    const static UINT32 test_bitmaps[] =
+    {
+        0x00654321, 0x00ABCDEF,
+        0x00654321, 0xFFABCDEF,
+        0x00654321, 0x89ABCDEF,
+        0xFF654321, 0x00ABCDEF,
+        0xFF654321, 0xFFABCDEF,
+        0xFF654321, 0x89ABCDEF,
+        0x87654321, 0x00ABCDEF,
+        0x87654321, 0xFFABCDEF,
+        0x87654321, 0x89ABCDEF
+    };
+
+    int i, ret;
+    HDC hdc;
+    HBITMAP hbm_test;
+    HIMAGELIST himl;
+    UINT32 alpha[2];
+
+    hdc = CreateCompatibleDC(0);
+    himl = pImageList_Create(2, 1, ILC_COLOR32 | ILC_MASK, 0, 10);
+
+    for (i = 0; i < ARRAY_SIZE(test_bitmaps); i += 2)
+    {
+        hbm_test = create_test_bitmap(hdc, 32, test_bitmaps[i], test_bitmaps[i + 1]);
+        ret = pImageList_AddMasked(himl, hbm_test, CLR_NONE);
+        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);
+
+        todo_wine_if(i == 0)
+        ok(alpha[0] == GetAValue(test_bitmaps[i]) && alpha[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],
+           GetAValue(test_bitmaps[i]), GetAValue(test_bitmaps[i + 1]));
+    }
+
+    pImageList_Destroy(himl);
+    DeleteDC(hdc);
+}
+
 static void test_IImageList_Clone(void)
 {
     IImageList *imgl, *imgl2;
@@ -2391,6 +2459,7 @@ static void init_functions(void)
     X(ImageList_Create);
     X(ImageList_Destroy);
     X(ImageList_Add);
+    X(ImageList_AddMasked);
     X(ImageList_DrawIndirect);
     X(ImageList_SetImageCount);
     X(ImageList_SetImageCount);
@@ -2461,6 +2530,7 @@ START_TEST(imagelist)
     test_color_table(ILC_COLOR8);
     test_copy();
     test_loadimage();
+    test_alpha();
 
     test_ImageList_DrawIndirect();
     test_shell_imagelist();




More information about the wine-cvs mailing list