From d068a0a6de180e3b31656a878b1a18110ed9d8b0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 29 Jan 2025 17:43:11 +0530 Subject: [PATCH] Add basic colrv1 rendering test --- kitty/fonts/render.py | 19 +++++++++++-------- kitty_tests/fonts.py | 10 +++++++++- kitty_tests/twemoji_smiley-cff2_colr_1.otf | Bin 0 -> 5324 bytes 3 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 kitty_tests/twemoji_smiley-cff2_colr_1.otf diff --git a/kitty/fonts/render.py b/kitty/fonts/render.py index 4ac8990d2..5cd0dc6a5 100644 --- a/kitty/fonts/render.py +++ b/kitty/fonts/render.py @@ -36,6 +36,9 @@ if is_macos: else: from .fontconfig import font_for_family as font_for_family_fontconfig +if TYPE_CHECKING: + from kitty.fast_data_types import CTFace, Face + FontObject = Union[CoreTextFont, FontConfigPattern] current_faces: list[tuple[FontObject, bool, bool]] = [] builtin_nerd_font_descriptor: FontObject | None = None @@ -354,15 +357,15 @@ def showcase() -> None: test_render_string('A=>>B!=C', family='Fira Code') +def create_face(path: str) -> 'Union[CTFace, Face]': + if is_macos: + from kitty.fast_data_types import CTFace + return CTFace(path=path) + from kitty.fast_data_types import Face + return Face(path=path) + + def test_render_codepoint(char: str = '😺', path: str = '/t/Noto-COLRv1.ttf', font_size: float = 160.0) -> None: - if TYPE_CHECKING: - from kitty.fast_data_types import CTFace, Face - def create_face(path: str) -> 'Union[CTFace, Face]': - if is_macos: - from kitty.fast_data_types import CTFace - return CTFace(path=path) - from kitty.fast_data_types import Face - return Face(path=path) f = create_face(path=path) f.set_size(font_size, 96, 96) bitmap, w, h = f.render_codepoint(ord(char)) diff --git a/kitty_tests/fonts.py b/kitty_tests/fonts.py index e2c9d41dd..4a373c6de 100644 --- a/kitty_tests/fonts.py +++ b/kitty_tests/fonts.py @@ -25,7 +25,7 @@ from kitty.fast_data_types import ( ) from kitty.fonts import family_name_to_key from kitty.fonts.common import FontSpec, all_fonts_map, face_from_descriptor, get_font_files, get_named_style, spec_for_face -from kitty.fonts.render import coalesce_symbol_maps, render_string, setup_for_testing, shape_string +from kitty.fonts.render import coalesce_symbol_maps, create_face, render_string, setup_for_testing, shape_string from kitty.options.types import Options from . import BaseTest, draw_multicell @@ -340,6 +340,14 @@ class Rendering(FontBaseTest): cells = render_string(text)[-1] self.ae(len(cells), sz) + def test_rendering_colrv1(self): + f = create_face(self.path_for_font('twemoji_smiley-cff2_colr_1.otf')) + f.set_size(64, 96, 96) + for char in '😁😇😈': + _, w, h = f.render_codepoint(ord(char)) + self.assertGreater(w, 64) + self.assertGreater(h, 64) + def test_shaping(self): def ss(text, font=None): diff --git a/kitty_tests/twemoji_smiley-cff2_colr_1.otf b/kitty_tests/twemoji_smiley-cff2_colr_1.otf new file mode 100644 index 0000000000000000000000000000000000000000..35a865bef0786a31363ee419e28cbcf70fd22e26 GIT binary patch literal 5324 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 literal 0 HcmV?d00001