diff options
author | Ken Takata <kentkt@csc.jp> | 2023-10-05 20:20:58 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-10-05 20:20:58 +0200 |
commit | da5da654deb46a1432de26c7e02e7eba64c122f3 (patch) | |
tree | befea9fd3ee283738e296c43ad444d6201b8478a | |
parent | c661e11e9cc24fac752afc56d2a691ca03def8cc (diff) |
patch 9.0.1987: win32: font-size calculation can be improvedv9.0.1987
Problem: win32: font-size calculation can be improved
Solution: calculate font size before the window size
Support calculating the new size even if a bitmap font is used.
Calculate the new font size before actually change the Window size.
closes: #13280
related: #11812, #13252
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Ken Takata <kentkt@csc.jp>
-rw-r--r-- | src/gui_w32.c | 48 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 40 insertions, 10 deletions
diff --git a/src/gui_w32.c b/src/gui_w32.c index 85adec67e9..eb4c841388 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -1588,7 +1588,7 @@ GetAverageFontSize(HDC hdc, SIZE *size) * Get the character size of a font. */ static void -GetFontSize(GuiFont font) +GetFontSize(GuiFont font, int *char_width, int *char_height) { HWND hwnd = GetDesktopWindow(); HDC hdc = GetWindowDC(hwnd); @@ -1599,8 +1599,10 @@ GetFontSize(GuiFont font) GetTextMetrics(hdc, &tm); GetAverageFontSize(hdc, &size); - gui.char_width = size.cx + tm.tmOverhang; - gui.char_height = tm.tmHeight + p_linespace; + if (char_width) + *char_width = size.cx + tm.tmOverhang; + if (char_height) + *char_height = tm.tmHeight + p_linespace; SelectFont(hdc, hfntOld); @@ -1608,12 +1610,21 @@ GetFontSize(GuiFont font) } /* + * Update the character size in "gui" structure with the specified font. + */ + static void +UpdateFontSize(GuiFont font) +{ + GetFontSize(font, &gui.char_width, &gui.char_height); +} + +/* * Adjust gui.char_height (after 'linespace' was changed). */ int gui_mch_adjust_charheight(void) { - GetFontSize(gui.norm_font); + UpdateFontSize(gui.norm_font); return OK; } @@ -3517,7 +3528,7 @@ gui_mch_init_font(char_u *font_name, int fontset UNUSED) gui_mch_free_font(gui.norm_font); gui.norm_font = font; current_font_height = lfOrig.lfHeight; - GetFontSize(font); + UpdateFontSize(font); p = logfont2name(lfOrig); if (p != NULL) @@ -4742,16 +4753,33 @@ _OnMenuSelect(HWND hwnd, WPARAM wParam, LPARAM lParam) static BOOL _OnGetDpiScaledSize(HWND hwnd, UINT dpi, SIZE *size) { + int old_width, old_height; + int new_width, new_height; + LOGFONTW lf; + HFONT font; + //TRACE("DPI: %d, SIZE=(%d,%d), s_dpi: %d", dpi, size->cx, size->cy, s_dpi); // Calculate new approximate size. - // FIXME: If a bitmap font (e.g. FixedSys) is used, the font size may not - // be changed. In that case, the calculated size can be wrong. - size->cx = size->cx * dpi / s_dpi; - size->cy = size->cy * dpi / s_dpi; + GetFontSize(gui.norm_font, &old_width, &old_height); // Current size + GetObjectW((HFONT)gui.norm_font, sizeof(lf), &lf); + lf.lfHeight = lf.lfHeight * (int)dpi / s_dpi; + font = CreateFontIndirectW(&lf); + if (font) + { + GetFontSize((GuiFont)font, &new_width, &new_height); // New size + DeleteFont(font); + } + else + { + new_width = old_width; + new_height = old_height; + } + size->cx = size->cx * new_width / old_width; + size->cy = size->cy * new_height / old_height; //TRACE("New approx. SIZE=(%d,%d)", size->cx, size->cy); - return FALSE; + return TRUE; } static LRESULT diff --git a/src/version.c b/src/version.c index c93b3e582d..f60f582967 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1987, +/**/ 1986, /**/ 1985, |