Commit 08775c64 authored by Jim Cameron's avatar Jim Cameron Committed by Alexandre Julliard

user32: Fixed bug in loading .cur files.

parent deccfeec
...@@ -660,14 +660,9 @@ static CURSORICONFILEDIRENTRY *CURSORICON_FindBestIconFile( CURSORICONFILEDIR *d ...@@ -660,14 +660,9 @@ static CURSORICONFILEDIRENTRY *CURSORICON_FindBestIconFile( CURSORICONFILEDIR *d
return &dir->idEntries[n]; return &dir->idEntries[n];
} }
/********************************************************************** static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
* CreateIconFromResourceEx (USER32.@) POINT16 hotspot, BOOL bIcon,
* DWORD dwVersion,
* 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, INT width, INT height,
UINT cFlag ) UINT cFlag )
{ {
...@@ -676,32 +671,15 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize, ...@@ -676,32 +671,15 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
int sizeAnd, sizeXor; int sizeAnd, sizeXor;
HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */ HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */
BITMAP bmpXor, bmpAnd; BITMAP bmpXor, bmpAnd;
POINT16 hotspot;
BITMAPINFO *bmi;
BOOL DoStretch; BOOL DoStretch;
INT size; 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) if (dwVersion == 0x00020000)
{ {
FIXME_(cursor)("\t2.xx resources are not supported\n"); FIXME_(cursor)("\t2.xx resources are not supported\n");
return 0; return 0;
} }
if (bIcon)
bmi = (BITMAPINFO *)bits;
else /* get the hotspot */
{
POINT16 *pt = (POINT16 *)bits;
hotspot = *pt;
bmi = (BITMAPINFO *)(pt + 1);
}
/* Check bitmap header */ /* Check bitmap header */
if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) && if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) &&
...@@ -873,6 +851,41 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize, ...@@ -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.@) * CreateIconFromResource (USER32.@)
*/ */
HICON WINAPI CreateIconFromResource( LPBYTE bits, UINT cbSize, HICON WINAPI CreateIconFromResource( LPBYTE bits, UINT cbSize,
...@@ -891,6 +904,7 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename, ...@@ -891,6 +904,7 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
DWORD filesize = 0; DWORD filesize = 0;
HICON hIcon = 0; HICON hIcon = 0;
LPBYTE bits; LPBYTE bits;
POINT16 hotspot;
TRACE("loading %s\n", debugstr_w( filename )); TRACE("loading %s\n", debugstr_w( filename ));
...@@ -926,8 +940,11 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename, ...@@ -926,8 +940,11 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
if ( entry->dwDIBOffset + entry->dwDIBSize > filesize ) if ( entry->dwDIBOffset + entry->dwDIBSize > filesize )
goto end; goto end;
hIcon = CreateIconFromResourceEx( &bits[entry->dwDIBOffset], entry->dwDIBSize, hotspot.x = entry->xHotspot;
!fCursor, 0x00030000, width, height, loadflags ); hotspot.y = entry->yHotspot;
hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)&bits[entry->dwDIBOffset],
hotspot, !fCursor, 0x00030000,
width, height, loadflags );
end: end:
TRACE("loaded %s -> %p\n", debugstr_w( filename ), hIcon ); TRACE("loaded %s -> %p\n", debugstr_w( filename ), hIcon );
UnmapViewOfFile( bits ); UnmapViewOfFile( bits );
......
...@@ -814,7 +814,6 @@ static void test_LoadImage(void) ...@@ -814,7 +814,6 @@ static void test_LoadImage(void)
/* Test loading an icon as a cursor. */ /* Test loading an icon as a cursor. */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
handle = LoadImageA(NULL, "icon.ico", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE); handle = LoadImageA(NULL, "icon.ico", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
todo_wine
ok(handle != NULL, "LoadImage() failed.\n"); ok(handle != NULL, "LoadImage() failed.\n");
error = GetLastError(); error = GetLastError();
ok(error == 0, "Last error: %u\n", error); ok(error == 0, "Last error: %u\n", error);
...@@ -822,7 +821,6 @@ static void test_LoadImage(void) ...@@ -822,7 +821,6 @@ static void test_LoadImage(void)
/* Test the icon information. */ /* Test the icon information. */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = GetIconInfo(handle, &icon_info); ret = GetIconInfo(handle, &icon_info);
todo_wine
ok(ret, "GetIconInfo() failed.\n"); ok(ret, "GetIconInfo() failed.\n");
error = GetLastError(); error = GetLastError();
ok(error == 0xdeadbeef, "Last error: %u\n", error); ok(error == 0xdeadbeef, "Last error: %u\n", error);
...@@ -839,7 +837,6 @@ static void test_LoadImage(void) ...@@ -839,7 +837,6 @@ static void test_LoadImage(void)
/* Clean up. */ /* Clean up. */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = DestroyCursor(handle); ret = DestroyCursor(handle);
todo_wine
ok(ret, "DestroyCursor() failed.\n"); ok(ret, "DestroyCursor() failed.\n");
error = GetLastError(); error = GetLastError();
ok(error == 0xdeadbeef, "Last error: %u\n", error); ok(error == 0xdeadbeef, "Last error: %u\n", error);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment