diff --git a/src/slic3r/Utils/FontConfigHelp.cpp b/src/slic3r/Utils/FontConfigHelp.cpp index 66891bb9c1..37275a9f45 100644 --- a/src/slic3r/Utils/FontConfigHelp.cpp +++ b/src/slic3r/Utils/FontConfigHelp.cpp @@ -8,14 +8,18 @@ using namespace Slic3r::GUI; -FontConfigHelp::FontConfigHelp() { FcInit(); } -FontConfigHelp::~FontConfigHelp() { - // fccache.c:795: FcCacheFini: Assertion `fcCacheChains[i] == NULL' failed. - // FcFini(); -} +// @Vojta suggest to make static variable global +// Guard for finalize Font Config +// Will be finalized on application exit +static std::optional finalize_guard; -std::string FontConfigHelp::get_font_path(const wxFont &font) +std::string Slic3r::GUI::get_font_path(const wxFont &font) { + if (!finalize_guard.has_value()) { + FcInit(); + finalize_guard.emplace([]() { FcFini(); }); + } + FcConfig *fc = FcInitLoadConfigAndFonts(); if (fc == nullptr) return ""; ScopeGuard sg_fc([fc]() { FcConfigDestroy(fc); }); diff --git a/src/slic3r/Utils/FontConfigHelp.hpp b/src/slic3r/Utils/FontConfigHelp.hpp index eb2da63977..10f7d1c1fa 100644 --- a/src/slic3r/Utils/FontConfigHelp.hpp +++ b/src/slic3r/Utils/FontConfigHelp.hpp @@ -7,33 +7,15 @@ #ifdef EXIST_FONT_CONFIG_INCLUDE #include -namespace Slic3r::GUI { +namespace Slic3r::GUI { /// -/// helper object for RAII access to font config -/// initialize & finalize FontConfig +/// initialize font config +/// Convert wx widget font to file path +/// inspired by wxpdfdoc - +/// https://github.com/utelle/wxpdfdoc/blob/5bdcdb9953327d06dc50ec312685ccd9bc8400e0/src/pdffontmanager.cpp /// -class FontConfigHelp -{ -public: - /// - /// initialize font config - /// - FontConfigHelp(); - - /// - /// free font config resources - /// - ~FontConfigHelp(); - - /// - /// initialize font config - /// Convert wx widget font to file path - /// inspired by wxpdfdoc - - /// https://github.com/utelle/wxpdfdoc/blob/5bdcdb9953327d06dc50ec312685ccd9bc8400e0/src/pdffontmanager.cpp - /// - std::string get_font_path(const wxFont &font); -}; +std::string get_font_path(const wxFont &font); } // namespace Slic3r #endif // EXIST_FONT_CONFIG_INCLUDE diff --git a/src/slic3r/Utils/WxFontUtils.cpp b/src/slic3r/Utils/WxFontUtils.cpp index ad143b4de4..7f0b2f210a 100644 --- a/src/slic3r/Utils/WxFontUtils.cpp +++ b/src/slic3r/Utils/WxFontUtils.cpp @@ -59,9 +59,7 @@ bool WxFontUtils::can_load(const wxFont &font) return false; return is_valid_ttf(file_path); #elif defined(__linux__) - // TODO: find better way - static FontConfigHelp help; - std::string font_path = help.get_font_path(font); + std::string font_path = Slic3r::GUI::get_font_path(font); return !font_path.empty(); #endif return false; @@ -88,8 +86,7 @@ std::unique_ptr WxFontUtils::create_font_file(const wxFont &fo file_path = file_path.substr(start, file_path.size() - start); return Emboss::create_font_file(file_path.c_str()); #elif defined(__linux__) - static FontConfigHelp help; - std::string font_path = help.get_font_path(font); + std::string font_path = Slic3r::GUI::get_font_path(font); if (font_path.empty()) return nullptr; return Emboss::create_font_file(font_path.c_str()); #else