From 7ed238a0b7e696fe105af62b1dbd411916defac4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 17 Dec 2022 09:16:05 -0800 Subject: [PATCH] Font: Avoid late load on save state. If they weren't loaded yet, we can stay that way. --- Core/HLE/sceFont.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index f819b3a2c7..a218ebdc92 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -317,7 +317,8 @@ public: int numInternalFonts = (int)internalFonts.size(); Do(p, numInternalFonts); - if (numInternalFonts != (int)internalFonts.size()) { + // It's okay if numInternalFonts was zero and we've now loaded them. + if (numInternalFonts != (int)internalFonts.size() && numInternalFonts != 0) { ERROR_LOG(SCEFONT, "Unable to load state: different internal font count."); p.SetError(p.ERROR_FAILURE); return; @@ -329,6 +330,11 @@ public: if (internalFont == -1) { Do(p, font_); } else if (p.mode == p.MODE_READ) { + if (internalFont < 0 || internalFont >= (int)internalFonts.size()) { + ERROR_LOG(SCEFONT, "Unable to load state: unexpected internal font index."); + p.SetError(p.ERROR_FAILURE); + return; + } font_ = internalFonts[internalFont]; } Do(p, handle_); @@ -947,11 +953,18 @@ void __FontShutdown() { } void __FontDoState(PointerWrap &p) { - auto s = p.Section("sceFont", 1, 2); + auto s = p.Section("sceFont", 1, 3); if (!s) return; - __LoadInternalFonts(); + bool needInternalFonts = true; + if (s >= 3) { + // If we loaded internal fonts, we need to load them when loading the state. + needInternalFonts = !internalFonts.empty(); + Do(p, needInternalFonts); + } + if (needInternalFonts) + __LoadInternalFonts(); Do(p, fontLibList); Do(p, fontLibMap);