diff --git a/font.c b/font.c index 692e82d5..049a3be8 100644 --- a/font.c +++ b/font.c @@ -4,9 +4,12 @@ #include #include #include +#include #include #include +#include + #define LOG_MODULE "font" #define LOG_ENABLE_DBG 0 #include "log.h" @@ -35,6 +38,43 @@ fini(void) FcFini(); } +static void +underline_strikeout_metrics(struct font *font) +{ + FT_Face ft_face = font->face; + double x_scale = ft_face->size->metrics.x_scale / 65526.; + double height = ft_face->size->metrics.height / 64; + double descent = ft_face->size->metrics.descender / 64; + + LOG_DBG("ft: x-scale: %f, height: %f, descent: %f", + x_scale, height, descent); + + font->underline.position = round(ft_face->underline_position * x_scale / 64.); + font->underline.thickness = ceil(ft_face->underline_thickness * x_scale / 64.); + + if (font->underline.position == 0.) { + font->underline.position = round(descent / 2.); + font->underline.thickness = fabs(round(descent / 5.)); + } + + LOG_DBG("underline: pos=%d, thick=%d", + font->underline.position, font->underline.thickness); + + TT_OS2 *os2 = FT_Get_Sfnt_Table(ft_face, ft_sfnt_os2); + if (os2 != NULL) { + font->strikeout.position = round(os2->yStrikeoutPosition * x_scale / 64.); + font->strikeout.thickness = ceil(os2->yStrikeoutSize * x_scale / 64.); + } + + if (font->strikeout.position == 0.) { + font->strikeout.position = round(height / 2. + descent); + font->strikeout.thickness = font->underline.thickness; + } + + LOG_DBG("strikeout: pos=%d, thick=%d", + font->strikeout.position, font->strikeout.thickness); +} + static bool from_font_set(FcPattern *pattern, FcFontSet *fonts, int start_idx, const font_list_t *fallbacks, const char *attributes, struct font *font, bool is_fallback) @@ -196,6 +236,7 @@ from_font_set(FcPattern *pattern, FcFontSet *fonts, int start_idx, const font_li } } + underline_strikeout_metrics(font); return true; } diff --git a/main.c b/main.c index b25799ec..0f93e188 100644 --- a/main.c +++ b/main.c @@ -17,7 +17,6 @@ #include #include -#include #include #include #include @@ -635,48 +634,6 @@ main(int argc, char *const *argv) tll_free(font_names); - /* Underline position and size */ - for (size_t i = 0; i < sizeof(term.fonts) / sizeof(term.fonts[0]); i++) { - struct font *f = &term.fonts[i]; - - if (f->face == NULL) - continue; - - FT_Face ft_face = f->face; - - double x_scale = ft_face->size->metrics.x_scale / 65526.; - double height = ft_face->size->metrics.height / 64; - double descent = ft_face->size->metrics.descender / 64; - - LOG_DBG("ft: x-scale: %f, height: %f, descent: %f", - x_scale, height, descent); - - f->underline.position = round(ft_face->underline_position * x_scale / 64.); - f->underline.thickness = ceil(ft_face->underline_thickness * x_scale / 64.); - - if (f->underline.position == 0.) { - f->underline.position = round(descent / 2.); - f->underline.thickness = fabs(round(descent / 5.)); - } - - LOG_DBG("underline: pos=%d, thick=%d", - f->underline.position, f->underline.thickness); - - TT_OS2 *os2 = FT_Get_Sfnt_Table(ft_face, ft_sfnt_os2); - if (os2 != NULL) { - f->strikeout.position = round(os2->yStrikeoutPosition * x_scale / 64.); - f->strikeout.thickness = ceil(os2->yStrikeoutSize * x_scale / 64.); - } - - if (f->strikeout.position == 0.) { - f->strikeout.position = round(height / 2. + descent); - f->strikeout.thickness = f->underline.thickness; - } - - LOG_DBG("strikeout: pos=%d, thick=%d", - f->strikeout.position, f->strikeout.thickness); - } - { FT_Face ft_face = term.fonts[0].face; int max_x_advance = ft_face->size->metrics.max_advance / 64;