From: sfan5 Date: Sat, 11 Apr 2020 18:03:59 +0000 (+0200) Subject: Implement DPI scaling for Windows (#9586) X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=40df3931d882daaeee42c8de69882b9f9df5c312;p=oweals%2Fminetest.git Implement DPI scaling for Windows (#9586) --- diff --git a/misc/minetest.exe.manifest b/misc/minetest.exe.manifest index 3c32b0f8b..18f8c85f4 100644 --- a/misc/minetest.exe.manifest +++ b/misc/minetest.exe.manifest @@ -8,8 +8,8 @@ - - true + + true diff --git a/misc/winresource.rc b/misc/winresource.rc index e1e82581b..ffb493873 100644 --- a/misc/winresource.rc +++ b/misc/winresource.rc @@ -1,6 +1,8 @@ #include +#include #include #include + #ifndef USE_CMAKE_CONFIG_H #define USE_CMAKE_CONFIG_H #endif @@ -13,6 +15,10 @@ #define BUILDMODE "RUN_IN_PLACE=0" #endif +#ifdef __MINGW32__ +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "minetest.exe.manifest" +#endif + LANGUAGE 0, SUBLANG_NEUTRAL 130 ICON "minetest-icon.ico" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0ebbd628c..0b550c09c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -451,7 +451,7 @@ if(WIN32) -i${WINRESOURCE_FILE} -o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${WINRESOURCE_FILE}) + DEPENDS ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE}) SET(extra_windows_SRCS ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o) else(MINGW) # Probably MSVC set(extra_windows_SRCS ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE}) diff --git a/src/client/renderingengine.cpp b/src/client/renderingengine.cpp index 8b7bbf328..eae6ca7d3 100644 --- a/src/client/renderingengine.cpp +++ b/src/client/renderingengine.cpp @@ -45,7 +45,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#endif +#ifdef _WIN32 +#include +#include #endif #if ENABLE_GLES @@ -318,6 +322,28 @@ void RenderingEngine::setupTopLevelXorgWindow(const std::string &name) #endif } +#ifdef _WIN32 +static bool getWindowHandle(irr::video::IVideoDriver *driver, HWND &hWnd) +{ + const video::SExposedVideoData exposedData = driver->getExposedVideoData(); + + switch (driver->getDriverType()) { + case video::EDT_DIRECT3D8: + hWnd = reinterpret_cast(exposedData.D3D8.HWnd); + break; + case video::EDT_DIRECT3D9: + hWnd = reinterpret_cast(exposedData.D3D9.HWnd); + break; + case video::EDT_OPENGL: + hWnd = reinterpret_cast(exposedData.OpenGLWin32.HWnd); + break; + default: + return false; + } + + return true; +} +#endif bool RenderingEngine::setWindowIcon() { @@ -335,22 +361,9 @@ bool RenderingEngine::setWindowIcon() "-xorg-icon-128.png"); #endif #elif defined(_WIN32) - const video::SExposedVideoData exposedData = driver->getExposedVideoData(); HWND hWnd; // Window handle - - switch (driver->getDriverType()) { - case video::EDT_DIRECT3D8: - hWnd = reinterpret_cast(exposedData.D3D8.HWnd); - break; - case video::EDT_DIRECT3D9: - hWnd = reinterpret_cast(exposedData.D3D9.HWnd); - break; - case video::EDT_OPENGL: - hWnd = reinterpret_cast(exposedData.OpenGLWin32.HWnd); - break; - default: + if (!getWindowHandle(driver, hWnd)) return false; - } // Load the ICON from resource file const HICON hicon = LoadIcon(GetModuleHandle(NULL), @@ -632,7 +645,7 @@ const char *RenderingEngine::getVideoDriverFriendlyName(irr::video::E_DRIVER_TYP } #ifndef __ANDROID__ -#ifdef XORG_USED +#if defined(XORG_USED) static float calcDisplayDensity() { @@ -667,12 +680,42 @@ float RenderingEngine::getDisplayDensity() return cached_display_density; } -#else // XORG_USED +#elif defined(_WIN32) + + +static float calcDisplayDensity(irr::video::IVideoDriver *driver) +{ + HWND hWnd; + if (getWindowHandle(driver, hWnd)) { + HDC hdc = GetDC(hWnd); + float dpi = GetDeviceCaps(hdc, LOGPIXELSX); + ReleaseDC(hWnd, hdc); + return dpi / 96.0f; + } + + /* return manually specified dpi */ + return g_settings->getFloat("screen_dpi") / 96.0f; +} + +float RenderingEngine::getDisplayDensity() +{ + static bool cached = false; + static float display_density; + if (!cached) { + display_density = calcDisplayDensity(get_video_driver()); + cached = true; + } + return display_density; +} + +#else + float RenderingEngine::getDisplayDensity() { return g_settings->getFloat("screen_dpi") / 96.0; } -#endif // XORG_USED + +#endif v2u32 RenderingEngine::getDisplaySize() { diff --git a/src/constants.h b/src/constants.h index 7636b38e0..0a8b22e15 100644 --- a/src/constants.h +++ b/src/constants.h @@ -110,10 +110,5 @@ with this program; if not, write to the Free Software Foundation, Inc., GUI related things */ -// TODO: implement dpi-based scaling for windows and remove this hack -#if defined(_WIN32) -#define TTF_DEFAULT_FONT_SIZE (18) -#else #define TTF_DEFAULT_FONT_SIZE (16) -#endif #define DEFAULT_FONT_SIZE (10)