Andrew Riedi : user32: Test LoadImage() to load an icon as a cursor.
Alexandre Julliard
julliard at winehq.org
Wed Feb 20 06:46:55 CST 2008
Module: wine
Branch: master
Commit: 5b3f53baf9b464baeff6c61091fe159b99253985
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b3f53baf9b464baeff6c61091fe159b99253985
Author: Andrew Riedi <andrewriedi at gmail.com>
Date: Tue Feb 19 01:23:16 2008 -0800
user32: Test LoadImage() to load an icon as a cursor.
---
dlls/user32/tests/cursoricon.c | 113 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 112 insertions(+), 1 deletions(-)
diff --git a/dlls/user32/tests/cursoricon.c b/dlls/user32/tests/cursoricon.c
index ca4b118..023a3a5 100644
--- a/dlls/user32/tests/cursoricon.c
+++ b/dlls/user32/tests/cursoricon.c
@@ -3,7 +3,7 @@
*
* Copyright 2006 Michael Kaufmann
* Copyright 2007 Dmitry Timoshkov
- * Copyright 2007 Andrew Riedi
+ * Copyright 2007-2008 Andrew Riedi
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,6 +32,30 @@
#include "wingdi.h"
#include "winuser.h"
+#include "pshpack1.h"
+
+typedef struct
+{
+ BYTE bWidth;
+ BYTE bHeight;
+ BYTE bColorCount;
+ BYTE bReserved;
+ WORD xHotspot;
+ WORD yHotspot;
+ DWORD dwDIBSize;
+ DWORD dwDIBOffset;
+} CURSORICONFILEDIRENTRY;
+
+typedef struct
+{
+ WORD idReserved;
+ WORD idType;
+ WORD idCount;
+ CURSORICONFILEDIRENTRY idEntries[1];
+} CURSORICONFILEDIR;
+
+#include "poppack.h"
+
static char **test_argv;
static int test_argc;
static HWND child = 0;
@@ -559,6 +583,92 @@ static void test_CreateIcon(void)
DeleteObject(hbmColor);
}
+static void test_LoadImage(void)
+{
+ HANDLE handle;
+ BOOL ret;
+ DWORD error, bytes_written;
+ CURSORICONFILEDIR *icon_data;
+ CURSORICONFILEDIRENTRY *icon_entry;
+ BITMAPINFOHEADER *icon_header;
+ ICONINFO icon_info;
+
+#define ICON_WIDTH 32
+#define ICON_HEIGHT 32
+#define ICON_AND_SIZE (ICON_WIDTH*ICON_HEIGHT/8)
+#define ICON_BPP 32
+#define ICON_SIZE \
+ (sizeof(CURSORICONFILEDIR) + sizeof(BITMAPINFOHEADER) \
+ + ICON_AND_SIZE + ICON_AND_SIZE*ICON_BPP)
+
+ /* Set icon data. */
+ icon_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ICON_SIZE);
+ icon_data->idReserved = 0;
+ icon_data->idType = 1;
+ icon_data->idCount = 1;
+
+ icon_entry = icon_data->idEntries;
+ icon_entry->bWidth = ICON_WIDTH;
+ icon_entry->bHeight = ICON_HEIGHT;
+ icon_entry->bColorCount = 0;
+ icon_entry->bReserved = 0;
+ icon_entry->xHotspot = 1;
+ icon_entry->yHotspot = 1;
+ icon_entry->dwDIBSize = ICON_SIZE - sizeof(CURSORICONFILEDIR);
+ icon_entry->dwDIBOffset = sizeof(CURSORICONFILEDIR);
+
+ icon_header = (BITMAPINFOHEADER *) ((BYTE *) icon_data + icon_entry->dwDIBOffset);
+ icon_header->biSize = sizeof(BITMAPINFOHEADER);
+ icon_header->biWidth = ICON_WIDTH;
+ icon_header->biHeight = ICON_HEIGHT*2;
+ icon_header->biPlanes = 1;
+ icon_header->biBitCount = ICON_BPP;
+ icon_header->biSizeImage = 0; /* Uncompressed bitmap. */
+
+ /* Create the icon. */
+ handle = CreateFileA("icon.ico", FILE_ALL_ACCESS, 0, NULL, CREATE_NEW,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+ ok(handle != INVALID_HANDLE_VALUE, "CreateFileA failed. %u\n", GetLastError());
+ ret = WriteFile(handle, icon_data, ICON_SIZE, &bytes_written, NULL);
+ ok(bytes_written == ICON_SIZE, "icon.ico created improperly.\n");
+ CloseHandle(handle);
+
+ /* Test loading an icon as a cursor. */
+ SetLastError(0xdeadbeef);
+ handle = LoadImageA(NULL, "icon.ico", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
+ todo_wine
+ ok(handle != NULL, "LoadImage() failed.\n");
+ error = GetLastError();
+ ok(error == 0, "Last error: %u\n", error);
+
+ /* Test the icon information. */
+ SetLastError(0xdeadbeef);
+ ret = GetIconInfo(handle, &icon_info);
+ todo_wine
+ ok(ret, "GetIconInfo() failed.\n");
+ error = GetLastError();
+ ok(error == 0xdeadbeef, "Last error: %u\n", error);
+
+ todo_wine {
+ ok(icon_info.fIcon == FALSE, "fIcon != FALSE.\n");
+ ok(icon_info.xHotspot == 1, "xHotspot is %u.\n", icon_info.xHotspot);
+ ok(icon_info.yHotspot == 1, "yHotspot is %u.\n", icon_info.yHotspot);
+ ok(icon_info.hbmColor != NULL, "No hbmColor!\n");
+ }
+ ok(icon_info.hbmMask != NULL, "No hbmMask!\n");
+
+ /* Clean up. */
+ SetLastError(0xdeadbeef);
+ ret = DestroyCursor(handle);
+ todo_wine
+ ok(ret, "DestroyCursor() failed.\n");
+ error = GetLastError();
+ ok(error == 0xdeadbeef, "Last error: %u\n", error);
+
+ HeapFree(GetProcessHeap(), 0, icon_data);
+ DeleteFileA("icon.ico");
+}
+
static void test_DestroyCursor(void)
{
static const BYTE bmp_bits[4096];
@@ -662,6 +772,7 @@ START_TEST(cursoricon)
test_CopyImage_Bitmap(32);
test_initial_cursor();
test_CreateIcon();
+ test_LoadImage();
test_DestroyCursor();
do_parent();
test_child_process();
More information about the wine-cvs
mailing list