Nikolay Sivov : shell32: Use array for icon lists.

Alexandre Julliard julliard at winehq.org
Wed Mar 21 17:05:18 CDT 2018


Module: wine
Branch: master
Commit: ff5cfaab56e31e8ec8dda88f81bbdd70e187d407
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ff5cfaab56e31e8ec8dda88f81bbdd70e187d407

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Mar 21 09:27:11 2018 +0300

shell32: Use array for icon lists.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/shell32/iconcache.c | 114 +++++++++++++++++++++++------------------------
 1 file changed, 57 insertions(+), 57 deletions(-)

diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index 8b864df..562f9b2 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -61,8 +61,7 @@ typedef struct
 
 static HDPA sic_hdpa;
 static INIT_ONCE sic_init_once = INIT_ONCE_STATIC_INIT;
-static HIMAGELIST ShellSmallIconList;
-static HIMAGELIST ShellBigIconList;
+static HIMAGELIST shell_imagelists[SHIL_SMALL+1];
 
 static CRITICAL_SECTION SHELL32_SicCS;
 static CRITICAL_SECTION_DEBUG critsect_debug =
@@ -158,8 +157,9 @@ static int SIC_LoadOverlayIcon(int icon_idx);
  *  Creates a new icon as a copy of the passed-in icon, overlaid with a
  *  shortcut image. 
  */
