From 2998cc0fd7b3fec47a53443beda58851e7b401d9 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 26 Jul 2025 14:01:31 +0200 Subject: [PATCH] impr: Cleanup font loading --- plugins/fonts/CMakeLists.txt | 1 + plugins/fonts/source/font_loader.cpp | 103 +++++++++++++++++++++++++ plugins/fonts/source/library_fonts.cpp | 93 +--------------------- 3 files changed, 108 insertions(+), 89 deletions(-) create mode 100644 plugins/fonts/source/font_loader.cpp diff --git a/plugins/fonts/CMakeLists.txt b/plugins/fonts/CMakeLists.txt index 3ec554576..c8972694e 100644 --- a/plugins/fonts/CMakeLists.txt +++ b/plugins/fonts/CMakeLists.txt @@ -9,6 +9,7 @@ add_imhex_plugin( source/library_fonts.cpp source/fonts.cpp source/font_settings.cpp + source/font_loader.cpp INCLUDES include LIBRARY_PLUGIN diff --git a/plugins/fonts/source/font_loader.cpp b/plugins/fonts/source/font_loader.cpp new file mode 100644 index 000000000..a6d3be05a --- /dev/null +++ b/plugins/fonts/source/font_loader.cpp @@ -0,0 +1,103 @@ +#include +#include + +#include +#include +#include +#include + +#include + +namespace hex::fonts::loader { + + void loadFont(const ContentRegistry::Settings::Widgets::Widget &widget, const UnlocalizedString &name, ImFont **imguiFont) { + const auto &settings = static_cast(widget); + + auto atlas = ImGui::GetIO().Fonts; + + { + auto &font = *imguiFont; + + if (font != nullptr) { + atlas->RemoveFont(font); + + font = nullptr; + } + } + + ImFontConfig config; + config.MergeMode = false; + config.FontDataOwnedByAtlas = false; + config.SizePixels = settings.getFontSize(); + + std::memcpy(config.Name, name.get().c_str(), std::min(name.get().size(), sizeof(config.Name) - 1)); + + if (!settings.isPixelPerfectFont()) { + if (settings.isBold()) + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Bold; + if (settings.isItalic()) + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Oblique; + switch (settings.getAntialiasingType()) { + case AntialiasingType::None: + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Monochrome | ImGuiFreeTypeLoaderFlags_MonoHinting; + break; + case AntialiasingType::Grayscale: + break; + case AntialiasingType::Lcd: + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_SubPixel; + break; + } + } else { + config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_NoHinting; + } + + { + const auto fontPath = settings.getFontPath(); + if (!fontPath.empty()) + *imguiFont = atlas->AddFontFromFileTTF(fontPath.string().c_str(), 0.0F, &config); + + if (*imguiFont == nullptr) { + if (settings.isPixelPerfectFont()) { + auto defaultConfig = config; + defaultConfig.SizePixels = 0; + *imguiFont = atlas->AddFontDefault(&defaultConfig); + } else { + static auto jetbrainsFont = romfs::get("fonts/JetBrainsMono.ttf"); + *imguiFont = atlas->AddFontFromMemoryTTF(const_cast(jetbrainsFont.data()), jetbrainsFont.size(), 0.0F, &config); + + if (*imguiFont == nullptr) { + log::error("Failed to load font '{}', using default font instead", name.get()); + *imguiFont = atlas->AddFontDefault(); + } + } + } + } + + config.MergeMode = true; + for (auto &extraFont : ImHexApi::Fonts::impl::getMergeFonts()) { + config.GlyphOffset = { extraFont.offset.x, -extraFont.offset.y }; + config.GlyphOffset *= ImHexApi::System::getGlobalScale(); + atlas->AddFontFromMemoryTTF(const_cast(extraFont.fontData.data()), extraFont.fontData.size(), extraFont.defaultSize.value_or(0), &config); + } + } + + bool loadFonts() { + for (auto &[name, font] : ImHexApi::Fonts::impl::getFontDefinitions()) { + auto &widget = addFontSettingsWidget(name) + .setChangedCallback([name, &font, firstLoad = true](auto &widget) mutable { + if (firstLoad) { + firstLoad = false; + return; + } + + TaskManager::doLater([name, &font, &widget] { + loadFont(widget, name, &font); + }); + }); + + loadFont(widget.getWidget(), name, &font); + } + + return true; + } +} \ No newline at end of file diff --git a/plugins/fonts/source/library_fonts.cpp b/plugins/fonts/source/library_fonts.cpp index 9f3bf0e70..e5793929c 100644 --- a/plugins/fonts/source/library_fonts.cpp +++ b/plugins/fonts/source/library_fonts.cpp @@ -6,7 +6,6 @@ #include #include -#include #include #include #include @@ -14,98 +13,14 @@ namespace hex::fonts { void registerFonts(); - void loadFont(const ContentRegistry::Settings::Widgets::Widget &widget, const UnlocalizedString &name, ImFont **imguiFont) { - const auto &settings = static_cast(widget); - auto atlas = ImGui::GetIO().Fonts; - - { - auto &font = *imguiFont; - - if (font != nullptr) { - atlas->RemoveFont(font); - - font = nullptr; - } - } - - ImFontConfig config; - config.MergeMode = false; - config.FontDataOwnedByAtlas = false; - config.SizePixels = settings.getFontSize(); - - std::memcpy(config.Name, name.get().c_str(), std::min(name.get().size(), sizeof(config.Name) - 1)); - - if (!settings.isPixelPerfectFont()) { - if (settings.isBold()) - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Bold; - if (settings.isItalic()) - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Oblique; - switch (settings.getAntialiasingType()) { - case AntialiasingType::None: - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_Monochrome | ImGuiFreeTypeLoaderFlags_MonoHinting; - break; - case AntialiasingType::Grayscale: - break; - case AntialiasingType::Lcd: - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_SubPixel; - break; - } - } else { - config.FontLoaderFlags |= ImGuiFreeTypeLoaderFlags_NoHinting; - } - - { - const auto fontPath = settings.getFontPath(); - if (!fontPath.empty()) - *imguiFont = atlas->AddFontFromFileTTF(fontPath.string().c_str(), 0.0F, &config); - - if (*imguiFont == nullptr) { - if (settings.isPixelPerfectFont()) { - auto defaultConfig = config; - defaultConfig.SizePixels = 0; - *imguiFont = atlas->AddFontDefault(&defaultConfig); - } else { - static auto jetbrainsFont = romfs::get("fonts/JetBrainsMono.ttf"); - *imguiFont = atlas->AddFontFromMemoryTTF(const_cast(jetbrainsFont.data()), jetbrainsFont.size(), 0.0F, &config); - - if (*imguiFont == nullptr) { - log::error("Failed to load font '{}', using default font instead", name.get()); - *imguiFont = atlas->AddFontDefault(); - } - } - } - } - - config.MergeMode = true; - for (auto &extraFont : ImHexApi::Fonts::impl::getMergeFonts()) { - config.GlyphOffset = { extraFont.offset.x, -extraFont.offset.y }; - config.GlyphOffset *= ImHexApi::System::getGlobalScale(); - atlas->AddFontFromMemoryTTF(const_cast(extraFont.fontData.data()), extraFont.fontData.size(), extraFont.defaultSize.value_or(0), &config); - } + namespace loader { + bool loadFonts(); } - bool setupFonts() { - for (auto &[name, font] : ImHexApi::Fonts::impl::getFontDefinitions()) { - auto &widget = addFontSettingsWidget(name) - .setChangedCallback([name, &font, firstLoad = true](auto &widget) mutable { - if (firstLoad) { - firstLoad = false; - return; - } - - TaskManager::doLater([name, &font, &widget] { - loadFont(widget, name, &font); - }); - }); - - loadFont(widget.getWidget(), name, &font); - } - - return true; - } } + IMHEX_LIBRARY_SETUP("Fonts") { hex::log::debug("Using romfs: '{}'", romfs::name()); for (auto &path : romfs::list("lang")) @@ -118,7 +33,7 @@ IMHEX_LIBRARY_SETUP("Fonts") { hex::fonts::registerFonts(); hex::EventImHexStartupFinished::subscribe([] { - hex::fonts::setupFonts(); + hex::fonts::loader::loadFonts(); hex::ImHexApi::Fonts::setDefaultFont(hex::fonts::Default()); });