From 46b13b6606ed9862dc7703d8f0c4957ff6b686e4 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 28 Jul 2025 17:50:04 +0200 Subject: [PATCH] impr: Nicer font registering API --- lib/libimhex/include/hex/api/imhex_api.hpp | 8 ++++-- lib/libimhex/source/api/imhex_api.cpp | 10 +++---- plugins/fonts/source/fonts.cpp | 32 +++++++++++++++------- plugins/fonts/source/library_fonts.cpp | 10 +++---- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/lib/libimhex/include/hex/api/imhex_api.hpp b/lib/libimhex/include/hex/api/imhex_api.hpp index 152d8bfe0..6f129bf86 100644 --- a/lib/libimhex/include/hex/api/imhex_api.hpp +++ b/lib/libimhex/include/hex/api/imhex_api.hpp @@ -772,6 +772,8 @@ EXPORT_MODULE namespace hex { void pop() const; [[nodiscard]] operator ImFont*() const; + [[nodiscard]] UnlocalizedString getUnlocalizedName() const { return m_fontName; } + private: void push(float size, ImFont *font) const; @@ -792,10 +794,10 @@ EXPORT_MODULE namespace hex { } - void loadFont(const std::fs::path &path, Offset offset = {}, std::optional defaultSize = std::nullopt); - void loadFont(const std::string &name, const std::span &data, Offset offset = {}, std::optional defaultSize = std::nullopt); + void registerMergeFont(const std::fs::path &path, Offset offset = {}, std::optional defaultSize = std::nullopt); + void registerMergeFont(const std::string &name, const std::span &data, Offset offset = {}, std::optional defaultSize = std::nullopt); - void registerFont(const UnlocalizedString &fontName); + void registerFont(const Font& font); FontDefinition getFont(const UnlocalizedString &fontName); void setDefaultFont(const Font& font); diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index bb6e0fa0c..f60efa94d 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -1032,8 +1032,6 @@ namespace hex { } Font::Font(UnlocalizedString fontName) : m_fontName(std::move(fontName)) { - Fonts::registerFont(m_fontName); - if (impl::s_defaultFont == nullptr) impl::s_defaultFont = this; } @@ -1081,7 +1079,7 @@ namespace hex { return getFont(m_fontName).regular; } - void loadFont(const std::fs::path &path, Offset offset, std::optional defaultSize) { + void registerMergeFont(const std::fs::path &path, Offset offset, std::optional defaultSize) { wolv::io::File fontFile(path, wolv::io::File::Mode::Read); if (!fontFile.isValid()) { log::error("Failed to load font from file '{}'", wolv::util::toUTF8String(path)); @@ -1096,7 +1094,7 @@ namespace hex { }); } - void loadFont(const std::string &name, const std::span &data, Offset offset, std::optional defaultSize) { + void registerMergeFont(const std::string &name, const std::span &data, Offset offset, std::optional defaultSize) { impl::s_fonts->emplace_back(MergeFont { name, { data.begin(), data.end() }, @@ -1105,8 +1103,8 @@ namespace hex { }); } - void registerFont(const UnlocalizedString &fontName) { - (*impl::s_fontDefinitions)[fontName] = {}; + void registerFont(const Font& font) { + (*impl::s_fontDefinitions)[font.getUnlocalizedName()] = {}; } FontDefinition getFont(const UnlocalizedString &fontName) { diff --git a/plugins/fonts/source/fonts.cpp b/plugins/fonts/source/fonts.cpp index 0c5547a4e..ab65fc157 100644 --- a/plugins/fonts/source/fonts.cpp +++ b/plugins/fonts/source/fonts.cpp @@ -5,17 +5,29 @@ namespace hex::fonts { - static auto s_defaultFont = ImHexApi::Fonts::Font("hex.fonts.font.default"); - const ImHexApi::Fonts::Font& Default() { return s_defaultFont; } - static auto s_hexEditorFont = ImHexApi::Fonts::Font("hex.fonts.font.hex_editor"); - const ImHexApi::Fonts::Font& HexEditor() { return s_hexEditorFont; } - static auto s_codeEditorFont = ImHexApi::Fonts::Font("hex.fonts.font.code_editor"); - const ImHexApi::Fonts::Font& CodeEditor() { return s_codeEditorFont; } + const ImHexApi::Fonts::Font& Default() { + static auto font = ImHexApi::Fonts::Font("hex.fonts.font.default"); + return font; + } + const ImHexApi::Fonts::Font& HexEditor() { + static auto font = ImHexApi::Fonts::Font("hex.fonts.font.hex_editor"); + return font; + } + const ImHexApi::Fonts::Font& CodeEditor() { + static auto font = ImHexApi::Fonts::Font("hex.fonts.font.code_editor"); + return font; + } - void registerFonts() { - ImHexApi::Fonts::loadFont("Blender Icons", romfs::get("fonts/blendericons.ttf").span(), { -1, -1 }); - ImHexApi::Fonts::loadFont("VS Codicons", romfs::get("fonts/codicons.ttf").span(), { 0, -2 }); - ImHexApi::Fonts::loadFont("Unifont", romfs::get("fonts/unifont.otf").span(), { 0, 0 }, 10); + void registerUIFonts() { + ImHexApi::Fonts::registerFont(Default()); + ImHexApi::Fonts::registerFont(HexEditor()); + ImHexApi::Fonts::registerFont(CodeEditor()); + } + + void registerMergeFonts() { + ImHexApi::Fonts::registerMergeFont("Blender Icons", romfs::get("fonts/blendericons.ttf").span(), { -1, -1 }); + ImHexApi::Fonts::registerMergeFont("VS Codicons", romfs::get("fonts/codicons.ttf").span(), { 0, -2 }); + ImHexApi::Fonts::registerMergeFont("Unifont", romfs::get("fonts/unifont.otf").span(), { 0, 0 }, 10); } } \ No newline at end of file diff --git a/plugins/fonts/source/library_fonts.cpp b/plugins/fonts/source/library_fonts.cpp index e5793929c..436c1cdca 100644 --- a/plugins/fonts/source/library_fonts.cpp +++ b/plugins/fonts/source/library_fonts.cpp @@ -12,7 +12,8 @@ namespace hex::fonts { - void registerFonts(); + void registerUIFonts(); + void registerMergeFonts(); namespace loader { bool loadFonts(); @@ -26,11 +27,8 @@ IMHEX_LIBRARY_SETUP("Fonts") { for (auto &path : romfs::list("lang")) hex::ContentRegistry::Language::addLocalization(nlohmann::json::parse(romfs::get(path).string())); - hex::ImHexApi::Fonts::registerFont("hex.fonts.font.default"); - hex::ImHexApi::Fonts::registerFont("hex.fonts.font.hex_editor"); - hex::ImHexApi::Fonts::registerFont("hex.fonts.font.code_editor"); - - hex::fonts::registerFonts(); + hex::fonts::registerUIFonts(); + hex::fonts::registerMergeFonts(); hex::EventImHexStartupFinished::subscribe([] { hex::fonts::loader::loadFonts();