From 35ac2a9da7593a270e0cbf3d5b56b0ac79828fde Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Wed, 15 Apr 2009 15:39:46 +0000 Subject: [PATCH] - CreateIcon: create color bitmap only if bitsPixel specifies a non-monochrome icon - CreateCursorIconHandle: set hotspot for icons based on the bitmap size - Fixes seven user32 cursoricon winetests svn path=/trunk/; revision=40528 --- reactos/dll/win32/user32/windows/icon.c | 16 ++++++++++++---- .../subsystems/win32/win32k/ntuser/cursoricon.c | 10 +++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/user32/windows/icon.c b/reactos/dll/win32/user32/windows/icon.c index 65600fefa06..2552311c5b6 100644 --- a/reactos/dll/win32/user32/windows/icon.c +++ b/reactos/dll/win32/user32/windows/icon.c @@ -202,11 +202,19 @@ CreateIcon( { return (HICON)0; } - IconInfo.hbmColor = CreateBitmap(nWidth, nHeight, cPlanes, cBitsPixel, XORbits); - if(!IconInfo.hbmColor) + + if (cBitsPixel == 1) { - DeleteObject(IconInfo.hbmMask); - return (HICON)0; + IconInfo.hbmColor = (HBITMAP)0; + } + else + { + IconInfo.hbmColor = CreateBitmap(nWidth, nHeight, cPlanes, cBitsPixel, XORbits); + if(!IconInfo.hbmColor) + { + DeleteObject(IconInfo.hbmMask); + return (HICON)0; + } } return NtUserCreateCursorIconHandle(&IconInfo, FALSE); diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index eec157f0d6e..b72062b76df 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -541,6 +541,7 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect) Status = MmCopyFromCaller(&CurIcon->IconInfo, IconInfo, sizeof(ICONINFO)); if(NT_SUCCESS(Status)) { + /* Copy bitmaps and size info */ if(Indirect) { CurIcon->IconInfo.hbmMask = BITMAP_CopyBitmap(CurIcon->IconInfo.hbmMask); @@ -560,11 +561,18 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect) if (CurIcon->IconInfo.hbmColor == NULL) { CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; - CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy / 2; + CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy; } SURFACE_UnlockSurface(psurfBmp); GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmMask, NULL); } + + /* Calculate icon hotspot */ + if (CurIcon->IconInfo.fIcon == TRUE) + { + CurIcon->IconInfo.xHotspot = CurIcon->Size.cx >> 1; + CurIcon->IconInfo.yHotspot = CurIcon->Size.cy >> 1; + } } else {