From fb249767f1942fbc85b7b3dd58f7c6dfc98e4a89 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Mon, 15 Jul 2024 15:22:02 -0500 Subject: [PATCH] fix: Crash on exit when using custom font from file (#1815) ### Problem description WerWolv/ImHex#1814 ### Implementation description 1. Remove the flag that wrongly tells `ImFontAtlas` that it owns font data, and remove that parameter from the function signature entirely since now it is always `false`. 2. Rename `takeAtlas` to `getAtlas` since it no longer transfers ownership as of b652565b57bd8a9aac2779b09f51f7bac26afca2. --- plugins/fonts/source/font_loader.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/fonts/source/font_loader.cpp b/plugins/fonts/source/font_loader.cpp index 46be93a45..2ac7efb5e 100644 --- a/plugins/fonts/source/font_loader.cpp +++ b/plugins/fonts/source/font_loader.cpp @@ -75,11 +75,11 @@ namespace hex::fonts { return Font(font); } - Font addFontFromMemory(const std::vector &fontData, float fontSize, bool scalable, ImVec2 offset, bool ownedByImGui = false, const ImVector &glyphRange = {}) { + Font addFontFromMemory(const std::vector &fontData, float fontSize, bool scalable, ImVec2 offset, const ImVector &glyphRange = {}) { auto &storedFontData = m_fontData.emplace_back(fontData); ImFontConfig config = m_config; - config.FontDataOwnedByAtlas = ownedByImGui; + config.FontDataOwnedByAtlas = false; config.GlyphOffset = { offset.x, offset.y }; auto font = m_fontAtlas->AddFontFromMemoryTTF(storedFontData.data(), int(storedFontData.size()), fontSize, &config, !glyphRange.empty() ? glyphRange.Data : m_glyphRange.Data); @@ -92,14 +92,14 @@ namespace hex::fonts { Font addFontFromRomFs(const std::fs::path &path, float fontSize, bool scalable, ImVec2 offset, const ImVector &glyphRange = {}) { auto data = romfs::get(path).span(); - return addFontFromMemory({ data.begin(), data.end() }, fontSize, scalable, offset, false, glyphRange); + return addFontFromMemory({ data.begin(), data.end() }, fontSize, scalable, offset, glyphRange); } Font addFontFromFile(const std::fs::path &path, float fontSize, bool scalable, ImVec2 offset, const ImVector &glyphRange = {}) { wolv::io::File file(path, wolv::io::File::Mode::Read); auto data = file.readVector(); - return addFontFromMemory(data, fontSize, scalable, offset, true, glyphRange); + return addFontFromMemory(data, fontSize, scalable, offset, glyphRange); } void setBold(bool enabled) { @@ -158,7 +158,7 @@ namespace hex::fonts { return m_fontAtlas->Build(); } - [[nodiscard]] ImFontAtlas* takeAtlas() { + [[nodiscard]] ImFontAtlas* getAtlas() { auto result = m_fontAtlas; return result; @@ -351,7 +351,7 @@ namespace hex::fonts { ImVec2 offset = { font.offset.x, font.offset.y - (defaultFont->getDescent() - fontAtlas.calculateFontDescend(font, fontSize)) }; // Load the font - fontAtlas.addFontFromMemory(font.fontData, font.defaultSize.value_or(fontSize), !font.defaultSize.has_value(), offset, false, glyphRanges.back()); + fontAtlas.addFontFromMemory(font.fontData, font.defaultSize.value_or(fontSize), !font.defaultSize.has_value(), offset, glyphRanges.back()); } } @@ -361,7 +361,7 @@ namespace hex::fonts { if (fontAtlas.build()) { ImGui_ImplOpenGL3_DestroyFontsTexture(); ImGui_ImplOpenGL3_CreateFontsTexture(); - ImHexApi::Fonts::impl::setFontAtlas(fontAtlas.takeAtlas()); + ImHexApi::Fonts::impl::setFontAtlas(fontAtlas.getAtlas()); } }); @@ -369,7 +369,7 @@ namespace hex::fonts { const bool result = fontAtlas.build(); if (result) { // Set the font atlas if the build was successful - ImHexApi::Fonts::impl::setFontAtlas(fontAtlas.takeAtlas()); + ImHexApi::Fonts::impl::setFontAtlas(fontAtlas.getAtlas()); return true; }