/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "Host/SystemFontResolver.hpp" #include "Base/Logger.hpp" #include "Base/Utils.hpp" #include #include namespace OpenVulkano { const std::string& SystemFontResolver::GetSystemFontPath(const std::string& fontName) { // fontName -> fontPath static std::map fontFilesMapping = ReadSystemFonts(); static std::string fallbackString; auto it = fontFilesMapping.find(Utils::ToLower(fontName)); return it == fontFilesMapping.end() ? fallbackString : it->second; } std::map SystemFontResolver::ReadSystemFonts() { std::unique_ptr config(FcInitLoadConfigAndFonts(), &FcConfigDestroy); std::unique_ptr pat(FcPatternCreate(), &FcPatternDestroy); std::unique_ptr os(FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_LANG, FC_FILE, NULL), &FcObjectSetDestroy); std::unique_ptr fs(FcFontList(config.get(), pat.get(), os.get()), &FcFontSetDestroy); if (!fs) { Logger::DATA->warn("Could not get system fonts"); return {}; } std::map fontFilesMapping; for (int i = 0; i < fs->nfont; ++i) { FcPattern* font = fs->fonts[i]; FcChar8* file; FcChar8 *style; FcChar8 *family; if (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch && FcPatternGetString(font, FC_FAMILY, 0, &family) == FcResultMatch && FcPatternGetString(font, FC_STYLE, 0, &style) == FcResultMatch) { std::string fontFull = std::string(reinterpret_cast(family)) + " " + std::string(reinterpret_cast(style)); Utils::ToLower(fontFull); fontFilesMapping[std::move(fontFull)] = std::string(reinterpret_cast(file)); } } return fontFilesMapping; } }