SubtitleString -> shared_ptr<Subtitle>
authorCarl Hetherington <cth@carlh.net>
Sat, 7 Jul 2018 22:16:45 +0000 (23:16 +0100)
committerCarl Hetherington <cth@carlh.net>
Sat, 7 Jul 2018 22:16:45 +0000 (23:16 +0100)
19 files changed:
src/data.cc
src/data.h
src/smpte_subtitle_asset.cc
src/smpte_subtitle_asset.h
src/subtitle.h
src/subtitle_asset.cc
src/subtitle_asset.h
src/subtitle_asset_internal.cc
src/subtitle_asset_internal.h
src/subtitle_image.cc
src/subtitle_image.h
src/subtitle_string.cc
src/subtitle_string.h
test/read_interop_subtitle_test.cc
test/read_smpte_subtitle_test.cc
test/smpte_subtitle_test.cc
test/write_subtitle_test.cc
tools/dcpinfo.cc
waf-tools/clang_compilation_database.py

index 1971a261bb7c463f2999d4035a1d43be0137621d..9fcf9601e2c2c51f46b7cefb7f43fc31441bc1b5 100644 (file)
@@ -107,3 +107,9 @@ Data::write_via_temp (boost::filesystem::path temp, boost::filesystem::path fina
        write (temp);
        boost::filesystem::rename (temp, final);
 }
+
+bool
+dcp::operator== (Data const & a, Data const & b)
+{
+       return (a.size() == b.size() && memcmp (a.data().get(), b.data().get(), a.size() == 0));
+}
index d06b2f49afabb0dcc7d1712928a9b85ee4435e7e..fd6eb22bb8bd202da08c259228e90c09efabd416 100644 (file)
@@ -72,6 +72,8 @@ private:
        int _size;
 };
 
+bool operator==(Data const & a, Data const & b);
+
 }
 
 #endif
index cd692736ac3c6d00744d0f469578556800f60a65..07d8f7eb48ebee953246e92e3e981eae884582fe 100644 (file)
@@ -443,7 +443,7 @@ SMPTESubtitleAsset::add_font (string load_id, boost::filesystem::path file)
 }
 
 void
-SMPTESubtitleAsset::add (dcp::SubtitleString s)
+SMPTESubtitleAsset::add (shared_ptr<Subtitle> s)
 {
        SubtitleAsset::add (s);
        _intrinsic_duration = latest_subtitle_out().as_editable_units (_edit_rate.numerator / _edit_rate.denominator);
index 9169a3d64298f315c8944140ebf540e919940756..6631b31ef7e15ddcb2cffbcdf9946f28fc77434e 100644 (file)
@@ -73,7 +73,7 @@ public:
 
        std::string xml_as_string () const;
        void write (boost::filesystem::path path) const;
-       void add (SubtitleString);
+       void add (boost::shared_ptr<Subtitle>);
        void add_font (std::string id, boost::filesystem::path file);
        void set_key (Key key);
 
index 32f7457a650bc688408d6a9d570063a8ac038f00..8dba299de6b6aa2d8d9f4b9ccf14eaef79c2d955 100644 (file)
@@ -31,6 +31,9 @@
     files in the program, then also delete it here.
 */
 
+#ifndef LIBDCP_SUBTITLE_H
+#define LIBDCP_SUBTITLE_H
+
 /** @file  src/subtitle.h
  *  @brief Subtitle class.
  */
@@ -53,6 +56,8 @@ public:
                Time fade_down_time
                );
 
+       virtual ~Subtitle () {}
+
        Time in () const {
                return _in;
        }
@@ -61,7 +66,6 @@ public:
                return _out;
        }
 
-
        float h_position () const {
                return _h_position;
        }
@@ -136,3 +140,5 @@ protected:
 };
 
 }
+
+#endif
index be49d8cfea7d91bdd38e0ebb3bec7f03be19518a..3ecd16a79d165966101ea868aff187b9ca9983a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
@@ -38,6 +38,7 @@
 #include "util.h"
 #include "xml.h"
 #include "subtitle_string.h"
+#include "subtitle_image.h"
 #include "dcp_assert.h"
 #include <asdcp/AS_DCP.h>
 #include <asdcp/KM_util.h>
