From 6c5af8a927041f97002e4175c85e0fc07aaabf52 Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Tue, 16 Jan 2007 18:30:54 +0000 Subject: [PATCH] improve cursor loading code svn path=/trunk/; revision=25488 --- reactos/dll/win32/user32/windows/icon.c | 55 +++++++++++++------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/reactos/dll/win32/user32/windows/icon.c b/reactos/dll/win32/user32/windows/icon.c index b62e7002fdd..b965658019f 100644 --- a/reactos/dll/win32/user32/windows/icon.c +++ b/reactos/dll/win32/user32/windows/icon.c @@ -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; }