Fix the dreaded font reloading bug

This commit is contained in:
Anthony Samms
2025-11-25 00:57:00 -05:00
parent 600307f1c1
commit 78c4f5af95
4 changed files with 43 additions and 1 deletions

View File

@@ -3,6 +3,8 @@ from enum import IntEnum
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
import pyray as ray
from libs.config import Config from libs.config import Config
class PlayerNum(IntEnum): class PlayerNum(IntEnum):
@@ -137,6 +139,8 @@ class GlobalData:
session_data (list[SessionData]): Session data for both players. session_data (list[SessionData]): Session data for both players.
""" """
songs_played: int = 0 songs_played: int = 0
font: ray.Font = ray.get_font_default()
font_codepoints = set()
config: Config = field(default_factory=dict) config: Config = field(default_factory=dict)
song_hashes: dict[str, list[dict]] = field(default_factory=lambda: dict()) #Hash to path song_hashes: dict[str, list[dict]] = field(default_factory=lambda: dict()) #Hash to path
song_paths: dict[Path, str] = field(default_factory=lambda: dict()) #path to hash song_paths: dict[Path, str] = field(default_factory=lambda: dict()) #path to hash

View File

@@ -203,6 +203,17 @@ class OutlinedText:
return n.hexdigest() return n.hexdigest()
def _load_font_for_text(self, text: str) -> ray.Font: def _load_font_for_text(self, text: str) -> ray.Font:
reload_font = False
for character in text:
if character not in global_data.font_codepoints:
global_data.font_codepoints.add(character)
reload_font = True
if reload_font:
codepoint_count = ray.ffi.new('int *', 0)
codepoints = ray.load_codepoints(''.join(global_data.font_codepoints), codepoint_count)
global_data.font = ray.load_font_ex(str(Path('Graphics/Modified-DFPKanteiryu-XB.ttf')), 40, codepoints, len(global_data.font_codepoints))
logger.info(f"Reloaded font with {len(global_data.font_codepoints)} codepoints")
return global_data.font
codepoint_count = ray.ffi.new('int *', 0) codepoint_count = ray.ffi.new('int *', 0)
unique_codepoints = set(text) unique_codepoints = set(text)
codepoints = ray.load_codepoints(''.join(unique_codepoints), codepoint_count) codepoints = ray.load_codepoints(''.join(unique_codepoints), codepoint_count)

View File

@@ -1,11 +1,19 @@
from pathlib import Path
import pyray as ray import pyray as ray
from libs.screen import Screen from libs.screen import Screen
from libs.texture import tex
class DevScreen(Screen): class DevScreen(Screen):
def on_screen_start(self): def on_screen_start(self):
super().on_screen_start() super().on_screen_start()
self.text = ".⁉ゃん座組ス5れへデ7x事音ょ野ダHズパに相村束虹神狂'Uqはたt朗♢弥ウち”作Wシら黒さドカモ金章よ方りj沙べ口ぃご歌こ制みわ険時行×ワ獣ぺ阿啓R哀肉乱終鼓ツ,0かVしでw?2⒒悟マ乙ィの女アラA疾浄u+も’グ怒[ャロ冒陽ね路想ベ#ト醜ペ!太悪χキn初あKン〜<原Qハ1s旅をガ分ビNゼ玄沢≠食@フ拝テM豚幻濤ま人腹世P愴)っピやナJ社びB一6c畑譚]gてd曲花Oくkル第◇校*⒓森・バコ談ヤ急め愛プ重ー勝DE:Zチ東二じ車>ブ刑ミX焼おyつλ♪オい憎aFe竜そ大84得渉/◆ソC番、l†レ悲暴う胸るG“ゆS転fゅとセo「風輔双zr―-vケp‼b…響3メ罪 クL自(Iイタニムき夜幽T&楽m学走ジ島h田i美心Yボサッリュひ寅9」達"
unique_codepoints = set(self.text)
codepoint_count = ray.ffi.new('int *', 0)
unique_string = ''.join(unique_codepoints)
codepoints = ray.load_codepoints(unique_string, codepoint_count)
self.font = ray.load_font_ex(str(Path('Graphics/Modified-DFPKanteiryu-XB.ttf')), 40, codepoints, len(unique_codepoints))
def on_screen_end(self, next_screen: str): def on_screen_end(self, next_screen: str):
return super().on_screen_end(next_screen) return super().on_screen_end(next_screen)
@@ -14,4 +22,5 @@ class DevScreen(Screen):
super().update() super().update()
def draw(self): def draw(self):
ray.draw_rectangle(0, 0, 1280, 720, ray.GREEN) ray.draw_rectangle(0, 0, tex.screen_width, tex.screen_height, ray.GREEN)
ray.draw_text_ex(self.font, "幽玄ノ乱", ray.Vector2(tex.screen_width//2, tex.screen_height//2), 60, 20, ray.BLACK)

View File

@@ -1,4 +1,5 @@
import logging import logging
from pathlib import Path
import threading import threading
import pyray as ray import pyray as ray
@@ -43,6 +44,22 @@ class LoadScreen(Screen):
self.songs_loaded = True self.songs_loaded = True
logger.info("Song hashes loaded") logger.info("Song hashes loaded")
def _load_font(self):
for hash in global_data.song_hashes:
song_entry = global_data.song_hashes[hash]
for song in song_entry:
titles = song.get('title', dict())
subtitles = song.get('subtitle', dict())
for title in titles.values():
for character in title:
global_data.font_codepoints.add(character)
for subtitle in subtitles.values():
for character in subtitle:
global_data.font_codepoints.add(character)
codepoint_count = ray.ffi.new('int *', 0)
codepoints = ray.load_codepoints(''.join(global_data.font_codepoints), codepoint_count)
global_data.font = ray.load_font_ex(str(Path('Graphics/Modified-DFPKanteiryu-XB.ttf')), 40, codepoints, len(global_data.font_codepoints))
def _load_navigator(self): def _load_navigator(self):
"""Background thread function to load navigator""" """Background thread function to load navigator"""
self.navigator.initialize(global_data.config["paths"]["tja_path"]) self.navigator.initialize(global_data.config["paths"]["tja_path"])
@@ -70,6 +87,7 @@ class LoadScreen(Screen):
super().update() super().update()
if self.songs_loaded and not self.navigator_started: if self.songs_loaded and not self.navigator_started:
self._load_font()
self.navigator_thread = threading.Thread(target=self._load_navigator) self.navigator_thread = threading.Thread(target=self._load_navigator)
self.navigator_thread.daemon = True self.navigator_thread.daemon = True
self.navigator_thread.start() self.navigator_thread.start()