-static HICON SIC_OverlayShortcutImage(HICON SourceIcon, BOOL large)
-{	ICONINFO SourceIconInfo, ShortcutIconInfo, TargetIconInfo;
+static HICON SIC_OverlayShortcutImage(HICON SourceIcon, int type)
+{
+    ICONINFO SourceIconInfo, ShortcutIconInfo, TargetIconInfo;
 	HICON ShortcutIcon, TargetIcon;
 	BITMAP SourceBitmapInfo, ShortcutBitmapInfo;
 	HDC SourceDC = NULL,
@@ -186,21 +186,16 @@ static HICON SIC_OverlayShortcutImage(HICON SourceIcon, BOOL large)
                               resource id, but not all icons are present yet
                               so we can't use icon indices */
 
-	if (s_imgListIdx != -1)
-	{
-	    if (large)
-	        ShortcutIcon = ImageList_GetIcon(ShellBigIconList, s_imgListIdx, ILD_TRANSPARENT);
-	    else
-	        ShortcutIcon = ImageList_GetIcon(ShellSmallIconList, s_imgListIdx, ILD_TRANSPARENT);
-	} else
-	    ShortcutIcon = NULL;
-
-	if (NULL == ShortcutIcon
-	    || ! GetIconInfo(ShortcutIcon, &ShortcutIconInfo)
-	    || 0 == GetObjectW(ShortcutIconInfo.hbmColor, sizeof(BITMAP), &ShortcutBitmapInfo))
-	{
-	  return NULL;
-	}
+    if (s_imgListIdx != -1)
+        ShortcutIcon = ImageList_GetIcon(shell_imagelists[type], s_imgListIdx, ILD_TRANSPARENT);
+    else
+        ShortcutIcon = NULL;
+
+    if (NULL == ShortcutIcon || ! GetIconInfo(ShortcutIcon, &ShortcutIconInfo)
+            || 0 == GetObjectW(ShortcutIconInfo.hbmColor, sizeof(BITMAP), &ShortcutBitmapInfo))
+    {
+        return NULL;
+    }
 
 	TargetIconInfo = SourceIconInfo;
 	TargetIconInfo.hbmMask = NULL;
@@ -308,7 +303,8 @@ fail:
  *  appends an icon pair to the end of the cache
  */
 static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon, DWORD dwFlags)
-{	LPSIC_ENTRY lpsice;
+{
+    LPSIC_ENTRY lpsice;
 	INT ret, index, index1;
 	WCHAR path[MAX_PATH];
 	TRACE("%s %i %p %p\n", debugstr_w(sSourceFile), dwSourceIndex, hSmallIcon ,hBigIcon);
@@ -333,8 +329,8 @@ static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallI
 	}
 	else
 	{
-	  index = ImageList_AddIcon (ShellSmallIconList, hSmallIcon);
-	  index1= ImageList_AddIcon (ShellBigIconList, hBigIcon);
+	    index  = ImageList_AddIcon(shell_imagelists[SHIL_SMALL], hSmallIcon);
+	    index1 = ImageList_AddIcon(shell_imagelists[SHIL_LARGE], hBigIcon);
 
 	  if (index!=index1)
 	  {
@@ -350,12 +346,9 @@ static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallI
 
 static BOOL get_imagelist_icon_size(int list, SIZE *size)
 {
-    HIMAGELIST image_list;
-
     if (list < SHIL_LARGE || list > SHIL_SMALL) return FALSE;
-    image_list = (list == SHIL_LARGE) ? ShellBigIconList : ShellSmallIconList;
 
-    return ImageList_GetIconSize( image_list, &size->cx, &size->cy );
+    return ImageList_GetIconSize( shell_imagelists[list], &size->cx, &size->cy );
 }
 
 /****************************************************************************
@@ -364,7 +357,7 @@ static BOOL get_imagelist_icon_size(int list, SIZE *size)
  * NOTES
  *  gets small/big icon by number from a file
  */
-static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags)
+static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD flags)
 {
 	HICON	hiconLarge=0;
 	HICON	hiconSmall=0;
@@ -384,10 +377,11 @@ static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags)
 	  return -1;
 	}
 
-	if (0 != (dwFlags & GIL_FORSHORTCUT))
-	{
-	  hiconLargeShortcut = SIC_OverlayShortcutImage(hiconLarge, TRUE);
-	  hiconSmallShortcut = SIC_OverlayShortcutImage(hiconSmall, FALSE);
+    if (flags & GIL_FORSHORTCUT)
+    {
+        hiconLargeShortcut = SIC_OverlayShortcutImage(hiconLarge, SHIL_LARGE);
+        hiconSmallShortcut = SIC_OverlayShortcutImage(hiconSmall, SHIL_SMALL);
+
 	  if (NULL != hiconLargeShortcut && NULL != hiconSmallShortcut)
 	  {
             DestroyIcon( hiconLarge );
@@ -400,14 +394,14 @@ static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags)
 	    WARN("Failed to create shortcut overlaid icons\n");
 	    if (NULL != hiconLargeShortcut) DestroyIcon(hiconLargeShortcut);
 	    if (NULL != hiconSmallShortcut) DestroyIcon(hiconSmallShortcut);
-	    dwFlags &= ~ GIL_FORSHORTCUT;
+	    flags &= ~ GIL_FORSHORTCUT;
 	  }
-	}
+    }
 
-        ret = SIC_IconAppend( sSourceFile, dwSourceIndex, hiconSmall, hiconLarge, dwFlags );
-        DestroyIcon( hiconLarge );
-        DestroyIcon( hiconSmall );
-        return ret;
+    ret = SIC_IconAppend( sSourceFile, dwSourceIndex, hiconSmall, hiconLarge, flags );
+    DestroyIcon( hiconLarge );
+    DestroyIcon( hiconSmall );
+    return ret;
 }
 
 static int get_shell_icon_size(void)