@@ -329,36 +330,38 @@ SubtitleAsset::maybe_add_subtitle (string text, list<ParseState> const & parse_s
        }
 
        _subtitles.push_back (
-               SubtitleString (
-                       ps.font_id,
-                       ps.italic.get_value_or (false),
-                       ps.bold.get_value_or (false),
-                       ps.underline.get_value_or (false),
-                       ps.colour.get_value_or (dcp::Colour (255, 255, 255)),
-                       ps.size.get_value_or (42),
-                       ps.aspect_adjust.get_value_or (1.0),
-                       ps.in.get(),
-                       ps.out.get(),
-                       ps.h_position.get_value_or(0),
-                       ps.h_align.get_value_or(HALIGN_CENTER),
-                       ps.v_position.get_value_or(0),
-                       ps.v_align.get_value_or(VALIGN_CENTER),
-                       ps.direction.get_value_or (DIRECTION_LTR),
-                       text,
-                       ps.effect.get_value_or (NONE),
-                       ps.effect_colour.get_value_or (dcp::Colour (0, 0, 0)),
-                       ps.fade_up_time.get_value_or(Time()),
-                       ps.fade_down_time.get_value_or(Time())
+               shared_ptr<Subtitle> (
+                       new SubtitleString (
+                               ps.font_id,
+                               ps.italic.get_value_or (false),
+                               ps.bold.get_value_or (false),
+                               ps.underline.get_value_or (false),
+                               ps.colour.get_value_or (dcp::Colour (255, 255, 255)),
+                               ps.size.get_value_or (42),
+                               ps.aspect_adjust.get_value_or (1.0),
+                               ps.in.get(),
+                               ps.out.get(),
+                               ps.h_position.get_value_or(0),
+                               ps.h_align.get_value_or(HALIGN_CENTER),
+                               ps.v_position.get_value_or(0),
+                               ps.v_align.get_value_or(VALIGN_CENTER),
+                               ps.direction.get_value_or (DIRECTION_LTR),
+                               text,
+                               ps.effect.get_value_or (NONE),
+                               ps.effect_colour.get_value_or (dcp::Colour (0, 0, 0)),
+                               ps.fade_up_time.get_value_or(Time()),
+                               ps.fade_down_time.get_value_or(Time())
+                               )
                        )
                );
 }
 
