Author: gedmurphy
Date: Tue Jan 16 21:30:54 2007
New Revision: 25488
URL:
http://svn.reactos.org/svn/reactos?rev=25488&view=rev
Log:
improve cursor loading code
Modified:
trunk/reactos/dll/win32/user32/windows/icon.c
Modified: trunk/reactos/dll/win32/user32/windows/icon.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/i…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/icon.c (original)
+++ trunk/reactos/dll/win32/user32/windows/icon.c Tue Jan 16 21:30:54 2007
@@ -247,10 +247,10 @@
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 @@
}
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 @@
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,39 +526,42 @@
int Height,
int ColorBits)
{
- int i, MaxWidth, MaxHeight, cx, cy, Bits, BestEntry = -1;
-
- /* 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;
+ int i, cx, cy, Bits, BestBits = 0, BestEntry = -1;
+ UINT iTotalDiff, iXDiff=0, iYDiff=0, iColorDiff;
+ UINT iTempXDiff, iTempYDiff, iTempColorDiff;
+
+ /* 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;
}