From 429a83d3eb36654a0293994a2201038765cb43e4 Mon Sep 17 00:00:00 2001 From: driver1998 Date: Wed, 2 Sep 2020 11:26:26 +0800 Subject: [PATCH] Enable DPI scaling of emulated screen --- src/include/86box/resource.h | 1 + src/win/86Box.rc | 1 + src/win/win_ui.c | 28 +++++++++++++++++++++++++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index b2c4810f6..b0422d18b 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -296,6 +296,7 @@ #define IDM_VID_SCALE_2X 40056 #define IDM_VID_SCALE_3X 40057 #define IDM_VID_SCALE_4X 40058 +#define IDM_VID_HIDPI 40059 #define IDM_VID_FULLSCREEN 40060 #define IDM_VID_FS_FULL 40061 #define IDM_VID_FS_43 40062 diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 845b65844..2d408cc9d 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -80,6 +80,7 @@ BEGIN MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X END + MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI MENUITEM SEPARATOR MENUITEM "&Fullscreen\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN POPUP "Fullscreen &stretch mode" diff --git a/src/win/win_ui.c b/src/win/win_ui.c index c72c83b0c..51f9ab77a 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -226,6 +226,7 @@ ResetAllMenus(void) CheckMenuItem(menuMain, IDM_VID_SCALE_1X+1, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X+2, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X+3, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_HIDPI, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_CGACON, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_GRAYCT_601+0, MF_UNCHECKED); @@ -275,6 +276,7 @@ ResetAllMenus(void) CheckMenuItem(menuMain, IDM_VID_FS_FULL+video_fullscreen_scale, MF_CHECKED); CheckMenuItem(menuMain, IDM_VID_REMEMBER, window_remember?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X+scale, MF_CHECKED); + CheckMenuItem(menuMain, IDM_VID_HIDPI, dpi_scale?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_CGACON, vid_cga_contrast?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_GRAYCT_601+video_graytype, MF_CHECKED); @@ -453,15 +455,23 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) else SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | WS_VISIBLE); + /* scale the screen base on DPI */ + if (dpi_scale) { + temp_x = MulDiv(unscaled_size_x, dpi, 96); + temp_y = MulDiv(unscaled_size_y, dpi, 96); + } else { + temp_x = unscaled_size_x; + temp_y = unscaled_size_y; + } /* Main Window. */ - ResizeWindowByClientArea(hwnd, unscaled_size_x, unscaled_size_y + sbar_height); + ResizeWindowByClientArea(hwnd, temp_x, temp_y + sbar_height); /* Render window. */ - MoveWindow(hwndRender, 0, 0, unscaled_size_x, unscaled_size_y, TRUE); + MoveWindow(hwndRender, 0, 0, temp_x, temp_y, TRUE); GetWindowRect(hwndRender, &rect); /* Status bar. */ - MoveWindow(hwndSBAR, 0, rect.bottom, unscaled_size_x, 17, TRUE); + MoveWindow(hwndSBAR, 0, rect.bottom, temp_x, 17, TRUE); if (mouse_capture) { ClipCursor(&rect); @@ -535,6 +545,13 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) config_save(); break; + case IDM_VID_HIDPI: + dpi_scale = !dpi_scale; + CheckMenuItem(hmenu, IDM_VID_HIDPI, dpi_scale ? MF_CHECKED : MF_UNCHECKED); + doresize = 1; + config_save(); + break; + case IDM_VID_FORCE43: video_toggle_option(hmenu, &force_43, IDM_VID_FORCE43); video_force_resize_set(1); @@ -1280,6 +1297,11 @@ plat_resize(int x, int y) video_wait_for_blit(); + /* scale the screen base on DPI */ + if (dpi_scale) { + x = MulDiv(x, dpi, 96); + y = MulDiv(y, dpi, 96); + } ResizeWindowByClientArea(hwndMain, x, y + sbar_height); MoveWindow(hwndRender, 0, 0, x, y, TRUE);