-list<SubtitleString>
+list<shared_ptr<Subtitle> >
 SubtitleAsset::subtitles_during (Time from, Time to, bool starting) const
 {
-       list<SubtitleString> s;
-       BOOST_FOREACH (SubtitleString const & i, _subtitles) {
-               if ((starting && from <= i.in() && i.in() < to) || (!starting && i.out() >= from && i.in() <= to)) {
+       list<shared_ptr<Subtitle> > s;
+       BOOST_FOREACH (shared_ptr<Subtitle> i, _subtitles) {
+               if ((starting && from <= i->in() && i->in() < to) || (!starting && i->out() >= from && i->in() <= to)) {
                        s.push_back (i);
                }
        }
@@ -367,7 +370,7 @@ SubtitleAsset::subtitles_during (Time from, Time to, bool starting) const
 }
 
 void
-SubtitleAsset::add (SubtitleString s)
+SubtitleAsset::add (shared_ptr<Subtitle> s)
 {
        _subtitles.push_back (s);
 }
@@ -376,9 +379,9 @@ Time
 SubtitleAsset::latest_subtitle_out () const
 {
        Time t;
-       BOOST_FOREACH (SubtitleString const & i, _subtitles) {
-               if (i.out() > t) {
-                       t = i.out ();
+       BOOST_FOREACH (shared_ptr<Subtitle> i, _subtitles) {
+               if (i->out() > t) {
+                       t = i->out ();
                }
        }
 
@@ -397,21 +400,46 @@ SubtitleAsset::equals (shared_ptr<const Asset> other_asset, EqualityOptions opti
                return false;
        }
 
-       if (_subtitles != other->_subtitles) {
+       if (_subtitles.size() != other->_subtitles.size()) {
                note (DCP_ERROR, "subtitles differ");
                return false;
        }
 
+       list<shared_ptr<Subtitle> >::const_iterator i = _subtitles.begin ();
+       list<shared_ptr<Subtitle> >::const_iterator j = other->_subtitles.begin ();
+
+       while (i != _subtitles.end()) {
+               shared_ptr<SubtitleString> string_i = dynamic_pointer_cast<SubtitleString> (*i);
+               shared_ptr<SubtitleString> string_j = dynamic_pointer_cast<SubtitleString> (*j);
+               shared_ptr<SubtitleImage> image_i = dynamic_pointer_cast<SubtitleImage> (*i);
+               shared_ptr<SubtitleImage> image_j = dynamic_pointer_cast<SubtitleImage> (*j);
+
+               if ((string_i && !string_j) || (image_i && !image_j)) {
+                       note (DCP_ERROR, "subtitles differ");
+                       return false;
+               }
+
+               if (string_i && *string_i != *string_j) {
+                       note (DCP_ERROR, "subtitles differ");
+                       return false;
+               }
+
+               if (image_i && *image_i != *image_j) {
+                       note (DCP_ERROR, "subtitles differ");
+                       return false;
+               }
+       }
+
        return true;
 }
 
 struct SubtitleSorter
 {
-       bool operator() (SubtitleString const & a, SubtitleString const & b) {
-               if (a.in() != b.in()) {
-                       return a.in() < b.in();
+       bool operator() (shared_ptr<Subtitle> a, shared_ptr<Subtitle> b) {
+               if (a->in() != b->in()) {
+                       return a->in() < b->in();
                }
-               return a.v_position() < b.v_position();
+               return a->v_position() < b->v_position();
        }
 };
 
@@ -481,7 +509,7 @@ SubtitleAsset::pull_fonts (shared_ptr<order::Part> part)
 void
 SubtitleAsset::subtitles_as_xml (xmlpp::Element* xml_root, int time_code_rate, Standard standard) const
 {
-       list<SubtitleString> sorted = _subtitles;
+       list<shared_ptr<Subtitle> > sorted = _subtitles;
        sorted.sort (SubtitleSorter ());
 
        /* Gather our subtitles into a hierarchy of Subtitle/Text/String objects, writing
@@ -502,43 +530,48 @@ SubtitleAsset::subtitles_as_xml (xmlpp::Element* xml_root, int time_code_rate, S
        float last_v_position;
        Direction last_direction;
 
-       BOOST_FOREACH (SubtitleString const & i, sorted) {
+       BOOST_FOREACH (shared_ptr<Subtitle> i, sorted) {
                if (!subtitle ||
-                   (last_in != i.in() ||
-                    last_out != i.out() ||
-                    last_fade_up_time != i.fade_up_time() ||
-                    last_fade_down_time != i.fade_down_time())
+                   (last_in != i->in() ||
+                    last_out != i->out() ||
+                    last_fade_up_time != i->fade_up_time() ||
+                    last_fade_down_time != i->fade_down_time())
                        ) {
 
-                       subtitle.reset (new order::Subtitle (root, i.in(), i.out(), i.fade_up_time(), i.fade_down_time()));
+                       subtitle.reset (new order::Subtitle (root, i->in(), i->out(), i->fade_up_time(), i->fade_down_time()));
                        root->children.push_back (subtitle);
 
-                       last_in = i.in ();
-                       last_out = i.out ();
-                       last_fade_up_time = i.fade_up_time ();
-                       last_fade_down_time = i.fade_down_time ();
+                       last_in = i->in ();
+                       last_out = i->out ();
+                       last_fade_up_time = i->fade_up_time ();
+                       last_fade_down_time = i->fade_down_time ();
                        text.reset ();
                }
 
-               if (!text ||
-                   last_h_align != i.h_align() ||
-                   fabs(last_h_position - i.h_position()) > ALIGN_EPSILON ||
-                   last_v_align != i.v_align() ||
-                   fabs(last_v_position - i.v_position()) > ALIGN_EPSILON ||
-                   last_direction != i.direction()
-                       ) {
-
-                       text.reset (new order::Text (subtitle, i.h_align(), i.h_position(), i.v_align(), i.v_position(), i.direction()));
-                       subtitle->children.push_back (text);
+               shared_ptr<SubtitleString> is = dynamic_pointer_cast<SubtitleString>(i);
+
+               if (is) {
+                       if (!text ||
+                           last_h_align != is->h_align() ||
+                           fabs(last_h_position - is->h_position()) > ALIGN_EPSILON ||
+                           last_v_align != is->v_align() ||
+                           fabs(last_v_position - is->v_position()) > ALIGN_EPSILON ||
+                           last_direction != is->direction()
+                               ) {
+                               text.reset (new order::Text (subtitle, is->h_align(), is->h_position(), is->v_align(), is->v_position(), is->direction()));
+                               subtitle->children.push_back (text);
+
+                               last_h_align = is->h_align ();
+                               last_h_position = is->h_position ();
+                               last_v_align = is->v_align ();
+                               last_v_position = is->v_position ();
+                               last_direction = is->direction ();
+                       }
 
-                       last_h_align = i.h_align ();
-                       last_h_position = i.h_position ();
-                       last_v_align = i.v_align ();
-                       last_v_position = i.v_position ();
-                       last_direction = i.direction ();
+                       text->children.push_back (shared_ptr<order::String> (new order::String (text, order::Font (is, standard), is->text())));
                }
 
-               text->children.push_back (shared_ptr<order::String> (new order::String (text, order::Font (i, standard), i.text())));
+               /* XXX: image */
        }
 
        /* Pull font changes as high up the hierarchy as we can */
index ce76eb3be7fe03d05b6f70b64abd56194f333ae3..1108514a3e67bbd66edbebda2198ec770b56ce1e 100644 (file)
@@ -69,7 +69,7 @@ namespace order {
 /** @class SubtitleAsset
  *  @brief A parent for classes representing a file containing subtitles.
  *
- *  This class holds a list of SubtitleString objects which it can extract
+ *  This class holds a list of Subtitle objects which it can extract
  *  from the appropriate part of either an Interop or SMPTE XML file.
  *  Its subclasses InteropSubtitleAsset and SMPTESubtitleAsset handle the
  *  differences between the two types.
@@ -86,12 +86,12 @@ public:
                NoteHandler note
                ) const;
 
-       std::list<SubtitleString> subtitles_during (Time from, Time to, bool starting) const;
-       std::list<SubtitleString> const & subtitles () const {
+       std::list<boost::shared_ptr<Subtitle> > subtitles_during (Time from, Time to, bool starting) const;
+       std::list<boost::shared_ptr<Subtitle> > const & subtitles () const {
                return _subtitles;
        }
 
-       virtual void add (SubtitleString);
+       virtual void add (boost::shared_ptr<Subtitle>);
        virtual void add_font (std::string id, boost::filesystem::path file) = 0;
        std::map<std::string, Data> fonts_with_load_ids () const;
 
@@ -136,7 +136,7 @@ protected:
        void subtitles_as_xml (xmlpp::Element* root, int time_code_rate, Standard standard) const;
 
        /** All our subtitles, in no particular order */
-       std::list<SubtitleString> _subtitles;
+       std::list<boost::shared_ptr<Subtitle> > _subtitles;
 
        class Font
        {
index 4ae90461c1cabb084112dd25258edc747773c33d..c525256d525d5a51a91bdb46c376c3142534e1f7 100644 (file)
@@ -37,6 +37,7 @@
 
 using std::string;
 using std::map;
+using boost::shared_ptr;
 using namespace dcp;
 
 string
@@ -45,28 +46,28 @@ order::Context::xmlns () const
        return standard == SMPTE ? "dcst" : "";
 }
 
-order::Font::Font (SubtitleString const & s, Standard standard)
+order::Font::Font (shared_ptr<SubtitleString> s, Standard standard)
 {
-       if (s.font()) {
+       if (s->font()) {
                if (standard == SMPTE) {
-                       _values["ID"] = s.font().get ();
+                       _values["ID"] = s->font().get ();
                } else {
-                       _values["Id"] = s.font().get ();
+                       _values["Id"] = s->font().get ();
                }
        }
-       _values["Italic"] = s.italic() ? "yes" : "no";
-       _values["Color"] = s.colour().to_argb_string();
-       _values["Size"] = raw_convert<string> (s.size());
-       _values["AspectAdjust"] = raw_convert<string>(s.aspect_adjust(), 1, true);
-       _values["Effect"] = effect_to_string (s.effect());
-       _values["EffectColor"] = s.effect_colour().to_argb_string();
+       _values["Italic"] = s->italic() ? "yes" : "no";
+       _values["Color"] = s->colour().to_argb_string();
+       _values["Size"] = raw_convert<string> (s->size());
+       _values["AspectAdjust"] = raw_convert<string>(s->aspect_adjust(), 1, true);
+       _values["Effect"] = effect_to_string (s->effect());
+       _values["EffectColor"] = s->effect_colour().to_argb_string();
        _values["Script"] = "normal";
        if (standard == SMPTE) {
-               _values["Underline"] = s.underline() ? "yes" : "no";
+               _values["Underline"] = s->underline() ? "yes" : "no";
        } else {
-               _values["Underlined"] = s.underline() ? "yes" : "no";
+               _values["Underlined"] = s->underline() ? "yes" : "no";
        }
-       _values["Weight"] = s.bold() ? "bold" : "normal";
+       _values["Weight"] = s->bold() ? "bold" : "normal";
 }
 
 xmlpp::Element*
index cd6e2b9fa1843f52482c1c8ca2e8598f3b0a5c07..fad65a91f4d0ccaaea1debc23f95d1013323cecb 100644 (file)
@@ -66,7 +66,7 @@ class Font
 public:
        Font () {}
 
-       Font (SubtitleString const & s, Standard standard);
+       Font (boost::shared_ptr<SubtitleString> s, Standard standard);
 
        xmlpp::Element* as_xml (xmlpp::Element* parent, Context& context) const;
 
index 90aadf29d09ddb0445ecc0e24054a0f5415f48d0..974b496f5f700343c546062f73c4f777095fe307 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "subtitle_image.h"
 
+using std::ostream;
 using namespace dcp;
 
 SubtitleImage::SubtitleImage (
@@ -51,3 +52,36 @@ SubtitleImage::SubtitleImage (
 {
 
 }
+
+bool
+dcp::operator== (SubtitleImage const & a, SubtitleImage const & b)
+{
+       return (
+               a.png_image() == b.png_image(),
+               a.in() == b.in() &&
+               a.out() == b.out() &&
+               a.h_position() == b.h_position() &&
+               a.h_align() == b.h_align() &&
+               a.v_position() == b.v_position() &&
+               a.v_align() == b.v_align() &&
+               a.fade_up_time() == b.fade_up_time() &&
+               a.fade_down_time() == b.fade_down_time()
+               );
+}
+
+bool
+dcp::operator!= (SubtitleImage const & a, SubtitleImage const & b)
+{
+       return !(a == b);
+}
+
+ostream&
+dcp::operator<< (ostream& s, SubtitleImage const & sub)
+{
+       s << "\n[IMAGE] from " << sub.in() << " to " << sub.out() << ";\n"
+         << "fade up " << sub.fade_up_time() << ", fade down " << sub.fade_down_time() << ";\n"
+         << "v pos " << sub.v_position() << ", valign " << ((int) sub.v_align())
+         << ", hpos " << sub.h_position() << ", halign " << ((int) sub.h_align()) << "\n";
+
+       return s;
+}
index e12c5733c95bea079ce980418fa1855c0ae5bc7f..d0c4732894c929298d23dad1a3f899d2959c89f3 100644 (file)
@@ -65,10 +65,18 @@ public:
                Time fade_down_time
                );
 
+       Data png_image () const {
+               return _png_image;
+       }
+
 private:
        Data _png_image;
 };
 
+bool operator== (SubtitleImage const & a, SubtitleImage const & b);
+bool operator!= (SubtitleImage const & a, SubtitleImage const & b);
+std::ostream& operator<< (std::ostream& s, SubtitleImage const & sub);
+
 }
 
 #endif
index 6d1e8cdb10e99bd38a9275bfb67e710ac310f072..f5f8c8acb34e60d0bc9332681a9763c06213278a 100644 (file)
@@ -115,6 +115,12 @@ dcp::operator== (SubtitleString const & a, SubtitleString const & b)
                );
 }
 
+bool
+dcp::operator!= (SubtitleString const & a, SubtitleString const & b)
+{
+       return !(a == b);
+}
+
 ostream&
 dcp::operator<< (ostream& s, SubtitleString const & sub)
 {
index fc88c15b475ae7ba29e10e9b5e59017398c97f9e..08e4da5dfe05df69b8ec54816fb8ab169fcba7ea 100644 (file)
@@ -172,6 +172,7 @@ private:
 };
 
 bool operator== (SubtitleString const & a, SubtitleString const & b);
+bool operator!= (SubtitleString const & a, SubtitleString const & b);
 std::ostream& operator<< (std::ostream& s, SubtitleString const & sub);
 
 }
index 7febaab485696b617548d4ec2483354c1cb93f6e..c91ba03c4cadb862381ad07e603db377d2f54f20 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
@@ -44,9 +44,10 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
        BOOST_CHECK_EQUAL (interop_lfn->id, "theFontId");
        BOOST_CHECK_EQUAL (interop_lfn->uri, "arial.ttf");
 
-       list<dcp::SubtitleString> s = subs.subtitles_during (dcp::Time (0, 0, 6, 1, 250), dcp::Time (0, 0, 6, 2, 250), false);
+       list<shared_ptr<dcp::Subtitle> > s = subs.subtitles_during (dcp::Time (0, 0, 6, 1, 250), dcp::Time (0, 0, 6, 2, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 1);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFontId"),
                                   false,
                                   false,
@@ -70,7 +71,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
 
        s = subs.subtitles_during (dcp::Time (0, 0, 7, 190, 250), dcp::Time (0, 0, 7, 191, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFontId"),
                                   true,
                                   false,
@@ -91,7 +93,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
                                   dcp::Time (0, 0, 0, 1, 250),
                                   dcp::Time (0, 0, 0, 1, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFontId"),
                                   false,
                                   false,
@@ -115,7 +118,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
 
        s = subs.subtitles_during (dcp::Time (0, 0, 11, 95, 250), dcp::Time (0, 0, 11, 96, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 1);
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFontId"),
                                   false,
                                   false,
@@ -139,7 +143,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
 
        s = subs.subtitles_during (dcp::Time (0, 0, 14, 42, 250), dcp::Time (0, 0, 14, 43, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 1);
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFontId"),
                                   false,
                                   true,
@@ -167,9 +172,10 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 {
        dcp::InteropSubtitleAsset subs ("test/data/subs2.xml");
 
-       list<dcp::SubtitleString> s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250), false);
+       list<shared_ptr<dcp::Subtitle> > s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -190,7 +196,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -214,7 +221,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 0, 50, 50, 250), dcp::Time (0, 0, 50, 51, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -235,7 +243,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -259,7 +268,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 1, 2, 300, 250), dcp::Time (0, 1, 2, 301, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -280,7 +290,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -304,7 +315,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 1, 15, 50, 250), dcp::Time (0, 1, 15, 51, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -325,7 +337,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -349,7 +362,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 1, 27, 200, 250), dcp::Time (0, 1, 27, 201, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -370,7 +384,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -394,7 +409,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 1, 42, 300, 250), dcp::Time (0, 1, 42, 301, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   false,
                                   false,
@@ -415,7 +431,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   false,
                                   false,
@@ -439,7 +456,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 1, 45, 200, 250), dcp::Time (0, 1, 45, 201, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   false,
                                   false,
@@ -460,7 +478,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   false,
                                   false,
@@ -484,7 +503,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 1, 47, 249, 250), dcp::Time (0, 1, 47, 250, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   false,
                                   false,
@@ -505,7 +525,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   false,
                                   false,
@@ -529,7 +550,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
 
        s = subs.subtitles_during (dcp::Time (0, 2, 6, 210, 250), dcp::Time (0, 2, 6, 211, 250), false);
        BOOST_REQUIRE_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
@@ -550,7 +572,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
                                   dcp::Time (0, 0, 0, 0, 250),
                                   dcp::Time (0, 0, 0, 0, 250)
                                   ));
-       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
+       BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
                                   string ("theFont"),
                                   true,
                                   false,
index 2aadc2dcc8fd1906a102fd1a7917192d9f38dd9f..ff2432e42fb0909fe4356e5d59929468712aad7b 100644 (file)
@@ -58,12 +58,14 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test)
        BOOST_CHECK_EQUAL (smpte_lfn->id, "theFontId");
        BOOST_CHECK_EQUAL (smpte_lfn->urn, "9118bbce-4105-4a05-b37c-a5a6f75e1fea");
        BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 63);
-       BOOST_CHECK_EQUAL (sc.subtitles().front().text(), "Noch mal.");
-       BOOST_CHECK_EQUAL (sc.subtitles().front().in(), dcp::Time (0, 0, 25, 12, 25));
-       BOOST_CHECK_EQUAL (sc.subtitles().front().out(), dcp::Time (0, 0, 26, 4, 25));
-       BOOST_CHECK_EQUAL (sc.subtitles().back().text(), "Prochainement");
-       BOOST_CHECK_EQUAL (sc.subtitles().back().in(), dcp::Time (0, 1, 57, 17, 25));
-       BOOST_CHECK_EQUAL (sc.subtitles().back().out(), dcp::Time (0, 1, 58, 12, 25));
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().front()));
+       BOOST_CHECK_EQUAL (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().front())->text(), "Noch mal.");
+       BOOST_CHECK_EQUAL (sc.subtitles().front()->in(), dcp::Time (0, 0, 25, 12, 25));
+       BOOST_CHECK_EQUAL (sc.subtitles().front()->out(), dcp::Time (0, 0, 26, 4, 25));
+       BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().back()));
+       BOOST_CHECK_EQUAL (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().back())->text(), "Prochainement");
+       BOOST_CHECK_EQUAL (sc.subtitles().back()->in(), dcp::Time (0, 1, 57, 17, 25));
+       BOOST_CHECK_EQUAL (sc.subtitles().back()->out(), dcp::Time (0, 1, 58, 12, 25));
 }
 
 /** And another one featuring <Font> within <Text> */
