Improve font fallback checking

This commit is contained in:
James R. Barlow
2026-01-21 10:38:07 -08:00
parent b386d39b3b
commit d951b4f0f7
2 changed files with 22 additions and 11 deletions
+18 -7
View File
@@ -153,10 +153,12 @@ class MultiFontManager:
self.font_provider = font_provider
else:
# Use chained provider: try builtin fonts first, then system fonts
self.font_provider = ChainedFontProvider([
BuiltinFontProvider(font_dir),
SystemFontProvider(),
])
self.font_provider = ChainedFontProvider(
[
BuiltinFontProvider(font_dir),
SystemFontProvider(),
]
)
# Font selection cache: (word_text, language) -> font_name
self._selection_cache: dict[tuple[str, str | None], str] = {}
@@ -235,9 +237,7 @@ class MultiFontManager:
self._selection_cache[cache_key] = 'Occulta'
return self.font_provider.get_fallback_font()
def _warn_missing_font(
self, word_text: str, line_language: str | None
) -> None:
def _warn_missing_font(self, word_text: str, line_language: str | None) -> None:
"""Warn user about missing font for non-Latin text.
Only warns once per language/script to avoid log spam.
@@ -294,6 +294,17 @@ class MultiFontManager:
return True
def has_font(self, font_name: str) -> bool:
"""Check if a named font is available.
Args:
font_name: Name of font to check
Returns:
True if font is available
"""
return self.font_provider.get_font(font_name) is not None
def has_all_glyphs(self, font_name: str, text: str) -> bool:
"""Check if a named font has glyphs for all characters in text.
+4 -4
View File
@@ -210,22 +210,22 @@ class TestArabicScript:
def _latin_font_works(multi_font_manager) -> bool:
"""Check if Latin font is available."""
return multi_font_manager.has_all_glyphs('NotoSans-Regular', 'A')
return multi_font_manager.has_font('NotoSans-Regular')
def _arabic_font_works(multi_font_manager) -> bool:
"""Check if Arabic font is available."""
return multi_font_manager.has_all_glyphs('NotoSansArabic-Regular', 'م')
return multi_font_manager.has_font('NotoSansArabic-Regular')
def _devanagari_font_works(multi_font_manager) -> bool:
"""Check if Devanagari font is available."""
return multi_font_manager.has_all_glyphs('NotoSansDevanagari-Regular', '')
return multi_font_manager.has_font('NotoSansDevanagari-Regular')
def _cjk_font_works(multi_font_manager) -> bool:
"""Check if CJK font is working (not corrupted)."""
return multi_font_manager.has_all_glyphs('NotoSansCJK-Regular', '')
return multi_font_manager.has_font('NotoSansCJK-Regular')
class TestCJKScript: