From eeae4512ae6b5286aff600d82e612fc10fef5a76 Mon Sep 17 00:00:00 2001 From: PeterN Date: Sat, 23 Feb 2019 16:07:25 +0000 Subject: [PATCH] Fix #7003: Freetype fonts were scaled by both GUI and Font zoom levels. (#7267) --- src/fontcache.cpp | 14 ++++++-------- src/zoom_func.h | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 9b732ce1ed..604cc7374e 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -184,12 +184,12 @@ uint SpriteFontCache::GetGlyphWidth(GlyphID key) { SpriteID sprite = this->GetUnicodeGlyph(key); if (sprite == 0) sprite = this->GetUnicodeGlyph('?'); - return SpriteExists(sprite) ? GetSprite(sprite, ST_FONT)->width + ScaleGUITrad(this->fs != FS_NORMAL ? 1 : 0) : 0; + return SpriteExists(sprite) ? GetSprite(sprite, ST_FONT)->width + ScaleFontTrad(this->fs != FS_NORMAL ? 1 : 0) : 0; } int SpriteFontCache::GetHeight() const { - return this->height * (1 << (ZOOM_LVL_OUT_4X - _font_zoom)); + return ScaleFontTrad(this->height); } bool SpriteFontCache::GetDrawGlyphShadow() @@ -282,21 +282,19 @@ void FreeTypeFontCache::SetFontSize(FontSize fs, FT_Face face, int pixels) { if (pixels == 0) { /* Try to determine a good height based on the minimal height recommended by the font. */ - int scaled_height = ScaleGUITrad(_default_font_height[this->fs]); + int scaled_height = ScaleFontTrad(_default_font_height[this->fs]); pixels = scaled_height; TT_Header *head = (TT_Header *)FT_Get_Sfnt_Table(this->face, ft_sfnt_head); if (head != NULL) { /* Font height is minimum height plus the difference between the default * height for this font size and the small size. */ - int diff = scaled_height - ScaleGUITrad(_default_font_height[FS_SMALL]); + int diff = scaled_height - ScaleFontTrad(_default_font_height[FS_SMALL]); pixels = Clamp(min(head->Lowest_Rec_PPEM, 20) + diff, scaled_height, MAX_FONT_SIZE); } + } else { + pixels = ScaleFontTrad(pixels); } - - /* Apply user-specified font zoom. */ - pixels *= (1 << (ZOOM_LVL_OUT_4X - _font_zoom)); - this->used_size = pixels; FT_Error err = FT_Set_Pixel_Sizes(this->face, 0, pixels); diff --git a/src/zoom_func.h b/src/zoom_func.h index da266e35c6..0e8fa8c9ef 100644 --- a/src/zoom_func.h +++ b/src/zoom_func.h @@ -84,4 +84,24 @@ static inline int ScaleGUITrad(int value) return UnScaleGUI(value * ZOOM_LVL_BASE); } +/** + * Short-hand to apply font zoom level. + * @param value Pixel amount at #ZOOM_LVL_BEGIN (full zoom in). + * @return Pixel amount at #ZOOM_LVL_FONT (current interface size). + */ +static inline int UnScaleFont(int value) +{ + return UnScaleByZoom(value, ZOOM_LVL_FONT); +} + +/** + * Scale traditional pixel dimensions to Font zoom level. + * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). + * @return Pixel amount at #ZOOM_LVL_FONT (current interface size). + */ +static inline int ScaleFontTrad(int value) +{ + return UnScaleFont(value * ZOOM_LVL_BASE); +} + #endif /* ZOOM_FUNC_H */