@@ -72,22 +74,34 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test2)
        dcp::SMPTESubtitleAsset sc (private_test / "olsson.xml");
 
        BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 6);
-       list<dcp::SubtitleString>::const_iterator i = sc.subtitles().begin();
-       BOOST_CHECK_EQUAL (i->text(), "Testing is ");
-       BOOST_CHECK (!i->italic());
+       list<shared_ptr<dcp::Subtitle> >::const_iterator i = sc.subtitles().begin();
+       shared_ptr<dcp::SubtitleString> is = dynamic_pointer_cast<dcp::SubtitleString>(*i);
+       BOOST_REQUIRE (is);
+       BOOST_CHECK_EQUAL (is->text(), "Testing is ");
+       BOOST_CHECK (!is->italic());
        ++i;
-       BOOST_CHECK_EQUAL (i->text(), "really");
-       BOOST_CHECK (i->italic());
+       is = dynamic_pointer_cast<dcp::SubtitleString>(*i);
+       BOOST_REQUIRE (is);
+       BOOST_CHECK_EQUAL (is->text(), "really");
+       BOOST_CHECK (is->italic());
        ++i;
-       BOOST_CHECK_EQUAL (i->text(), " fun!");
-       BOOST_CHECK (!i->italic());
+       is = dynamic_pointer_cast<dcp::SubtitleString>(*i);
+       BOOST_REQUIRE (is);
+       BOOST_CHECK_EQUAL (is->text(), " fun!");
+       BOOST_CHECK (!is->italic());
        ++i;
