user32: Fixed bug in loading .cur files.
This commit is contained in:
parent
deccfeec9a
commit
08775c642a
|
@ -660,14 +660,9 @@ 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,
|
||||
static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
|
||||
POINT16 hotspot, BOOL bIcon,
|
||||
DWORD dwVersion,
|
||||
INT width, INT height,
|
||||
UINT cFlag )
|
||||
{
|
||||
|
@ -676,32 +671,15 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
|
|||
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)) &&
|
||||
|
@ -872,6 +850,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.@)
|
||||
*/
|
||||
|
@ -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 );
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue