Alexandre Julliard : user32: Store the module and resource name information for icons.
Alexandre Julliard
julliard at winehq.org
Mon Oct 11 13:15:13 CDT 2010
Module: wine
Branch: master
Commit: 751a09e9839d7273895df24666a0bb2fb51a29c7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=751a09e9839d7273895df24666a0bb2fb51a29c7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Oct 11 12:50:58 2010 +0200
user32: Store the module and resource name information for icons.
---
dlls/user32/cursoricon.c | 62 +++++++++++++++++++++++++++++----------------
1 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index e27365c..c88bc53 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -39,6 +39,7 @@
#include "controls.h"
#include "user_private.h"
#include "wine/list.h"
+#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(cursor);
@@ -114,6 +115,8 @@ struct cursoricon_object
{
struct user_object obj; /* object header */
ULONG_PTR param; /* opaque param used by 16-bit code */
+ HMODULE module; /* module for icons loaded from resources */
+ LPWSTR resname; /* resource name for icons loaded from resources */
BOOL is_icon; /* whether icon or cursor */
UINT width;
UINT height;
@@ -165,6 +168,7 @@ static BOOL free_icon_handle( HICON handle )
if (obj->frames[i].color) DeleteObject( obj->frames[i].color );
DeleteObject( obj->frames[i].mask );
}
+ if (!IS_INTRESOURCE( obj->resname )) HeapFree( GetProcessHeap(), 0, obj->resname );
HeapFree( GetProcessHeap(), 0, obj );
if (wow_handlers.free_icon_param && param) wow_handlers.free_icon_param( param );
USER_Driver->pDestroyCursorIcon( handle );
@@ -845,22 +849,13 @@ done:
return ret;
}
-static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
- POINT hotspot, BOOL bIcon,
- DWORD dwVersion,
- INT width, INT height,
- UINT cFlag )
+static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi, HMODULE module, LPCWSTR resname,
+ POINT hotspot, BOOL bIcon, INT width, INT height, UINT cFlag )
{
HICON hObj;
HBITMAP color = 0, mask = 0, alpha = 0;
BOOL do_stretch;
- if (dwVersion == 0x00020000)
- {
- FIXME_(cursor)("\t2.xx resources are not supported\n");
- return 0;
- }
-
/* Check bitmap header */
if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) &&
@@ -899,13 +894,22 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
struct cursoricon_object *info = get_icon_ptr( hObj );
info->is_icon = bIcon;
+ info->module = module;
info->hotspot = hotspot;
info->width = width;
info->height = height;
info->frames[0].color = color;
info->frames[0].mask = mask;
info->frames[0].alpha = alpha;
+ if (!IS_INTRESOURCE(resname))
+ {
+ info->resname = HeapAlloc( GetProcessHeap(), 0, (strlenW(resname) + 1) * sizeof(WCHAR) );
+ if (info->resname) strcpyW( info->resname, resname );
+ }
+ else info->resname = MAKEINTRESOURCEW( LOWORD(resname) );
+
release_icon_ptr( hObj, info );
+ USER_Driver->pCreateCursorIcon( hObj );
}
else
{
@@ -1149,7 +1153,6 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
{
POINT hotspot;
BITMAPINFO *bmi;
- HICON icon;
TRACE_(cursor)("%p (%u bytes), ver %08x, %ix%i %s %s\n",
bits, cbSize, dwVersion, width, height,
@@ -1157,6 +1160,12 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
if (!bits) return 0;
+ if (dwVersion == 0x00020000)
+ {
+ FIXME_(cursor)("\t2.xx resources are not supported\n");
+ return 0;
+ }
+
if (bIcon)
{
hotspot.x = width / 2;
@@ -1171,10 +1180,7 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
bmi = (BITMAPINFO *)(pt + 2);
}
- icon = CURSORICON_CreateIconFromBMI( bmi, hotspot, bIcon, dwVersion,
- width, height, cFlag );
- if (icon) USER_Driver->pCreateCursorIcon( icon );
- return icon;
+ return CURSORICON_CreateIconFromBMI( bmi, NULL, NULL, hotspot, bIcon, width, height, cFlag );
}
@@ -1236,13 +1242,11 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
hotspot.x = entry->xHotspot;
hotspot.y = entry->yHotspot;
- hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)&bits[entry->dwDIBOffset],
- hotspot, !fCursor, 0x00030000,
- width, height, loadflags );
+ hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)&bits[entry->dwDIBOffset], NULL, NULL,
+ hotspot, !fCursor, width, height, loadflags );
end:
TRACE("loaded %s -> %p\n", debugstr_w( filename ), hIcon );
UnmapViewOfFile( bits );
- if (hIcon) USER_Driver->pCreateCursorIcon( hIcon );
return hIcon;
}
@@ -1263,6 +1267,7 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name,
LPBYTE bits;
WORD wResId;
DWORD dwBytesInRes;
+ POINT hotspot;
TRACE("%p, %s, %dx%d, depth %d, fCursor %d, flags 0x%04x\n",
hInstance, debugstr_w(name), width, height, depth, fCursor, loadflags);
@@ -1307,8 +1312,21 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name,
if (!(handle = LoadResource( hInstance, hRsrc ))) return 0;
bits = LockResource( handle );
- hIcon = CreateIconFromResourceEx( bits, dwBytesInRes,
- !fCursor, 0x00030000, width, height, loadflags);
+
+ if (!fCursor)
+ {
+ hotspot.x = width / 2;
+ hotspot.y = height / 2;
+ }
+ else /* get the hotspot */
+ {
+ SHORT *pt = (SHORT *)bits;
+ hotspot.x = pt[0];
+ hotspot.y = pt[1];
+ bits += 2 * sizeof(SHORT);
+ }
+ hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)bits, hInstance, name, hotspot,
+ !fCursor, width, height, loadflags );
FreeResource( handle );
/* If shared icon, add to icon cache */
More information about the wine-cvs
mailing list