+
+}
+
+SubtitleContent::SubtitleContent (shared_ptr<const Film> film, cxml::ConstNodePtr node, int version)
+ : Content (film, node)
+ , _use_subtitles (false)
+ , _subtitle_x_offset (0)
+ , _subtitle_y_offset (0)
+ , _subtitle_x_scale (1)
+ , _subtitle_y_scale (1)
+{
+ if (version >= 32) {
+ _use_subtitles = node->bool_child ("UseSubtitles");
+ } else {
+ _use_subtitles = false;
+ }
+
+ if (version >= 7) {
+ _subtitle_x_offset = node->number_child<float> ("SubtitleXOffset");
+ _subtitle_y_offset = node->number_child<float> ("SubtitleYOffset");
+ } else {
+ _subtitle_y_offset = node->number_child<float> ("SubtitleOffset");
+ }
+
+ if (version >= 10) {
+ _subtitle_x_scale = node->number_child<float> ("SubtitleXScale");
+ _subtitle_y_scale = node->number_child<float> ("SubtitleYScale");
+ } else {
+ _subtitle_x_scale = _subtitle_y_scale = node->number_child<float> ("SubtitleScale");
+ }
+
+ _subtitle_language = node->optional_string_child ("SubtitleLanguage").get_value_or ("");
+
+ list<cxml::NodePtr> fonts = node->node_children ("Font");
+ for (list<cxml::NodePtr>::const_iterator i = fonts.begin(); i != fonts.end(); ++i) {
+ _fonts.push_back (shared_ptr<Font> (new Font (*i)));
+ }
+
+ connect_to_fonts ();
+}
+
+SubtitleContent::SubtitleContent (shared_ptr<const Film> film, vector<shared_ptr<Content> > c)
+ : Content (film, c)
+{
+ shared_ptr<SubtitleContent> ref = dynamic_pointer_cast<SubtitleContent> (c[0]);
+ DCPOMATIC_ASSERT (ref);
+ list<shared_ptr<Font> > ref_fonts = ref->fonts ();
+
+ for (size_t i = 0; i < c.size(); ++i) {
+ shared_ptr<SubtitleContent> sc = dynamic_pointer_cast<SubtitleContent> (c[i]);
+
+ if (sc->use_subtitles() != ref->use_subtitles()) {
+ throw JoinError (_("Content to be joined must have the same 'use subtitles' setting."));
+ }
+
+ if (sc->subtitle_x_offset() != ref->subtitle_x_offset()) {
+ throw JoinError (_("Content to be joined must have the same subtitle X offset."));
+ }
+
+ if (sc->subtitle_y_offset() != ref->subtitle_y_offset()) {
+ throw JoinError (_("Content to be joined must have the same subtitle Y offset."));
+ }
+
+ if (sc->subtitle_x_scale() != ref->subtitle_x_scale()) {
+ throw JoinError (_("Content to be joined must have the same subtitle X scale."));
+ }
+
+ if (sc->subtitle_y_scale() != ref->subtitle_y_scale()) {
+ throw JoinError (_("Content to be joined must have the same subtitle Y scale."));
+ }
+
+ list<shared_ptr<Font> > fonts = sc->fonts ();
+ if (fonts.size() != ref_fonts.size()) {
+ throw JoinError (_("Content to be joined must use the same fonts."));
+ }
+
+ list<shared_ptr<Font> >::const_iterator j = ref_fonts.begin ();
+ list<shared_ptr<Font> >::const_iterator k = fonts.begin ();
+
+ while (j != ref_fonts.end ()) {
+ if (**j != **k) {
+ throw JoinError (_("Content to be joined must use the same fonts."));
+ }
+ ++j;
+ ++k;
+ }
+ }
+
+ _use_subtitles = ref->use_subtitles ();
+ _subtitle_x_offset = ref->subtitle_x_offset ();
+ _subtitle_y_offset = ref->subtitle_y_offset ();
+ _subtitle_x_scale = ref->subtitle_x_scale ();
+ _subtitle_y_scale = ref->subtitle_y_scale ();
+ _subtitle_language = ref->subtitle_language ();
+ _fonts = ref_fonts;
+
+ connect_to_fonts ();