X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ftext_content.cc;h=2584b5caaff85bec1c4dca472e5c6d4fcd988230;hb=2b67fb950f1ba2b1327ef7f82d3d63b46bf0135b;hp=c86150881418121b32c59e8d7187d72f6ca3aa18;hpb=e0a70cd5cfb11fc2de167f3146acdd437a6faa82;p=dcpomatic.git diff --git a/src/lib/text_content.cc b/src/lib/text_content.cc index c86150881..2584b5caa 100644 --- a/src/lib/text_content.cc +++ b/src/lib/text_content.cc @@ -32,13 +32,13 @@ #include "i18n.h" -using std::string; -using std::vector; using std::cout; +using std::dynamic_pointer_cast; using std::list; -using std::shared_ptr; using std::make_shared; -using std::dynamic_pointer_cast; +using std::shared_ptr; +using std::string; +using std::vector; using boost::optional; using dcp::raw_convert; using namespace dcpomatic; @@ -80,11 +80,12 @@ TextContent::TextContent (Content* parent, TextType type, TextType original_type } + /** @return TextContents from node or nodes under node (according to version). * The list could be empty if no TextContents are found. */ list> -TextContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version) +TextContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version, list& notes) { if (version < 34) { /* With old metadata FFmpeg content has the subtitle-related tags even with no @@ -101,22 +102,19 @@ TextContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version) if (!node->optional_number_child("SubtitleXOffset") && !node->optional_number_child("SubtitleOffset")) { return {}; } - return { make_shared(parent, node, version) }; - } - - if (!node->optional_node_child("Text")) { - return {}; + return { make_shared(parent, node, version, notes) }; } list> c; for (auto i: node->node_children("Text")) { - c.push_back (make_shared(parent, i, version)); + c.push_back (make_shared(parent, i, version, notes)); } return c; } -TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version) + +TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version, list& notes) : ContentPart (parent) , _use (false) , _burn (false) @@ -128,7 +126,6 @@ TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version) , _outline_width (node->optional_number_child("OutlineWidth").get_value_or(4)) , _type (TextType::OPEN_SUBTITLE) , _original_type (TextType::OPEN_SUBTITLE) - , _language ("en-US") { if (version >= 37) { _use = node->bool_child ("Use"); @@ -239,12 +236,28 @@ TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version) auto lang = node->optional_node_child("Language"); if (lang) { - _language = dcp::LanguageTag(lang->content()); - auto add = lang->optional_bool_attribute("Additional"); - _language_is_additional = add && *add; + try { + _language = dcp::LanguageTag(lang->content()); + auto add = lang->optional_bool_attribute("Additional"); + _language_is_additional = add && *add; + } catch (dcp::LanguageTagError&) { + /* The language tag can be empty or invalid if it was loaded from a + * 2.14.x metadata file; we'll just ignore it in that case. + */ + if (version <= 37) { + if (!lang->content().empty()) { + notes.push_back (String::compose( + _("A subtitle or closed caption file in this project is marked with the language '%1', " + "which DCP-o-matic does not recognise. The file's language has been cleared."), lang->content())); + } + } else { + throw; + } + } } } + TextContent::TextContent (Content* parent, vector> c) : ContentPart (parent) { @@ -342,6 +355,7 @@ TextContent::TextContent (Content* parent, vector> c) connect_to_fonts (); } + /** _mutex must not be held on entry */ void TextContent::as_xml (xmlpp::Node* root) const @@ -404,6 +418,7 @@ TextContent::as_xml (xmlpp::Node* root) const } } + string TextContent::identifier () const { @@ -432,6 +447,7 @@ TextContent::identifier () const return s; } + void TextContent::add_font (shared_ptr font) { @@ -439,6 +455,7 @@ TextContent::add_font (shared_ptr font) connect_to_fonts (); } + void TextContent::connect_to_fonts () { @@ -453,6 +470,7 @@ TextContent::connect_to_fonts () } } + void TextContent::font_changed () { @@ -460,144 +478,168 @@ TextContent::font_changed () ContentChangeSignaller cc (_parent, TextContentProperty::FONTS); } + void TextContent::set_colour (dcp::Colour colour) { maybe_set (_colour, colour, TextContentProperty::COLOUR); } + void TextContent::unset_colour () { maybe_set (_colour, optional(), TextContentProperty::COLOUR); } + void TextContent::set_effect (dcp::Effect e) { maybe_set (_effect, e, TextContentProperty::EFFECT); } + void TextContent::unset_effect () { maybe_set (_effect, optional(), TextContentProperty::EFFECT); } + void TextContent::set_effect_colour (dcp::Colour colour) { maybe_set (_effect_colour, colour, TextContentProperty::EFFECT_COLOUR); } + void TextContent::unset_effect_colour () { maybe_set (_effect_colour, optional(), TextContentProperty::EFFECT_COLOUR); } + void TextContent::set_use (bool u) { maybe_set (_use, u, TextContentProperty::USE); } + void TextContent::set_burn (bool b) { maybe_set (_burn, b, TextContentProperty::BURN); } + void TextContent::set_x_offset (double o) { maybe_set (_x_offset, o, TextContentProperty::X_OFFSET); } + void TextContent::set_y_offset (double o) { maybe_set (_y_offset, o, TextContentProperty::Y_OFFSET); } + void TextContent::set_x_scale (double s) { maybe_set (_x_scale, s, TextContentProperty::X_SCALE); } + void TextContent::set_y_scale (double s) { maybe_set (_y_scale, s, TextContentProperty::Y_SCALE); } + void TextContent::set_line_spacing (double s) { maybe_set (_line_spacing, s, TextContentProperty::LINE_SPACING); } + void TextContent::set_fade_in (ContentTime t) { maybe_set (_fade_in, t, TextContentProperty::FADE_IN); } + void TextContent::unset_fade_in () { maybe_set (_fade_in, optional(), TextContentProperty::FADE_IN); } + void TextContent::set_fade_out (ContentTime t) { maybe_set (_fade_out, t, TextContentProperty::FADE_OUT); } + void TextContent::unset_fade_out () { maybe_set (_fade_out, optional(), TextContentProperty::FADE_OUT); } + void TextContent::set_type (TextType type) { maybe_set (_type, type, TextContentProperty::TYPE); } + void TextContent::set_outline_width (int w) { maybe_set (_outline_width, w, TextContentProperty::OUTLINE_WIDTH); } + void TextContent::set_dcp_track (DCPTextTrack t) { maybe_set (_dcp_track, t, TextContentProperty::DCP_TRACK); } + void TextContent::unset_dcp_track () { maybe_set (_dcp_track, optional(), TextContentProperty::DCP_TRACK); } + void TextContent::set_language (optional language) { maybe_set (_language, language, TextContentProperty::LANGUAGE); } + void TextContent::set_language_is_additional (bool additional) { maybe_set (_language_is_additional, additional, TextContentProperty::LANGUAGE_IS_ADDITIONAL); } + void TextContent::take_settings_from (shared_ptr c) {