123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- #include "main.h"
- #include "./stockobjects.h"
- #include "./colors.h"
- typedef struct MlStockObjects
- {
- CRITICAL_SECTION lock;
- HDC cachedDc;
- HFONT skinFont;
- HFONT systemFont;
- HBRUSH brushes[BRUSH_MAX - BRUSH_MIN + 1];
- HPEN pens[PEN_MAX - PEN_MIN + 1];
- } MlStockObjects;
- static MlStockObjects stockObjects;
- static void
- MlStockObjects_ResetEx(MlStockObjects *self)
- {
- INT index;
- if (NULL != self->cachedDc)
- {
- DeleteDC(self->cachedDc);
- self->cachedDc = NULL;
- }
- if (NULL != self->skinFont)
- {
- DeleteObject(self->skinFont);
- self->skinFont = NULL;
- }
- if (NULL != self->systemFont)
- {
- DeleteObject(self->systemFont);
- self->systemFont = NULL;
- }
-
- for (index = 0; index < ARRAYSIZE(self->brushes); index++)
- {
- if (NULL != self->brushes[index])
- DeleteObject(self->brushes[index]);
- }
- ZeroMemory(self->brushes, sizeof(self->brushes));
- for (index = 0; index < ARRAYSIZE(self->pens); index++)
- {
- if (NULL != self->pens[index])
- DeleteObject(self->pens[index]);
- }
- ZeroMemory(self->pens, sizeof(self->pens));
- }
- static BYTE
- MlStockObjects_GetSysFontQuality()
- {
- BOOL smoothingEnabled;
- if (FALSE == SystemParametersInfoW(SPI_GETFONTSMOOTHING, 0, &smoothingEnabled, 0) ||
- FALSE == smoothingEnabled)
- {
- return DEFAULT_QUALITY;
- }
-
- UINT smootingType;
- if (FALSE == SystemParametersInfoW(SPI_GETFONTSMOOTHINGTYPE, 0, &smootingType, 0))
- return DEFAULT_QUALITY;
-
- if (FE_FONTSMOOTHINGCLEARTYPE == smootingType)
- return CLEARTYPE_QUALITY;
- return ANTIALIASED_QUALITY;
- }
- static HDC
- MlStockObjects_GetCachedDc(MlStockObjects *self)
- {
- if (NULL == self->cachedDc)
- {
- HDC baseDC = GetDCEx(g_hwnd, NULL, DCX_WINDOW | DCX_CACHE | DCX_NORESETATTRS);
- self->cachedDc = CreateCompatibleDC(baseDC);
- ReleaseDC(g_hwnd, baseDC);
- }
- return self->cachedDc;
- }
- static HFONT
- MlStockObjects_GetSkinFont(MlStockObjects *self)
- {
- if (NULL == self->skinFont &&
- NULL != g_config &&
- 0 != g_config->ReadInt(L"plfont_everywhere", 1))
- {
- INT height = (INT)SendMessageW(plugin.hwndParent, WM_WA_IPC, 3, IPC_GET_GENSKINBITMAP);
- DWORD charset = (DWORD)SendMessageW(plugin.hwndParent, WM_WA_IPC, 2, IPC_GET_GENSKINBITMAP);
- char *fontname = (char*)SendMessageW(plugin.hwndParent, WM_WA_IPC, 1, IPC_GET_GENSKINBITMAP);
- self->skinFont = CreateFontA(-height, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DRAFT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, fontname);
- }
- return self->skinFont;
- }
- static HFONT
- MlStockObjects_GetSystemFont(MlStockObjects *self)
- {
- if (NULL == self->systemFont)
- {
- LOGFONTW lf;
-
- if (FALSE == SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
- return NULL;
-
- lf.lfQuality = MlStockObjects_GetSysFontQuality();
- self->systemFont = CreateFontIndirectW(&lf);
- }
- return self->systemFont;
- }
- static HBRUSH
- MlStockObjects_GetBrush(MlStockObjects *self, UINT type)
- {
- if (NULL == self->brushes[type - BRUSH_MIN])
- {
- INT color;
- switch(type)
- {
- case WNDBCK_BRUSH: color = WADLG_WNDBG; break;
- case ITEMBCK_BRUSH: color = WADLG_ITEMBG; break;
- case HILITE_BRUSH: color = WADLG_HILITE; break;
- case ITEMTEXT_BRUSH: color = WADLG_ITEMFG; break;
- default: return NULL;
- }
- self->brushes[type - BRUSH_MIN] = CreateSolidBrush(WADlg_getColor(color));
- }
- return self->brushes[type - BRUSH_MIN];
- }
- static HPEN
- MlStockObjects_GetPen(MlStockObjects *self, UINT type)
- {
- if (NULL == self->pens[type - PEN_MIN])
- {
- COLORREF rgb;
- switch(type)
- {
- case HILITE_PEN: rgb = WADlg_getColor(WADLG_HILITE); break;
- case HEADERTOP_PEN: rgb = WADlg_getColor(WADLG_LISTHEADER_FRAME_TOPCOLOR); break;
- case HEADERMIDDLE_PEN: rgb = WADlg_getColor(WADLG_LISTHEADER_FRAME_MIDDLECOLOR); break;
- case HEADERBOTTOM_PEN: rgb = WADlg_getColor(WADLG_LISTHEADER_FRAME_BOTTOMCOLOR); break;
- case WNDBCK_PEN: rgb = WADlg_getColor(WADLG_WNDBG); break;
- case MENUBORDER_PEN: MLGetSkinColor(MLSO_MENU, MP_FRAME, 0, &rgb); break;
- case TOOLTIPBORDER_PEN: MLGetSkinColor(MLSO_TOOLTIP, TTP_FRAME, 0, &rgb); break;
- case ITEMBCK_PEN: rgb = WADlg_getColor(WADLG_ITEMBG); break;
- case ITEMTEXT_PEN: rgb = WADlg_getColor(WADLG_ITEMFG); break;
- default: return NULL;
- }
- self->pens[type - PEN_MIN] = CreatePen(PS_SOLID, 0, rgb);
- }
- return self->pens[type - PEN_MIN];
- }
- static HANDLE
- MlStockObjects_GetEx(MlStockObjects *self, UINT type)
- {
- HANDLE handle;
- EnterCriticalSection(&self->lock);
- if (CACHED_DC == type)
- handle = MlStockObjects_GetCachedDc(self);
- else if (SKIN_FONT == type)
- handle = MlStockObjects_GetSkinFont(self);
- else if (DEFAULT_FONT == type)
- handle = MlStockObjects_GetSystemFont(self);
- else if (BRUSH_MIN <= type && BRUSH_MAX >= type)
- handle = MlStockObjects_GetBrush(self, type);
- else if (PEN_MIN <= type && PEN_MAX >= type)
- handle = MlStockObjects_GetPen(self, type);
- else
- handle = NULL;
- LeaveCriticalSection(&self->lock);
- return handle;
- }
- void
- MlStockObjects_Init()
- {
- ZeroMemory(&stockObjects, sizeof(MlStockObjects));
- InitializeCriticalSection(&stockObjects.lock);
- }
- void
- MlStockObjects_Free()
- {
- MlStockObjects_ResetEx(&stockObjects);
- DeleteCriticalSection(&stockObjects.lock);
- }
- HANDLE
- MlStockObjects_Get(UINT type)
- {
- return MlStockObjects_GetEx(&stockObjects, type);
- }
- void
- MlStockObjects_Reset()
- {
- MlStockObjects_ResetEx(&stockObjects);
- }
|