Use a special value in the hotspot coordinate to identify which HICON

are cursors and which are icons.
This commit is contained in:
Francis Beaudet 1999-09-05 12:15:49 +00:00 committed by Alexandre Julliard
parent a433582363
commit 699900bdb3
1 changed files with 42 additions and 10 deletions

View File

@ -80,6 +80,7 @@ typedef struct tagICONCACHE
static ICONCACHE *IconAnchor = NULL;
static CRITICAL_SECTION IconCrst;
static DWORD ICON_HOTSPOT = 0x42424242;
/**********************************************************************
* CURSORICON_Init
@ -436,7 +437,7 @@ static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE16 hInstance, HGLOBAL16
int sizeAnd, sizeXor;
HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */
BITMAPOBJ *bmpXor, *bmpAnd;
POINT16 hotspot = { 0 ,0 };
POINT16 hotspot = { ICON_HOTSPOT, ICON_HOTSPOT };
BITMAPINFO *bmi;
HDC hdc;
BOOL DoStretch;
@ -964,7 +965,16 @@ HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon, BOOL bSemiTransparent)
if(hIcon && pTask)
if (!(pIcon = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
if (pIcon->bPlanes * pIcon->bBitsPerPixel == 1)
{
hRet = CURSORICON_Copy( pTask->hInstance, hIcon );
pIcon = GlobalLock16(hRet);
pIcon->ptHotSpot.x = pIcon->ptHotSpot.y = 15;
GlobalUnlock(hRet);
}
else
{
BYTE pAndBits[128];
@ -1119,8 +1129,8 @@ HICON16 WINAPI CreateIcon16( HINSTANCE16 hInstance, INT16 nWidth,
TRACE_(icon)("%dx%dx%d, xor=%p, and=%p\n",
nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits);
info.ptHotSpot.x = 0;
info.ptHotSpot.y = 0;
info.ptHotSpot.x = ICON_HOTSPOT;
info.ptHotSpot.y = ICON_HOTSPOT;
info.nWidth = nWidth;
info.nHeight = nHeight;
info.nWidthBytes = 0;
@ -1143,8 +1153,8 @@ HICON WINAPI CreateIcon( HINSTANCE hInstance, INT nWidth,
TRACE_(icon)("%dx%dx%d, xor=%p, and=%p\n",
nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits);
info.ptHotSpot.x = 0;
info.ptHotSpot.y = 0;
info.ptHotSpot.x = ICON_HOTSPOT;
info.ptHotSpot.y = ICON_HOTSPOT;
info.nWidth = nWidth;
info.nHeight = nHeight;
info.nWidthBytes = 0;
@ -1784,9 +1794,20 @@ BOOL WINAPI GetIconInfo(HICON hIcon,LPICONINFO iconinfo) {
ciconinfo = GlobalLock16(hIcon);
if (!ciconinfo)
return FALSE;
iconinfo->xHotspot = ciconinfo->ptHotSpot.x;
iconinfo->yHotspot = ciconinfo->ptHotSpot.y;
iconinfo->fIcon = TRUE; /* hmm */
if ( (ciconinfo->ptHotSpot.x == ICON_HOTSPOT) &&
(ciconinfo->ptHotSpot.y == ICON_HOTSPOT) )
{
iconinfo->fIcon = TRUE;
iconinfo->xHotspot = 0;
iconinfo->yHotspot = 0;
}
else
{
iconinfo->fIcon = FALSE;
iconinfo->xHotspot = ciconinfo->ptHotSpot.x;
iconinfo->yHotspot = ciconinfo->ptHotSpot.y;
}
iconinfo->hbmColor = CreateBitmap ( ciconinfo->nWidth, ciconinfo->nHeight,
ciconinfo->bPlanes, ciconinfo->bBitsPerPixel,
@ -1822,8 +1843,19 @@ HICON WINAPI CreateIconIndirect(LPICONINFO iconinfo) {
CURSORICONINFO *info;
info = (CURSORICONINFO *)GlobalLock16( hObj );
info->ptHotSpot.x = iconinfo->xHotspot;
info->ptHotSpot.y = iconinfo->yHotspot;
/* If we are creating an icon, the hotspot is unused */
if (iconinfo->fIcon)
{
info->ptHotSpot.x = ICON_HOTSPOT;
info->ptHotSpot.y = ICON_HOTSPOT;
}
else
{
info->ptHotSpot.x = iconinfo->xHotspot;
info->ptHotSpot.y = iconinfo->yHotspot;
}
info->nWidth = bmpXor->bitmap.bmWidth;
info->nHeight = bmpXor->bitmap.bmHeight;
info->nWidthBytes = bmpXor->bitmap.bmWidthBytes;