From d34ad33c3c7964bc0ef58f5f517ef69b0e0bf866 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 24 Nov 2023 11:29:05 +0100 Subject: [PATCH] feat: Added setting for font bold, italic and antialiasing --- main/gui/source/init/tasks.cpp | 31 ++++++++++++------- plugins/builtin/romfs/lang/en_US.json | 4 +++ .../source/content/settings_entries.cpp | 27 ++++++++++------ .../source/content/views/view_settings.cpp | 7 ++++- 4 files changed, 47 insertions(+), 22 deletions(-) diff --git a/main/gui/source/init/tasks.cpp b/main/gui/source/init/tasks.cpp index 383f99140..6426ecac4 100644 --- a/main/gui/source/init/tasks.cpp +++ b/main/gui/source/init/tasks.cpp @@ -1,6 +1,8 @@ #include "init/tasks.hpp" #include +#include + #include #include @@ -22,8 +24,6 @@ #include #include -#include - #include #include @@ -239,18 +239,18 @@ namespace hex::init { ImFontGlyphRangesBuilder glyphRangesBuilder; { - constexpr static ImWchar controlCodeRange[] = { 0x0001, 0x001F, 0 }; - constexpr static ImWchar extendedAsciiRange[] = { 0x007F, 0x00FF, 0 }; + constexpr static std::array controlCodeRange = { 0x0001, 0x001F, 0 }; + constexpr static std::array extendedAsciiRange = { 0x007F, 0x00FF, 0 }; - glyphRangesBuilder.AddRanges(controlCodeRange); + glyphRangesBuilder.AddRanges(controlCodeRange.data()); glyphRangesBuilder.AddRanges(fonts->GetGlyphRangesDefault()); - glyphRangesBuilder.AddRanges(extendedAsciiRange); + glyphRangesBuilder.AddRanges(extendedAsciiRange.data()); } if (loadUnicode) { - constexpr static ImWchar fullRange[] = { 0x0100, 0xFFEF, 0 }; + constexpr static std::array fullRange = { 0x0100, 0xFFEF, 0 }; - glyphRangesBuilder.AddRanges(fullRange); + glyphRangesBuilder.AddRanges(fullRange.data()); } else { glyphRangesBuilder.AddRanges(fonts->GetGlyphRangesJapanese()); glyphRangesBuilder.AddRanges(fonts->GetGlyphRangesChineseFull()); @@ -264,12 +264,12 @@ namespace hex::init { } // Glyph range for font awesome icons - static ImWchar fontAwesomeRange[] = { + constexpr static std::array fontAwesomeRange = { ICON_MIN_FA, ICON_MAX_FA, 0 }; // Glyph range for codicons icons - static ImWchar codiconsRange[] = { + constexpr static std::array codiconsRange = { ICON_MIN_VS, ICON_MAX_VS, 0 }; @@ -279,6 +279,13 @@ namespace hex::init { fonts->Clear(); fonts->AddFontDefault(&cfg); } else { + if (ContentRegistry::Settings::read("hex.builtin.setting.font", "hex.builtin.setting.font.bold", false)) + cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_Bold; + if (ContentRegistry::Settings::read("hex.builtin.setting.font", "hex.builtin.setting.font.italic", false)) + cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_Oblique; + if (!ContentRegistry::Settings::read("hex.builtin.setting.font", "hex.builtin.setting.font.antialias", false)) + cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_Monochrome | ImGuiFreeTypeBuilderFlags_MonoHinting; + auto font = fonts->AddFontFromFileTTF(wolv::util::toUTF8String(fontFile).c_str(), 0, &cfg, ranges.Data); if (font == nullptr) { log::warn("Failed to load custom font! Falling back to default font."); @@ -295,8 +302,8 @@ namespace hex::init { // Add font awesome and codicons icons to font atlas cfg.GlyphOffset = ImVec2(0, 3_scaled); - fonts->AddFontFromMemoryCompressedTTF(font_awesome_compressed_data, font_awesome_compressed_size, 0, &cfg, fontAwesomeRange); - fonts->AddFontFromMemoryCompressedTTF(codicons_compressed_data, codicons_compressed_size, 0, &cfg, codiconsRange); + fonts->AddFontFromMemoryCompressedTTF(font_awesome_compressed_data, font_awesome_compressed_size, 0, &cfg, fontAwesomeRange.data()); + fonts->AddFontFromMemoryCompressedTTF(codicons_compressed_data, codicons_compressed_size, 0, &cfg, codiconsRange.data()); cfg.GlyphOffset = ImVec2(0, 0); // Add unifont if unicode support is enabled diff --git a/plugins/builtin/romfs/lang/en_US.json b/plugins/builtin/romfs/lang/en_US.json index d0e79adec..670ac11a9 100644 --- a/plugins/builtin/romfs/lang/en_US.json +++ b/plugins/builtin/romfs/lang/en_US.json @@ -529,6 +529,10 @@ "hex.builtin.setting.font": "Font", "hex.builtin.setting.font.glyphs": "Glyphs", "hex.builtin.setting.font.custom_font": "Custom Font", + "hex.builtin.setting.font.custom_font_enable": "Use custom font", + "hex.builtin.setting.font.font_bold": "Bold", + "hex.builtin.setting.font.font_italic": "Italic", + "hex.builtin.setting.font.font_antialias": "Antialiasing", "hex.builtin.setting.font.font_path": "Custom Font Path", "hex.builtin.setting.font.font_size": "Font Size", "hex.builtin.setting.font.font_size.tooltip": "The font size can only be adjusted when a custom font has been selected above.\n\nThis is because ImHex uses a pixel-perfect bitmap font by default. Scaling it by any non-integer factor will only cause it to become blurry.", diff --git a/plugins/builtin/source/content/settings_entries.cpp b/plugins/builtin/source/content/settings_entries.cpp index 5171329d0..a25ce32b9 100644 --- a/plugins/builtin/source/content/settings_entries.cpp +++ b/plugins/builtin/source/content/settings_entries.cpp @@ -389,20 +389,29 @@ namespace hex::plugin::builtin { auto customFontEnabledSetting = ContentRegistry::Settings::add("hex.builtin.setting.font", "hex.builtin.setting.font.custom_font", "hex.builtin.setting.font.custom_font_enable", false).requiresRestart(); + const auto fontSettingsEnabled = [customFontEnabledSetting]{ + auto &checkBox = static_cast(customFontEnabledSetting.getWidget()); + + return checkBox.isChecked(); + }; + ContentRegistry::Settings::add("hex.builtin.setting.font", "hex.builtin.setting.font.custom_font", "hex.builtin.setting.font.font_path") .requiresRestart() - .setEnabledCallback([customFontEnabledSetting]{ - auto &checkBox = static_cast(customFontEnabledSetting.getWidget()); - - return checkBox.isChecked(); - }); + .setEnabledCallback(fontSettingsEnabled); ContentRegistry::Settings::add("hex.builtin.setting.font", "hex.builtin.setting.font.custom_font", "hex.builtin.setting.font.font_size", 13, 0, 100) .requiresRestart() - .setEnabledCallback([customFontEnabledSetting]{ - auto &checkBox = static_cast(customFontEnabledSetting.getWidget()); + .setEnabledCallback(fontSettingsEnabled); + + ContentRegistry::Settings::add("hex.builtin.setting.font", "hex.builtin.setting.font.custom_font", "hex.builtin.setting.font.font_bold", false) + .requiresRestart() + .setEnabledCallback(fontSettingsEnabled); + ContentRegistry::Settings::add("hex.builtin.setting.font", "hex.builtin.setting.font.custom_font", "hex.builtin.setting.font.font_italic", false) + .requiresRestart() + .setEnabledCallback(fontSettingsEnabled); + ContentRegistry::Settings::add("hex.builtin.setting.font", "hex.builtin.setting.font.custom_font", "hex.builtin.setting.font.font_antialias", false) + .requiresRestart() + .setEnabledCallback(fontSettingsEnabled); - return checkBox.isChecked(); - }); /* Folders */ diff --git a/plugins/builtin/source/content/views/view_settings.cpp b/plugins/builtin/source/content/views/view_settings.cpp index 700086131..396c9e638 100644 --- a/plugins/builtin/source/content/views/view_settings.cpp +++ b/plugins/builtin/source/content/views/view_settings.cpp @@ -113,7 +113,12 @@ namespace hex::plugin::builtin { // If a restart is required, ask the user if they want to restart if (!this->getWindowOpenState() && this->m_restartRequested) { - PopupQuestion::open("hex.builtin.view.settings.restart_question"_lang, ImHexApi::System::restartImHex, []{}); + PopupQuestion::open("hex.builtin.view.settings.restart_question"_lang, + ImHexApi::System::restartImHex, + [this]{ + this->m_restartRequested = false; + } + ); } }