diff options
author | sfan5 <sfan5@live.de> | 2020-04-11 20:03:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-11 20:03:59 +0200 |
commit | 40df3931d882daaeee42c8de69882b9f9df5c312 (patch) | |
tree | ac8b12c279a164ea619788192494f8ff63da2060 | |
parent | 5cc06e4748a82acb36310fee89e72f30b2b35a36 (diff) | |
download | minetest-40df3931d882daaeee42c8de69882b9f9df5c312.tar.gz minetest-40df3931d882daaeee42c8de69882b9f9df5c312.tar.bz2 minetest-40df3931d882daaeee42c8de69882b9f9df5c312.zip |
Implement DPI scaling for Windows (#9586)
-rw-r--r-- | misc/minetest.exe.manifest | 4 | ||||
-rw-r--r-- | misc/winresource.rc | 6 | ||||
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/client/renderingengine.cpp | 77 | ||||
-rw-r--r-- | src/constants.h | 5 |
5 files changed, 69 insertions, 25 deletions
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 @@ </security> </trustInfo> <application xmlns="urn:schemas-microsoft-com:asm.v3"> - <windowsSettings> - <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> + <windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> + <dpiAware>true</dpiAware> </windowsSettings> </application> </assembly> 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 <windows.h>
+#include <winuser.h>
#include <commctrl.h>
#include <richedit.h>
+
#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 <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> +#endif +#ifdef _WIN32 +#include <windows.h> +#include <winuser.h> #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<HWND>(exposedData.D3D8.HWnd); + break; + case video::EDT_DIRECT3D9: + hWnd = reinterpret_cast<HWND>(exposedData.D3D9.HWnd); + break; + case video::EDT_OPENGL: + hWnd = reinterpret_cast<HWND>(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<HWND>(exposedData.D3D8.HWnd); - break; - case video::EDT_DIRECT3D9: - hWnd = reinterpret_cast<HWND>(exposedData.D3D9.HWnd); - break; - case video::EDT_OPENGL: - hWnd = reinterpret_cast<HWND>(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) |