You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
34 lines
1.0 KiB
34 lines
1.0 KiB
2 days ago
|
import pyray as rl
|
||
|
from openpilot.system.ui.lib.application import FONT_SCALE
|
||
|
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."""
|
||
|
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
|