Fix subtitle font handling with in-memory fonts from SMPTE (#2509).
[dcpomatic.git] / src / lib / render_text.cc
index b32bed557d9557a07037f7d5de9008cbacbe474e..1a06722626d140fdd3b0b32b9a442734a7a3fb5f 100644 (file)
@@ -47,6 +47,7 @@ using std::min;
 using std::pair;
 using std::shared_ptr;
 using std::string;
+using boost::optional;
 using namespace dcpomatic;
 
 
@@ -170,19 +171,6 @@ create_surface (shared_ptr<Image> image)
 }
 
 
-static string
-setup_font(shared_ptr<const dcpomatic::Font> font)
-{
-       auto font_file = default_font_file ();
-
-       if (font && font->file()) {
-               font_file = *font->file();
-       }
-
-       return FontConfig::instance()->make_font_available(font_file);
-}
-
-
 static float
 calculate_fade_factor (StringText const& first, DCPTime time, int frame_rate)
 {
@@ -313,7 +301,7 @@ setup_layout(list<StringText> subtitles, dcp::Size target, DCPTime time, int fra
        DCPOMATIC_ASSERT(!subtitles.empty());
        auto const& first = subtitles.front();
 
-       auto const font_name = setup_font(first.font);
+       auto const font_name = FontConfig::instance()->make_font_available(first.font);
        auto const fade_factor = calculate_fade_factor(first, time, frame_rate);
        auto const markup = marked_up(subtitles, target.height, fade_factor, font_name);
        auto layout = create_layout(font_name, markup);
@@ -436,17 +424,18 @@ render_text (list<StringText> subtitles, dcp::Size target, DCPTime time, int fra
 
 
 list<dcpomatic::Rect<int>>
-bounding_box(list<StringText> subtitles, dcp::Size target)
+bounding_box(list<StringText> subtitles, dcp::Size target, optional<dcp::SubtitleStandard> override_standard)
 {
        list<StringText> pending;
        list<dcpomatic::Rect<int>> rects;
 
-       auto use_pending = [&pending, &rects, target]() {
+       auto use_pending = [&pending, &rects, target, override_standard]() {
                auto const& subtitle = pending.front();
+               auto standard = override_standard.get_value_or(subtitle.valign_standard);
                /* We can provide dummy values for time and frame rate here as they are only used to calculate fades */
                auto layout = setup_layout(pending, target, DCPTime(), 24);
                int const x = x_position(subtitle.h_align(), subtitle.h_position(), target.width, layout.size.width);
-               int const y = y_position(subtitle.valign_standard, subtitle.v_align(), subtitle.v_position(), target.height, layout.position.y, layout.size.height);
+               int const y = y_position(standard, subtitle.v_align(), subtitle.v_position(), target.height, layout.position.y, layout.size.height);
                rects.push_back({Position<int>(x, y), layout.size.width, layout.size.height});
        };
 
@@ -490,7 +479,7 @@ FontMetrics::get(StringText const& subtitle)
                return iter;
        }
 
-       auto const font_name = setup_font(subtitle.font);
+       auto const font_name = FontConfig::instance()->make_font_available(subtitle.font);
        auto copy = subtitle;
        copy.set_text("Qypjg");
        auto layout = create_layout(font_name, marked_up({copy}, _target_height, 1, font_name));