From 5356e5908818a832ff872c4565c1771055f4b677 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Sat, 15 Jun 2024 23:01:55 +0200 Subject: [PATCH] load fonts from conf and merge --- external/imgui/CMakeLists.txt | 1 + src/main.cpp | 56 ------------------------ src/start_screen.cpp | 81 +++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 56 deletions(-) diff --git a/external/imgui/CMakeLists.txt b/external/imgui/CMakeLists.txt index 7b9217a5..ce7c243f 100644 --- a/external/imgui/CMakeLists.txt +++ b/external/imgui/CMakeLists.txt @@ -18,6 +18,7 @@ add_library(imgui imgui/misc/cpp/imgui_stdlib.cpp ) +target_compile_definitions(imgui PUBLIC IMGUI_USE_WCHAR32) target_compile_features(imgui PUBLIC cxx_std_11) target_include_directories(imgui PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/src/main.cpp b/src/main.cpp index b981f3b3..7803bd1b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -93,62 +93,6 @@ int main(int argc, char** argv) { theme = getDefaultThemeDark(); } - { - auto* font_atlas = ImGui::GetIO().Fonts; - font_atlas->ClearFonts(); - { - ImFontConfig fontcfg; - - // upsampling to int looks almost ok - const float font_size_scale = 1.3f * display_scale; - const float font_oversample = 4.f; - - // default font is pixel perfect at 13 - fontcfg.SizePixels = 13.f * font_size_scale; - fontcfg.RasterizerDensity = font_oversample/font_size_scale; - // normally density would be set to dpi scale of the display - - font_atlas->AddFontDefault(&fontcfg); - } - if constexpr (false) { - ImFontConfig fontcfg; - //fontcfg.SizePixels = 16.f; - fontcfg.RasterizerDensity = 1.f; - fontcfg.OversampleH = 1; - fontcfg.OversampleV = 1; - fontcfg.PixelSnapH = true; - - //ImFontGlyphRangesBuilder glyphbld; - //glyphbld.AddRanges(font_atlas->GetGlyphRangesDefault()); - //glyphbld.AddRanges(font_atlas->GetGlyphRangesGreek()); - //glyphbld.AddRanges(font_atlas->GetGlyphRangesCyrillic()); - //glyphbld.AddRanges(font_atlas->GetGlyphRangesChineseSimplifiedCommon()); - - font_atlas->AddFontFromFileTTF( - "/nix/store/7fjwhgbz16i08xm171arr081bqpivv7k-hack-font-3.003/share/fonts/truetype/Hack-Regular.ttf", - 20.f*display_scale, - &fontcfg, - font_atlas->GetGlyphRangesGreek() - ); - - fontcfg.MergeMode = true; - - font_atlas->AddFontFromFileTTF( - "/nix/store/7fjwhgbz16i08xm171arr081bqpivv7k-hack-font-3.003/share/fonts/truetype/Hack-Regular.ttf", - 20.f*display_scale, - &fontcfg, - font_atlas->GetGlyphRangesCyrillic() - ); - - font_atlas->AddFontFromFileTTF( - "/nix/store/7fjwhgbz16i08xm171arr081bqpivv7k-hack-font-3.003/share/fonts/truetype/Hack-Regular.ttf", - 20.f*display_scale, - &fontcfg, - font_atlas->GetGlyphRangesChineseSimplifiedCommon() - ); - } - font_atlas->Build(); - } ImGui_ImplSDL3_InitForSDLRenderer(window.get(), renderer.get()); ImGui_ImplSDLRenderer3_Init(renderer.get()); diff --git a/src/start_screen.cpp b/src/start_screen.cpp index 6e8ac2de..0c69b008 100644 --- a/src/start_screen.cpp +++ b/src/start_screen.cpp @@ -50,6 +50,87 @@ StartScreen::StartScreen(const std::vector& args, SDL_Renderer } } + float display_scale = SDL_GetWindowDisplayScale(SDL_GetRenderWindow(renderer)); + if (display_scale < 0.001f) { + // error? + display_scale = 1.f; + } + + { + auto* font_atlas = ImGui::GetIO().Fonts; + font_atlas->ClearFonts(); + // for now we also always merge + //bool has_font {false}; + + ImFontGlyphRangesBuilder glyphbld; + ImVector glyph_ranges; + { // build ranges + glyphbld.AddRanges(font_atlas->GetGlyphRangesDefault()); + glyphbld.AddRanges(font_atlas->GetGlyphRangesGreek()); + glyphbld.AddRanges(font_atlas->GetGlyphRangesCyrillic()); + glyphbld.AddRanges(font_atlas->GetGlyphRangesChineseSimplifiedCommon()); // contains CJK + glyphbld.AddText("โ„ข"); // somehow missing + // popular emojies + glyphbld.AddText(u8"๐Ÿ˜‚โค๏ธ๐Ÿคฃ๐Ÿ‘๐Ÿ˜ญ๐Ÿ™๐Ÿ˜˜๐Ÿฅฐ๐Ÿ˜๐Ÿ˜Š๐ŸŽ‰๐Ÿ˜๐Ÿ’•๐Ÿฅบ๐Ÿ˜…๐Ÿ”ฅโ˜บ๏ธ๐Ÿคฆโ™ฅ๏ธ๐Ÿคท๐Ÿ™„๐Ÿ˜†๐Ÿค—๐Ÿ˜‰๐ŸŽ‚๐Ÿค”๐Ÿ‘๐Ÿ™‚๐Ÿ˜ณ๐Ÿฅณ๐Ÿ˜Ž๐Ÿ‘Œ๐Ÿ’œ๐Ÿ˜”๐Ÿ’ชโœจ๐Ÿ’–๐Ÿ‘€๐Ÿ˜‹๐Ÿ˜๐Ÿ˜ข๐Ÿ‘‰๐Ÿ’—๐Ÿ˜ฉ๐Ÿ’ฏ๐ŸŒน๐Ÿ’ž๐ŸŽˆ๐Ÿ’™๐Ÿ˜ƒ๐Ÿ˜ก๐Ÿ’๐Ÿ˜œ๐Ÿ™ˆ๐Ÿคž๐Ÿ˜„๐Ÿคค๐Ÿ™Œ๐Ÿคชโฃ๏ธ๐Ÿ˜€๐Ÿ’‹๐Ÿ’€๐Ÿ‘‡๐Ÿ’”๐Ÿ˜Œ๐Ÿ’“๐Ÿคฉ๐Ÿ™ƒ๐Ÿ˜ฌ๐Ÿ˜ฑ๐Ÿ˜ด๐Ÿคญ๐Ÿ˜๐ŸŒž๐Ÿ˜’๐Ÿ˜‡๐ŸŒธ๐Ÿ˜ˆ๐ŸŽถโœŒ๏ธ๐ŸŽŠ๐Ÿฅต๐Ÿ˜ž๐Ÿ’šโ˜€๏ธ๐Ÿ–ค๐Ÿ’ฐ๐Ÿ˜š๐Ÿ‘‘๐ŸŽ๐Ÿ’ฅ๐Ÿ™‹โ˜น๏ธ๐Ÿ˜‘๐Ÿฅด๐Ÿ‘ˆ๐Ÿ’ฉโœ…๐Ÿ‘‹๐Ÿคฎ๐Ÿ˜ค๐Ÿคข๐ŸŒŸโ—๐Ÿ˜ฅ๐ŸŒˆ๐Ÿ’›๐Ÿ˜๐Ÿ˜ซ๐Ÿ˜ฒ๐Ÿ–•โ€ผ๏ธ๐Ÿ”ด๐ŸŒป๐Ÿคฏ๐Ÿ’ƒ๐Ÿ‘Š๐Ÿคฌ๐Ÿƒ๐Ÿ˜•๐Ÿ‘๏ธโšกโ˜•๐Ÿ€๐Ÿ’ฆโญ๐Ÿฆ‹๐Ÿคจ๐ŸŒบ๐Ÿ˜น๐Ÿค˜๐ŸŒท๐Ÿ’๐Ÿ’ค๐Ÿค๐Ÿฐ๐Ÿ˜“๐Ÿ’˜๐Ÿป๐Ÿ˜Ÿ๐Ÿ˜ฃ๐Ÿง๐Ÿ˜ ๐Ÿค ๐Ÿ˜ป๐ŸŒ™๐Ÿ˜›๐Ÿค™๐Ÿ™Š"); + + if (const auto sv_opt = _conf.get_string("ImGuiFonts", "atlas_extra_text"); sv_opt.has_value) { + glyphbld.AddText(sv_opt.s.start, sv_opt.s.start+sv_opt.s.extend); + } + glyphbld.BuildRanges(&glyph_ranges); + } + + ImFontConfig fontcfg; + //fontcfg.SizePixels = 16.f*display_scale; + fontcfg.SizePixels = _conf.get_int("ImGuiFonts", "size").value_or(13) * display_scale; + fontcfg.RasterizerDensity = 1.f; + fontcfg.OversampleH = 2; + fontcfg.OversampleV = 1; + fontcfg.MergeMode = false; + + for (const auto [font_path, should_load] : _conf.entries_bool("ImGuiFonts", "fonts")) { + if (!should_load) { + continue; + } + + std::cout << "Font: loading '" << font_path << "'\n"; + const auto* resulting_font = font_atlas->AddFontFromFileTTF( + font_path.c_str(), + _conf.get_int("ImGuiFonts", "size", font_path).value_or(0) * display_scale, + &fontcfg, + &(glyph_ranges[0]) + ); + + if (resulting_font != nullptr) { + //has_font = true; + fontcfg.MergeMode = true; + } else { + std::cerr << "Font: failed to load '" << "path" << "' !\n"; + } + } + + // always append the default as a fallback (merge in) + { +#if 0 + ImFontConfig fontcfg; + + // upsampling to int looks almost ok + //const float font_size_scale = 1.3f * display_scale; + const float font_size_scale = 1.0f * display_scale; + const float font_oversample = 4.f; + + // default font is pixel perfect at 13 + fontcfg.SizePixels = 13.f * font_size_scale; + fontcfg.RasterizerDensity = font_oversample/font_size_scale; + // normally density would be set to dpi scale of the display + + fontcfg.MergeMode = has_font; +#endif + + font_atlas->AddFontDefault(&fontcfg); + } + + font_atlas->Build(); + } } Screen* StartScreen::render(float, bool&) {