# HG changeset patch # User Christian Brabandt # Date 1696530610 -7200 # Node ID 34d6ba6b0a824279fdd809090ce0e25474cfabae # Parent 57667dcb195b7c8c19193f8a87f809f27e2f35e8 patch 9.0.1987: win32: font-size calculation can be improved Commit: https://github.com/vim/vim/commit/da5da654deb46a1432de26c7e02e7eba64c122f3 Author: Ken Takata Date: Thu Oct 5 20:20:58 2023 +0200 patch 9.0.1987: win32: font-size calculation can be improved 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 Co-authored-by: Ken Takata diff --git a/src/gui_w32.c b/src/gui_w32.c --- 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 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 @@ destroy_sizing_tip(void) 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 --- 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,