Alexandre Julliard : user32: Reimplement icon copying using CURSORICON_Load .

Alexandre Julliard julliard at winehq.org
Mon Oct 11 13:15:13 CDT 2010


Module: wine
Branch: master
Commit: 76cd25c875586eb81264fb1d1ac11740ce48a074
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=76cd25c875586eb81264fb1d1ac11740ce48a074

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Oct 11 14:12:31 2010 +0200

user32: Reimplement icon copying using CURSORICON_Load.

---

 dlls/user32/cursoricon.c |  171 ++++++---------------------------------------
 1 files changed, 23 insertions(+), 148 deletions(-)

diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index 1efe78e..1af3aa4 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -1338,148 +1338,6 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name,
 }
 
 
-/*************************************************************************
- * CURSORICON_ExtCopy
- *
- * Copies an Image from the Cache if LR_COPYFROMRESOURCE is specified
- *
- * PARAMS
- *      Handle     [I] handle to an Image
- *      nType      [I] Type of Handle (IMAGE_CURSOR | IMAGE_ICON)
- *      iDesiredCX [I] The Desired width of the Image
- *      iDesiredCY [I] The desired height of the Image
- *      nFlags     [I] The flags from CopyImage
- *
- * RETURNS
- *     Success: The new handle of the Image
- *
- * NOTES
- *     LR_COPYDELETEORG and LR_MONOCHROME are currently not implemented.
- *     LR_MONOCHROME should be implemented by CreateIconFromResourceEx.
- *     LR_COPYFROMRESOURCE will only work if the Image is in the Cache.
- *
- *
- */
-
-static HICON CURSORICON_ExtCopy(HICON hIcon, UINT nType,
-                                INT iDesiredCX, INT iDesiredCY,
-                                UINT nFlags)
-{
-    HICON hNew=0;
-
-    TRACE_(icon)("hIcon %p, nType %u, iDesiredCX %i, iDesiredCY %i, nFlags %u\n",
-                 hIcon, nType, iDesiredCX, iDesiredCY, nFlags);
-
-    if(hIcon == 0)
-    {
-        return 0;
-    }
-
-    /* Best Fit or Monochrome */
-    if( (nFlags & LR_COPYFROMRESOURCE
-        && (iDesiredCX > 0 || iDesiredCY > 0))
-        || nFlags & LR_MONOCHROME)
-    {
-        ICONCACHE* pIconCache = CURSORICON_FindCache(hIcon);
-
-        /* Not Found in Cache, then do a straight copy
-        */
-        if(pIconCache == NULL)
-        {
-            hNew = CopyIcon( hIcon );
-            if(nFlags & LR_COPYFROMRESOURCE)
-            {
-                TRACE_(icon)("LR_COPYFROMRESOURCE: Failed to load from cache\n");
-            }
-        }
-        else
-        {
-            int iTargetCY = iDesiredCY, iTargetCX = iDesiredCX;
-            LPBYTE pBits;
-            HANDLE hMem;
-            HRSRC hRsrc;
-            DWORD dwBytesInRes;
-            WORD wResId;
-            CURSORICONDIR *pDir;
-            CURSORICONDIRENTRY *pDirEntry;
-            BOOL bIsIcon = (nType == IMAGE_ICON);
-
-            /* Completing iDesiredCX CY for Monochrome Bitmaps if needed
-            */
-            if(((nFlags & LR_MONOCHROME) && !(nFlags & LR_COPYFROMRESOURCE))
-                || (iDesiredCX == 0 && iDesiredCY == 0))
-            {
-                iDesiredCY = GetSystemMetrics(bIsIcon ?
-                    SM_CYICON : SM_CYCURSOR);
-                iDesiredCX = GetSystemMetrics(bIsIcon ?
-                    SM_CXICON : SM_CXCURSOR);
-            }
-
-            /* Retrieve the CURSORICONDIRENTRY
-            */
-            if (!(hMem = LoadResource( pIconCache->hModule ,
-                            pIconCache->hGroupRsrc)))
-            {
-                return 0;
-            }
-            if (!(pDir = LockResource( hMem )))
-            {
-                return 0;
-            }
-
-            /* Find Best Fit
-            */
-            if(bIsIcon)
-            {
-                pDirEntry = CURSORICON_FindBestIconRes(
-                                pDir, iDesiredCX, iDesiredCY, 256 );
-            }
-            else
-            {
-                pDirEntry = CURSORICON_FindBestCursorRes(
-                                pDir, iDesiredCX, iDesiredCY, 1);
-            }
-
-            wResId = pDirEntry->wResId;
-            dwBytesInRes = pDirEntry->dwBytesInRes;
-            FreeResource(hMem);
-
-            TRACE_(icon)("ResID %u, BytesInRes %u, Width %d, Height %d DX %d, DY %d\n",
-                wResId, dwBytesInRes,  pDirEntry->ResInfo.icon.bWidth,
-                pDirEntry->ResInfo.icon.bHeight, iDesiredCX, iDesiredCY);
-
-            /* Get the Best Fit
-            */
-            if (!(hRsrc = FindResourceW(pIconCache->hModule ,
-                MAKEINTRESOURCEW(wResId), (LPWSTR)(bIsIcon ? RT_ICON : RT_CURSOR))))
-            {
-                return 0;
-            }
-            if (!(hMem = LoadResource( pIconCache->hModule , hRsrc )))
-            {
-                return 0;
-            }
-
-            pBits = LockResource( hMem );
-
-            if(nFlags & LR_DEFAULTSIZE)
-            {
-                iTargetCY = GetSystemMetrics(SM_CYICON);
-                iTargetCX = GetSystemMetrics(SM_CXICON);
-            }
-
-            /* Create a New Icon with the proper dimension
-            */
-            hNew = CreateIconFromResourceEx( pBits, dwBytesInRes,
-                       bIsIcon, 0x00030000, iTargetCX, iTargetCY, nFlags);
-            FreeResource(hMem);
-        }
-    }
-    else hNew = CopyIcon( hIcon );
-    return hNew;
-}
-
-
 /***********************************************************************
  *		CreateCursor (USER32.@)
  */
