aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/skinHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/omBrowser/skinHelper.cpp')
-rw-r--r--Src/omBrowser/skinHelper.cpp602
1 files changed, 602 insertions, 0 deletions
diff --git a/Src/omBrowser/skinHelper.cpp b/Src/omBrowser/skinHelper.cpp
new file mode 100644
index 00000000..8f4ecdfb
--- /dev/null
+++ b/Src/omBrowser/skinHelper.cpp
@@ -0,0 +1,602 @@
+#include "main.h"
+
+#ifndef WA_DLG_IMPLEMENT
+#define WA_DLG_IMPLEMENT
+#endif // WA_DLG_IMPLEMENT
+#include "../winamp/wa_dlg.h"
+#undef WA_DLG_IMPLEMENT
+#include "./skinHelper.h"
+#include "./ratingMenuCustomizer.h"
+#include "./ifc_menucustomizer.h"
+#include <windows.h>
+#include <shlwapi.h>
+#include <strsafe.h>
+
+#define ENSURE_FUNCTION_LOADED(__function) {\
+ HRESULT hr;\
+ if (NULL == (__function)) {\
+ hr = LoadMediaLibraryModule();\
+ if (SUCCEEDED(hr) && NULL == (__function)) hr = E_UNEXPECTED;\
+ if (FAILED(hr)) return hr; }}
+
+#define BOOL2HRESULT(__result) ((FALSE != (__result)) ? S_OK : E_FAIL)
+
+SkinHelper::SkinHelper(HWND hwndWa)
+ : ref(1), hwndWinamp(hwndWa), mlModule(NULL), mlLoadResult(S_FALSE),
+ playlistFont(NULL), initializeColors(TRUE), cchHostCss(0),
+ mlSkinWindowEx(NULL), mlUnskinWindow(NULL), mlTrackSkinnedPopupMenuEx(NULL),
+ mlIsSkinnedPopupEnabled(NULL), mlInitSkinnedPopupHook(NULL),
+ mlRemoveSkinnedPopupHook(NULL), mlGetSkinColor(NULL), mlResetSkinColor(NULL),
+ mlRatingDraw(NULL), mlRatingHitTest(NULL), mlRatingCalcMinRect(NULL)
+{
+ ZeroMemory(szBrushes, sizeof(HBRUSH) * ARRAYSIZE(szBrushes));
+ ZeroMemory(szHostCss, sizeof(szHostCss));
+}
+
+SkinHelper::~SkinHelper()
+{
+ if (NULL != playlistFont)
+ DeleteObject(playlistFont);
+
+ for (int i = 0; i < ARRAYSIZE(szBrushes); i++)
+ {
+ if (NULL != szBrushes[i]) DeleteObject(szBrushes[i]);
+ }
+
+ if (NULL != mlModule)
+ FreeLibrary(mlModule);
+}
+
+HRESULT SkinHelper::CreateInstance(HWND hwndWinamp, SkinHelper **instance)
+{
+ if (NULL == instance) return E_POINTER;
+
+ *instance = NULL;
+
+ if (NULL == hwndWinamp || FALSE == IsWindow(hwndWinamp))
+ return E_INVALIDARG;
+
+ *instance = new SkinHelper(hwndWinamp);
+ if (NULL == *instance) return E_OUTOFMEMORY;
+
+ return S_OK;
+}
+
+size_t SkinHelper::AddRef()
+{
+ return InterlockedIncrement((LONG*)&ref);
+}
+
+size_t SkinHelper::Release()
+{
+ if (0 == ref)
+ return ref;
+
+ LONG r = InterlockedDecrement((LONG*)&ref);
+ if (0 == r)
+ delete(this);
+
+ return r;
+}
+
+int SkinHelper::QueryInterface(GUID interface_guid, void **object)
+{
+ if (NULL == object) return E_POINTER;
+
+ if (IsEqualIID(interface_guid, IFC_SkinHelper))
+ *object = static_cast<ifc_skinhelper*>(this);
+ else if (IsEqualIID(interface_guid, IFC_SkinnedMenu))
+ *object = static_cast<ifc_skinnedmenu*>(this);
+ else if (IsEqualIID(interface_guid, IFC_SkinnedRating))
+ *object = static_cast<ifc_skinnedrating*>(this);
+ else if (IsEqualIID(interface_guid, IFC_SkinnedBrowser))
+ *object = static_cast<ifc_skinnedbrowser*>(this);
+ else
+ {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+
+ if (NULL == *object)
+ return E_UNEXPECTED;
+
+ AddRef();
+ return S_OK;
+}
+
+HRESULT SkinHelper::GetColor(UINT colorIndex, COLORREF *pColor)
+{
+ if (NULL == pColor) return E_POINTER;
+
+ if (colorIndex >= WADLG_NUM_COLORS)
+ return E_INVALIDARG;
+
+ if (FALSE != initializeColors)
+ {
+ HRESULT hr = InitializeColorData();
+ if (FAILED(hr)) return hr;
+ }
+
+ *pColor = WADlg_getColor(colorIndex);
+ return S_OK;
+}
+
+HRESULT SkinHelper::GetColorEx(UINT uObject, UINT uPart, UINT uState, COLORREF *pColor)
+{
+ if (NULL == pColor) return E_POINTER;
+
+ ENSURE_FUNCTION_LOADED(mlGetSkinColor);
+ BOOL result = mlGetSkinColor(uObject, uPart, uState, pColor);
+ return BOOL2HRESULT(result);
+}
+
+HRESULT SkinHelper::GetBrush(UINT colorIndex, HBRUSH *pBrush)
+{
+ if (NULL == pBrush) return E_POINTER;
+
+ if (FALSE != initializeColors)
+ InitializeColorData();
+
+ if (colorIndex < WADLG_NUM_COLORS)
+ {
+ *pBrush = szBrushes[colorIndex];
+ if (NULL == *pBrush)
+ {
+ COLORREF color = WADlg_getColor(colorIndex);
+ *pBrush = CreateSolidBrush(color);
+ szBrushes[colorIndex] = *pBrush;
+ }
+ return S_OK;
+ }
+ return E_INVALIDARG;
+}
+
+HFONT SkinHelper::GetFont()
+{
+ if (NULL == playlistFont)
+ playlistFont = CreateSkinFont();
+
+ return playlistFont;
+}
+
+HRESULT SkinHelper::SkinWindow(HWND hwnd, const GUID *windowGuid, UINT flagsEx, FFCALLBACK callbackFF)
+{
+ SKINWINDOWPARAM swp;
+ swp.cbSize = sizeof(SKINWINDOWPARAM);
+ swp.hwndToSkin = hwnd;
+ swp.windowGuid = *windowGuid;
+ swp.flagsEx = flagsEx;
+ swp.callbackFF = callbackFF;
+
+ BOOL result = (BOOL)SENDWAIPC(hwndWinamp, IPC_SKINWINDOW, (WPARAM)&swp);
+ return BOOL2HRESULT(result);
+}
+
+HRESULT SkinHelper::SkinControl(HWND hwnd, UINT type, UINT style)
+{
+ ENSURE_FUNCTION_LOADED(mlSkinWindowEx);
+ BOOL result = mlSkinWindowEx(hwnd, type, style);
+ return BOOL2HRESULT(result);
+}
+
+HRESULT SkinHelper::UnskinWindow(HWND hwnd)
+{
+ ENSURE_FUNCTION_LOADED(mlUnskinWindow);
+ BOOL result = mlUnskinWindow(hwnd);
+ return BOOL2HRESULT(result);
+}
+
+static INT CALLBACK SkinHelper_CustomMenuProc(INT action, HMENU hMenu, HDC hdc, LPARAM param, ULONG_PTR user)
+{
+ ifc_menucustomizer *customizer = (ifc_menucustomizer*)user;
+ if (NULL != customizer)
+ {
+ return customizer->CustomDraw(hMenu, action, hdc, param);
+ }
+ return FALSE;
+}
+
+BOOL SkinHelper::TrackPopup(HMENU hMenu, UINT fuFlags, INT x, INT y, HWND hwnd, LPTPMPARAMS lptpm, ifc_menucustomizer *customizer)
+{
+ if (ForceNoSkinnedMenu != customizer && S_OK == IsPopupEnabled())
+ {
+ BOOL result;
+ HMLIMGLST hmlil = NULL;
+ INT width = 0;
+ UINT skinStyle = SMS_USESKINFONT;
+ MENUCUSTOMIZEPROC customProc = NULL;
+ ULONG_PTR customParam = 0;
+
+ if (NULL != customizer)
+ {
+ hmlil = customizer->GetImageList();
+ skinStyle = customizer->GetSkinStyle();
+ if (FAILED(customizer->GetWidth(&width)))
+ width = 0;
+
+ customProc = SkinHelper_CustomMenuProc;
+ customParam = (ULONG_PTR)customizer;
+ }
+
+ HRESULT hr = MlTrackSkinnedPopupMenuEx(hMenu, fuFlags, x, y, hwnd, lptpm,
+ hmlil, width, skinStyle, customProc, customParam, &result);
+
+ if (SUCCEEDED(hr))
+ return result;
+ }
+
+ return TrackPopupMenuEx(hMenu, fuFlags, x, y, hwnd, lptpm);
+}
+
+HRESULT SkinHelper::IsPopupEnabled()
+{
+ ENSURE_FUNCTION_LOADED(mlIsSkinnedPopupEnabled);
+ return (FALSE != mlIsSkinnedPopupEnabled()) ? S_OK : S_FALSE;
+}
+
+HANDLE SkinHelper::InitPopupHook(HWND hwnd, ifc_menucustomizer *customizer)
+{
+ if (ForceNoSkinnedMenu != customizer && S_OK == IsPopupEnabled())
+ {
+ HMLIMGLST hmlil = NULL;
+ INT width = 0;
+ UINT skinStyle = SMS_USESKINFONT;
+ MENUCUSTOMIZEPROC customProc = NULL;
+ ULONG_PTR customParam = 0;
+
+ if (NULL != customizer)
+ {
+ hmlil = customizer->GetImageList();
+ skinStyle = customizer->GetSkinStyle();
+ if (FAILED(customizer->GetWidth(&width)))
+ width = 0;
+
+ customProc = SkinHelper_CustomMenuProc;
+ customParam = (ULONG_PTR)customizer;
+ }
+
+ HANDLE hook;
+ HRESULT hr = MlInitSkinnedPopupHook(hwnd, hmlil, width, skinStyle, customProc, customParam, &hook);
+ if (FAILED(hr))
+ hook = NULL;
+ return hook;
+ }
+
+ return NULL;
+}
+
+HRESULT SkinHelper::RemovePopupHook(HANDLE hPopupHook)
+{
+ ENSURE_FUNCTION_LOADED(mlRemoveSkinnedPopupHook);
+ mlRemoveSkinnedPopupHook(hPopupHook);
+ return S_OK;
+}
+
+HRESULT SkinHelper::MlTrackSkinnedPopupMenuEx(HMENU hmenu, UINT fuFlags, INT x, INT y, HWND hwnd, LPTPMPARAMS lptpm, HMLIMGLST hmlil, INT width, UINT skinStyle, MENUCUSTOMIZEPROC customProc, ULONG_PTR customParam, INT *resultOut)
+{
+ if (NULL != resultOut)
+ *resultOut = 0;
+
+ ENSURE_FUNCTION_LOADED(mlTrackSkinnedPopupMenuEx);
+ INT result = mlTrackSkinnedPopupMenuEx(hmenu, fuFlags, x, y, hwnd, lptpm, hmlil, width, skinStyle, customProc, customParam);
+
+ if (NULL != resultOut)
+ *resultOut = result;
+
+ return S_OK;
+}
+
+HRESULT SkinHelper::MlInitSkinnedPopupHook(HWND hwnd, HMLIMGLST hmlil, INT width, UINT skinStyle, MENUCUSTOMIZEPROC customProc, ULONG_PTR customParam, HANDLE *hookOut)
+{
+ if (NULL == hookOut) return E_POINTER;
+ *hookOut = NULL;
+ ENSURE_FUNCTION_LOADED(mlInitSkinnedPopupHook);
+
+ *hookOut = mlInitSkinnedPopupHook(hwnd, hmlil, width, skinStyle, customProc, customParam);
+ if (NULL == *hookOut)
+ return E_FAIL;
+
+ return S_OK;
+}
+
+
+HRESULT SkinHelper::RatingDraw(HDC hdc, INT maxValue, INT value, INT trackingVal, RECT *prc, UINT fStyle)
+{
+ ENSURE_FUNCTION_LOADED(mlRatingDraw);
+ BOOL result = mlRatingDraw(hdc, maxValue, value, trackingVal, NULL, 0, prc, fStyle);
+ return BOOL2HRESULT(result);
+}
+
+HRESULT SkinHelper::RatingHitTest(POINT pt, INT maxValue, RECT *prc, UINT fStyle, LONG *result)
+{
+ if (NULL == result) return E_POINTER;
+ ENSURE_FUNCTION_LOADED(mlRatingHitTest);
+ *result = mlRatingHitTest(pt, maxValue, NULL, prc, fStyle);
+ return S_OK;
+}
+
+HRESULT SkinHelper::RatingCalcMinRect(INT maxValue, RECT *prc)
+{
+ ENSURE_FUNCTION_LOADED(mlRatingCalcMinRect);
+ BOOL result = mlRatingCalcMinRect(maxValue, NULL, prc);
+ return BOOL2HRESULT(result);
+}
+
+HRESULT SkinHelper::RatingCreateMenuCustomizer(HMENU hMenu, ifc_menucustomizer **customizer)
+{
+ return RatingMenuCustomizer::CreateInstance(hMenu, this, (RatingMenuCustomizer**)customizer);
+}
+
+HRESULT SkinHelper::LoadMediaLibraryModule()
+{
+ if (S_FALSE != mlLoadResult)
+ return mlLoadResult;
+
+ WCHAR szPath[MAX_PATH*2] = {0};
+ PathCombine(szPath, (LPCWSTR)SENDWAIPC(hwndWinamp, IPC_GETPLUGINDIRECTORYW, 0), L"gen_ml.dll");
+
+ mlModule = LoadLibrary(szPath);
+ if (NULL == mlModule)
+ mlLoadResult = HRESULT_FROM_WIN32(GetLastError());
+
+ if (SUCCEEDED(mlLoadResult))
+ {
+ mlSkinWindowEx = (MLSKINWINDOWEX)GetProcAddress(mlModule, "MlSkinWindowEx");
+ mlUnskinWindow = (MLUNSKINWINDOW)GetProcAddress(mlModule, "MlUnskinWindow");
+ mlTrackSkinnedPopupMenuEx = (MLTRACKSKINNEDPOPUPMENUEX)GetProcAddress(mlModule, "MlTrackSkinnedPopupMenuEx");
+ mlIsSkinnedPopupEnabled = (MLISSKINNEDPOPUPENABLED)GetProcAddress(mlModule, "MlIsSkinnedPopupEnabled");
+ mlGetSkinColor = (MLGETSKINCOLOR)GetProcAddress(mlModule, "MlGetSkinColor");
+ mlResetSkinColor = (MLRESETSKINCOLOR)GetProcAddress(mlModule, "MlResetSkinColor");
+ mlInitSkinnedPopupHook = (MLINITSKINNEDPOPUPHOOK)GetProcAddress(mlModule, "MlInitSkinnedPopupHook");
+ mlRemoveSkinnedPopupHook = (MLREMOVESKINNEDPOPUPHOOK)GetProcAddress(mlModule, "MlRemoveSkinnedPopupHook");
+ mlRatingDraw = (MLRATINGDRAW)GetProcAddress(mlModule, "MlRatingDraw");
+ mlRatingHitTest = (MLRATINGHITTEST)GetProcAddress(mlModule, "MlRatingHitTest");
+ mlRatingCalcMinRect = (MLRATINGCALCMINRECT)GetProcAddress(mlModule, "MlRatingCalcMinRect");
+ }
+ return mlLoadResult;
+}
+
+
+HRESULT SkinHelper::InitializeColorData()
+{
+ if (NULL == hwndWinamp || !IsWindow(hwndWinamp))
+ return E_UNEXPECTED;
+
+ for (int i = 0; i < ARRAYSIZE(szBrushes); i++)
+ {
+ if (NULL != szBrushes[i])
+ {
+ DeleteObject(szBrushes[i]);
+ szBrushes[i] = NULL;
+ }
+ }
+
+ cchHostCss = 0;
+
+ WADlg_init(hwndWinamp);
+ initializeColors = FALSE;
+
+ return S_OK;
+}
+
+HFONT SkinHelper::CreateSkinFont()
+{
+ if (NULL == hwndWinamp || !IsWindow(hwndWinamp))
+ return NULL;
+
+ LOGFONT lf =
+ {
+ 0, /* lfHeight */
+ 0, /* lfWidth */
+ 0, /* lfEscapement */
+ 0, /* lfOrientation */
+ FW_NORMAL, /* lfWeight */
+ FALSE, /* lfItalic */
+ FALSE, /* lfUnderline */
+ FALSE, /* lfStrikeOut */
+ DEFAULT_CHARSET, /* lfCharSet */
+ OUT_DEFAULT_PRECIS, /* lfOutPrecision */
+ CLIP_DEFAULT_PRECIS, /* lfClipPrecision */
+ DEFAULT_QUALITY, /* lfQuality */
+ DEFAULT_PITCH | FF_DONTCARE, /* lfPitchAndFamily */
+ TEXT(""), /* lfFaceName */
+ };
+
+
+ lf.lfHeight = -(INT)SENDWAIPC(hwndWinamp, IPC_GET_GENSKINBITMAP, 3);
+ lf.lfCharSet = (BYTE)SENDWAIPC(hwndWinamp, IPC_GET_GENSKINBITMAP, 2);
+
+ LPCSTR faceNameAnsi = (LPCSTR)SENDWAIPC(hwndWinamp,IPC_GET_GENSKINBITMAP, 1);
+ if (NULL != faceNameAnsi/* && '\0' != faceNameAnsi*/)
+ {
+ INT count = MultiByteToWideChar(CP_ACP, 0, faceNameAnsi, -1, lf.lfFaceName, ARRAYSIZE(lf.lfFaceName));
+ if (count > 0) count--;
+ lf.lfFaceName[count] = L'\0';
+ }
+ return CreateFontIndirect(&lf);
+}
+
+void SkinHelper::ResetColorCache()
+{
+ initializeColors = TRUE;
+ if (NULL != mlResetSkinColor)
+ mlResetSkinColor();
+}
+
+void SkinHelper::ResetFontCache()
+{
+ if (NULL != playlistFont)
+ {
+ DeleteObject(playlistFont);
+ playlistFont = NULL;
+ }
+}
+
+
+#define RGBTOHTML(__rgbColor) (((__rgbColor)>>16) & 0xFF | ((__rgbColor)&0xFF00) | (((__rgbColor)<<16)&0xFF0000))
+
+HRESULT SkinHelper::Browser_GetHostCss(wchar_t **ppchHostCss)
+{
+ if (NULL == ppchHostCss) return E_POINTER;
+ *ppchHostCss = NULL;
+
+ if (FALSE != initializeColors)
+ {
+ HRESULT hr = InitializeColorData();
+ if (FAILED(hr)) return hr;
+ }
+
+ if (0 == cchHostCss)
+ {
+ size_t remaining;
+ COLORREF szColors[] =
+ {
+ Browser_GetBackColor(),
+ Browser_GetTextColor(),
+ (COLORREF)WADlg_getColor(WADLG_LISTHEADER_BGCOLOR),
+ (COLORREF)WADlg_getColor(WADLG_SCROLLBAR_BGCOLOR),
+ (COLORREF)WADlg_getColor(WADLG_LISTHEADER_FRAME_TOPCOLOR),
+ (COLORREF)WADlg_getColor(WADLG_LISTHEADER_BGCOLOR),
+ (COLORREF)WADlg_getColor(WADLG_LISTHEADER_FRAME_BOTTOMCOLOR),
+ (COLORREF)WADlg_getColor(WADLG_LISTHEADER_BGCOLOR),
+ (COLORREF)WADlg_getColor(WADLG_BUTTONFG),
+ Browser_GetLinkColor(),
+ Browser_GetActiveLinkColor(),
+ Browser_GetVisitedLinkColor(),
+ Browser_GetHoveredLinkColor(),
+ };
+
+ for (INT i = 0; i < ARRAYSIZE(szColors); i++)
+ {
+ COLORREF c = szColors[i];
+ szColors[i] = RGBTOHTML(c);
+ }
+
+ HRESULT hr = StringCchPrintfEx(szHostCss, ARRAYSIZE(szHostCss), NULL, &remaining,
+ STRSAFE_IGNORE_NULLS | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION,
+ L"body { "
+ L"background-color: #%06X;"
+ L"color: #%06X;"
+ L"scrollbar-face-color: #%06X;"
+ L"scrollbar-track-color: #%06X;"
+ L"scrollbar-3dlight-color: #%06X;"
+ L"scrollbar-shadow-color: #%06X;"
+ L"scrollbar-darkshadow-color: #%06X;"
+ L"scrollbar-highlight-color: #%06X;"
+ L"scrollbar-arrow-color: #%06X;"
+ L"}"
+ L"a:link {color: #%06X;}"
+ L"a:active {color: #%06X;}"
+ L"a:visited {color: #%06X;}"
+ L"a:hover {color: #%06X;}",
+ szColors[0], szColors[1], szColors[2], szColors[3], szColors[4], szColors[5], szColors[6],
+ szColors[7], szColors[8], szColors[9], szColors[10], szColors[11], szColors[12]
+ );
+ if (FAILED(hr))
+ return E_UNEXPECTED;
+
+ cchHostCss = ARRAYSIZE(szHostCss) - remaining;
+
+ }
+
+ LPWSTR buffer = (LPWSTR)CoTaskMemAlloc(sizeof(WCHAR) * (cchHostCss + 1));
+ if (NULL == buffer) return E_OUTOFMEMORY;
+
+ if (FAILED(StringCchCopy(buffer, cchHostCss + 1, szHostCss)))
+ return E_UNEXPECTED;
+
+ *ppchHostCss = buffer;
+ return S_OK;
+}
+
+COLORREF SkinHelper::Browser_GetBackColor(void)
+{
+ COLORREF rgb;
+ if (FAILED(GetColorEx(MLSO_OMBROWSER, BP_BACKGROUND, 0, &rgb)))
+ rgb = GetSysColor(COLOR_WINDOW);
+ return rgb;
+}
+
+COLORREF SkinHelper::Browser_GetTextColor(void)
+{
+ COLORREF rgb;
+ if (FAILED(GetColorEx(MLSO_OMBROWSER, BP_TEXT, BTS_NORMAL, &rgb)))
+ rgb = GetSysColor(COLOR_WINDOWTEXT);
+ return rgb;
+}
+
+COLORREF SkinHelper::Browser_GetLinkColor(void)
+{
+ COLORREF rgb;
+ if (FAILED(GetColorEx(MLSO_OMBROWSER, BP_LINK, BLS_NORMAL, &rgb)))
+ rgb = GetSysColor(COLOR_HOTLIGHT);
+ return rgb;
+}
+
+COLORREF SkinHelper::Browser_GetActiveLinkColor(void)
+{
+ COLORREF rgb;
+ if (FAILED(GetColorEx(MLSO_OMBROWSER, BP_LINK, BLS_ACTIVE, &rgb)))
+ rgb = GetSysColor(COLOR_HOTLIGHT);
+ return rgb;
+}
+
+COLORREF SkinHelper::Browser_GetVisitedLinkColor(void)
+{
+ COLORREF rgb;
+ if (FAILED(GetColorEx(MLSO_OMBROWSER, BP_LINK, BLS_VISITED, &rgb)))
+ rgb = GetSysColor(COLOR_WINDOWTEXT);
+ return rgb;
+}
+
+COLORREF SkinHelper::Browser_GetHoveredLinkColor(void)
+{
+ COLORREF rgb;
+ if (FAILED(GetColorEx(MLSO_OMBROWSER, BP_LINK, BLS_HOVER, &rgb)))
+ rgb = GetSysColor(COLOR_HOTLIGHT);
+ return rgb;
+}
+
+#define CBCLASS SkinHelper
+START_MULTIPATCH;
+ START_PATCH(MPIID_SKINHELPER)
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, ADDREF, AddRef);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, RELEASE, Release);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, QUERYINTERFACE, QueryInterface);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, API_GETCOLOR, GetColor);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, API_GETCOLOREX, GetColorEx);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, API_GETBRUSH, GetBrush);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, API_GETFONT, GetFont);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, API_SKINWINDOW, SkinWindow);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, API_SKINCONTROL, SkinControl);
+ M_CB(MPIID_SKINHELPER, ifc_skinhelper, API_UNSKINWINDOW, UnskinWindow);
+ NEXT_PATCH(MPIID_SKINNEDMENU)
+ M_CB(MPIID_SKINNEDMENU, ifc_skinnedmenu, ADDREF, AddRef);
+ M_CB(MPIID_SKINNEDMENU, ifc_skinnedmenu, RELEASE, Release);
+ M_CB(MPIID_SKINNEDMENU, ifc_skinnedmenu, QUERYINTERFACE, QueryInterface);
+ M_CB(MPIID_SKINNEDMENU, ifc_skinnedmenu, API_TRACKPOPUP, TrackPopup);
+ M_CB(MPIID_SKINNEDMENU, ifc_skinnedmenu, API_ISENABLED, IsPopupEnabled);
+ M_CB(MPIID_SKINNEDMENU, ifc_skinnedmenu, API_INITPOPUPHOOK, InitPopupHook);
+ M_CB(MPIID_SKINNEDMENU, ifc_skinnedmenu, API_REMOVEPOPUPHOOK, RemovePopupHook);
+ NEXT_PATCH(MPIID_SKINNEDRATING)
+ M_CB(MPIID_SKINNEDRATING, ifc_skinnedrating, ADDREF, AddRef);
+ M_CB(MPIID_SKINNEDRATING, ifc_skinnedrating, RELEASE, Release);
+ M_CB(MPIID_SKINNEDRATING, ifc_skinnedrating, QUERYINTERFACE, QueryInterface);
+ M_CB(MPIID_SKINNEDRATING, ifc_skinnedrating, API_DRAW, RatingDraw);
+ M_CB(MPIID_SKINNEDRATING, ifc_skinnedrating, API_HITTEST, RatingHitTest);
+ M_CB(MPIID_SKINNEDRATING, ifc_skinnedrating, API_CALCMINRECT, RatingCalcMinRect);
+ M_CB(MPIID_SKINNEDRATING, ifc_skinnedrating, API_CREATEMENUCUSTOMIZER, RatingCreateMenuCustomizer);
+ NEXT_PATCH(MPIID_SKINNEDBROWSER)
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, ADDREF, AddRef);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, RELEASE, Release);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, QUERYINTERFACE, QueryInterface);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, API_GETHOSTCSS, Browser_GetHostCss);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, API_GETBACKCOLOR, Browser_GetBackColor);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, API_GETTEXTCOLOR, Browser_GetTextColor);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, API_GETLINKCOLOR, Browser_GetLinkColor);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, API_GETACTIVELINKCOLOR, Browser_GetActiveLinkColor);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, API_GETVISITEDLINKCOLOR, Browser_GetVisitedLinkColor);
+ M_CB(MPIID_SKINNEDBROWSER, ifc_skinnedbrowser, API_GETHOVEREDLINKCOLOR, Browser_GetHoveredLinkColor);
+ END_PATCH
+END_MULTIPATCH;
+#undef CBCLASS \ No newline at end of file