From 280a456ae1da8fa648be1e9f68140f045b306e32 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 2 Jun 2022 12:20:41 +0200 Subject: [PATCH] Ask fontconfig to scan the system for fonts requested by text subtitle files (#2264). --- src/lib/font_config.cc | 28 ++++++++++++++++++++++++++++ src/lib/font_config.h | 1 + src/lib/string_text_file_content.cc | 18 +++++++++++------- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/lib/font_config.cc b/src/lib/font_config.cc index c7361bc04..5c9eebb3f 100644 --- a/src/lib/font_config.cc +++ b/src/lib/font_config.cc @@ -22,6 +22,7 @@ #include "dcpomatic_assert.h" #include "font_config.h" #include +#include #include @@ -85,6 +86,33 @@ FontConfig::make_font_available(boost::filesystem::path font_file) } +optional +FontConfig::system_font_with_name(string name) +{ + optional path; + + auto pattern = FcNameParse(reinterpret_cast(name.c_str())); + auto object_set = FcObjectSetBuild(FC_FILE, nullptr); + auto font_set = FcFontList(_config, pattern, object_set); + if (font_set) { + for (int i = 0; i < font_set->nfont; ++i) { + auto font = font_set->fonts[i]; + FcChar8* file; + if (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch) { + path = boost::filesystem::path(reinterpret_cast(file)); + break; + } + } + FcFontSetDestroy(font_set); + } + + FcObjectSetDestroy(object_set); + FcPatternDestroy(pattern); + + return path; +} + + FontConfig * FontConfig::instance() { diff --git a/src/lib/font_config.h b/src/lib/font_config.h index 7527d9127..6dadbae8a 100644 --- a/src/lib/font_config.h +++ b/src/lib/font_config.h @@ -32,6 +32,7 @@ public: static FontConfig* instance(); std::string make_font_available(boost::filesystem::path font_file); + boost::optional system_font_with_name(std::string name); private: FontConfig(); diff --git a/src/lib/string_text_file_content.cc b/src/lib/string_text_file_content.cc index 3750b0a50..eea9362bb 100644 --- a/src/lib/string_text_file_content.cc +++ b/src/lib/string_text_file_content.cc @@ -19,13 +19,15 @@ */ -#include "string_text_file_content.h" -#include "util.h" -#include "string_text_file.h" #include "film.h" #include "font.h" +#include "font_config.h" +#include "string_text_file.h" +#include "string_text_file_content.h" #include "text_content.h" +#include "util.h" #include +#include #include #include @@ -76,10 +78,12 @@ StringTextFileContent::examine (shared_ptr film, shared_ptr job } for (auto name: names) { - /* Make a font for each family name that somebody might later - * ask about. - */ - only_text()->add_font(make_shared(name)); + auto path = FontConfig::instance()->system_font_with_name(name); + if (path) { + only_text()->add_font(make_shared(name, *path)); + } else { + only_text()->add_font(make_shared(name)); + } } boost::mutex::scoped_lock lm (_mutex); -- 2.30.2