[PATCH] Added tests for ImageList_DrawIndirect
Joel Holdsworth
joel at airwebreathe.org.uk
Thu Oct 8 17:28:49 CDT 2009
---
dlls/comctl32/tests/imagelist.c | 229 +++++++++++++++++++++++++++++++++++++++
1 files changed, 229 insertions(+), 0 deletions(-)
diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c
index 9bb0253..7ccb6dc 100644
--- a/dlls/comctl32/tests/imagelist.c
+++ b/dlls/comctl32/tests/imagelist.c
@@ -70,6 +70,8 @@ typedef struct _ILHEAD
} ILHEAD;
#include "poppack.h"
+static HIMAGELIST (WINAPI *pImageList_Create)(int, int, UINT, int, int);
+static int (WINAPI *pImageList_Add)(HIMAGELIST, HBITMAP, HBITMAP);
static BOOL (WINAPI *pImageList_DrawIndirect)(IMAGELISTDRAWPARAMS*);
static BOOL (WINAPI *pImageList_SetImageCount)(HIMAGELIST,UINT);
@@ -1028,11 +1030,227 @@ static void test_shell_imagelist(void)
FreeLibrary(hShell32);
}
+static HBITMAP create_test_bitmap(HDC hdc, int bpp, UINT32 pixel1, UINT32 pixel2)
+{
+ HBITMAP hBitmap;
+ UINT32 *buffer = NULL;
+ BITMAPINFO bitmapInfo = {{sizeof(BITMAPINFOHEADER), 2, 1, 1, bpp, BI_RGB,
+ 0, 0, 0, 0, 0}};
+
+ hBitmap = CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, (void**)&buffer, NULL, 0);
+ ok(hBitmap != NULL && buffer != NULL, "CreateDIBSection failed.\n");
+
+ if(!hBitmap || !buffer)
+ {
+ DeleteObject(hBitmap);
+ return NULL;
+ }
+
+ buffer[0] = pixel1;
+ buffer[1] = pixel2;
+
+ return hBitmap;
+}
+
+static BOOL colour_match(UINT32 x, UINT32 y)
+{
+ const INT32 tolerance = 8;
+
+ const INT32 dr = abs((INT32)(x & 0x000000FF) - (INT32)(y & 0x000000FF));
+ const INT32 dg = abs((INT32)((x & 0x0000FF00) >> 8) - (INT32)((y & 0x0000FF00) >> 8));
+ const INT32 db = abs((INT32)((x & 0x00FF0000) >> 16) - (INT32)((y & 0x00FF0000) >> 16));
+
+ return (dr <= tolerance && dg <= tolerance && db <= tolerance);
+}
+
+static void check_ImageList_DrawIndirect(IMAGELISTDRAWPARAMS *ildp, UINT32 *bits,
+ UINT32 expected, int line)
+{
+ bits[0] = 0x00FFFFFF;
+ pImageList_DrawIndirect(ildp);
+ ok(colour_match(bits[0], expected),
+ "ImageList_DrawIndirect: Pixel %08X, Expected a close match to %08X from line %d\n",
+ bits[0] & 0x00FFFFFF, expected, line);
+}
+
+
+static void check_ImageList_DrawIndirect_fStyle(HDC hdc, HIMAGELIST himl, UINT32 *bits, int i,
+ UINT fStyle, UINT32 expected, int line)
+{
+ IMAGELISTDRAWPARAMS ildp = {sizeof(IMAGELISTDRAWPARAMS), himl, i, hdc,
+ 0, 0, 0, 0, 0, 0, CLR_NONE, CLR_NONE, fStyle, 0, ILS_NORMAL, 0, 0x00000000};
+ check_ImageList_DrawIndirect(&ildp, bits, expected, line);
+}
+
+static void check_ImageList_DrawIndirect_ILD_ROP(HDC hdc, HIMAGELIST himl, UINT32 *bits, int i,
+ DWORD dwRop, UINT32 expected, int line)
+{
+ IMAGELISTDRAWPARAMS ildp = {sizeof(IMAGELISTDRAWPARAMS), himl, i, hdc,
+ 0, 0, 0, 0, 0, 0, CLR_NONE, CLR_NONE, ILD_IMAGE | ILD_ROP, dwRop, ILS_NORMAL, 0, 0x00000000};
+ check_ImageList_DrawIndirect(&ildp, bits, expected, line);
+}
+
+static void check_ImageList_DrawIndirect_fState(HDC hdc, HIMAGELIST himl, UINT32 *bits, int i, UINT fStyle,
+ UINT fState, DWORD Frame, UINT32 expected, int line)
+{
+ IMAGELISTDRAWPARAMS ildp = {sizeof(IMAGELISTDRAWPARAMS), himl, i, hdc,
+ 0, 0, 0, 0, 0, 0, CLR_NONE, CLR_NONE, fStyle, 0, fState, Frame, 0x00000000};
+ check_ImageList_DrawIndirect(&ildp, bits, expected, line);
+}
+
+static void check_ImageList_DrawIndirect_broken(HDC hdc, HIMAGELIST himl, UINT32 *bits, int i,
+ UINT fStyle, UINT fState, DWORD Frame, UINT32 expected,
+ UINT32 broken_expected, int line)
+{
+ IMAGELISTDRAWPARAMS ildp = {sizeof(IMAGELISTDRAWPARAMS), himl, i, hdc,
+ 0, 0, 0, 0, 0, 0, CLR_NONE, CLR_NONE, fStyle, 0, fState, Frame, 0x00000000};
+ bits[0] = 0x00FFFFFF;
+ pImageList_DrawIndirect(&ildp);
+ ok(colour_match(bits[0], expected) ||
+ broken(colour_match(bits[0], broken_expected)),
+ "ImageList_DrawIndirect: Pixel %08X, Expected a close match to %08X from line %d\n",
+ bits[0] & 0x00FFFFFF, expected, line);
+}
+
+static void test_ImageList_DrawIndirect(void)
+{
+ HIMAGELIST himl = NULL;
+ int ret;
+ HDC hdcDst = NULL;
+ HBITMAP hbmOld = NULL, hbmDst = NULL;
+ HBITMAP hbmMask = NULL, hbmInverseMask = NULL;
+ HBITMAP hbmImage = NULL, hbmAlphaImage = NULL, hbmTransparentImage = NULL;
+ int iImage = -1, iAlphaImage = -1, iTransparentImage = -1;
+ UINT32 *bits = 0;
+ UINT32 maskBits = 0x00000000, inverseMaskBits = 0xFFFFFFFF;
+
+ BITMAPINFO bitmapInfo = {{sizeof(BITMAPINFOHEADER), 2, 1, 1, 32, BI_RGB,
+ 0, 0, 0, 0, 0}};
+
+ hdcDst = CreateCompatibleDC(0);
+ ok(hdcDst != 0, "CreateCompatibleDC(0) failed to return a valid DC\n");
+ if (!hdcDst)
+ return;
+
+ hbmMask = CreateBitmap(2, 1, 1, 1, &maskBits);
+ ok(hbmMask != 0, "CreateBitmap failed\n");
+ if(!hbmMask) goto cleanup;
+
+ hbmInverseMask = CreateBitmap(2, 1, 1, 1, &inverseMaskBits);
+ ok(hbmInverseMask != 0, "CreateBitmap failed\n");
+ if(!hbmInverseMask) goto cleanup;
+
+ himl = pImageList_Create(2, 1, ILC_COLOR32, 0, 1);
+ ok(himl != 0, "ImageList_Create failed\n");
+ if(!himl) goto cleanup;
+
+ /* Add a no-alpha image */
+ hbmImage = create_test_bitmap(hdcDst, 32, 0x00ABCDEF, 0x00ABCDEF);
+ if(!hbmImage) goto cleanup;
+
+ iImage = pImageList_Add(himl, hbmImage, hbmMask);
+ ok(iImage != -1, "ImageList_Add failed\n");
+ if(iImage == -1) goto cleanup;
+
+ /* Add an alpha image */
+ hbmAlphaImage = create_test_bitmap(hdcDst, 32, 0x89ABCDEF, 0x89ABCDEF);
+ if(!hbmAlphaImage) goto cleanup;
+
+ iAlphaImage = pImageList_Add(himl, hbmAlphaImage, hbmMask);
+ ok(iAlphaImage != -1, "ImageList_Add failed\n");
+ if(iAlphaImage == -1) goto cleanup;
+
+ /* Add a transparent alpha image */
+ hbmTransparentImage = create_test_bitmap(hdcDst, 32, 0x00ABCDEF, 0x89ABCDEF);
+ if(!hbmTransparentImage) goto cleanup;
+
+ iTransparentImage = pImageList_Add(himl, hbmTransparentImage, hbmMask);
+ ok(iTransparentImage != -1, "ImageList_Add failed\n");
+ if(iTransparentImage == -1) goto cleanup;
+
+ /* 32-bit Tests */
+ bitmapInfo.bmiHeader.biBitCount = 32;
+ hbmDst = CreateDIBSection(hdcDst, &bitmapInfo, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
+ ok (hbmDst && bits, "CreateDIBSection failed to return a valid bitmap and buffer\n");
+ if (!hbmDst || !bits)
+ goto cleanup;
+ hbmOld = SelectObject(hdcDst, hbmDst);
+
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_NORMAL, 0x00ABCDEF, __LINE__);
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_TRANSPARENT, 0x00ABCDEF, __LINE__);
+ todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND25, ILS_NORMAL, 0, 0x00E8F1FA, 0x00D4D9DD, __LINE__);
+ todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND50, ILS_NORMAL, 0, 0x00E8F1FA, 0x00B4BDC4, __LINE__);
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_MASK, 0x00ABCDEF, __LINE__);
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_IMAGE, 0x00ABCDEF, __LINE__);
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_PRESERVEALPHA, 0x00ABCDEF, __LINE__);
+
+ todo_wine
+ {
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_NORMAL, 0x00D3E5F7, __LINE__);
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_TRANSPARENT, 0x00D3E5F7, __LINE__);
+ check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND25, ILS_NORMAL, 0, 0x00E8F1FA, 0x009DA8B1, __LINE__);
+ check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND50, ILS_NORMAL, 0, 0x00E8F1FA, 0x008C99A3, __LINE__);
+
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_MASK, 0x00D3E5F7, __LINE__);
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_IMAGE, 0x00D3E5F7, __LINE__);
+ check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_PRESERVEALPHA, 0x005D6F81, __LINE__);
+ }
+
+ todo_wine check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iTransparentImage, ILD_NORMAL, 0x00FFFFFF, __LINE__);
+
+ check_ImageList_DrawIndirect_ILD_ROP(hdcDst, himl, bits, iImage, SRCCOPY, 0x00ABCDEF, __LINE__);
+ check_ImageList_DrawIndirect_ILD_ROP(hdcDst, himl, bits, iImage, SRCINVERT, 0x00543210, __LINE__);
+
+ /* ILD_ROP is ignored when the image has an alpha channel */
+ todo_wine check_ImageList_DrawIndirect_ILD_ROP(hdcDst, himl, bits, iAlphaImage, SRCCOPY, 0x00D3E5F7, __LINE__);
+ todo_wine check_ImageList_DrawIndirect_ILD_ROP(hdcDst, himl, bits, iAlphaImage, SRCINVERT, 0x00D3E5F7, __LINE__);
+
+ todo_wine check_ImageList_DrawIndirect_fState(hdcDst, himl, bits, iImage, ILD_NORMAL, ILS_SATURATE, 0, 0x00CCCCCC, __LINE__);
+ todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_NORMAL, ILS_SATURATE, 0, 0x00AFAFAF, 0x00F0F0F0, __LINE__);
+
+ check_ImageList_DrawIndirect_fState(hdcDst, himl, bits, iImage, ILD_NORMAL, ILS_GLOW, 0, 0x00ABCDEF, __LINE__);
+ check_ImageList_DrawIndirect_fState(hdcDst, himl, bits, iImage, ILD_NORMAL, ILS_SHADOW, 0, 0x00ABCDEF, __LINE__);
+
+ todo_wine check_ImageList_DrawIndirect_fState(hdcDst, himl, bits, iImage, ILD_NORMAL, ILS_ALPHA, 127, 0x00D5E6F7, __LINE__);
+ todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_NORMAL, ILS_ALPHA, 127, 0x00E9F2FB, 0x00AEB7C0, __LINE__);
+ todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_NORMAL, ILS_NORMAL, 127, 0x00E9F2FB, 0x00D3E5F7, __LINE__);
+
+cleanup:
+
+ if(hbmOld)
+ SelectObject(hdcDst, hbmOld);
+ if(hbmDst)
+ DeleteObject(hbmDst);
+
+ if(hdcDst)
+ DeleteDC(hdcDst);
+
+ if(hbmMask)
+ DeleteObject(hbmMask);
+ if(hbmInverseMask)
+ DeleteObject(hbmInverseMask);
+
+ if(hbmImage)
+ DeleteObject(hbmImage);
+ if(hbmAlphaImage)
+ DeleteObject(hbmAlphaImage);
+ if(hbmTransparentImage)
+ DeleteObject(hbmTransparentImage);
+
+ if(himl)
+ {
+ ret = ImageList_Destroy(himl);
+ ok(ret, "ImageList_Destroy failed\n");
+ }
+}
+
START_TEST(imagelist)
{
ULONG_PTR ctx_cookie;
HMODULE hComCtl32 = GetModuleHandle("comctl32.dll");
+ pImageList_Create = NULL; /* These are not needed for non-v6.0 tests*/
+ pImageList_Add = NULL;
pImageList_DrawIndirect = (void*)GetProcAddress(hComCtl32, "ImageList_DrawIndirect");
pImageList_SetImageCount = (void*)GetProcAddress(hComCtl32, "ImageList_SetImageCount");
@@ -1048,11 +1266,22 @@ START_TEST(imagelist)
testMerge();
test_imagelist_storage();
+ FreeLibrary(hComCtl32);
+
/* Now perform v6 tests */
if (!load_v6_module(&ctx_cookie))
return;
+ /* Reload comctl32 */
+ hComCtl32 = LoadLibraryA("comctl32.dll");
+ pImageList_Create = (void*)GetProcAddress(hComCtl32, "ImageList_Create");
+ pImageList_Add = (void*)GetProcAddress(hComCtl32, "ImageList_Add");
+ pImageList_DrawIndirect = (void*)GetProcAddress(hComCtl32, "ImageList_DrawIndirect");
+ pImageList_SetImageCount = (void*)GetProcAddress(hComCtl32, "ImageList_SetImageCount");
+
+ /* Do v6.0 tests */
+ test_ImageList_DrawIndirect();
test_shell_imagelist();
unload_v6_module(ctx_cookie);
--
1.6.0.4
--=-RnAGZSQbNqwrnouVZdBQ--
More information about the wine-patches
mailing list