winamp/Src/Plugins/General/gen_ml/stockobjects.cpp
2024-09-24 14:54:57 +02:00

216 lines
5.2 KiB
C++

#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);
}