-       BOOST_CHECK_EQUAL (i->text(), "This is the ");
-       BOOST_CHECK (!i->italic());
+       is = dynamic_pointer_cast<dcp::SubtitleString>(*i);
+       BOOST_REQUIRE (is);
+       BOOST_CHECK_EQUAL (is->text(), "This is the ");
+       BOOST_CHECK (!is->italic());
        ++i;
-       BOOST_CHECK_EQUAL (i->text(), "second");
-       BOOST_CHECK (i->italic());
+       is = dynamic_pointer_cast<dcp::SubtitleString>(*i);
+       BOOST_REQUIRE (is);
+       BOOST_CHECK_EQUAL (is->text(), "second");
+       BOOST_CHECK (is->italic());
        ++i;
-       BOOST_CHECK_EQUAL (i->text(), " line!");
-       BOOST_CHECK (!i->italic());
+       is = dynamic_pointer_cast<dcp::SubtitleString>(*i);
+       BOOST_REQUIRE (is);
+       BOOST_CHECK_EQUAL (is->text(), " line!");
+       BOOST_CHECK (!is->italic());
 }
index b094ea0db0d6d47a928cc0707eb423021d17f2b8..35ad55505adf59f5d3898751fc45f628172482eb 100644 (file)
 
 using std::string;
 using boost::optional;
