Author: jgardou
Date: Thu Oct 4 13:38:26 2012
New Revision: 57477
URL:
http://svn.reactos.org/svn/reactos?rev=57477&view=rev
Log:
[APITESTS/USER32]
Improve GetIconInfo tests:
-Stop leaking each handle we create
-Show Icons sensitivity to screen bit depth
Modified:
trunk/rostests/apitests/user32/GetIconInfo.c
Modified: trunk/rostests/apitests/user32/GetIconInfo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/GetIconIn…
==============================================================================
--- trunk/rostests/apitests/user32/GetIconInfo.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/GetIconInfo.c [iso-8859-1] Thu Oct 4 13:38:26 2012
@@ -7,7 +7,7 @@
// FIXME user32
void
-Test_GetIconInfo(BOOL fIcon)
+Test_GetIconInfo(BOOL fIcon, DWORD screen_bpp)
{
HICON hicon;
ICONINFO iconinfo, iconinfo2;
@@ -41,6 +41,7 @@
ok(iconinfo2.hbmMask != NULL, "\n");
ok(iconinfo2.hbmMask != iconinfo.hbmMask, "\n");
ok(iconinfo2.hbmColor == NULL, "\n");
+ DeleteObject(iconinfo2.hbmMask);
ok(GetIconInfo(hicon, &iconinfo2), "\n");
ok(iconinfo2.fIcon == iconinfo.fIcon, "\n");
@@ -57,6 +58,8 @@
ok(iconinfo2.hbmMask != NULL, "\n");
ok(iconinfo2.hbmMask != iconinfo.hbmMask, "\n");
ok(iconinfo2.hbmColor == NULL, "\n");
+ DeleteObject(iconinfo2.hbmMask);
+ ok(DestroyIcon(hicon), "\n");
iconinfo.hbmColor = CreateBitmap(2, 2, 1, 1, NULL);
hicon = CreateIconIndirect(&iconinfo);
@@ -77,7 +80,7 @@
ok(iconinfo2.hbmMask != NULL, "\n");
ok(iconinfo2.hbmMask != iconinfo.hbmMask, "\n");
ok(iconinfo2.hbmColor != NULL, "\n");
- ok(iconinfo2.hbmMask != iconinfo.hbmColor, "\n");
+ ok(iconinfo2.hbmColor != iconinfo.hbmColor, "\n");
ok(GetObject(iconinfo2.hbmMask, sizeof(bitmap), &bitmap), "GetObject
failed\n");
ok(bitmap.bmType == 0, "\n");
@@ -94,8 +97,11 @@
ok(bitmap.bmHeight == 16, "\n");
ok(bitmap.bmWidthBytes == 8 * bitmap.bmBitsPixel / 8, "\n");
ok(bitmap.bmPlanes == 1, "\n");
- ok(bitmap.bmBitsPixel == 32, "\n");
- ok(bitmap.bmBits == NULL, "\n");
+ ok(bitmap.bmBitsPixel == screen_bpp, "\n");
+ ok(bitmap.bmBits == NULL, "\n");
+ DeleteObject(iconinfo2.hbmMask);
+ DeleteObject(iconinfo2.hbmColor);
+ ok(DestroyIcon(hicon), "\n");
DeleteObject(iconinfo.hbmMask);
iconinfo.hbmMask = NULL;
@@ -126,11 +132,13 @@
ok(bitmap.bmType == 0, "\n");
ok(bitmap.bmWidth == 8, "%ld\n", bitmap.bmWidth);
ok(bitmap.bmHeight == 16, "%ld\n", bitmap.bmHeight);
- ok(bitmap.bmWidthBytes == 32, "%ld\n", bitmap.bmWidthBytes);
+ ok(bitmap.bmWidthBytes == screen_bpp, "%ld\n", bitmap.bmWidthBytes);
ok(bitmap.bmPlanes == 1, "%d\n", bitmap.bmPlanes);
- ok(bitmap.bmBitsPixel == 32, "%d\n", bitmap.bmBitsPixel);
- ok(bitmap.bmBits == NULL, "\n");
-
+ ok(bitmap.bmBitsPixel == screen_bpp, "%d\n", bitmap.bmBitsPixel);
+ ok(bitmap.bmBits == NULL, "\n");
+ DeleteObject(iconinfo2.hbmMask);
+ DeleteObject(iconinfo2.hbmColor);
+ ok(DestroyIcon(hicon), "\n");
}
@@ -140,9 +148,15 @@
ICONINFO iconinfo2;
BITMAP bitmap;
DWORD data[] = {0, 0, 0, 0, 0, 0};
-
- Test_GetIconInfo(0);
- Test_GetIconInfo(1);
+ DWORD bpp, screenbpp, creationbpp;
+ DEVMODEW dm;
+
+ /* Test icons behaviour regarding display settings */
+ EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm);
+ screenbpp = dm.dmBitsPerPel;
+
+ Test_GetIconInfo(0, screenbpp);
+ Test_GetIconInfo(1, screenbpp);
hcursor = LoadCursor(GetModuleHandle(NULL), "TESTCURSOR");
ok(hcursor != 0, "should not fail, error %ld\n", GetLastError());
@@ -152,33 +166,82 @@
ok(iconinfo2.yHotspot == 29, "%ld\n", iconinfo2.yHotspot);
ok(iconinfo2.hbmMask != NULL, "\n");
ok(iconinfo2.hbmColor != NULL, "\n");
-
- hcursor = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_TEST));
- ok(hcursor != 0, "should not fail\n");
- ok(GetIconInfo(hcursor, &iconinfo2), "\n");
- ok(iconinfo2.fIcon == 1, "\n");
- ok(iconinfo2.xHotspot == 16, "%ld\n", iconinfo2.xHotspot);
- ok(iconinfo2.yHotspot == 16, "%ld\n", iconinfo2.yHotspot);
- ok(iconinfo2.hbmMask != NULL, "\n");
- ok(iconinfo2.hbmColor != NULL, "\n");
-
- ok(GetObject(iconinfo2.hbmMask, sizeof(bitmap), &bitmap), "GetObject
failed\n");
- ok(bitmap.bmType == 0, "\n");
- ok(bitmap.bmWidth == 32, "%ld\n", bitmap.bmWidth);
- ok(bitmap.bmHeight == 32, "\n");
- ok(bitmap.bmWidthBytes == 4, "\n");
- ok(bitmap.bmPlanes == 1, "\n");
- ok(bitmap.bmBitsPixel == 1, "\n");
- ok(bitmap.bmBits == NULL, "\n");
-
- ok(GetObject(iconinfo2.hbmColor, sizeof(bitmap), &bitmap), "GetObject
failed\n");
- ok(bitmap.bmType == 0, "\n");
- ok(bitmap.bmWidth == 32, "\n");
- ok(bitmap.bmHeight == 32, "\n");
- ok(bitmap.bmWidthBytes == 32 * bitmap.bmBitsPixel / 8, "\n");
- ok(bitmap.bmPlanes == 1, "\n");
- ok(bitmap.bmBitsPixel == 32, "\n");
- ok(bitmap.bmBits == NULL, "\n");
+ /* Delete objects */
+ DeleteObject(iconinfo2.hbmColor);
+ DeleteObject(iconinfo2.hbmMask);
+ /* Delete cursor */
+ DestroyCursor(hcursor);
+
+ /* To sum it up:
+ * There are two criteria when using icons: performance and aesthetics (=alpha
channel).
+ * Performance asks for bit parity with the screen display.
+ * Aesthetics needs a 32bpp bitmap.
+ * The behaviour is basically : aesthetics first if already loaded.
+ * ie: if the 32bpp bitmap were already loaded because of previous display settings,
always use it.
+ * Otherwise, use the bitmap matching the screen bit depth.
+ */
+
+ /* if we use LR_SHARED here, and reverse the loop (32->16), then
hbmColor.bmBitsPixel is always 32. */
+ for(creationbpp = 16; creationbpp <=32; creationbpp += 8)
+ {
+ dm.dmBitsPerPel = creationbpp;
+ if(ChangeDisplaySettingsExW(NULL, &dm, NULL, 0, NULL) !=
DISP_CHANGE_SUCCESSFUL)
+ {
+ skip("Unable to change bpp to %lu.\n", creationbpp);
+ continue;
+ }
+ hcursor = LoadImage(GetModuleHandle(NULL),
+ MAKEINTRESOURCE(IDI_TEST),
+ IMAGE_ICON,
+ 0,
+ 0,
+ LR_DEFAULTCOLOR);
+ ok(hcursor != 0, "should not fail\n");
+
+ /* If we reverse the loop here (32->16 bpp), then hbmColor.bmBitsPixel is
always 32 */
+ for(bpp = 16; bpp <=32; bpp += 8)
+ {
+ dm.dmBitsPerPel = bpp;
+ if(ChangeDisplaySettingsExW(NULL, &dm, NULL, 0, NULL) !=
DISP_CHANGE_SUCCESSFUL)
+ {
+ skip("Unable to change bpp to %lu.\n", bpp);
+ continue;
+ }
+ ok(GetIconInfo(hcursor, &iconinfo2), "\n");
+ ok(iconinfo2.fIcon == 1, "\n");
+ ok(iconinfo2.xHotspot == 24, "%ld\n", iconinfo2.xHotspot);
+ ok(iconinfo2.yHotspot == 24, "%ld\n", iconinfo2.yHotspot);
+ ok(iconinfo2.hbmMask != NULL, "\n");
+ ok(iconinfo2.hbmColor != NULL, "\n");
+
+ ok(GetObject(iconinfo2.hbmMask, sizeof(bitmap), &bitmap), "GetObject
failed\n");
+ ok(bitmap.bmType == 0, "\n");
+ ok(bitmap.bmWidth == 48, "%ld\n", bitmap.bmWidth);
+ ok(bitmap.bmHeight == 48, "\n");
+ ok(bitmap.bmWidthBytes == 6, "\n");
+ ok(bitmap.bmPlanes == 1, "\n");
+ ok(bitmap.bmBitsPixel == 1, "\n");
+ ok(bitmap.bmBits == NULL, "\n");
+
+ ok(GetObject(iconinfo2.hbmColor, sizeof(bitmap), &bitmap),
"GetObject failed\n");
+ ok(bitmap.bmType == 0, "\n");
+ ok(bitmap.bmWidth == 48, "\n");
+ ok(bitmap.bmHeight == 48, "\n");
+ ok(bitmap.bmWidthBytes == 48 * bitmap.bmBitsPixel / 8, "\n");
+ ok(bitmap.bmPlanes == 1, "\n");
+ ok(bitmap.bmBitsPixel == (creationbpp == 32 ? 32 : bpp), "creationbpp:
%lu, bpp: %lu:\n", creationbpp, bpp);
+ ok(bitmap.bmBits == NULL, "\n");
+
+ /* Delete objects */
+ DeleteObject(iconinfo2.hbmColor);
+ DeleteObject(iconinfo2.hbmMask);
+ }
+ ok(DestroyIcon(hcursor), "\n");
+ }
+ /* Restore display settings */
+ dm.dmBitsPerPel = screenbpp;
+ if(ChangeDisplaySettingsExW(NULL, &dm, NULL, 0, NULL) != DISP_CHANGE_SUCCESSFUL)
+ trace("Unable to go back to previous display settings. Sorry.\n");
hcursor = CreateCursor(NULL, 1, 2, 4, 4, data, data);
ok(hcursor != 0, "should not fail\n");
@@ -197,7 +260,12 @@
ok(bitmap.bmPlanes == 1, "\n");
ok(bitmap.bmBitsPixel == 1, "\n");
ok(bitmap.bmBits == NULL, "\n");
-
+
+ /* Delete objects */
+ DeleteObject(iconinfo2.hbmColor);
+ DeleteObject(iconinfo2.hbmMask);
+ /* Delete cursor */
+ DestroyCursor(hcursor);
}