From 65b7eb26359110959692db7c0c3cebd263fe21ab Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 16 Dec 2011 13:07:45 +0100 Subject: [PATCH] comctl32/tests: Add some more tests for ImageList_Write. --- dlls/comctl32/imagelist.c | 14 ++--- dlls/comctl32/tests/imagelist.c | 130 ++++++++++++++++++++++++++++++---------- 2 files changed, 102 insertions(+), 42 deletions(-) diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c index 0914c091a4a..81ee65570fc 100644 --- a/dlls/comctl32/imagelist.c +++ b/dlls/comctl32/imagelist.c @@ -798,7 +798,10 @@ ImageList_Create (INT cx, INT cy, UINT flags, /* Default to ILC_COLOR4 if none of the ILC_COLOR* flags are specified */ if (ilc == ILC_COLOR) + { ilc = ILC_COLOR4; + himl->flags |= ILC_COLOR4; + } if (ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) himl->uBitsPixel = ilc; @@ -2993,11 +2996,11 @@ _write_bitmap(HBITMAP hBitmap, LPSTREAM pstm) if (!GetObjectW(hBitmap, sizeof(BITMAP), &bm)) return FALSE; - bitCount = bm.bmBitsPixel == 1 ? 1 : 24; + bitCount = bm.bmBitsPixel; sizeImage = get_dib_stride(bm.bmWidth, bitCount) * bm.bmHeight; totalSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); - if(bitCount != 24) + if(bitCount <= 8) totalSize += (1 << bitCount) * sizeof(RGBQUAD); offBits = totalSize; totalSize += sizeImage; @@ -3037,13 +3040,6 @@ _write_bitmap(HBITMAP hBitmap, LPSTREAM pstm) bmih->biWidth, bmih->biHeight, bmih->biPlanes, bmih->biBitCount); - if(bitCount == 1) { - /* Hack. */ - LPBITMAPINFO inf = (LPBITMAPINFO)bmih; - inf->bmiColors[0].rgbRed = inf->bmiColors[0].rgbGreen = inf->bmiColors[0].rgbBlue = 0; - inf->bmiColors[1].rgbRed = inf->bmiColors[1].rgbGreen = inf->bmiColors[1].rgbBlue = 0xff; - } - if(FAILED(IStream_Write(pstm, data, totalSize, NULL))) goto failed; diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c index f783ce6f024..85eb13e0b4e 100644 --- a/dlls/comctl32/tests/imagelist.c +++ b/dlls/comctl32/tests/imagelist.c @@ -721,9 +721,9 @@ static INT DIB_GetWidthBytes( int width, int bpp ) return ((width * bpp + 31) / 8) & ~3; } -static void check_bitmap_data(const char *bm_data, ULONG bm_data_size, - INT width, INT height, INT bpp, - const char *comment) +static ULONG check_bitmap_data(const char *bm_data, ULONG bm_data_size, + INT width, INT height, INT bpp, + const char *comment) { const BITMAPFILEHEADER *bmfh = (const BITMAPFILEHEADER *)bm_data; const BITMAPINFOHEADER *bmih = (const BITMAPINFOHEADER *)(bm_data + sizeof(*bmfh)); @@ -756,9 +756,10 @@ static void check_bitmap_data(const char *bm_data, ULONG bm_data_size, fclose(f); } #endif + return hdr_size + image_size; } -static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT max, INT grow) +static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT max, INT grow, INT flags) { const ILHEAD *ilh = (const ILHEAD *)ilh_data; @@ -770,7 +771,7 @@ static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT ok(ilh->cx == cx, "wrong cx %d (expected %d)\n", ilh->cx, cx); ok(ilh->cy == cy, "wrong cy %d (expected %d)\n", ilh->cy, cy); ok(ilh->bkcolor == CLR_NONE, "wrong bkcolor %x\n", ilh->bkcolor); - ok(ilh->flags == ILC_COLOR24, "wrong flags %04x\n", ilh->flags); + ok(ilh->flags == flags, "wrong flags %04x\n", ilh->flags); ok(ilh->ovls[0] == -1, "wrong ovls[0] %04x\n", ilh->ovls[0]); ok(ilh->ovls[1] == -1, "wrong ovls[1] %04x\n", ilh->ovls[1]); ok(ilh->ovls[2] == -1, "wrong ovls[2] %04x\n", ilh->ovls[2]); @@ -817,9 +818,9 @@ static HBITMAP create_bitmap(INT cx, INT cy, COLORREF color, const char *comment Test_Stream.iml_data_size = 0; static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, INT grow, - INT width, INT height, INT bpp, const char *comment) + INT width, INT height, INT flags, const char *comment) { - INT ret, cxx, cyy; + INT ret, cxx, cyy, size; trace("%s\n", comment); @@ -838,10 +839,18 @@ static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, IN ok(Test_Stream.iml_data != 0, "ImageList_Write didn't write any data\n"); ok(Test_Stream.iml_data_size > sizeof(ILHEAD), "ImageList_Write wrote not enough data\n"); - check_ilhead_data(Test_Stream.iml_data, cx, cy, cur, max, grow); - check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD), - Test_Stream.iml_data_size - sizeof(ILHEAD), - width, height, bpp, comment); + check_ilhead_data(Test_Stream.iml_data, cx, cy, cur, max, grow, flags); + size = check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD), + Test_Stream.iml_data_size - sizeof(ILHEAD), + width, height, flags & 0xfe, comment); + if (size < Test_Stream.iml_data_size - sizeof(ILHEAD)) /* mask is present */ + { + ok( flags & ILC_MASK, "extra data %u/%u but mask not expected\n", + Test_Stream.iml_data_size, size ); + check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD) + size, + Test_Stream.iml_data_size - sizeof(ILHEAD) - size, + width, height, 1, comment); + } } static void image_list_init(HIMAGELIST himl) @@ -883,7 +892,7 @@ static void image_list_init(HIMAGELIST himl) { 255, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "total 24" } }; - check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, 24, "total 0"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "total 0"); #define add_bitmap(grey) \ sprintf(comment, "%d", n++); \ @@ -904,43 +913,44 @@ static void test_imagelist_storage(void) { HIMAGELIST himl; HBITMAP hbm; + HICON icon; INT ret; himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 1, 1); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, 24, "empty"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "empty"); image_list_init(himl); - check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "orig"); + check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "orig"); ret = ImageList_Remove(himl, 4); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "1"); + check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "1"); ret = ImageList_Remove(himl, 5); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "2"); + check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "2"); ret = ImageList_Remove(himl, 6); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "3"); + check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "3"); ret = ImageList_Remove(himl, 7); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "4"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "4"); ret = ImageList_Remove(himl, -2); ok(!ret, "ImageList_Remove(-2) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "5"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "5"); ret = ImageList_Remove(himl, 20); ok(!ret, "ImageList_Remove(20) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "6"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "6"); ret = ImageList_Remove(himl, -1); ok(ret, "ImageList_Remove(-1) failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, 4, BMP_CX * 4, BMP_CX * 1, 24, "7"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "7"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); @@ -951,11 +961,11 @@ static void test_imagelist_storage(void) himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 0, 32); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 32, BMP_CX * 4, BMP_CX * 1, 24, "init 0 grow 32"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 32, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "init 0 grow 32"); hbm = create_bitmap(BMP_CX * 9, BMP_CX, 0, "9"); ret = ImageList_Add(himl, hbm, NULL); ok(ret == 0, "ImageList_Add returned %d, expected 0\n", ret); - check_iml_data(himl, BMP_CX, BMP_CX, 1, 34, 32, BMP_CX * 4, BMP_CX * 9, 24, "add 1 x 9"); + check_iml_data(himl, BMP_CX, BMP_CX, 1, 34, 32, BMP_CX * 4, BMP_CX * 9, ILC_COLOR24, "add 1 x 9"); DeleteObject(hbm); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); @@ -963,14 +973,14 @@ static void test_imagelist_storage(void) himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 4); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, 24, "init 4 grow 4"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 4 grow 4"); hbm = create_bitmap(BMP_CX, BMP_CX * 9, 0, "9"); ret = ImageList_Add(himl, hbm, NULL); ok(ret == 0, "ImageList_Add returned %d, expected 0\n", ret); - check_iml_data(himl, BMP_CX, BMP_CX, 9, 15, 4, BMP_CX * 4, BMP_CX * 4, 24, "add 9 x 1"); + check_iml_data(himl, BMP_CX, BMP_CX, 9, 15, 4, BMP_CX * 4, BMP_CX * 4, ILC_COLOR24, "add 9 x 1"); ret = ImageList_Add(himl, hbm, NULL); ok(ret == 9, "ImageList_Add returned %d, expected 9\n", ret); - check_iml_data(himl, BMP_CX, BMP_CX, 18, 25, 4, BMP_CX * 4, BMP_CX * 7, 24, "add 9 x 1"); + check_iml_data(himl, BMP_CX, BMP_CX, 18, 25, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "add 9 x 1"); DeleteObject(hbm); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); @@ -978,49 +988,103 @@ static void test_imagelist_storage(void) himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 207, 209); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 212, BMP_CX * 4, BMP_CX * 52, 24, "init 207 grow 209"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 212, BMP_CX * 4, BMP_CX * 52, ILC_COLOR24, "init 207 grow 209"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 209, 207); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 208, BMP_CX * 4, BMP_CX * 53, 24, "init 209 grow 207"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 208, BMP_CX * 4, BMP_CX * 53, ILC_COLOR24, "init 209 grow 207"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 14, 4); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 15, 4, BMP_CX * 4, BMP_CX * 4, 24, "init 14 grow 4"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 15, 4, BMP_CX * 4, BMP_CX * 4, ILC_COLOR24, "init 14 grow 4"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 5, 9); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 12, BMP_CX * 4, BMP_CX * 2, 24, "init 5 grow 9"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 12, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 5 grow 9"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 9, 5); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 8, BMP_CX * 4, BMP_CX * 3, 24, "init 9 grow 5"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 8, BMP_CX * 4, BMP_CX * 3, ILC_COLOR24, "init 9 grow 5"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 2, 4); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, BMP_CX * 4, BMP_CX * 1, 24, "init 2 grow 4"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "init 2 grow 4"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, 24, "init 4 grow 2"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 4 grow 2"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR8, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR8, "bpp 8"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp 4"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, 0, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp default"); + icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); + ok( ImageList_AddIcon(himl, icon) == 0,"failed to add icon\n"); + ok( ImageList_AddIcon(himl, icon) == 1,"failed to add icon\n"); + DestroyIcon( icon ); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp default"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24|ILC_MASK, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24|ILC_MASK, + "bpp 24 + mask"); + icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); + ok( ImageList_AddIcon(himl, icon) == 0,"failed to add icon\n"); + ok( ImageList_AddIcon(himl, icon) == 1,"failed to add icon\n"); + DestroyIcon( icon ); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24|ILC_MASK, + "bpp 24 + mask"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4|ILC_MASK, + "bpp 4 + mask"); + icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); + ok( ImageList_AddIcon(himl, icon) == 0,"failed to add icon\n"); + ok( ImageList_AddIcon(himl, icon) == 1,"failed to add icon\n"); + DestroyIcon( icon ); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4|ILC_MASK, + "bpp 4 + mask"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); -- 2.11.4.GIT