+using boost::shared_ptr;
 
 BOOST_AUTO_TEST_CASE (smpte_subtitle_id_test)
 {
        dcp::SMPTESubtitleAsset subs;
-       subs.add(dcp::SubtitleString(
-                        optional<string>(),
-                        false, false, false,
-                        dcp::Colour(),
-                        64,
-                        1,
-                        dcp::Time(0, 1, 2, 3, 24),
-                        dcp::Time(0, 2, 2, 3, 24),
-                        0.5,
-                        dcp::HALIGN_CENTER,
-                        0.5,
-                        dcp::VALIGN_CENTER,
-                        dcp::DIRECTION_LTR,
-                        "Hello",
-                        dcp::NONE,
-                        dcp::Colour(),
-                        dcp::Time(0, 0, 0, 0, 24),
-                        dcp::Time(0, 0, 0, 0, 24)
-                        ));
+       subs.add(
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString(
+                               optional<string>(),
+                               false, false, false,
+                               dcp::Colour(),
+                               64,
+                               1,
+                               dcp::Time(0, 1, 2, 3, 24),
+                               dcp::Time(0, 2, 2, 3, 24),
+                               0.5,
+                               dcp::HALIGN_CENTER,
+                               0.5,
+                               dcp::VALIGN_CENTER,
+                               dcp::DIRECTION_LTR,
+                               "Hello",
+                               dcp::NONE,
+                               dcp::Colour(),
+                               dcp::Time(0, 0, 0, 0, 24),
+                               dcp::Time(0, 0, 0, 0, 24)
+                               )
+                       )
+               );
        subs.write("build/test/smpte_subtitle_id_test.mxf");
 
        dcp::SMPTESubtitleAsset check("build/test/smpte_subtitle_id_test.mxf");
