mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-11-01 00:20:06 +00:00
Refactoring fontconfig from Resource Manager to Font Manager
This commit is contained in:
parent
190bd95781
commit
c807188b2b
5 changed files with 206 additions and 183 deletions
|
|
@ -1,6 +1,13 @@
|
||||||
#include <scwx/qt/manager/font_manager.hpp>
|
#include <scwx/qt/manager/font_manager.hpp>
|
||||||
#include <scwx/util/logger.hpp>
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <fontconfig/fontconfig.h>
|
||||||
|
|
||||||
namespace scwx
|
namespace scwx
|
||||||
{
|
{
|
||||||
namespace qt
|
namespace qt
|
||||||
|
|
@ -11,33 +18,206 @@ namespace manager
|
||||||
static const std::string logPrefix_ = "scwx::qt::manager::font_manager";
|
static const std::string logPrefix_ = "scwx::qt::manager::font_manager";
|
||||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||||
|
|
||||||
|
static const std::string kFcTrueType_ {"TrueType"};
|
||||||
|
|
||||||
|
struct FontRecord
|
||||||
|
{
|
||||||
|
std::string family_ {};
|
||||||
|
std::string style_ {};
|
||||||
|
std::string filename_ {};
|
||||||
|
};
|
||||||
|
|
||||||
class FontManager::Impl
|
class FontManager::Impl
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit Impl() {}
|
explicit Impl()
|
||||||
~Impl() {}
|
{
|
||||||
|
InitializeFontCache();
|
||||||
|
InitializeFontconfig();
|
||||||
|
}
|
||||||
|
~Impl() { FinalizeFontconfig(); }
|
||||||
|
|
||||||
|
void FinalizeFontconfig();
|
||||||
|
void InitializeFontCache();
|
||||||
|
void InitializeFontconfig();
|
||||||
|
|
||||||
|
static FontRecord MatchFontFile(const std::string& family,
|
||||||
|
const std::vector<std::string>& styles);
|
||||||
|
|
||||||
|
std::string fontCachePath_ {};
|
||||||
};
|
};
|
||||||
|
|
||||||
FontManager::FontManager() : p(std::make_unique<Impl>()) {}
|
FontManager::FontManager() : p(std::make_unique<Impl>()) {}
|
||||||
|
|
||||||
FontManager::~FontManager() {};
|
FontManager::~FontManager() {};
|
||||||
|
|
||||||
std::shared_ptr<FontManager> FontManager::Instance()
|
std::shared_ptr<types::ImGuiFont>
|
||||||
|
FontManager::GetImGuiFont(const std::string& family,
|
||||||
|
const std::vector<std::string>& styles,
|
||||||
|
units::font_size::points<double> size)
|
||||||
{
|
{
|
||||||
static std::weak_ptr<FontManager> fontManagerReference_ {};
|
const std::string styleString = fmt::format("{}", fmt::join(styles, " "));
|
||||||
static std::mutex instanceMutex_ {};
|
const std::string fontString =
|
||||||
|
fmt::format("{}-{}:{}", family, size.value(), styleString);
|
||||||
|
|
||||||
std::unique_lock lock(instanceMutex_);
|
logger_->debug("LoadFontResource: {}", fontString);
|
||||||
|
|
||||||
std::shared_ptr<FontManager> fontManager = fontManagerReference_.lock();
|
FontRecord fontRecord = Impl::MatchFontFile(family, styles);
|
||||||
|
|
||||||
if (fontManager == nullptr)
|
// TODO:
|
||||||
|
Q_UNUSED(fontRecord);
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::LoadApplicationFont(const std::string& filename)
|
||||||
|
{
|
||||||
|
// If the font cache failed to create, don't attempt to cache any fonts
|
||||||
|
if (p->fontCachePath_.empty())
|
||||||
{
|
{
|
||||||
fontManager = std::make_shared<FontManager>();
|
return;
|
||||||
fontManagerReference_ = fontManager;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return fontManager;
|
// Make a copy of the font in the cache (if it doesn't exist)
|
||||||
|
QFile fontFile(QString::fromStdString(filename));
|
||||||
|
QFileInfo fontFileInfo(fontFile);
|
||||||
|
|
||||||
|
QFile cacheFile(QString::fromStdString(p->fontCachePath_) +
|
||||||
|
fontFileInfo.fileName());
|
||||||
|
QFileInfo cacheFileInfo(cacheFile);
|
||||||
|
std::string cacheFilename = cacheFile.fileName().toStdString();
|
||||||
|
|
||||||
|
if (fontFile.exists())
|
||||||
|
{
|
||||||
|
// If the file has not been cached, or the font file size has changed
|
||||||
|
if (!cacheFile.exists() || fontFileInfo.size() != cacheFileInfo.size())
|
||||||
|
{
|
||||||
|
logger_->info("Caching font: {}", filename);
|
||||||
|
if (!fontFile.copy(cacheFile.fileName()))
|
||||||
|
{
|
||||||
|
logger_->error("Could not cache font: {}", filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger_->error("Font does not exist: {}", filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the file into fontconfig
|
||||||
|
FcBool result = FcConfigAppFontAddFile(
|
||||||
|
nullptr, reinterpret_cast<const FcChar8*>(cacheFilename.c_str()));
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
logger_->error("Could not load font into fontconfig database", filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::Impl::InitializeFontCache()
|
||||||
|
{
|
||||||
|
std::string cachePath {
|
||||||
|
QStandardPaths::writableLocation(QStandardPaths::CacheLocation)
|
||||||
|
.toStdString() +
|
||||||
|
"/fonts"};
|
||||||
|
|
||||||
|
fontCachePath_ = cachePath + "/";
|
||||||
|
|
||||||
|
if (!std::filesystem::exists(cachePath))
|
||||||
|
{
|
||||||
|
std::error_code error;
|
||||||
|
if (!std::filesystem::create_directories(cachePath, error))
|
||||||
|
{
|
||||||
|
logger_->error("Unable to create font cache directory: \"{}\" ({})",
|
||||||
|
cachePath,
|
||||||
|
error.message());
|
||||||
|
fontCachePath_.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::Impl::InitializeFontconfig()
|
||||||
|
{
|
||||||
|
FcConfig* fcConfig = FcInitLoadConfigAndFonts();
|
||||||
|
FcConfigSetCurrent(fcConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontManager::Impl::FinalizeFontconfig()
|
||||||
|
{
|
||||||
|
FcFini();
|
||||||
|
}
|
||||||
|
|
||||||
|
FontRecord
|
||||||
|
FontManager::Impl::MatchFontFile(const std::string& family,
|
||||||
|
const std::vector<std::string>& styles)
|
||||||
|
{
|
||||||
|
const std::string styleString = fmt::format("{}", fmt::join(styles, " "));
|
||||||
|
const std::string fontString = fmt::format("{}:{}", family, styleString);
|
||||||
|
|
||||||
|
// Build fontconfig pattern
|
||||||
|
FcPattern* pattern = FcPatternCreate();
|
||||||
|
|
||||||
|
FcPatternAddString(
|
||||||
|
pattern, FC_FAMILY, reinterpret_cast<const FcChar8*>(family.c_str()));
|
||||||
|
FcPatternAddString(pattern,
|
||||||
|
FC_FONTFORMAT,
|
||||||
|
reinterpret_cast<const FcChar8*>(kFcTrueType_.c_str()));
|
||||||
|
|
||||||
|
if (!styles.empty())
|
||||||
|
{
|
||||||
|
FcPatternAddString(pattern,
|
||||||
|
FC_STYLE,
|
||||||
|
reinterpret_cast<const FcChar8*>(styleString.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform font pattern match substitution
|
||||||
|
FcConfigSubstitute(nullptr, pattern, FcMatchPattern);
|
||||||
|
FcDefaultSubstitute(pattern);
|
||||||
|
|
||||||
|
// Find matching font
|
||||||
|
FcResult result;
|
||||||
|
FcPattern* match = FcFontMatch(nullptr, pattern, &result);
|
||||||
|
FontRecord record {};
|
||||||
|
|
||||||
|
if (match != 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)
|
||||||
|
{
|
||||||
|
record.family_ = reinterpret_cast<char*>(fcFamily);
|
||||||
|
record.style_ = reinterpret_cast<char*>(fcStyle);
|
||||||
|
record.filename_ = reinterpret_cast<char*>(fcFile);
|
||||||
|
|
||||||
|
logger_->debug("Found matching font: {}:{} ({})",
|
||||||
|
record.family_,
|
||||||
|
record.style_,
|
||||||
|
record.filename_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (record.filename_.empty())
|
||||||
|
{
|
||||||
|
logger_->warn("Could not find matching font: {}", fontString);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
FcPatternDestroy(match);
|
||||||
|
FcPatternDestroy(pattern);
|
||||||
|
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
FontManager& FontManager::Instance()
|
||||||
|
{
|
||||||
|
static FontManager instance_ {};
|
||||||
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace manager
|
} // namespace manager
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,14 @@ public:
|
||||||
explicit FontManager();
|
explicit FontManager();
|
||||||
~FontManager();
|
~FontManager();
|
||||||
|
|
||||||
static std::shared_ptr<FontManager> Instance();
|
std::shared_ptr<types::ImGuiFont>
|
||||||
|
GetImGuiFont(const std::string& family,
|
||||||
|
const std::vector<std::string>& styles,
|
||||||
|
units::font_size::points<double> size);
|
||||||
|
|
||||||
|
void LoadApplicationFont(const std::string& filename);
|
||||||
|
|
||||||
|
static FontManager& Instance();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Impl;
|
class Impl;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include <scwx/qt/manager/placefile_manager.hpp>
|
#include <scwx/qt/manager/placefile_manager.hpp>
|
||||||
|
#include <scwx/qt/manager/font_manager.hpp>
|
||||||
#include <scwx/qt/manager/resource_manager.hpp>
|
#include <scwx/qt/manager/resource_manager.hpp>
|
||||||
#include <scwx/qt/main/application.hpp>
|
#include <scwx/qt/main/application.hpp>
|
||||||
#include <scwx/qt/util/json.hpp>
|
#include <scwx/qt/util/json.hpp>
|
||||||
|
|
@ -706,7 +707,7 @@ void PlacefileManager::Impl::LoadFontResources(
|
||||||
styles.push_back("italic");
|
styles.push_back("italic");
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceManager::LoadFontResource(font.second->face_, styles, size);
|
FontManager::Instance().GetImGuiFont(font.second->face_, styles, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include <scwx/qt/manager/resource_manager.hpp>
|
#include <scwx/qt/manager/resource_manager.hpp>
|
||||||
|
#include <scwx/qt/manager/font_manager.hpp>
|
||||||
#include <scwx/qt/config/county_database.hpp>
|
#include <scwx/qt/config/county_database.hpp>
|
||||||
#include <scwx/qt/model/imgui_context_model.hpp>
|
#include <scwx/qt/model/imgui_context_model.hpp>
|
||||||
#include <scwx/qt/util/font.hpp>
|
#include <scwx/qt/util/font.hpp>
|
||||||
|
|
@ -6,14 +7,9 @@
|
||||||
#include <scwx/util/logger.hpp>
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
#include <execution>
|
#include <execution>
|
||||||
#include <filesystem>
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QFontDatabase>
|
#include <QFontDatabase>
|
||||||
#include <QStandardPaths>
|
|
||||||
#include <fontconfig/fontconfig.h>
|
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
|
||||||
namespace scwx
|
namespace scwx
|
||||||
|
|
@ -28,42 +24,26 @@ namespace ResourceManager
|
||||||
static const std::string logPrefix_ = "scwx::qt::manager::resource_manager";
|
static const std::string logPrefix_ = "scwx::qt::manager::resource_manager";
|
||||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||||
|
|
||||||
static void InitializeFonts();
|
|
||||||
static void InitializeFontCache();
|
|
||||||
static void LoadFcApplicationFont(const std::string& fontFilename);
|
|
||||||
static void LoadFonts();
|
static void LoadFonts();
|
||||||
static void LoadTextures();
|
static void LoadTextures();
|
||||||
|
|
||||||
static const std::string kFcTrueType_ {"TrueType"};
|
|
||||||
|
|
||||||
static const std::vector<std::pair<types::Font, std::string>> fontNames_ {
|
static const std::vector<std::pair<types::Font, std::string>> fontNames_ {
|
||||||
{types::Font::din1451alt, ":/res/fonts/din1451alt.ttf"},
|
{types::Font::din1451alt, ":/res/fonts/din1451alt.ttf"},
|
||||||
{types::Font::din1451alt_g, ":/res/fonts/din1451alt_g.ttf"},
|
{types::Font::din1451alt_g, ":/res/fonts/din1451alt_g.ttf"},
|
||||||
{types::Font::Inconsolata_Regular, ":/res/fonts/Inconsolata-Regular.ttf"}};
|
{types::Font::Inconsolata_Regular, ":/res/fonts/Inconsolata-Regular.ttf"}};
|
||||||
|
|
||||||
static std::string fontCachePath_ {};
|
|
||||||
|
|
||||||
static std::unordered_map<types::Font, int> fontIds_ {};
|
static std::unordered_map<types::Font, int> fontIds_ {};
|
||||||
static std::unordered_map<types::Font, std::shared_ptr<util::Font>> fonts_ {};
|
static std::unordered_map<types::Font, std::shared_ptr<util::Font>> fonts_ {};
|
||||||
|
|
||||||
static FcFontSet* fcFontSet_ {nullptr};
|
|
||||||
static FcObjectSet* fcObjectSet_ {nullptr};
|
|
||||||
|
|
||||||
void Initialize()
|
void Initialize()
|
||||||
{
|
{
|
||||||
config::CountyDatabase::Initialize();
|
config::CountyDatabase::Initialize();
|
||||||
|
|
||||||
InitializeFonts();
|
|
||||||
|
|
||||||
LoadFonts();
|
LoadFonts();
|
||||||
LoadTextures();
|
LoadTextures();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown()
|
void Shutdown() {}
|
||||||
{
|
|
||||||
// Finalize Fontconfig
|
|
||||||
FcFini();
|
|
||||||
}
|
|
||||||
|
|
||||||
int FontId(types::Font font)
|
int FontId(types::Font font)
|
||||||
{
|
{
|
||||||
|
|
@ -85,72 +65,6 @@ std::shared_ptr<util::Font> Font(types::Font font)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadFontResource(const std::string& family,
|
|
||||||
const std::vector<std::string>& styles,
|
|
||||||
units::font_size::points<double> size)
|
|
||||||
{
|
|
||||||
const std::string styleString = fmt::format("{}", fmt::join(styles, " "));
|
|
||||||
const std::string fontString =
|
|
||||||
fmt::format("{}-{}:{}", family, size.value(), styleString);
|
|
||||||
|
|
||||||
logger_->debug("LoadFontResource: {}", fontString);
|
|
||||||
|
|
||||||
// Build fontconfig pattern
|
|
||||||
FcPattern* pattern = FcPatternCreate();
|
|
||||||
|
|
||||||
FcPatternAddString(
|
|
||||||
pattern, FC_FAMILY, reinterpret_cast<const FcChar8*>(family.c_str()));
|
|
||||||
FcPatternAddDouble(pattern, FC_SIZE, size.value());
|
|
||||||
FcPatternAddString(pattern,
|
|
||||||
FC_FONTFORMAT,
|
|
||||||
reinterpret_cast<const FcChar8*>(kFcTrueType_.c_str()));
|
|
||||||
|
|
||||||
if (!styles.empty())
|
|
||||||
{
|
|
||||||
FcPatternAddString(pattern,
|
|
||||||
FC_STYLE,
|
|
||||||
reinterpret_cast<const FcChar8*>(styleString.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform font pattern match substitution
|
|
||||||
FcConfigSubstitute(nullptr, pattern, FcMatchPattern);
|
|
||||||
FcDefaultSubstitute(pattern);
|
|
||||||
|
|
||||||
// Find matching font
|
|
||||||
FcResult result;
|
|
||||||
FcPattern* match = FcFontMatch(nullptr, pattern, &result);
|
|
||||||
std::string fontFile {};
|
|
||||||
|
|
||||||
if (match != 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)
|
|
||||||
{
|
|
||||||
fontFile = reinterpret_cast<char*>(fcFile);
|
|
||||||
|
|
||||||
logger_->debug("Found matching font: {}:{} ({})",
|
|
||||||
reinterpret_cast<char*>(fcFamily),
|
|
||||||
reinterpret_cast<char*>(fcStyle),
|
|
||||||
fontFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fontFile.empty())
|
|
||||||
{
|
|
||||||
logger_->warn("Could not find matching font: {}", fontString);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cleanup
|
|
||||||
FcPatternDestroy(match);
|
|
||||||
FcPatternDestroy(pattern);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<boost::gil::rgba8_image_t>
|
std::shared_ptr<boost::gil::rgba8_image_t>
|
||||||
LoadImageResource(const std::string& urlString)
|
LoadImageResource(const std::string& urlString)
|
||||||
{
|
{
|
||||||
|
|
@ -187,47 +101,17 @@ LoadImageResources(const std::vector<std::string>& urlStrings)
|
||||||
return images;
|
return images;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InitializeFonts()
|
|
||||||
{
|
|
||||||
// Create a directory to store local fonts
|
|
||||||
InitializeFontCache();
|
|
||||||
|
|
||||||
// Initialize Fontconfig
|
|
||||||
FcConfig* fcConfig = FcInitLoadConfigAndFonts();
|
|
||||||
FcConfigSetCurrent(fcConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void InitializeFontCache()
|
|
||||||
{
|
|
||||||
std::string cachePath {
|
|
||||||
QStandardPaths::writableLocation(QStandardPaths::CacheLocation)
|
|
||||||
.toStdString() +
|
|
||||||
"/fonts"};
|
|
||||||
|
|
||||||
fontCachePath_ = cachePath + "/";
|
|
||||||
|
|
||||||
if (!std::filesystem::exists(cachePath))
|
|
||||||
{
|
|
||||||
std::error_code error;
|
|
||||||
if (!std::filesystem::create_directories(cachePath, error))
|
|
||||||
{
|
|
||||||
logger_->error("Unable to create font cache directory: \"{}\" ({})",
|
|
||||||
cachePath,
|
|
||||||
error.message());
|
|
||||||
fontCachePath_.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void LoadFonts()
|
static void LoadFonts()
|
||||||
{
|
{
|
||||||
|
auto& fontManager = FontManager::Instance();
|
||||||
|
|
||||||
for (auto& fontName : fontNames_)
|
for (auto& fontName : fontNames_)
|
||||||
{
|
{
|
||||||
int fontId = QFontDatabase::addApplicationFont(
|
int fontId = QFontDatabase::addApplicationFont(
|
||||||
QString::fromStdString(fontName.second));
|
QString::fromStdString(fontName.second));
|
||||||
fontIds_.emplace(fontName.first, fontId);
|
fontIds_.emplace(fontName.first, fontId);
|
||||||
|
|
||||||
LoadFcApplicationFont(fontName.second);
|
fontManager.LoadApplicationFont(fontName.second);
|
||||||
|
|
||||||
auto font = util::Font::Create(fontName.second);
|
auto font = util::Font::Create(fontName.second);
|
||||||
fonts_.emplace(fontName.first, font);
|
fonts_.emplace(fontName.first, font);
|
||||||
|
|
@ -237,52 +121,6 @@ static void LoadFonts()
|
||||||
fontAtlas->AddFontDefault();
|
fontAtlas->AddFontDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void LoadFcApplicationFont(const std::string& fontFilename)
|
|
||||||
{
|
|
||||||
// If the font cache failed to create, don't attempt to cache any fonts
|
|
||||||
if (fontCachePath_.empty())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make a copy of the font in the cache (if it doesn't exist)
|
|
||||||
QFile fontFile(QString::fromStdString(fontFilename));
|
|
||||||
QFileInfo fontFileInfo(fontFile);
|
|
||||||
|
|
||||||
QFile cacheFile(QString::fromStdString(fontCachePath_) +
|
|
||||||
fontFileInfo.fileName());
|
|
||||||
QFileInfo cacheFileInfo(cacheFile);
|
|
||||||
std::string cacheFilename = cacheFile.fileName().toStdString();
|
|
||||||
|
|
||||||
if (fontFile.exists())
|
|
||||||
{
|
|
||||||
// If the file has not been cached, or the font file size has changed
|
|
||||||
if (!cacheFile.exists() || fontFileInfo.size() != cacheFileInfo.size())
|
|
||||||
{
|
|
||||||
logger_->info("Caching font: {}", fontFilename);
|
|
||||||
if (!fontFile.copy(cacheFile.fileName()))
|
|
||||||
{
|
|
||||||
logger_->error("Could not cache font: {}", fontFilename);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger_->error("Font does not exist: {}", fontFilename);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the file into fontconfig (FcConfigAppFontAddFile)
|
|
||||||
FcBool result = FcConfigAppFontAddFile(
|
|
||||||
nullptr, reinterpret_cast<const FcChar8*>(cacheFilename.c_str()));
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
logger_->error("Could not load font into fontconfig database",
|
|
||||||
fontFilename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void LoadTextures()
|
static void LoadTextures()
|
||||||
{
|
{
|
||||||
util::TextureAtlas& textureAtlas = util::TextureAtlas::Instance();
|
util::TextureAtlas& textureAtlas = util::TextureAtlas::Instance();
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,6 @@ void Shutdown();
|
||||||
int FontId(types::Font font);
|
int FontId(types::Font font);
|
||||||
std::shared_ptr<util::Font> Font(types::Font font);
|
std::shared_ptr<util::Font> Font(types::Font font);
|
||||||
|
|
||||||
void LoadFontResource(const std::string& family,
|
|
||||||
const std::vector<std::string>& styles,
|
|
||||||
units::font_size::points<double> size);
|
|
||||||
std::shared_ptr<boost::gil::rgba8_image_t>
|
std::shared_ptr<boost::gil::rgba8_image_t>
|
||||||
LoadImageResource(const std::string& urlString);
|
LoadImageResource(const std::string& urlString);
|
||||||
std::vector<std::shared_ptr<boost::gil::rgba8_image_t>>
|
std::vector<std::shared_ptr<boost::gil::rgba8_image_t>>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue