mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 23:30:04 +00:00
Get ImGui font by font category
This commit is contained in:
parent
e4ab1e8c19
commit
acc782b2bc
4 changed files with 60 additions and 10 deletions
|
|
@ -64,6 +64,8 @@ public:
|
||||||
|
|
||||||
std::shared_mutex imguiFontAtlasMutex_ {};
|
std::shared_mutex imguiFontAtlasMutex_ {};
|
||||||
|
|
||||||
|
std::uint64_t imguiFontsBuildCount_ {};
|
||||||
|
|
||||||
boost::unordered_flat_map<FontRecordPair,
|
boost::unordered_flat_map<FontRecordPair,
|
||||||
std::shared_ptr<types::ImGuiFont>,
|
std::shared_ptr<types::ImGuiFont>,
|
||||||
FontRecordHash<FontRecordPair>>
|
FontRecordHash<FontRecordPair>>
|
||||||
|
|
@ -73,6 +75,12 @@ public:
|
||||||
boost::unordered_flat_map<std::string, std::vector<std::uint8_t>>
|
boost::unordered_flat_map<std::string, std::vector<std::uint8_t>>
|
||||||
rawFontData_ {};
|
rawFontData_ {};
|
||||||
std::mutex rawFontDataMutex_ {};
|
std::mutex rawFontDataMutex_ {};
|
||||||
|
|
||||||
|
std::shared_ptr<types::ImGuiFont> defaultFont_ {};
|
||||||
|
boost::unordered_flat_map<types::FontCategory,
|
||||||
|
std::shared_ptr<types::ImGuiFont>>
|
||||||
|
fontCategoryMap_ {};
|
||||||
|
std::mutex fontCategoryMutex_ {};
|
||||||
};
|
};
|
||||||
|
|
||||||
FontManager::FontManager() : p(std::make_unique<Impl>()) {}
|
FontManager::FontManager() : p(std::make_unique<Impl>()) {}
|
||||||
|
|
@ -84,11 +92,30 @@ std::shared_mutex& FontManager::imgui_font_atlas_mutex()
|
||||||
return p->imguiFontAtlasMutex_;
|
return p->imguiFontAtlasMutex_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::uint64_t FontManager::imgui_fonts_build_count() const
|
||||||
|
{
|
||||||
|
return p->imguiFontsBuildCount_;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<types::ImGuiFont>
|
std::shared_ptr<types::ImGuiFont>
|
||||||
FontManager::GetImGuiFont(const std::string& family,
|
FontManager::GetImGuiFont(types::FontCategory fontCategory)
|
||||||
const std::vector<std::string>& styles,
|
{
|
||||||
units::font_size::points<double> size,
|
std::unique_lock lock {p->fontCategoryMutex_};
|
||||||
bool loadIfNotFound)
|
|
||||||
|
auto it = p->fontCategoryMap_.find(fontCategory);
|
||||||
|
if (it != p->fontCategoryMap_.cend())
|
||||||
|
{
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p->defaultFont_;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<types::ImGuiFont>
|
||||||
|
FontManager::LoadImGuiFont(const std::string& family,
|
||||||
|
const std::vector<std::string>& styles,
|
||||||
|
units::font_size::points<double> size,
|
||||||
|
bool loadIfNotFound)
|
||||||
{
|
{
|
||||||
const std::string styleString = fmt::format("{}", fmt::join(styles, " "));
|
const std::string styleString = fmt::format("{}", fmt::join(styles, " "));
|
||||||
const std::string fontString =
|
const std::string fontString =
|
||||||
|
|
@ -148,6 +175,9 @@ FontManager::GetImGuiFont(const std::string& family,
|
||||||
// Store the ImGui font
|
// Store the ImGui font
|
||||||
p->imguiFonts_.insert_or_assign(imguiFontKey, imguiFont);
|
p->imguiFonts_.insert_or_assign(imguiFontKey, imguiFont);
|
||||||
|
|
||||||
|
// Increment ImGui font build count
|
||||||
|
++p->imguiFontsBuildCount_;
|
||||||
|
|
||||||
// Return the ImGui font
|
// Return the ImGui font
|
||||||
return imguiFont;
|
return imguiFont;
|
||||||
}
|
}
|
||||||
|
|
@ -181,7 +211,7 @@ FontManager::Impl::GetRawFontData(const std::string& filename)
|
||||||
auto result = rawFontData_.emplace(filename, std::move(buffer));
|
auto result = rawFontData_.emplace(filename, std::move(buffer));
|
||||||
|
|
||||||
// Return the cached buffer
|
// Return the cached buffer
|
||||||
return it->second;
|
return result.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FontManager::LoadApplicationFont(const std::string& filename)
|
void FontManager::LoadApplicationFont(const std::string& filename)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <scwx/qt/types/imgui_font.hpp>
|
#include <scwx/qt/types/imgui_font.hpp>
|
||||||
|
#include <scwx/qt/types/text_types.hpp>
|
||||||
|
|
||||||
#include <shared_mutex>
|
#include <shared_mutex>
|
||||||
|
|
||||||
|
|
@ -22,12 +23,15 @@ public:
|
||||||
~FontManager();
|
~FontManager();
|
||||||
|
|
||||||
std::shared_mutex& imgui_font_atlas_mutex();
|
std::shared_mutex& imgui_font_atlas_mutex();
|
||||||
|
std::uint64_t imgui_fonts_build_count() const;
|
||||||
|
|
||||||
std::shared_ptr<types::ImGuiFont>
|
std::shared_ptr<types::ImGuiFont>
|
||||||
GetImGuiFont(const std::string& family,
|
GetImGuiFont(types::FontCategory fontCategory);
|
||||||
const std::vector<std::string>& styles,
|
std::shared_ptr<types::ImGuiFont>
|
||||||
units::font_size::points<double> size,
|
LoadImGuiFont(const std::string& family,
|
||||||
bool loadIfNotFound = false);
|
const std::vector<std::string>& styles,
|
||||||
|
units::font_size::points<double> size,
|
||||||
|
bool loadIfNotFound = true);
|
||||||
|
|
||||||
void LoadApplicationFont(const std::string& filename);
|
void LoadApplicationFont(const std::string& filename);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -707,7 +707,7 @@ void PlacefileManager::Impl::LoadFontResources(
|
||||||
styles.push_back("italic");
|
styles.push_back("italic");
|
||||||
}
|
}
|
||||||
|
|
||||||
FontManager::Instance().GetImGuiFont(font.second->face_, styles, size);
|
FontManager::Instance().LoadImGuiFont(font.second->face_, styles, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,7 @@ public:
|
||||||
ImGuiContext* imGuiContext_;
|
ImGuiContext* imGuiContext_;
|
||||||
std::string imGuiContextName_;
|
std::string imGuiContextName_;
|
||||||
bool imGuiRendererInitialized_;
|
bool imGuiRendererInitialized_;
|
||||||
|
std::uint64_t imGuiFontsBuildCount_ {};
|
||||||
|
|
||||||
std::shared_ptr<manager::PlacefileManager> placefileManager_ {
|
std::shared_ptr<manager::PlacefileManager> placefileManager_ {
|
||||||
manager::PlacefileManager::Instance()};
|
manager::PlacefileManager::Instance()};
|
||||||
|
|
@ -981,9 +982,15 @@ void MapWidget::initializeGL()
|
||||||
makeCurrent();
|
makeCurrent();
|
||||||
p->context_->gl().initializeOpenGLFunctions();
|
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
|
// Initialize ImGui OpenGL3 backend
|
||||||
ImGui::SetCurrentContext(p->imGuiContext_);
|
ImGui::SetCurrentContext(p->imGuiContext_);
|
||||||
ImGui_ImplOpenGL3_Init();
|
ImGui_ImplOpenGL3_Init();
|
||||||
|
p->imGuiFontsBuildCount_ =
|
||||||
|
manager::FontManager::Instance().imgui_fonts_build_count();
|
||||||
p->imGuiRendererInitialized_ = true;
|
p->imGuiRendererInitialized_ = true;
|
||||||
|
|
||||||
p->map_.reset(
|
p->map_.reset(
|
||||||
|
|
@ -1038,6 +1045,15 @@ void MapWidget::paintGL()
|
||||||
ImGui_ImplOpenGL3_NewFrame();
|
ImGui_ImplOpenGL3_NewFrame();
|
||||||
ImGui::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
|
// Update pixel ratio
|
||||||
p->context_->set_pixel_ratio(pixelRatio());
|
p->context_->set_pixel_ratio(pixelRatio());
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue