user32: Fixed bug in loading .cur files.

This commit is contained in:
Jim Cameron 2008-08-27 21:46:59 +01:00 committed by Alexandre Julliard
parent deccfeec9a
commit 08775c642a
2 changed files with 46 additions and 32 deletions

View file

@ -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)) &&
@ -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 );

View file

@ -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);