mirror of
https://github.com/reactos/reactos.git
synced 2025-01-13 01:22:03 +00:00
improve cursor loading code
svn path=/trunk/; revision=25488
This commit is contained in:
parent
14060f6c04
commit
6c5af8a927
1 changed files with 29 additions and 26 deletions
|
@ -247,10 +247,10 @@ CreateIconFromResourceEx(
|
|||
if (! fIcon)
|
||||
{
|
||||
wXHotspot = *(WORD*)pbIconBits;
|
||||
pbIconBits+=sizeof(WORD);
|
||||
pbIconBits += sizeof(WORD);
|
||||
wYHotspot = *(WORD*)pbIconBits;
|
||||
pbIconBits+=sizeof(WORD);
|
||||
cbIconBits-=2*sizeof(WORD);
|
||||
pbIconBits += sizeof(WORD);
|
||||
cbIconBits -= 2 * sizeof(WORD);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -266,7 +266,7 @@ CreateIconFromResourceEx(
|
|||
}
|
||||
memcpy(SafeIconImage, pbIconBits, cbIconBits);
|
||||
|
||||
/* take into acount the origonal height was for both the AND and XOR images */
|
||||
/* take into acount the original height was for both the AND and XOR images */
|
||||
if(fIcon)
|
||||
SafeIconImage->icHeader.biHeight /= 2;
|
||||
|
||||
|
@ -326,7 +326,7 @@ CreateIconIndirect(PICONINFO IconInfo)
|
|||
return (HICON)0;
|
||||
}
|
||||
/* FIXME - does there really *have* to be a color bitmap? monochrome cursors don't have one */
|
||||
if(IconInfo->hbmColor && !GetObjectW(IconInfo->hbmColor, sizeof(BITMAP), &ColorBitmap))
|
||||
if(/*IconInfo->hbmColor &&*/ !GetObjectW(IconInfo->hbmColor, sizeof(BITMAP), &ColorBitmap))
|
||||
{
|
||||
return (HICON)0;
|
||||
}
|
||||
|
@ -526,40 +526,43 @@ CURSORICON_FindBestCursor(LPVOID dir,
|
|||
int Height,
|
||||
int ColorBits)
|
||||
{
|
||||
int i, MaxWidth, MaxHeight, cx, cy, Bits, BestEntry = -1;
|
||||
int i, cx, cy, Bits, BestBits = 0, BestEntry = -1;
|
||||
UINT iTotalDiff, iXDiff=0, iYDiff=0, iColorDiff;
|
||||
UINT iTempXDiff, iTempYDiff, iTempColorDiff;
|
||||
|
||||
/* Double height to account for AND and XOR masks */
|
||||
Height *= 2;
|
||||
|
||||
/* First find the largest one smaller than or equal to the requested size*/
|
||||
MaxWidth = MaxHeight = 0;
|
||||
/* Find Best Fit */
|
||||
iTotalDiff = 0xFFFFFFFF;
|
||||
iColorDiff = 0xFFFFFFFF;
|
||||
for (i = 0; get_entry(dir, i, &cx, &cy, &Bits); i++ )
|
||||
{
|
||||
if ((cx <= Width) && (cy <= Height) &&
|
||||
(cx > MaxWidth) && (cy > MaxHeight) &&
|
||||
(Bits == 1))
|
||||
iTempXDiff = abs(Width - cx);
|
||||
iTempYDiff = abs(Height - cy);
|
||||
|
||||
if(iTotalDiff > (iTempXDiff + iTempYDiff))
|
||||
{
|
||||
BestEntry = i;
|
||||
MaxWidth = cx;
|
||||
MaxHeight = cy;
|
||||
iXDiff = iTempXDiff;
|
||||
iYDiff = iTempYDiff;
|
||||
iTotalDiff = iXDiff + iYDiff;
|
||||
}
|
||||
}
|
||||
if (BestEntry != -1)
|
||||
return BestEntry;
|
||||
|
||||
/* Now find the smallest one larger than the requested size */
|
||||
MaxWidth = MaxHeight = 255;
|
||||
/* Find Best Colors for Best Fit */
|
||||
for (i = 0; get_entry(dir, i, &cx, &cy, &Bits); i++ )
|
||||
{
|
||||
if (((cx < MaxWidth) && (cy < MaxHeight) && (Bits == 1)) ||
|
||||
(BestEntry == -1))
|
||||
if(abs(Width - cx) == iXDiff && abs(Height - cy) == iYDiff)
|
||||
{
|
||||
BestEntry = i;
|
||||
MaxWidth = cx;
|
||||
MaxHeight = cy;
|
||||
iTempColorDiff = abs(ColorBits - Bits);
|
||||
if(iColorDiff > iTempColorDiff)
|
||||
{
|
||||
BestEntry = i;
|
||||
BestBits = Bits;
|
||||
iColorDiff = iTempColorDiff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT("Best Cursor: ResId: %d, bits : %d\n", BestEntry, BestBits);
|
||||
|
||||
return BestEntry;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue