diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py index 54a18d96d3..f09344a9e2 100644 --- a/system/ui/lib/application.py +++ b/system/ui/lib/application.py @@ -14,7 +14,7 @@ from typing import NamedTuple from importlib.resources import as_file, files from openpilot.common.swaglog import cloudlog from openpilot.system.hardware import HARDWARE, PC, TICI -from openpilot.system.ui.lib.multilang import TRANSLATIONS_DIR, multilang +from openpilot.system.ui.lib.multilang import TRANSLATIONS_DIR, UNIFONT_LANGUAGES, multilang from openpilot.common.realtime import Ratekeeper _DEFAULT_FPS = int(os.getenv("FPS", 20 if TICI else 60)) @@ -363,33 +363,48 @@ class GuiApplication: # Create a character set from our keyboard layouts from openpilot.system.ui.widgets.keyboard import KEYBOARD_LAYOUTS - all_chars = set() + base_chars = set() for layout in KEYBOARD_LAYOUTS.values(): - all_chars.update(key for row in layout for key in row) - all_chars |= set("–‑✓×°§•") + base_chars.update(key for row in layout for key in row) + base_chars |= set("–‑✓×°§•") # Load only the characters used in translations + unifont_chars = set(base_chars) for language, code in multilang.languages.items(): - all_chars |= set(language) + unifont_chars |= set(language) try: with open(os.path.join(TRANSLATIONS_DIR, f"app_{code}.po")) as f: - all_chars |= set(f.read()) + lang_chars = set(f.read()) + if code in UNIFONT_LANGUAGES: + unifont_chars |= lang_chars + else: + base_chars |= lang_chars except FileNotFoundError: cloudlog.warning(f"Translation file for language '{code}' not found when loading fonts.") - all_chars = "".join(all_chars) - cloudlog.debug(f"Loading fonts with {len(all_chars)} glyphs.") + base_chars = "".join(base_chars) + cloudlog.debug(f"Loading fonts with {len(base_chars)} glyphs.") + + unifont_chars = "".join(unifont_chars) + cloudlog.debug(f"Loading unifont with {len(unifont_chars)} glyphs.") - codepoint_count = rl.ffi.new("int *", 1) - codepoints = rl.load_codepoints(all_chars, codepoint_count) + base_codepoint_count = rl.ffi.new("int *", 1) + base_codepoints = rl.load_codepoints(base_chars, base_codepoint_count) + + unifont_codepoint_count = rl.ffi.new("int *", 1) + unifont_codepoints = rl.load_codepoints(unifont_chars, unifont_codepoint_count) for font_weight_file in FontWeight: with as_file(FONT_DIR.joinpath(font_weight_file)) as fspath: - font = rl.load_font_ex(fspath.as_posix(), 200, codepoints, codepoint_count[0]) + if font_weight_file == FontWeight.UNIFONT: + font = rl.load_font_ex(fspath.as_posix(), 200, unifont_codepoints, unifont_codepoint_count[0]) + else: + font = rl.load_font_ex(fspath.as_posix(), 200, base_codepoints, base_codepoint_count[0]) rl.set_texture_filter(font.texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) self._fonts[font_weight_file] = font - rl.unload_codepoints(codepoints) + rl.unload_codepoints(base_codepoints) + rl.unload_codepoints(unifont_codepoints) rl.gui_set_font(self._fonts[FontWeight.NORMAL]) def _set_styles(self):