diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.cpp b/scwx-qt/source/scwx/qt/manager/font_manager.cpp index 2b38168c..295d0cd8 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.cpp @@ -64,6 +64,8 @@ public: std::shared_mutex imguiFontAtlasMutex_ {}; + std::uint64_t imguiFontsBuildCount_ {}; + boost::unordered_flat_map, FontRecordHash> @@ -73,6 +75,12 @@ public: boost::unordered_flat_map> rawFontData_ {}; std::mutex rawFontDataMutex_ {}; + + std::shared_ptr defaultFont_ {}; + boost::unordered_flat_map> + fontCategoryMap_ {}; + std::mutex fontCategoryMutex_ {}; }; FontManager::FontManager() : p(std::make_unique()) {} @@ -84,11 +92,30 @@ std::shared_mutex& FontManager::imgui_font_atlas_mutex() return p->imguiFontAtlasMutex_; } +std::uint64_t FontManager::imgui_fonts_build_count() const +{ + return p->imguiFontsBuildCount_; +} + std::shared_ptr -FontManager::GetImGuiFont(const std::string& family, - const std::vector& styles, - units::font_size::points size, - bool loadIfNotFound) +FontManager::GetImGuiFont(types::FontCategory fontCategory) +{ + std::unique_lock lock {p->fontCategoryMutex_}; + + auto it = p->fontCategoryMap_.find(fontCategory); + if (it != p->fontCategoryMap_.cend()) + { + return it->second; + } + + return p->defaultFont_; +} + +std::shared_ptr +FontManager::LoadImGuiFont(const std::string& family, + const std::vector& styles, + units::font_size::points size, + bool loadIfNotFound) { const std::string styleString = fmt::format("{}", fmt::join(styles, " ")); const std::string fontString = @@ -148,6 +175,9 @@ FontManager::GetImGuiFont(const std::string& family, // Store the ImGui font p->imguiFonts_.insert_or_assign(imguiFontKey, imguiFont); + // Increment ImGui font build count + ++p->imguiFontsBuildCount_; + // Return the ImGui font return imguiFont; } @@ -181,7 +211,7 @@ FontManager::Impl::GetRawFontData(const std::string& filename) auto result = rawFontData_.emplace(filename, std::move(buffer)); // Return the cached buffer - return it->second; + return result.first->second; } void FontManager::LoadApplicationFont(const std::string& filename) diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.hpp b/scwx-qt/source/scwx/qt/manager/font_manager.hpp index 171da79c..6cee1135 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -22,12 +23,15 @@ public: ~FontManager(); std::shared_mutex& imgui_font_atlas_mutex(); + std::uint64_t imgui_fonts_build_count() const; std::shared_ptr - GetImGuiFont(const std::string& family, - const std::vector& styles, - units::font_size::points size, - bool loadIfNotFound = false); + GetImGuiFont(types::FontCategory fontCategory); + std::shared_ptr + LoadImGuiFont(const std::string& family, + const std::vector& styles, + units::font_size::points size, + bool loadIfNotFound = true); void LoadApplicationFont(const std::string& filename); diff --git a/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp b/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp index d721e5cb..52414031 100644 --- a/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp @@ -707,7 +707,7 @@ void PlacefileManager::Impl::LoadFontResources( styles.push_back("italic"); } - FontManager::Instance().GetImGuiFont(font.second->face_, styles, size); + FontManager::Instance().LoadImGuiFont(font.second->face_, styles, size); } } diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 89eabb3f..96aca7a2 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -155,6 +155,7 @@ public: ImGuiContext* imGuiContext_; std::string imGuiContextName_; bool imGuiRendererInitialized_; + std::uint64_t imGuiFontsBuildCount_ {}; std::shared_ptr placefileManager_ { manager::PlacefileManager::Instance()}; @@ -981,9 +982,15 @@ void MapWidget::initializeGL() makeCurrent(); p->context_->gl().initializeOpenGLFunctions(); + // Lock ImGui font atlas prior to new ImGui frame + std::shared_lock imguiFontAtlasLock { + manager::FontManager::Instance().imgui_font_atlas_mutex()}; + // Initialize ImGui OpenGL3 backend ImGui::SetCurrentContext(p->imGuiContext_); ImGui_ImplOpenGL3_Init(); + p->imGuiFontsBuildCount_ = + manager::FontManager::Instance().imgui_fonts_build_count(); p->imGuiRendererInitialized_ = true; p->map_.reset( @@ -1038,6 +1045,15 @@ void MapWidget::paintGL() ImGui_ImplOpenGL3_NewFrame(); ImGui::NewFrame(); + // Update ImGui Fonts if required + std::uint64_t currentImGuiFontsBuildCount = + manager::FontManager::Instance().imgui_fonts_build_count(); + if (p->imGuiFontsBuildCount_ != currentImGuiFontsBuildCount) + { + ImGui_ImplOpenGL3_DestroyFontsTexture(); + ImGui_ImplOpenGL3_CreateFontsTexture(); + } + // Update pixel ratio p->context_->set_pixel_ratio(pixelRatio());