- 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
This commit is contained in:
Gregor Schneider
2009-04-15 15:39:46 +00:00
parent e24b445f11
commit 35ac2a9da7
2 changed files with 21 additions and 5 deletions
+12 -4
View File
@@ -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);
@@ -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
{