From db6974eda1dc1fada95af97ea53c369db58fda41 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Mon, 1 Jun 2020 12:03:57 +0200 Subject: replace windows version checks with compat bits this saves us from calling GetVersion() and massaging the result in hot code paths --- alf/alfcompat.cpp | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) (limited to 'alf/alfcompat.cpp') diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp index 12a79f4..b986ee8 100644 --- a/alf/alfcompat.cpp +++ b/alf/alfcompat.cpp @@ -2,6 +2,8 @@ #include +DWORD _alf_compatBits = 0; + static DWORD ALF_DllGetVersion(const char *dll) { @@ -32,7 +34,7 @@ static int WINAPI ALF_Compat_fallbackGetSystemMetricsForDpi(int nIndex, UINT dpi) { (void)dpi; - if (!ALF_Compat_IsMinWindowsVersion(4, 0)) { + if (!ALF_Compat_Is40()) { // old NT does not support several properties, so we fake them switch (nIndex) { case SM_CXEDGE: @@ -84,7 +86,7 @@ ALF_Compat_fallbackSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID // we need to provide a fallback even on ANSI systems #ifdef UNICODE SIZE_T s = sizeof(*ncmw); - if (!ALF_Compat_IsMinWindowsVersion(6, 0)) { + if (!ALF_Compat_IsVista()) { // pre-vista OS doesn't contain last member s -= sizeof(ncmw->iPaddedBorderWidth); ncmw->iPaddedBorderWidth = 0; @@ -97,7 +99,7 @@ ALF_Compat_fallbackSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID ZeroMemory(&ncma, sizeof(ncma)); SIZE_T s = sizeof(ncma); - if (!ALF_Compat_IsMinWindowsVersion(6, 0)) { + if (!ALF_Compat_IsVista()) { // pre-vista OS doesn't contain last member s -= sizeof(ncma.iPaddedBorderWidth); ncma.iPaddedBorderWidth = 0; @@ -428,17 +430,39 @@ static HMODULE _alf_dll_comctl32 = NULL; void ALF_LoadCompatFunctions(void) { - if (ALF_Compat_IsWinNT()) // don't attempt to load uxtheme.dll on non-NT platforms (ugly error on Win32s) + // setup compat bits + DWORD v = GetVersion(); + DWORD vMajor = LOBYTE(LOWORD(v)); + DWORD vMinor = HIBYTE(LOWORD(v)); + + if (v < 0x80000000) + _alf_compatBits |= ALF_COMPAT_ISNT; + + if (vMajor >= 4) + _alf_compatBits |= ALF_COMPAT_IS40; + + if (vMajor >= 5) + _alf_compatBits |= ALF_COMPAT_ISW2K; + + if (vMajor > 5 || (vMajor == 5 && vMinor >= 1)) + _alf_compatBits |= ALF_COMPAT_ISXP; + + if (vMajor >= 6) + _alf_compatBits |= ALF_COMPAT_ISVISTA; + + // load compat functions + if (ALF_Compat_IsXP()) // don't even attempt to load uxtheme.dll on non-XP _alf_dll_uxtheme = LoadLibraryA("uxtheme.dll"); _alf_dll_user32 = LoadLibraryA("user32.dll"); _alf_dll_comctl32 = LoadLibraryA("comctl32.dll"); - - if (ALF_DllGetVersion("comctl32.dll") >= 0x60000) + if (ALF_DllGetVersion("comctl32.dll") >= 0x60000) { + _alf_compatBits |= ALF_COMPAT_ISCOMCTLV6; LOAD_FUNC(uxtheme, IsAppThemed); - else + } else { ALF_Compat_IsAppThemed = ALF_Compat_fallbackIsAppThemed; + } LOAD_FUNC(user32, GetDpiForWindow); LOAD_FUNC(user32, AdjustWindowRectExForDpi); @@ -467,7 +491,7 @@ void ALF_LoadCompatFunctions(void) LOAD_FUNC(uxtheme, GetThemeColor); // initialize helper function for disabled text - if (ALF_Compat_IsMinWindowsVersion(4, 0)) { + if (ALF_Compat_Is40()) { if (GetSystemMetrics(SM_SLOWMACHINE)) { ALF_Compat_DrawDisabledText = ALF_Compat_DrawDisabledTextSolid; } else { -- cgit v1.2.3