@@ -436,6 +430,7 @@ static BOOL WINAPI SIC_Initialize( INIT_ONCE *once, void *param, void **context
 	HICON		hSm, hLg;
 	int		cx_small, cy_small;
 	int		cx_large, cy_large;
+	unsigned int i;
 
         if (!IsProcessDPIAware())
         {
@@ -460,11 +455,11 @@ static BOOL WINAPI SIC_Initialize( INIT_ONCE *once, void *param, void **context
 	  return(FALSE);
 	}
 
-        ShellSmallIconList = ImageList_Create(cx_small,cy_small,ILC_COLOR32|ILC_MASK,0,0x20);
-        ShellBigIconList = ImageList_Create(cx_large,cy_large,ILC_COLOR32|ILC_MASK,0,0x20);
+        shell_imagelists[SHIL_SMALL] = ImageList_Create(cx_small, cy_small, ILC_COLOR32 | ILC_MASK, 0, 0x20);
+        shell_imagelists[SHIL_LARGE] = ImageList_Create(cx_large, cy_large, ILC_COLOR32 | ILC_MASK, 0, 0x20);
 
-        ImageList_SetBkColor(ShellSmallIconList, CLR_NONE);
-        ImageList_SetBkColor(ShellBigIconList, CLR_NONE);
+        for (i = 0; i < ARRAY_SIZE(shell_imagelists); i++)
+            ImageList_SetBkColor(shell_imagelists[i], CLR_NONE);
 
         /* Load the document icon, which is used as the default if an icon isn't found. */
         hSm = LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(IDI_SHELL_DOCUMENT),
@@ -480,10 +475,10 @@ static BOOL WINAPI SIC_Initialize( INIT_ONCE *once, void *param, void **context
 
         SIC_IconAppend (swShell32Name, IDI_SHELL_DOCUMENT-1, hSm, hLg, 0);
         SIC_IconAppend (swShell32Name, -IDI_SHELL_DOCUMENT, hSm, hLg, 0);
-   
-	TRACE("hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList);
 
-	return TRUE;
+    TRACE("small list=%p, large list=%p\n", shell_imagelists[SHIL_SMALL], shell_imagelists[SHIL_LARGE]);
+
+    return TRUE;
 }
 /*************************************************************************
  * SIC_Destroy
@@ -499,19 +494,22 @@ static INT CALLBACK sic_free( LPVOID ptr, LPVOID lparam )
 
 void SIC_Destroy(void)
 {
-	TRACE("\n");
+    unsigned int i;
 
-	EnterCriticalSection(&SHELL32_SicCS);
+    TRACE("\n");
 
-	if (sic_hdpa) DPA_DestroyCallback(sic_hdpa, sic_free, NULL );
+    EnterCriticalSection(&SHELL32_SicCS);
 
-	if (ShellSmallIconList)
-	    ImageList_Destroy(ShellSmallIconList);
-	if (ShellBigIconList)
-	    ImageList_Destroy(ShellBigIconList);
+    if (sic_hdpa) DPA_DestroyCallback(sic_hdpa, sic_free, NULL );
 
-	LeaveCriticalSection(&SHELL32_SicCS);
-	DeleteCriticalSection(&SHELL32_SicCS);
+    for (i = 0; i < ARRAY_SIZE(shell_imagelists); i++)
+    {
+        if (shell_imagelists[i])
+            ImageList_Destroy(shell_imagelists[i]);
+    }
+
+    LeaveCriticalSection(&SHELL32_SicCS);
+    DeleteCriticalSection(&SHELL32_SicCS);
 }
 
 /*****************************************************************************
@@ -621,14 +619,16 @@ static int SIC_LoadOverlayIcon(int icon_idx)
  *  imglist[1|2] [OUT] pointer which receives imagelist handles
  *
  */
-BOOL WINAPI Shell_GetImageLists(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList)
+BOOL WINAPI Shell_GetImageLists(HIMAGELIST *large_list, HIMAGELIST *small_list)
 {
-    TRACE("(%p,%p)\n",lpBigList,lpSmallList);
+    TRACE("(%p, %p)\n", large_list, small_list);
+
     InitOnceExecuteOnce( &sic_init_once, SIC_Initialize, NULL, NULL );
-    if (lpBigList) *lpBigList = ShellBigIconList;
-    if (lpSmallList) *lpSmallList = ShellSmallIconList;
+    if (large_list) *large_list = shell_imagelists[SHIL_LARGE];
+    if (small_list) *small_list = shell_imagelists[SHIL_SMALL];
     return TRUE;
 }
+
 /*************************************************************************
  * PidlToSicIndex			[INTERNAL]
  *




More information about the wine-cvs mailing list