Tweaks: don't use shared_ptr for dcp::SubtitleString; SubtitleContent::write_xml...
authorCarl Hetherington <cth@carlh.net>
Tue, 1 Jul 2014 23:17:24 +0000 (00:17 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 1 Jul 2014 23:17:24 +0000 (00:17 +0100)
src/subtitle_content.cc
src/subtitle_content.h
src/wscript
test/rewrite_subs.cc
test/subtitle_tests.cc
tools/dcpinfo.cc

index a622e7b09a2cce1b144c0e03763b0e5d7540fd6a..7e11dea4b20545f8d6d2412551072d6fefe7d3b3 100644 (file)
@@ -169,32 +169,30 @@ SubtitleContent::maybe_add_subtitle (string text, ParseState const & parse_state
        dcp::Subtitle effective_subtitle (*parse_state.subtitle_nodes.back ());
 
        _subtitles.push_back (
-               shared_ptr<SubtitleString> (
-                       new SubtitleString (
-                               font_id_to_name (effective_font.id),
-                               effective_font.italic.get(),
-                               effective_font.color.get(),
-                               effective_font.size,
-                               effective_subtitle.in,
-                               effective_subtitle.out,
-                               effective_text.v_position,
-                               effective_text.v_align,
-                               text,
-                               effective_font.effect ? effective_font.effect.get() : NONE,
-                               effective_font.effect_color.get(),
-                               effective_subtitle.fade_up_time,
-                               effective_subtitle.fade_down_time
-                               )
+               SubtitleString (
+                       font_id_to_name (effective_font.id),
+                       effective_font.italic.get(),
+                       effective_font.color.get(),
+                       effective_font.size,
+                       effective_subtitle.in,
+                       effective_subtitle.out,
+                       effective_text.v_position,
+                       effective_text.v_align,
+                       text,
+                       effective_font.effect ? effective_font.effect.get() : NONE,
+                       effective_font.effect_color.get(),
+                       effective_subtitle.fade_up_time,
+                       effective_subtitle.fade_down_time
                        )
                );
 }
 
-list<shared_ptr<SubtitleString> >
+list<SubtitleString>
 SubtitleContent::subtitles_at (Time t) const
 {
-       list<shared_ptr<SubtitleString> > s;
-       for (list<shared_ptr<SubtitleString> >::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
-               if ((*i)->in() <= t && t <= (*i)->out ()) {
+       list<SubtitleString> s;
+       for (list<SubtitleString>::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
+               if (i->in() <= t && t <= i->out ()) {
                        s.push_back (*i);
                }
        }
@@ -222,25 +220,25 @@ SubtitleContent::font_id_to_name (string id) const
 }
 
 void
-SubtitleContent::add (shared_ptr<SubtitleString> s)
+SubtitleContent::add (SubtitleString s)
 {
        _subtitles.push_back (s);
        _need_sort = true;
 }
 
 struct SubtitleSorter {
-       bool operator() (shared_ptr<SubtitleString> a, shared_ptr<SubtitleString> b) {
-               if (a->in() != b->in()) {
-                       return a->in() < b->in();
+       bool operator() (SubtitleString const & a, SubtitleString const & 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();
        }
 };
 
 void
-SubtitleContent::write_xml () const
+SubtitleContent::write_xml (boost::filesystem::path p) const
 {
-       FILE* f = fopen_boost (file (), "r");
+       FILE* f = fopen_boost (p, "r");
        Glib::ustring const s = xml_as_string ();
        fwrite (s.c_str(), 1, s.length(), f);
        fclose (f);
@@ -272,7 +270,7 @@ SubtitleContent::xml_as_string () const
                }
        }
 
-       list<shared_ptr<SubtitleString> > sorted = _subtitles;
+       list<SubtitleString> sorted = _subtitles;
        if (_need_sort) {
                sorted.sort (SubtitleSorter ());
        }
@@ -294,7 +292,7 @@ SubtitleContent::xml_as_string () const
        xmlpp::Element* font = 0;
        xmlpp::Element* subtitle = 0;
 
-       for (list<shared_ptr<SubtitleString> >::iterator i = sorted.begin(); i != sorted.end(); ++i) {
+       for (list<SubtitleString>::iterator i = sorted.begin(); i != sorted.end(); ++i) {
 
                /* We will start a new <Font>...</Font> whenever some font property changes.
                   I suppose we should really make an optimal hierarchy of <Font> tags, but
@@ -302,18 +300,18 @@ SubtitleContent::xml_as_string () const
                */
 
                bool const font_changed =
-                       italic       != (*i)->italic()       ||
-                       color        != (*i)->color()        ||
-                       size         != (*i)->size()         ||
-                       effect       != (*i)->effect()       ||
-                       effect_color != (*i)->effect_color();
+                       italic       != i->italic()       ||
+                       color        != i->color()        ||
+                       size         != i->size()         ||
+                       effect       != i->effect()       ||
+                       effect_color != i->effect_color();
 
                if (font_changed) {
-                       italic = (*i)->italic ();
-                       color = (*i)->color ();
-                       size = (*i)->size ();
-                       effect = (*i)->effect ();
-                       effect_color = (*i)->effect_color ();
+                       italic = i->italic ();
+                       color = i->color ();
+                       size = i->size ();
+                       effect = i->effect ();
+                       effect_color = i->effect_color ();
                }
 
                if (!font || font_changed) {
@@ -334,29 +332,29 @@ SubtitleContent::xml_as_string () const
                }
 
                if (!subtitle || font_changed ||
-                   (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 = font->add_child ("Subtitle");
                        subtitle->set_attribute ("SpotNumber", raw_convert<string> (spot_number++));
-                       subtitle->set_attribute ("TimeIn", (*i)->in().to_string());
-                       subtitle->set_attribute ("TimeOut", (*i)->out().to_string());
-                       subtitle->set_attribute ("FadeUpTime", raw_convert<string> ((*i)->fade_up_time().to_ticks()));
-                       subtitle->set_attribute ("FadeDownTime", raw_convert<string> ((*i)->fade_down_time().to_ticks()));
-
-                       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->set_attribute ("TimeIn", i->in().to_string());
+                       subtitle->set_attribute ("TimeOut", i->out().to_string());
+                       subtitle->set_attribute ("FadeUpTime", raw_convert<string> (i->fade_up_time().to_ticks()));
+                       subtitle->set_attribute ("FadeDownTime", raw_convert<string> (i->fade_down_time().to_ticks()));
+
+                       last_in = i->in ();
+                       last_out = i->out ();
+                       last_fade_up_time = i->fade_up_time ();
+                       last_fade_down_time = i->fade_down_time ();
                }
 
                xmlpp::Element* text = subtitle->add_child ("Text");
-               text->set_attribute ("VAlign", valign_to_string ((*i)->v_align()));             
-               text->set_attribute ("VPosition", raw_convert<string> ((*i)->v_position()));
-               text->add_child_text ((*i)->text());
+               text->set_attribute ("VAlign", valign_to_string (i->v_align()));                
+               text->set_attribute ("VPosition", raw_convert<string> (i->v_position()));
+               text->add_child_text (i->text());
        }
 
        return doc.write_to_string_formatted ("UTF-8");
index 1ddb9122427f78654ce084fd47e23f4a4d4b0bcc..c00c3f310a650197e3abf502c1d3327b14156d40 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "content.h"
 #include "dcp_time.h"
+#include "subtitle_string.h"
 #include <libcxml/cxml.h>
 
 namespace dcp
@@ -63,14 +64,14 @@ public:
                return _language;
        }
 
-       std::list<boost::shared_ptr<SubtitleString> > subtitles_at (Time t) const;
-       std::list<boost::shared_ptr<SubtitleString> > const & subtitles () const {
+       std::list<SubtitleString> subtitles_at (Time t) const;
+       std::list<SubtitleString> const & subtitles () const {
                return _subtitles;
        }
 
-       void add (boost::shared_ptr<SubtitleString>);
+       void add (SubtitleString);
 
-       void write_xml () const;
+       void write_xml (boost::filesystem::path) const;
        Glib::ustring xml_as_string () const;
 
 protected:
@@ -111,7 +112,7 @@ private:
        std::string _language;
        std::list<boost::shared_ptr<LoadFont> > _load_font_nodes;
 
-       std::list<boost::shared_ptr<SubtitleString> > _subtitles;
+       std::list<SubtitleString> _subtitles;
        bool _need_sort;
 };
 
index e5f0c2a51aa8a0460d2fd90bd03c761637e935b8..e9b3c955c18279bfa0381dc0b1ab1a8bc3ddee9c 100644 (file)
@@ -99,6 +99,7 @@ def build(bld):
               reel_picture_asset.h
               reel_sound_asset.h
               reel_stereo_picture_asset.h
+              reel_subtitle_asset.h
               ref.h
               argb_frame.h
               signer.h
index 553c6291b8ea3c21f163bd7021eb32cc77bc60c6..1a3cfbff0743e4cbfcebc38a158977f1f0d71281 100644 (file)
@@ -51,7 +51,7 @@ main (int argc, char* argv[])
                        for (list<shared_ptr<Reel> >::iterator j = reels.begin(); j != reels.end(); ++j) {
                                
                                if ((*j)->main_subtitle()) {
-                                       (*j)->main_subtitle()->subtitle_content()->write_xml ();
+                                       (*j)->main_subtitle()->subtitle_content()->write_xml ((*j)->main_subtitle()->subtitle_content()->file ());
                                }
                        }
                }
index 2f7331949995dc281d55f94929b9cb87086085e7..f90218e557621d978543774f9bd748cf6c43a01e 100644 (file)
@@ -31,9 +31,9 @@ BOOST_AUTO_TEST_CASE (subtitles1)
 
        BOOST_CHECK_EQUAL (subs.language(), "French");
 
-       list<shared_ptr<dcp::SubtitleString> > s = subs.subtitles_at (dcp::Time (0, 0, 6, 1));
+       list<dcp::SubtitleString> s = subs.subtitles_at (dcp::Time (0, 0, 6, 1));
        BOOST_CHECK_EQUAL (s.size(), 1);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -51,7 +51,7 @@ BOOST_AUTO_TEST_CASE (subtitles1)
                                                         
        s = subs.subtitles_at (dcp::Time (0, 0, 7, 190));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -66,7 +66,7 @@ BOOST_AUTO_TEST_CASE (subtitles1)
                                   dcp::Time (0, 0, 0, 1),
                                   dcp::Time (0, 0, 0, 1)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -84,7 +84,7 @@ BOOST_AUTO_TEST_CASE (subtitles1)
 
        s = subs.subtitles_at (dcp::Time (0, 0, 11, 95));
        BOOST_CHECK_EQUAL (s.size(), 1);
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE (subtitles1)
 
        s = subs.subtitles_at (dcp::Time (0, 0, 14, 42));
        BOOST_CHECK_EQUAL (s.size(), 1);
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -124,9 +124,9 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 {
        dcp::SubtitleContent subs ("test/data/subs2.xml", false);
 
-       list<shared_ptr<dcp::SubtitleString> > s = subs.subtitles_at (dcp::Time (0, 0, 42, 100));
+       list<dcp::SubtitleString> s = subs.subtitles_at (dcp::Time (0, 0, 42, 100));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -141,7 +141,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -159,7 +159,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 0, 50, 50));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -192,7 +192,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 1, 2, 300));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -207,7 +207,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -225,7 +225,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 1, 15, 50));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -240,7 +240,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -258,7 +258,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 1, 27, 200));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -273,7 +273,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -291,7 +291,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 1, 42, 300));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -306,7 +306,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -324,7 +324,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 1, 45, 200));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -339,7 +339,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -357,7 +357,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 1, 47, 249));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -372,7 +372,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   false,
                                   dcp::Color (255, 255, 255),
