From 5784343db8e81006f411f114f10e5c78a96169e7 Mon Sep 17 00:00:00 2001 From: Ziqing Hui Date: Mon, 2 Mar 2020 10:30:44 +0800 Subject: [PATCH] comctl32/tests: Add tests for alpha channel of imagelist. Signed-off-by: Ziqing Hui Signed-off-by: Alexandre Julliard --- 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 daa1715e7ee..9271354edbb 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();