#include #include #include #include #include #include #include #include namespace hex::fonts { void registerFonts(); bool buildFontAtlas(FontAtlas *fontAtlas, std::fs::path fontPath, bool pixelPerfectFont, float fontSize, bool loadUnicodeCharacters, bool bold, bool italic, bool antialias); static AutoReset>> s_fontAtlases; void loadFont(const ContentRegistry::Settings::Widgets::Widget &widget, const UnlocalizedString &name, ImFont **font, float scale) { const auto &settings = static_cast(widget); auto atlas = std::make_unique(); const bool atlasBuilt = buildFontAtlas( atlas.get(), settings.getFontPath(), settings.isPixelPerfectFont(), settings.getFontSize() * scale, true, settings.isBold(), settings.isItalic(), settings.isAntiAliased() ); if (!atlasBuilt) { buildFontAtlas( atlas.get(), "", false, settings.getFontSize() * scale, false, settings.isBold(), settings.isItalic(), settings.isAntiAliased() ); log::error("Failed to load font {}! Reverting back to default font!", name.get()); } *font = atlas->getAtlas()->Fonts[0]; (*s_fontAtlases)[*font] = std::move(atlas); } bool setupFonts() { ContentRegistry::Settings::add("hex.fonts.setting.font", "hex.fonts.setting.font.glyphs", "hex.fonts.setting.font.load_all_unicode_chars", false).requiresRestart(); 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; } loadFont(widget, name, &font, ImHexApi::System::getGlobalScale()); }); loadFont(widget.getWidget(), name, &font, ImHexApi::System::getGlobalScale()); EventDPIChanged::subscribe(font, [&widget, name, &font](float, float newScaling) { loadFont(widget.getWidget(), name, &font, newScaling); }); } return true; } } IMHEX_LIBRARY_SETUP("Fonts") { hex::log::debug("Using romfs: '{}'", romfs::name()); 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::ImHexApi::System::addStartupTask("Loading fonts", true, hex::fonts::setupFonts); hex::fonts::registerFonts(); }