@@ -2719,13 +2577,30 @@ HANDLE WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx,
             return res;
         }
         case IMAGE_ICON:
-                return CURSORICON_ExtCopy(hnd,type, desiredx, desiredy, flags);
         case IMAGE_CURSOR:
-                /* Should call CURSORICON_ExtCopy but more testing
-                 * needs to be done before we change this
-                 */
-                if (flags) FIXME("Flags are ignored\n");
-                return CopyCursor(hnd);
+        {
+            struct cursoricon_object *icon;
+            HICON res = 0;
+            int depth = (flags & LR_MONOCHROME) ? 1 : GetDeviceCaps( screen_dc, BITSPIXEL );
+
+            if (flags & LR_DEFAULTSIZE)
+            {
+                if (!desiredx) desiredx = GetSystemMetrics( type == IMAGE_ICON ? SM_CXICON : SM_CXCURSOR );
+                if (!desiredy) desiredy = GetSystemMetrics( type == IMAGE_ICON ? SM_CYICON : SM_CYCURSOR );
+            }
+
+            if (!(icon = get_icon_ptr( hnd ))) return 0;
+
+            if (icon->module && (flags & LR_COPYFROMRESOURCE))
+                res = CURSORICON_Load( icon->module, icon->resname, desiredx, desiredy, depth,
+                                       type == IMAGE_CURSOR, flags );
+            else
+                res = CopyIcon( hnd ); /* FIXME: change size if necessary */
+            release_icon_ptr( hnd, icon );
+
+            if (res && (flags & LR_COPYDELETEORG)) DeleteObject( hnd );
+            return res;
+        }
     }
     return 0;
 }




More information about the wine-cvs mailing list