index 1ca7840e77f121c935a62014cae42884585896f6..c8f8fc57de10188a93d9d2acf0253f51f9b187c4 100644 (file)
@@ -146,50 +146,54 @@ BOOST_AUTO_TEST_CASE (write_interop_subtitle_test)
        c.set_movie_title ("Test");
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Frutiger"),
-                       false,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 4,  9, 22, 24),
-                       dcp::Time (0, 4, 11, 22, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.8,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       "Hello world",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Frutiger"),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 4,  9, 22, 24),
+                               dcp::Time (0, 4, 11, 22, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.8,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               "Hello world",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       boost::optional<string> (),
-                       true,
-                       true,
-                       true,
-                       dcp::Colour (128, 0, 64),
-                       91,
-                       1.0,
-                       dcp::Time (5, 41,  0, 21, 24),
-                       dcp::Time (6, 12, 15, 21, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.4,
-                       dcp::VALIGN_BOTTOM,
-                       dcp::DIRECTION_LTR,
-                       "What's going on",
-                       dcp::BORDER,
-                       dcp::Colour (1, 2, 3),
-                       dcp::Time (1, 2, 3, 4, 24),
-                       dcp::Time (5, 6, 7, 8, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               boost::optional<string> (),
+                               true,
+                               true,
+                               true,
+                               dcp::Colour (128, 0, 64),
+                               91,
+                               1.0,
+                               dcp::Time (5, 41,  0, 21, 24),
+                               dcp::Time (6, 12, 15, 21, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.4,
+                               dcp::VALIGN_BOTTOM,
+                               dcp::DIRECTION_LTR,
+                               "What's going on",
+                               dcp::BORDER,
+                               dcp::Colour (1, 2, 3),
+                               dcp::Time (1, 2, 3, 4, 24),
+                               dcp::Time (5, 6, 7, 8, 24)
+                               )
                        )
                );
 
@@ -228,50 +232,54 @@ BOOST_AUTO_TEST_CASE (write_interop_subtitle_test2)
        c.set_movie_title ("Test");
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Frutiger"),
-                       false,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 4,  9, 22, 24),
-                       dcp::Time (0, 4, 11, 22, 24),
-                       -0.2,
-                       dcp::HALIGN_CENTER,
-                       0.8,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       "Hello world",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Frutiger"),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 4,  9, 22, 24),
+                               dcp::Time (0, 4, 11, 22, 24),
+                               -0.2,
+                               dcp::HALIGN_CENTER,
+                               0.8,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               "Hello world",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       boost::optional<string> (),
-                       true,
-                       true,
-                       true,
-                       dcp::Colour (128, 0, 64),
-                       91,
-                       1.0,
-                       dcp::Time (5, 41,  0, 21, 24),
-                       dcp::Time (6, 12, 15, 21, 24),
-                       -0.2,
-                       dcp::HALIGN_CENTER,
-                       0.4,
-                       dcp::VALIGN_BOTTOM,
-                       dcp::DIRECTION_LTR,
-                       "What's going on",
-                       dcp::BORDER,
-                       dcp::Colour (1, 2, 3),
-                       dcp::Time (1, 2, 3, 4, 24),
-                       dcp::Time (5, 6, 7, 8, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               boost::optional<string> (),
+                               true,
+                               true,
+                               true,
+                               dcp::Colour (128, 0, 64),
+                               91,
+                               1.0,
+                               dcp::Time (5, 41,  0, 21, 24),
+                               dcp::Time (6, 12, 15, 21, 24),
+                               -0.2,
+                               dcp::HALIGN_CENTER,
+                               0.4,
+                               dcp::VALIGN_BOTTOM,
+                               dcp::DIRECTION_LTR,
+                               "What's going on",
+                               dcp::BORDER,
+                               dcp::Colour (1, 2, 3),
+                               dcp::Time (1, 2, 3, 4, 24),
+                               dcp::Time (5, 6, 7, 8, 24)
+                               )
                        )
                );
 
