bowser/src/render/fonts.py
Benedikt Willi c9ef5e5c44 Refactor test files to remove unnecessary imports and improve readability
- Removed unused imports from various test files to streamline code.
- Cleaned up whitespace in test cases for better consistency.
- Updated dependency management in `uv.lock` to reflect changes in optional dependencies.
- Ensured all tests maintain functionality while enhancing clarity and organization.
2026-01-12 10:22:34 +01:00

58 lines
1.8 KiB
Python

"""Font management with Skia."""
import skia
class FontCache:
"""Cache for Skia fonts and typefaces."""
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance._font_cache = {}
cls._instance._default_typeface = None
return cls._instance
def get_typeface(self):
"""Get the default typeface, creating it if needed."""
if self._default_typeface is None:
self._default_typeface = skia.Typeface.MakeDefault()
return self._default_typeface
def get_font(self, size: int, weight: str = "normal", style: str = "normal") -> skia.Font:
"""Get a cached Skia font for the given parameters."""
key = (size, weight, style)
if key not in self._font_cache:
typeface = self.get_typeface()
self._font_cache[key] = skia.Font(typeface, size)
return self._font_cache[key]
def measure_text(self, text: str, font: skia.Font) -> float:
"""Measure the width of text using the given font."""
return font.measureText(text)
def get_line_height(self, font_size: int) -> float:
"""Get the line height for a given font size."""
return font_size * 1.4
# Global font cache instance
_font_cache = FontCache()
def get_font(size: int, weight: str = "normal", style: str = "normal") -> skia.Font:
"""Get a cached font."""
return _font_cache.get_font(size, weight, style)
def measure_text(text: str, size: int) -> float:
"""Measure text width at given font size."""
font = get_font(size)
return _font_cache.measure_text(text, font)
def linespace(font_size: int) -> float:
"""Get line height for font size."""
return _font_cache.get_line_height(font_size)