From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/General/gen_ml/stockobjects.cpp | 215 ++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 Src/Plugins/General/gen_ml/stockobjects.cpp (limited to 'Src/Plugins/General/gen_ml/stockobjects.cpp') diff --git a/Src/Plugins/General/gen_ml/stockobjects.cpp b/Src/Plugins/General/gen_ml/stockobjects.cpp new file mode 100644 index 00000000..80da7353 --- /dev/null +++ b/Src/Plugins/General/gen_ml/stockobjects.cpp @@ -0,0 +1,215 @@ +#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); +} -- cgit