@@ -309,50 +317,54 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Frutiger"),
-                       false,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 4,  9, 22, 24),
-                       dcp::Time (0, 4, 11, 22, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.8,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       "Hello world",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Frutiger"),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 4,  9, 22, 24),
+                               dcp::Time (0, 4, 11, 22, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.8,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               "Hello world",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       boost::optional<string> (),
-                       true,
-                       true,
-                       true,
-                       dcp::Colour (128, 0, 64),
-                       91,
-                       1.0,
-                       dcp::Time (5, 41,  0, 21, 24),
-                       dcp::Time (6, 12, 15, 21, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.4,
-                       dcp::VALIGN_BOTTOM,
-                       dcp::DIRECTION_RTL,
-                       "What's going on",
-                       dcp::BORDER,
-                       dcp::Colour (1, 2, 3),
-                       dcp::Time (1, 2, 3, 4, 24),
-                       dcp::Time (5, 6, 7, 8, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               boost::optional<string> (),
+                               true,
+                               true,
+                               true,
+                               dcp::Colour (128, 0, 64),
+                               91,
+                               1.0,
+                               dcp::Time (5, 41,  0, 21, 24),
+                               dcp::Time (6, 12, 15, 21, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.4,
+                               dcp::VALIGN_BOTTOM,
+                               dcp::DIRECTION_RTL,
+                               "What's going on",
+                               dcp::BORDER,
+                               dcp::Colour (1, 2, 3),
+                               dcp::Time (1, 2, 3, 4, 24),
+                               dcp::Time (5, 6, 7, 8, 24)
+                               )
                        )
                );
 
@@ -398,146 +410,158 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Arial"),
-                       false,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 0, 1, 0, 24),
-                       dcp::Time (0, 0, 9, 0, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.8,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       "Testing is ",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Arial"),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 0, 1, 0, 24),
+                               dcp::Time (0, 0, 9, 0, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.8,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               "Testing is ",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Arial"),
-                       true,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 0, 1, 0, 24),
-                       dcp::Time (0, 0, 9, 0, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.8,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       "really",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Arial"),
+                               true,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 0, 1, 0, 24),
+                               dcp::Time (0, 0, 9, 0, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.8,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               "really",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Arial"),
-                       false,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 0, 1, 0, 24),
-                       dcp::Time (0, 0, 9, 0, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.8,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       " fun",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Arial"),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 0, 1, 0, 24),
+                               dcp::Time (0, 0, 9, 0, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.8,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               " fun",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Arial"),
-                       false,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 0, 1, 0, 24),
-                       dcp::Time (0, 0, 9, 0, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.9,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       "This is the ",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Arial"),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 0, 1, 0, 24),
+                               dcp::Time (0, 0, 9, 0, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.9,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               "This is the ",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Arial"),
-                       true,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 0, 1, 0, 24),
-                       dcp::Time (0, 0, 9, 0, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.9,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       "second",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Arial"),
+                               true,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 0, 1, 0, 24),
+                               dcp::Time (0, 0, 9, 0, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.9,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               "second",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
        c.add (
-               dcp::SubtitleString (
-                       string ("Arial"),
-                       false,
-                       false,
-                       false,
-                       dcp::Colour (255, 255, 255),
-                       48,
-                       1.0,
-                       dcp::Time (0, 0, 1, 0, 24),
-                       dcp::Time (0, 0, 9, 0, 24),
-                       0,
-                       dcp::HALIGN_CENTER,
-                       0.9,
-                       dcp::VALIGN_TOP,
-                       dcp::DIRECTION_LTR,
-                       " line",
-                       dcp::NONE,
-                       dcp::Colour (0, 0, 0),
-                       dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+               shared_ptr<dcp::Subtitle> (
+                       new dcp::SubtitleString (
+                               string ("Arial"),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour (255, 255, 255),
+                               48,
+                               1.0,
+                               dcp::Time (0, 0, 1, 0, 24),
+                               dcp::Time (0, 0, 9, 0, 24),
+                               0,
+                               dcp::HALIGN_CENTER,
+                               0.9,
+                               dcp::VALIGN_TOP,
+                               dcp::DIRECTION_LTR,
+                               " line",
+                               dcp::NONE,
+                               dcp::Colour (0, 0, 0),
+                               dcp::Time (0, 0, 0, 0, 24),
+                               dcp::Time (0, 0, 0, 0, 24)
+                               )
                        )
                );
 
index 29ef77c9bcbe28efee52b802a5e8b47f2a0e5b7e..92f12a3c1da224ca49a36e8296d727318d7687dc 100644 (file)
@@ -41,6 +41,7 @@
 #include "reel_sound_asset.h"
 #include "reel_subtitle_asset.h"
 #include "subtitle_string.h"
+#include "subtitle_image.h"
 #include "interop_subtitle_asset.h"
 #include "smpte_subtitle_asset.h"
 #include "mono_picture_asset.h"
@@ -171,7 +172,7 @@ main_subtitle (shared_ptr<Reel> reel, bool list_subtitles)
        cout << "      Subtitle ID: " << reel->main_subtitle()->id();
 
        if (reel->main_subtitle()->asset_ref().resolved()) {
-               list<SubtitleString> subs = reel->main_subtitle()->asset()->subtitles ();
+               list<shared_ptr<Subtitle> > subs = reel->main_subtitle()->asset()->subtitles ();
                cout << "\n      Subtitle:    " << subs.size() << " subtitles";
                shared_ptr<InteropSubtitleAsset> iop = dynamic_pointer_cast<InteropSubtitleAsset> (reel->main_subtitle()->asset());
                if (iop) {
@@ -182,8 +183,15 @@ main_subtitle (shared_ptr<Reel> reel, bool list_subtitles)
                        cout << " in " << smpte->language().get() << "\n";
                }
                if (list_subtitles) {
-                       BOOST_FOREACH (SubtitleString const& k, subs) {
-                               cout << k << "\n";
+                       BOOST_FOREACH (shared_ptr<Subtitle> k, subs) {
+                               shared_ptr<SubtitleString> ks = dynamic_pointer_cast<SubtitleString> (k);
+                               if (ks) {
+                                       cout << *ks << "\n";
+                               }
+                               shared_ptr<SubtitleImage> is = dynamic_pointer_cast<SubtitleImage> (k);
+                               if (is) {
+                                       cout << *is << "\n";
+                               }
                        }
                }
        } else {
index 4d9b5e275aedc6c46ba9df5d89a7f193c5ae0969..189de1eb6a8fb37903b26098fe82aefd722df9ce 100644 (file)
@@ -37,7 +37,7 @@ def collect_compilation_db_tasks(self):
 def write_compilation_database(ctx):
        "Write the clang compilation database as JSON"
        database_file = ctx.bldnode.make_node('compile_commands.json')
-       Logs.info('Build commands will be stored in %s', database_file.path_from(ctx.path))
+       Logs.info('Build commands will be stored in %s' % database_file.path_from(ctx.path))
        try:
                root = json.load(database_file)
        except IOError: