diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.cpp b/scwx-qt/source/scwx/qt/manager/font_manager.cpp index 72779f67..89a1643f 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.cpp @@ -472,6 +472,7 @@ FontManager::Impl::MatchFontFile(const std::string& family, FcPatternAddString(pattern, FC_FONTFORMAT, reinterpret_cast(kFcTrueType_.c_str())); + FcPatternAddBool(pattern, FC_SYMBOL, FcFalse); if (!styles.empty()) { @@ -485,29 +486,51 @@ FontManager::Impl::MatchFontFile(const std::string& family, FcDefaultSubstitute(pattern); // Find matching font - FcResult result; - FcPattern* match = FcFontMatch(nullptr, pattern, &result); + FcResult result {}; + FcFontSet* matches = FcFontSort(nullptr, pattern, FcFalse, nullptr, &result); FontRecord record {}; - if (match != nullptr) + if (matches != nullptr) { - FcChar8* fcFamily; - FcChar8* fcStyle; - FcChar8* fcFile; - - // Match was found, get properties - if (FcPatternGetString(match, FC_FAMILY, 0, &fcFamily) == FcResultMatch && - FcPatternGetString(match, FC_STYLE, 0, &fcStyle) == FcResultMatch && - FcPatternGetString(match, FC_FILE, 0, &fcFile) == FcResultMatch) + for (int i = 0; i < matches->nfont; i++) { - record.family_ = reinterpret_cast(fcFamily); - record.style_ = reinterpret_cast(fcStyle); - record.filename_ = reinterpret_cast(fcFile); + FcPattern* match = + // Using C code requires pointer arithmetic + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) + FcFontRenderPrepare(nullptr, pattern, matches->fonts[i]); + if (match == nullptr) + { + continue; + } + FcChar8* fcFamily = nullptr; + FcChar8* fcStyle = nullptr; + FcChar8* fcFile = nullptr; + FcBool fcSymbol = FcFalse; - logger_->debug("Found matching font: {}:{} ({})", - record.family_, - record.style_, - record.filename_); + // Match was found, get properties + if (FcPatternGetString(match, FC_FAMILY, 0, &fcFamily) == + FcResultMatch && + FcPatternGetString(match, FC_STYLE, 0, &fcStyle) == + FcResultMatch && + FcPatternGetString(match, FC_FILE, 0, &fcFile) == FcResultMatch && + FcPatternGetBool(match, FC_SYMBOL, 0, &fcSymbol) == + FcResultMatch && + fcSymbol == FcFalse /*Must check fcSymbol manually*/) + { + record.family_ = reinterpret_cast(fcFamily); + record.style_ = reinterpret_cast(fcStyle); + record.filename_ = reinterpret_cast(fcFile); + + logger_->debug("Found matching font: {}:{} ({}) {}", + record.family_, + record.style_, + record.filename_, + fcSymbol); + FcPatternDestroy(match); + break; + } + + FcPatternDestroy(match); } } @@ -517,7 +540,7 @@ FontManager::Impl::MatchFontFile(const std::string& family, } // Cleanup - FcPatternDestroy(match); + FcFontSetDestroy(matches); FcPatternDestroy(pattern); return record; diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index df45024a..ab7b0cf6 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -1619,6 +1619,14 @@ void MapWidgetImpl::ImGuiCheckFonts() ImGui_ImplOpenGL3_CreateFontsTexture(); } + static bool haveLogged = false; + if (!model::ImGuiContextModel::Instance().font_atlas()->IsBuilt() && + !haveLogged) + { + logger_->error("ImGui font atlas could not be built."); + haveLogged = true; + } + imGuiFontsBuildCount_ = currentImGuiFontsBuildCount; }