X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Frender_text.cc;h=8b9d93423d390062e53b710fba9feaf06b098a92;hb=4cb18d1e0b8fdedf6bb38e1d4187a2d782957022;hp=63ff2b74c916273adf714542f524b93d217ea368;hpb=9cb73fbc0fa4643612f01665bc6d9fc430656f32;p=dcpomatic.git diff --git a/src/lib/render_text.cc b/src/lib/render_text.cc index 63ff2b74c..8b9d93423 100644 --- a/src/lib/render_text.cc +++ b/src/lib/render_text.cc @@ -46,16 +46,17 @@ using std::make_pair; using boost::shared_ptr; using boost::optional; using boost::algorithm::replace_all; +using namespace dcpomatic; static FcConfig* fc_config = 0; -static list > fc_config_fonts; +static list > fc_config_fonts; string -marked_up (list subtitles, int target_height, float fade_factor) +marked_up (list subtitles, int target_height, float fade_factor) { string out; - BOOST_FOREACH (TextCaption const & i, subtitles) { + BOOST_FOREACH (StringText const & i, subtitles) { out += " context, dcp::Colour colour, floa * at the same time and with the same fade in/out. */ static PositionImage -render_line (list subtitles, list > fonts, dcp::Size target, DCPTime time, int frame_rate) +render_line (list subtitles, list > fonts, dcp::Size target, DCPTime time, int frame_rate) { /* XXX: this method can only handle italic / bold changes mid-line, nothing else yet. @@ -158,39 +159,31 @@ render_line (list subtitles, list > fonts, dcp::Si Cairo::RefPtr context = Cairo::Context::create (surface); if (!fc_config) { - fc_config = FcConfigCreate (); + fc_config = FcInitLoadConfig (); } - FontFiles font_files; + optional font_file; try { - font_files.set (FontFiles::NORMAL, shared_path () / "LiberationSans-Regular.ttf"); - font_files.set (FontFiles::ITALIC, shared_path () / "LiberationSans-Italic.ttf"); - font_files.set (FontFiles::BOLD, shared_path () / "LiberationSans-Bold.ttf"); + font_file = shared_path () / "LiberationSans-Regular.ttf"; } catch (boost::filesystem::filesystem_error& e) { } /* Hack: try the debian/ubuntu locations if getting the shared path failed */ - if (!font_files.get(FontFiles::NORMAL) || !boost::filesystem::exists(font_files.get(FontFiles::NORMAL).get())) { - font_files.set (FontFiles::NORMAL, "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf"); - } - if (!font_files.get(FontFiles::ITALIC) || !boost::filesystem::exists(font_files.get(FontFiles::ITALIC).get())) { - font_files.set (FontFiles::ITALIC, "/usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf"); - } - if (!font_files.get(FontFiles::BOLD) || !boost::filesystem::exists(font_files.get(FontFiles::BOLD).get())) { - font_files.set (FontFiles::BOLD, "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf"); + if (!font_file || !boost::filesystem::exists(*font_file)) { + font_file = "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf"; } BOOST_FOREACH (shared_ptr i, fonts) { - if (i->id() == subtitles.front().font() && i->file(FontFiles::NORMAL)) { - font_files = i->files (); + if (i->id() == subtitles.front().font() && i->file()) { + font_file = i->file (); } } - list >::const_iterator existing = fc_config_fonts.begin (); - while (existing != fc_config_fonts.end() && existing->first != font_files) { + list >::const_iterator existing = fc_config_fonts.begin (); + while (existing != fc_config_fonts.end() && existing->first != *font_file) { ++existing; } @@ -199,17 +192,9 @@ render_line (list subtitles, list > fonts, dcp::Si font_name = existing->second; } else { /* Make this font available to DCP-o-matic */ - for (int i = 0; i < FontFiles::VARIANTS; ++i) { - if (font_files.get(static_cast(i))) { - FcConfigAppFontAddFile ( - fc_config, - reinterpret_cast (font_files.get(static_cast(i)).get().string().c_str()) - ); - } - } - + FcConfigAppFontAddFile (fc_config, reinterpret_cast(font_file->string().c_str())); FcPattern* pattern = FcPatternBuild ( - 0, FC_FILE, FcTypeString, font_files.get(FontFiles::NORMAL).get().string().c_str(), static_cast (0) + 0, FC_FILE, FcTypeString, font_file->string().c_str(), static_cast (0) ); FcObjectSet* object_set = FcObjectSetBuild (FC_FAMILY, FC_STYLE, FC_LANG, FC_FILE, static_cast (0)); FcFontSet* font_set = FcFontList (fc_config, pattern, object_set); @@ -234,7 +219,7 @@ render_line (list subtitles, list > fonts, dcp::Si FcObjectSetDestroy (object_set); FcPatternDestroy (pattern); - fc_config_fonts.push_back (make_pair (font_files, font_name)); + fc_config_fonts.push_back (make_pair(*font_file, font_name)); } FcConfigSetCurrent (fc_config); @@ -244,11 +229,6 @@ render_line (list subtitles, list > fonts, dcp::Si layout->set_alignment (Pango::ALIGN_LEFT); context->set_line_width (1); - context->set_antialias (Cairo::ANTIALIAS_GRAY); - Cairo::FontOptions fo; - context->get_font_options (fo); - fo.set_antialias (Cairo::ANTIALIAS_GRAY); - context->set_font_options (fo); /* Compute fade factor */ float fade_factor = 1; @@ -365,13 +345,13 @@ render_line (list subtitles, list > fonts, dcp::Si * @param frame_rate DCP frame rate. */ list -render_text (list subtitles, list > fonts, dcp::Size target, DCPTime time, int frame_rate) +render_text (list subtitles, list > fonts, dcp::Size target, DCPTime time, int frame_rate) { - list pending; + list pending; list images; - BOOST_FOREACH (TextCaption const & i, subtitles) { - if (!pending.empty() && fabs (i.v_position() - pending.back().v_position()) > 1e-4) { + BOOST_FOREACH (StringText const & i, subtitles) { + if (!pending.empty() && (i.v_align() != pending.back().v_align() || fabs(i.v_position() - pending.back().v_position()) > 1e-4)) { images.push_back (render_line (pending, fonts, target, time, frame_rate)); pending.clear (); }