fix(font): fall back to system font if embedded resource missing (F10.2)

GetHellionFontBytes used to throw a FileNotFoundException when the
embedded Hellion font resource was missing — only possible on a broken
csproj or a hand-rolled dev build, never on a signed release, but the
throw bubbled up and broke the entire UiBuilder font atlas.

Replaced with a nullable TryGetHellionFontBytes that logs a warning
and returns null on miss. The RegularFont delegate now falls back to
the same system-font path that UseHellionFont=false already uses, so
the plugin still loads and the issue surfaces in /xllog instead of as
a crash.
This commit is contained in:
2026-05-12 13:55:04 +02:00
parent b489ac946c
commit eabb39ba86
+20 -7
View File
@@ -44,16 +44,26 @@ public class FontManager
// Hellion font bytes (Exo 2, OFL-1.1); lazily loaded from manifest resources
private static byte[]? HellionFontBytes;
private static byte[] GetHellionFontBytes()
// Returns null when the embedded font resource is missing. Should never
// happen on a signed release build, but a broken csproj or hand-rolled
// dev build can land here. Caller falls back to the system font path so
// the plugin still loads instead of crashing the whole UiBuilder.
private static byte[]? TryGetHellionFontBytes()
{
if (HellionFontBytes is not null)
return HellionFontBytes;
using var stream =
typeof(FontManager).Assembly.GetManifestResourceStream("HellionFont.ttf")
?? throw new FileNotFoundException(
"Hellion font resource not embedded in the assembly"
using var stream = typeof(FontManager).Assembly.GetManifestResourceStream(
"HellionFont.ttf"
);
if (stream is null)
{
Plugin.Log.Warning(
"Hellion font resource missing — falling back to system default font."
);
return null;
}
using var ms = new MemoryStream();
stream.CopyTo(ms);
HellionFontBytes = ms.ToArray();
@@ -146,8 +156,11 @@ public class FontManager
? Plugin.Config.FontSizeV2
: Plugin.Config.GlobalFontV2.SizePt;
var config = new SafeFontConfig { SizePt = basePt, GlyphRanges = Ranges };
config.MergeFont = Plugin.Config.UseHellionFont
? tk.AddFontFromMemory(GetHellionFontBytes(), config, "Hellion-Exo2")
// F10.2: if the embedded font is missing, drop to the system font
// path rather than letting the UiBuilder throw.
var hellionBytes = Plugin.Config.UseHellionFont ? TryGetHellionFontBytes() : null;
config.MergeFont = hellionBytes is not null
? tk.AddFontFromMemory(hellionBytes, config, "Hellion-Exo2")
: AddFontWithFallback(tk, Plugin.Config.GlobalFontV2.FontId, config, "global");
config.SizePt = Plugin.Config.JapaneseFontV2.SizePt;