From ea65ede572f48de1bfca159ead54a47b28f3d016 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 May 2024 11:16:13 +0530 Subject: [PATCH] fontconfig: Lift axes spec to named style --- kitty/fonts/fontconfig.py | 12 ++++++++++++ kitty_tests/fonts.py | 26 +++++++++++++++++--------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/kitty/fonts/fontconfig.py b/kitty/fonts/fontconfig.py index 0eb6a3988..e4d92b1fb 100644 --- a/kitty/fonts/fontconfig.py +++ b/kitty/fonts/fontconfig.py @@ -180,6 +180,17 @@ def set_named_style(name: str, font: FontConfigPattern, vd: VariableData) -> boo return False +def lift_axes_to_named_style_if_possible(font: FontConfigPattern, vd: VariableData) -> bool: + axes = font.get('axes', tuple(ax['default'] for ax in vd['axes'])) + q = {vd['axes'][i]['tag']: val for i, val in enumerate(axes)} + for i, ns in enumerate(vd['named_styles']): + if ns['axis_values'] == q: + font.pop('axes', None) + font['named_style'] = i + return True + return False + + def set_axis_values(tag_map: Dict[str, float], font: FontConfigPattern, vd: VariableData) -> bool: axes = list(font.get('axes', ())) or [ax['default'] for ax in vd['axes']] changed = False @@ -190,4 +201,5 @@ def set_axis_values(tag_map: Dict[str, float], font: FontConfigPattern, vd: Vari axes[i] = val if changed: font['axes'] = tuple(axes) + lift_axes_to_named_style_if_possible(font, vd) return changed diff --git a/kitty_tests/fonts.py b/kitty_tests/fonts.py index 26cc6b3b7..ea70f5282 100644 --- a/kitty_tests/fonts.py +++ b/kitty_tests/fonts.py @@ -26,18 +26,26 @@ class Selection(BaseTest): fonts_map = all_fonts_map(monospaced=True) family_map = fonts_map['family_map'] variable_map = fonts_map['variable_map'] - def a(family: str, *expected: str) -> None: + has_source_code_pro = family_name_to_key('Source Code Pro') in family_map + has_source_code_vf = family_name_to_key('sourcecodeVf') in variable_map + del fonts_map, family_map, variable_map + + def s(family: str, *expected: str) -> None: opts.font_family = parse_font_spec(family) ff = get_font_files(opts) actual = tuple(face_from_descriptor(ff[x]).postscript_name() for x in ('medium', 'bold', 'italic', 'bi')) # type: ignore - self.assertEqual(expected, actual) - def t(family: str, *expected: str) -> None: - a(family, *expected) - a(f'family="{family}"', *expected) - if family_name_to_key('Source Code Pro') in family_map: - t('Source Code Pro', 'SourceCodePro-Regular', 'SourceCodePro-Bold', 'SourceCodePro-It', 'SourceCodePro-BoldIt') - if family_name_to_key('sourcecodeVf') in variable_map: - a('sourcecodeVf', 'SourceCodeVF-Regular', 'SourceCodeVF-Bold', 'SourceCodeVF-Italic', 'SourceCodeVF-BoldItalic') + with self.subTest(spec=family): + self.ae(expected, actual) + + def both(family: str, *expected: str) -> None: + for family in (family, f'family="{family}"'): + s(family, *expected) + + if has_source_code_pro: + both('Source Code Pro', 'SourceCodePro-Regular', 'SourceCodePro-Bold', 'SourceCodePro-It', 'SourceCodePro-BoldIt') + if has_source_code_vf: + s('sourcecodeVf', 'SourceCodeVF-Regular', 'SourceCodeVF-Bold', 'SourceCodeVF-Italic', 'SourceCodeVF-BoldItalic') + s('family=sourcecodeVf', 'SourceCodeVF-Regular', 'SourceCodeVF-Semibold', 'SourceCodeVF-Italic', 'SourceCodeVF-SemiboldItalic') class Rendering(BaseTest):