From 08775c642a3f19ecf1e47b8bdbbc20221442414c Mon Sep 17 00:00:00 2001 From: Jim Cameron Date: Wed, 27 Aug 2008 21:46:59 +0100 Subject: [PATCH] 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 066203b24fe..2af3798cc61 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 6b165600c79..c36adce8a78 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); -- 2.11.4.GIT