user32: Fixed bug in loading .cur files.
This commit is contained in:
parent
deccfeec9a
commit
08775c642a
@ -660,48 +660,26 @@ 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
|
INT width, INT height,
|
||||||
* with cbSize parameter as well.
|
UINT cFlag )
|
||||||
*/
|
|
||||||
HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
|
|
||||||
BOOL bIcon, DWORD dwVersion,
|
|
||||||
INT width, INT height,
|
|
||||||
UINT cFlag )
|
|
||||||
{
|
{
|
||||||
HGLOBAL16 hObj;
|
HGLOBAL16 hObj;
|
||||||
static HDC hdcMem;
|
static HDC hdcMem;
|
||||||
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)) &&
|
||||||
@ -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.@)
|
* CreateIconFromResource (USER32.@)
|
||||||
*/
|
*/
|
||||||
@ -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,
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
/* 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)
|
|||||||
/* 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user