@@ -390,7 +390,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
 
        s = subs.subtitles_at (dcp::Time (0, 2, 6, 210));
        BOOST_CHECK_EQUAL (s.size(), 2);
-       BOOST_CHECK_EQUAL (*(s.front().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
@@ -405,7 +405,7 @@ BOOST_AUTO_TEST_CASE (subtitles2)
                                   dcp::Time (0, 0, 0, 0),
                                   dcp::Time (0, 0, 0, 0)
                                   ));
-       BOOST_CHECK_EQUAL (*(s.back().get()), dcp::SubtitleString (
+       BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
                                   "Arial",
                                   true,
                                   dcp::Color (255, 255, 255),
index 0c41b0c3a00fddbf7eb472b2818b05006792ca7b..a705d5f4cdfdba7deb375727afd259067c87dc27 100644 (file)
@@ -79,24 +79,24 @@ main_subtitle (shared_ptr<Reel> reel, bool list_subtitles)
                return;
        }
        
-       list<shared_ptr<SubtitleString> > subs = reel->main_subtitle()->subtitle_content()->subtitles ();
+       list<SubtitleString> subs = reel->main_subtitle()->subtitle_content()->subtitles ();
        cout << "      Subtitle: " << subs.size() << " subtitles in " << reel->main_subtitle()->subtitle_content()->language() << "\n";
        if (list_subtitles) {
-               for (list<shared_ptr<SubtitleString> >::const_iterator k = subs.begin(); k != subs.end(); ++k) {
-                       cout << "        " << (*k)->text() << "\n";
+               for (list<SubtitleString>::const_iterator k = subs.begin(); k != subs.end(); ++k) {
+                       cout << "        " << k->text() << "\n";
                        cout << "          "
-                            << "font:" << (*k)->font() << "; "
-                            << "italic:" << (*k)->italic() << "; "
-                            << "color:" << (*k)->color() << "; "
-                            << "in:" << (*k)->in() << "; "
-                            << "out:" << (*k)->out() << "; "
-                            << "v_position:" << (*k)->v_position() << "; "
-                            << "v_align:" << (*k)->v_align() << "; "
-                            << "effect:" << (*k)->effect() << "; "
-                            << "effect_color:" << (*k)->effect_color() << "; "
-                            << "fade_up_time:" << (*k)->fade_up_time() << "; "
-                            << "fade_down_time:" << (*k)->fade_down_time() << "; "
-                            << "size: " << (*k)->size() << "\n";
+                            << "font:" << k->font() << "; "
+                            << "italic:" << k->italic() << "; "
+                            << "color:" << k->color() << "; "
+                            << "in:" << k->in() << "; "
+                            << "out:" << k->out() << "; "
+                            << "v_position:" << k->v_position() << "; "
+                            << "v_align:" << k->v_align() << "; "
+                            << "effect:" << k->effect() << "; "
+                            << "effect_color:" << k->effect_color() << "; "
+                            << "fade_up_time:" << k->fade_up_time() << "; "
+                            << "fade_down_time:" << k->fade_down_time() << "; "
+                            << "size: " << k->size() << "\n";
                }
        }
 }