*/
+
#include "text_content.h"
#include "util.h"
#include "exceptions.h"
#include "i18n.h"
+
using std::string;
using std::vector;
using std::cout;
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;
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)
* The list could be empty if no TextContents are found.
*/
list<shared_ptr<TextContent>>
-TextContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version)
+TextContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version, list<string>& notes)
{
if (version < 34) {
/* With old metadata FFmpeg content has the subtitle-related tags even with no
if (!node->optional_number_child<double>("SubtitleXOffset") && !node->optional_number_child<double>("SubtitleOffset")) {
return {};
}
- list<shared_ptr<TextContent>> c;
- c.push_back (make_shared<TextContent>(parent, node, version));
- return c;
- }
-
- if (!node->optional_node_child("Text")) {
- return {};
+ return { make_shared<TextContent>(parent, node, version, notes) };
}
list<shared_ptr<TextContent>> c;
for (auto i: node->node_children("Text")) {
- c.push_back (make_shared<TextContent>(parent, i, version));
+ c.push_back (make_shared<TextContent>(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<string>& notes)
: ContentPart (parent)
, _use (false)
, _burn (false)
if (dt) {
_dcp_track = DCPTextTrack (dt);
}
+
+ auto lang = node->optional_node_child("Language");
+ if (lang) {
+ 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<shared_ptr<Content>> 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 ();
_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 ();
}
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
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;
}
TextContent::font_changed ()
{
/* XXX: too late */
- ChangeSignaller<Content> cc (_parent, TextContentProperty::FONTS);
+ ContentChangeSignaller cc (_parent, TextContentProperty::FONTS);
}
void
maybe_set (_dcp_track, optional<DCPTextTrack>(), TextContentProperty::DCP_TRACK);
}
+void
+TextContent::set_language (optional<dcp::LanguageTag> 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<const TextContent> c)
{
} else {
unset_dcp_track ();
}
+ set_language (c->_language);
+ set_language_is_additional (c->_language_is_additional);
}