mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-03 20:42:09 +08:00
a0d48b6c63
* add rest of langs * unifont * all langs are supported * add japanese translations * fix strip! * add language name chars * use unifont in lang selection * add korean * test all langs * doesn't work * unifont font fallback for multilang * add ar translations * fix labels not updating until scrolling * t chinese * more chn * we already default * wrap * update * fix thai * fix missing chinese langs and all are supported! * clean up * update * ??? mypy r u ok ??? * fix default option font weight
35 lines
1.1 KiB
Python
35 lines
1.1 KiB
Python
import pyray as rl
|
|
from openpilot.system.ui.lib.application import FONT_SCALE, font_fallback
|
|
from openpilot.system.ui.lib.emoji import find_emoji
|
|
|
|
_cache: dict[int, rl.Vector2] = {}
|
|
|
|
|
|
def measure_text_cached(font: rl.Font, text: str, font_size: int, spacing: int = 0) -> rl.Vector2:
|
|
"""Caches text measurements to avoid redundant calculations."""
|
|
font = font_fallback(font)
|
|
key = hash((font.texture.id, text, font_size, spacing))
|
|
if key in _cache:
|
|
return _cache[key]
|
|
|
|
# Measure normal characters without emojis, then add standard width for each found emoji
|
|
emoji = find_emoji(text)
|
|
if emoji:
|
|
non_emoji_text = ""
|
|
last_index = 0
|
|
for start, end, _ in emoji:
|
|
non_emoji_text += text[last_index:start]
|
|
last_index = end
|
|
else:
|
|
non_emoji_text = text
|
|
|
|
result = rl.measure_text_ex(font, non_emoji_text, font_size * FONT_SCALE, spacing) # noqa: TID251
|
|
if emoji:
|
|
result.x += len(emoji) * font_size * FONT_SCALE
|
|
# If just emoji assume a single line height
|
|
if result.y == 0:
|
|
result.y = font_size * FONT_SCALE
|
|
|
|
_cache[key] = result
|
|
return result
|