Jim Cameron : user32: Fixed bug in loading .cur files.
Alexandre Julliard
julliard at winehq.org
Thu Aug 28 07:00:52 CDT 2008
Module: wine
Branch: master
Commit: 08775c642a3f19ecf1e47b8bdbbc20221442414c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=08775c642a3f19ecf1e47b8bdbbc20221442414c
Author: Jim Cameron <jim_24601 at btinternet.com>
Date: Wed Aug 27 21:46:59 2008 +0100
user32: Fixed bug in loading .cur files.
---
dlls/user32/cursoricon.c | 75 ++++++++++++++++++++++++---------------
dlls/user32/tests/cursoricon.c | 3 --
2 files changed, 46 insertions(+), 32 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index 066203b..2af3798 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -660,48 +660,26 @@ static CURSORICONFILEDIRENTRY *CURSORICON_FindBestIconFile( CURSORICONFILEDIR *d
return &dir->idEntries[n];
}
-/**********************************************************************
- * CreateIconFromResourceEx (USER32.@)
- *
- * FIXME: Convert to mono when cFlag is LR_MONOCHROME. Do something
- * with cbSize parameter as well.
- */
-HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
- BOOL bIcon, DWORD dwVersion,
- INT width, INT height,
- UINT cFlag )
+static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
+ POINT16 hotspot, BOOL bIcon,
+ DWORD dwVersion,
+ INT width, INT height,
+ UINT cFlag )
{
HGLOBAL16 hObj;
static HDC hdcMem;
int sizeAnd, sizeXor;
HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */
BITMAP bmpXor, bmpAnd;
- POINT16 hotspot;
- BITMAPINFO *bmi;
BOOL DoStretch;
INT size;
- hotspot.x = ICON_HOTSPOT;
- hotspot.y = ICON_HOTSPOT;
-
- TRACE_(cursor)("%p (%u bytes), ver %08x, %ix%i %s %s\n",
- bits, cbSize, dwVersion, width, height,
- bIcon ? "icon" : "cursor", (cFlag & LR_MONOCHROME) ? "mono" : "" );
if (dwVersion == 0x00020000)
{
FIXME_(cursor)("\t2.xx resources are not supported\n");
return 0;
}
- if (bIcon)
- bmi = (BITMAPINFO *)bits;
- else /* get the hotspot */
- {
- POINT16 *pt = (POINT16 *)bits;
- hotspot = *pt;
- bmi = (BITMAPINFO *)(pt + 1);
- }
-
/* Check bitmap header */
if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) &&
@@ -873,6 +851,41 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
/**********************************************************************
+ * CreateIconFromResourceEx (USER32.@)
+ *
+ * FIXME: Convert to mono when cFlag is LR_MONOCHROME. Do something
+ * with cbSize parameter as well.
+ */
+HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
+ BOOL bIcon, DWORD dwVersion,
+ INT width, INT height,
+ UINT cFlag )
+{
+ POINT16 hotspot;
+ BITMAPINFO *bmi;
+
+ hotspot.x = ICON_HOTSPOT;
+ hotspot.y = ICON_HOTSPOT;
+
+ TRACE_(cursor)("%p (%u bytes), ver %08x, %ix%i %s %s\n",
+ bits, cbSize, dwVersion, width, height,
+ bIcon ? "icon" : "cursor", (cFlag & LR_MONOCHROME) ? "mono" : "" );
+
+ if (bIcon)
+ bmi = (BITMAPINFO *)bits;
+ else /* get the hotspot */
+ {
+ POINT16 *pt = (POINT16 *)bits;
+ hotspot = *pt;
+ bmi = (BITMAPINFO *)(pt + 1);
+ }
+
+ return CURSORICON_CreateIconFromBMI( bmi, hotspot, bIcon, dwVersion,
+ width, height, cFlag );
+}
+
+
+/**********************************************************************
* CreateIconFromResource (USER32.@)
*/
HICON WINAPI CreateIconFromResource( LPBYTE bits, UINT cbSize,
@@ -891,6 +904,7 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
DWORD filesize = 0;
HICON hIcon = 0;
LPBYTE bits;
+ POINT16 hotspot;
TRACE("loading %s\n", debugstr_w( filename ));
@@ -926,8 +940,11 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
if ( entry->dwDIBOffset + entry->dwDIBSize > filesize )
goto end;
- hIcon = CreateIconFromResourceEx( &bits[entry->dwDIBOffset], entry->dwDIBSize,
- !fCursor, 0x00030000, width, height, loadflags );
+ hotspot.x = entry->xHotspot;
+ hotspot.y = entry->yHotspot;
+ hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)&bits[entry->dwDIBOffset],
+ hotspot, !fCursor, 0x00030000,
+ width, height, loadflags );
end:
TRACE("loaded %s -> %p\n", debugstr_w( filename ), hIcon );
UnmapViewOfFile( bits );
diff --git a/dlls/user32/tests/cursoricon.c b/dlls/user32/tests/cursoricon.c
index 6b16560..c36adce 100644
--- a/dlls/user32/tests/cursoricon.c
+++ b/dlls/user32/tests/cursoricon.c
@@ -814,7 +814,6 @@ static void test_LoadImage(void)
/* 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);
@@ -822,7 +821,6 @@ static void test_LoadImage(void)
/* 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);
@@ -839,7 +837,6 @@ static void test_LoadImage(void)
/* Clean up. */
SetLastError(0xdeadbeef);
ret = DestroyCursor(handle);
- todo_wine
ok(ret, "DestroyCursor() failed.\n");
error = GetLastError();
ok(error == 0xdeadbeef, "Last error: %u\n", error);
More information about the wine-cvs
mailing list