[ros-diffs] [gedmurphy] 25488: improve cursor loading code

gedmurphy at svn.reactos.org gedmurphy at svn.reactos.org
Tue Jan 16 19:30:54 CET 2007


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/icon.c?rev=25488&r1=25487&r2=25488&view=diff
==============================================================================
--- 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;
 }




More information about the Ros-diffs mailing list