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:
@@ -44,16 +44,26 @@ public class FontManager
|
|||||||
// Hellion font bytes (Exo 2, OFL-1.1); lazily loaded from manifest resources
|
// Hellion font bytes (Exo 2, OFL-1.1); lazily loaded from manifest resources
|
||||||
private static byte[]? HellionFontBytes;
|
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)
|
if (HellionFontBytes is not null)
|
||||||
return HellionFontBytes;
|
return HellionFontBytes;
|
||||||
|
|
||||||
using var stream =
|
using var stream = typeof(FontManager).Assembly.GetManifestResourceStream(
|
||||||
typeof(FontManager).Assembly.GetManifestResourceStream("HellionFont.ttf")
|
"HellionFont.ttf"
|
||||||
?? throw new FileNotFoundException(
|
);
|
||||||
"Hellion font resource not embedded in the assembly"
|
if (stream is null)
|
||||||
|
{
|
||||||
|
Plugin.Log.Warning(
|
||||||
|
"Hellion font resource missing — falling back to system default font."
|
||||||
);
|
);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
using var ms = new MemoryStream();
|
using var ms = new MemoryStream();
|
||||||
stream.CopyTo(ms);
|
stream.CopyTo(ms);
|
||||||
HellionFontBytes = ms.ToArray();
|
HellionFontBytes = ms.ToArray();
|
||||||
@@ -146,8 +156,11 @@ public class FontManager
|
|||||||
? Plugin.Config.FontSizeV2
|
? Plugin.Config.FontSizeV2
|
||||||
: Plugin.Config.GlobalFontV2.SizePt;
|
: Plugin.Config.GlobalFontV2.SizePt;
|
||||||
var config = new SafeFontConfig { SizePt = basePt, GlyphRanges = Ranges };
|
var config = new SafeFontConfig { SizePt = basePt, GlyphRanges = Ranges };
|
||||||
config.MergeFont = Plugin.Config.UseHellionFont
|
// F10.2: if the embedded font is missing, drop to the system font
|
||||||
? tk.AddFontFromMemory(GetHellionFontBytes(), config, "Hellion-Exo2")
|
// 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");
|
: AddFontWithFallback(tk, Plugin.Config.GlobalFontV2.FontId, config, "global");
|
||||||
|
|
||||||
config.SizePt = Plugin.Config.JapaneseFontV2.SizePt;
|
config.SizePt = Plugin.Config.JapaneseFontV2.SizePt;
|
||||||
|
|||||||
Reference in New Issue
Block a user