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.
		
		
		
		
		
			
		
			
				
					
					
						
							33 lines
						
					
					
						
							1.0 KiB
						
					
					
				
			
		
		
	
	
							33 lines
						
					
					
						
							1.0 KiB
						
					
					
				| 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
 | |
| 
 |