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