X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ftext_content.cc;h=5ae8dd45eb47724454b6ebd18397e4755ec3dd45;hb=924f4edb20d14bc697956254951fb87513cf2e19;hp=a9ed8608350fdbb9f9a48b8f2fbc2edfd598da56;hpb=444809fb888ed99803f2d19c94d3faef067cf348;p=dcpomatic.git diff --git a/src/lib/text_content.cc b/src/lib/text_content.cc index a9ed86083..5ae8dd45e 100644 --- a/src/lib/text_content.cc +++ b/src/lib/text_content.cc @@ -18,6 +18,7 @@ */ + #include "text_content.h" #include "util.h" #include "exceptions.h" @@ -30,6 +31,7 @@ #include "i18n.h" + using std::string; using std::vector; using std::cout; @@ -41,6 +43,7 @@ using boost::optional; using dcp::raw_convert; using namespace dcpomatic; + int const TextContentProperty::X_OFFSET = 500; int const TextContentProperty::Y_OFFSET = 501; int const TextContentProperty::X_SCALE = 502; @@ -57,6 +60,9 @@ int const TextContentProperty::FADE_OUT = 512; int const TextContentProperty::OUTLINE_WIDTH = 513; int const TextContentProperty::TYPE = 514; int const TextContentProperty::DCP_TRACK = 515; +int const TextContentProperty::LANGUAGE = 516; +int const TextContentProperty::LANGUAGE_IS_ADDITIONAL = 517; + TextContent::TextContent (Content* parent, TextType type, TextType original_type) : ContentPart (parent) @@ -95,13 +101,7 @@ TextContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version) if (!node->optional_number_child("SubtitleXOffset") && !node->optional_number_child("SubtitleOffset")) { return {}; } - list> c; - c.push_back (make_shared(parent, node, version)); - return c; - } - - if (!node->optional_node_child("Text")) { - return {}; + return { make_shared(parent, node, version) }; } list> c; @@ -120,10 +120,10 @@ TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version) , _y_offset (0) , _x_scale (1) , _y_scale (1) - , _line_spacing (node->optional_number_child("LineSpacing").get_value_or (1)) - , _outline_width (node->optional_number_child("OutlineWidth").get_value_or (4)) - , _type (TEXT_OPEN_SUBTITLE) - , _original_type (TEXT_OPEN_SUBTITLE) + , _line_spacing (node->optional_number_child("LineSpacing").get_value_or(1)) + , _outline_width (node->optional_number_child("OutlineWidth").get_value_or(4)) + , _type (TextType::OPEN_SUBTITLE) + , _original_type (TextType::OPEN_SUBTITLE) { if (version >= 37) { _use = node->bool_child ("Use"); @@ -144,21 +144,21 @@ TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version) } if (node->optional_bool_child("Outline").get_value_or(false)) { - _effect = dcp::BORDER; + _effect = dcp::Effect::BORDER; } else if (node->optional_bool_child("Shadow").get_value_or(false)) { - _effect = dcp::SHADOW; + _effect = dcp::Effect::SHADOW; } else { - _effect = dcp::NONE; + _effect = dcp::Effect::NONE; } auto effect = node->optional_string_child("Effect"); if (effect) { if (*effect == "none") { - _effect = dcp::NONE; + _effect = dcp::Effect::NONE; } else if (*effect == "outline") { - _effect = dcp::BORDER; + _effect = dcp::Effect::BORDER; } else if (*effect == "shadow") { - _effect = dcp::SHADOW; + _effect = dcp::Effect::SHADOW; } } @@ -231,6 +231,13 @@ TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version) if (dt) { _dcp_track = DCPTextTrack (dt); } + + 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; + } } TextContent::TextContent (Content* parent, vector> c) @@ -290,6 +297,14 @@ TextContent::TextContent (Content* parent, vector> c) throw JoinError (_("Content to be joined must use the same DCP track.")); } + if (c[i]->only_text()->language() != ref->language()) { + throw JoinError (_("Content to be joined must use the same text language.")); + } + + if (c[i]->only_text()->language_is_additional() != ref->language_is_additional()) { + throw JoinError (_("Content to be joined must both be main subtitle languages or both additional.")); + } + auto j = ref_fonts.begin (); auto k = fonts.begin (); @@ -316,6 +331,8 @@ TextContent::TextContent (Content* parent, vector> c) _type = ref->type (); _original_type = ref->original_type (); _dcp_track = ref->dcp_track (); + _language = ref->language (); + _language_is_additional = ref->language_is_additional (); connect_to_fonts (); } @@ -341,13 +358,13 @@ TextContent::as_xml (xmlpp::Node* root) const } if (_effect) { switch (*_effect) { - case dcp::NONE: + case dcp::Effect::NONE: text->add_child("Effect")->add_child_text("none"); break; - case dcp::BORDER: + case dcp::Effect::BORDER: text->add_child("Effect")->add_child_text("outline"); break; - case dcp::SHADOW: + case dcp::Effect::SHADOW: text->add_child("Effect")->add_child_text("shadow"); break; } @@ -375,6 +392,11 @@ TextContent::as_xml (xmlpp::Node* root) const if (_dcp_track) { _dcp_track->as_xml(text->add_child("DCPTrack")); } + if (_language) { + auto lang = text->add_child("Language"); + lang->add_child_text (_language->to_string()); + lang->set_attribute ("Additional", _language_is_additional ? "1" : "0"); + } } string @@ -389,7 +411,7 @@ TextContent::identifier () const + "_" + raw_convert (fade_out().get_value_or(ContentTime()).get()) + "_" + raw_convert (outline_width()) + "_" + raw_convert (colour().get_value_or(dcp::Colour(255, 255, 255)).to_argb_string()) - + "_" + raw_convert (dcp::effect_to_string(effect().get_value_or(dcp::NONE))) + + "_" + raw_convert (dcp::effect_to_string(effect().get_value_or(dcp::Effect::NONE))) + "_" + raw_convert (effect_colour().get_value_or(dcp::Colour(0, 0, 0)).to_argb_string()) + "_" + raw_convert (_parent->video_frame_rate().get_value_or(0)); @@ -400,7 +422,7 @@ TextContent::identifier () const s += "_" + f->file().get_value_or("Default").string(); } - /* The DCP track is for metadata only, and doesn't affect how this content looks */ + /* The DCP track and language are for metadata only, and don't affect how this content looks */ return s; } @@ -430,7 +452,7 @@ void TextContent::font_changed () { /* XXX: too late */ - ChangeSignaller cc (_parent, TextContentProperty::FONTS); + ContentChangeSignaller cc (_parent, TextContentProperty::FONTS); } void @@ -559,6 +581,18 @@ 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) { @@ -595,4 +629,6 @@ TextContent::take_settings_from (shared_ptr c) } else { unset_dcp_track (); } + set_language (c->_language); + set_language_is_additional (c->_language_is_additional); }