Template-ize collect so that any container can be used.
authorCarl Hetherington <cth@carlh.net>
Mon, 6 Oct 2014 12:29:36 +0000 (13:29 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 6 Oct 2014 12:29:36 +0000 (13:29 +0100)
Add new vertical reference of TOP_OF_SUBTITLE, and use references
with line numbers as well as proportional specifiers.
Add a couple of methods to MetricTime.

19 files changed:
src/collect.cc [deleted file]
src/collect.h
src/dcp_reader.cc
src/metric_time.h
src/stl_binary_reader.cc
src/stl_binary_writer.cc
src/stl_text_reader.cc
src/subrip_reader.cc
src/vertical_position.cc
src/vertical_position.h
src/vertical_reference.cc
src/vertical_reference.h
src/wscript
test/dcp_reader_test.cc
test/dcp_to_stl_binary_test.cc
test/stl_binary_writer_test.cc
test/stl_text_reader_test.cc
test/subrip_reader_test.cc
tools/dumpsubs.cc

diff --git a/src/collect.cc b/src/collect.cc
deleted file mode 100644 (file)
index 0f592d4..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "raw_subtitle.h"
-#include "subtitle.h"
-#include "collect.h"
-
-using std::list;
-using boost::optional;
-using namespace sub;
-
-list<Subtitle>
-sub::collect (list<RawSubtitle> raw)
-{
-       raw.sort ();
-
-       list<Subtitle> out;
-
-       optional<Subtitle> current;
-       for (list<RawSubtitle>::const_iterator i = raw.begin (); i != raw.end(); ++i) {
-               if (current && current->same_metadata (*i)) {
-                       /* This RawSubtitle can be added to current... */
-                       if (!current->lines.empty() && current->lines.back().same_metadata (*i)) {
-                               /* ... and indeed to its last line */
-                               current->lines.back().blocks.push_back (Block (*i));
-                       } else {
-                               /* ... as a new line */
-                               current->lines.push_back (Line (*i));
-                       }
-               } else {
-                       /* We must start a new Subtitle */
-                       if (current) {
-                               out.push_back (current.get ());
-                       }
-                       current = Subtitle (*i);
-               }
-       }
-
-       if (current) {
-               out.push_back (current.get ());
-       }
-
-       return out;
-}
index 62e872ff4ee757c78a3f826a0108fe2b7c4482a4..ff43ce044bade20c7610322a23d2cc32b7d8eb92 100644 (file)
 
 namespace sub {
        
-std::list<Subtitle> collect (std::list<RawSubtitle>);
+template <class T>
+T
+collect (std::list<RawSubtitle> raw)
+{
+       raw.sort ();
+
+       T out;
+
+       boost::optional<Subtitle> current;
+       for (std::list<RawSubtitle>::const_iterator i = raw.begin (); i != raw.end(); ++i) {
+               if (current && current->same_metadata (*i)) {
+                       /* This RawSubtitle can be added to current... */
+                       if (!current->lines.empty() && current->lines.back().same_metadata (*i)) {
+                               /* ... and indeed to its last line */
+                               current->lines.back().blocks.push_back (Block (*i));
+                       } else {
+                               /* ... as a new line */
+                               current->lines.push_back (Line (*i));
+                       }
+               } else {
+                       /* We must start a new Subtitle */
+                       if (current) {
+                               out.push_back (current.get ());
+                       }
+                       current = Subtitle (*i);
+               }
+       }
+
+       if (current) {
+               out.push_back (current.get ());
+       }
+
+       return out;
+}
 
 }
index b938b6cc8263c1fca2cc07965a2da8406de3a2c1..3634d934941a0951a8777ac87c55a91a10cfd2b1 100644 (file)
@@ -47,11 +47,11 @@ class DCPText
 public:
        DCPText ()
                : v_position (0)
-               , v_align (TOP)
+               , v_align (TOP_OF_SCREEN)
        {}
        
        DCPText (shared_ptr<const cxml::Node> node)
-               : v_align (CENTRE)
+               : v_align (CENTRE_OF_SCREEN)
        {
                text = node->content ();
                v_position = node->number_attribute<float> ("VPosition");
index 86c19239c0d1eed479e8dc3b860571cedc2697b8..404464e953e0f571d0009c2dc732724931f0d588 100644 (file)
@@ -42,6 +42,14 @@ public:
        int seconds () const;
        int milliseconds () const;
 
+       double all_as_seconds () const {
+               return all_as_milliseconds() / 1000.0;
+       }
+       
+       int64_t all_as_milliseconds () const {
+               return _ms;
+       }               
+
        void add (MetricTime t);
        void scale (float f);
                          
index dd0020f37766205e810fbdbc336f679ed0eadfb0..ff3d9a0ee5af692085eb769061ae1a5669437e9c 100644 (file)
@@ -98,6 +98,7 @@ STLBinaryReader::STLBinaryReader (istream& in)
                        sub.from.set_frame (get_timecode (5));
                        sub.to.set_frame (get_timecode (9));
                        sub.vertical_position.line = get_int (13, 1) + i;
+                       sub.vertical_position.reference = TOP_OF_SCREEN;
 
                        string text;
                        for (size_t j = 0; j < lines[i].size(); ++j) {
index 9b98b84cf7de4fe3888045384e3d407d20876cbd..0ebdc2c1d7d3a95c02582cf5050cd36bff4cfa31 100644 (file)
@@ -135,18 +135,22 @@ sub::write_stl_binary (
                        
                        if (j->vertical_position.proportional) {
                                switch (j->vertical_position.reference.get ()) {
-                               case TOP:
+                               case TOP_OF_SCREEN:
                                        check_top.insert (j->vertical_position.proportional.get ());
                                        break;
-                               case CENTRE:
+                               case CENTRE_OF_SCREEN:
                                        check_centre.insert (j->vertical_position.proportional.get ());
                                        break;
-                               case BOTTOM:
+                               case BOTTOM_OF_SCREEN:
                                        check_bottom.insert (j->vertical_position.proportional.get ());
                                        break;
+                               case TOP_OF_SUBTITLE:
+                                       /* XXX: something needs to be done here */
+                                       break;
                                }
                        } else {
                                check_rows.insert (j->vertical_position.line.get ());
+                               /* XXX: this needs to take vertical_position.reference into account */
                        }
                }
        }
index 7eaa24b8359ab83519104636032f3920638ab36e..3c60e4141422ba72f45248c34d136dadd115b227 100644 (file)
@@ -39,6 +39,7 @@ using namespace sub;
 STLTextReader::STLTextReader (istream& in)
 {
        _subtitle.vertical_position.line = 0;
+       _subtitle.vertical_position.reference = TOP_OF_SCREEN;
        
        while (in.good ()) {
                string line;
index 2728d201b895b6e8612fbc5f90a6b0ce6673dc3d..8bd200537200c4f2f9601d2f78e24a404fcec64c 100644 (file)
@@ -131,8 +131,8 @@ SubripReader::convert_line (string t, int line_number, TimePair from, TimePair t
        p.font_size.set_points (48);
        p.from = from;
        p.to = to;
-       p.vertical_position.proportional = 0.7 + line_number * 0.1;
-       p.vertical_position.reference = TOP;
+       p.vertical_position.line = line_number;
+       p.vertical_position.reference = TOP_OF_SUBTITLE;
        
        /* XXX: missing <font> support */
        /* XXX: nesting of tags e.g. <b>foo<i>bar<b>baz</b>fred</i>jim</b> might
index 3984568d756e4b64d2a5cbd7dd84d4b6c54559d9..1fdb1e174a4b6e0807a2505490cce79e770a2f08 100644 (file)
@@ -26,8 +26,8 @@ VerticalPosition::operator== (VerticalPosition const & other) const
 {
        if (proportional && reference && other.proportional && other.reference) {
                return proportional.get() == other.proportional.get() && reference.get() == other.reference.get();
-       } else if (line && other.line) {
-               return line.get() == other.line.get();
+       } else if (reference && line && other.reference && other.line) {
+               return line.get() == other.line.get() && reference.get() == other.reference.get();
        }
 
        return false;
index 6a0fff4313b9ad3e43d2b9dd3ab319e1c8881bbd..1d0b9394dc8e933861621cc89bfdf4316dcabd02 100644 (file)
@@ -33,10 +33,10 @@ class VerticalPosition
 public:
        /** as a proportion of screen height offset from some reference point */
        boost::optional<float> proportional;
-       /** reference position for proportional */
-       boost::optional<VerticalReference> reference;
-       /** line number from the top of the screen */
+       /** line number offset from some reference point */
        boost::optional<int> line;
+       /** reference point */
+       boost::optional<VerticalReference> reference;
        
        bool operator== (VerticalPosition const & other) const;
        
index 69f9d8436f7da569fd17c2d562297c2e27b7b6a5..3f9219badae0a903bd16b454b360b1a32ff01c78 100644 (file)
@@ -28,11 +28,11 @@ VerticalReference
 sub::string_to_vertical_reference (string s)
 {
        if (s == "top") {
-               return TOP;
+               return TOP_OF_SCREEN;
        } else if (s == "center") {
-               return CENTRE;
+               return CENTRE_OF_SCREEN;
        } else if (s == "bottom") {
-               return BOTTOM;
+               return BOTTOM_OF_SCREEN;
        }
        
        throw XMLError ("unknown subtitle valign type");
index 52cf840f2352c712d704359dcb369e7a28626eb1..4bdcde85e3390df06903cc59a691a859db74f9e3 100644 (file)
@@ -26,9 +26,10 @@ namespace sub {
 
 enum VerticalReference
 {
-       TOP,
-       CENTRE,
-       BOTTOM
+       TOP_OF_SCREEN,
+       CENTRE_OF_SCREEN,
+       BOTTOM_OF_SCREEN,
+       TOP_OF_SUBTITLE
 };
 
 VerticalReference string_to_vertical_reference (std::string s);
index cdc9c3ff30248da341164574eac2313aab2a0cfe..58434b227def6e400cdd8d18def9785891ede0e4 100644 (file)
@@ -11,7 +11,6 @@ def build(bld):
     obj.uselib = 'CXML BOOST_FILESYSTEM BOOST_LOCALE'
     obj.export_includes = ['.']
     obj.source = """
-                 collect.cc
                  colour.cc
                  dcp_reader.cc
                  effect.cc
index c73207e09ee461e2ba0a93a4f755ce66fee98133..5da9bf0b22ee13a38dc377c1bcad39d9a8003ccb 100644 (file)
@@ -32,7 +32,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
 {
        ifstream file ("test/data/test1.xml");
        sub::DCPReader reader (file);
-       list<sub::Subtitle> subs = sub::collect (reader.subtitles ());
+       list<sub::Subtitle> subs = sub::collect<list<sub::Subtitle> > (reader.subtitles ());
 
        list<sub::Subtitle>::iterator i = subs.begin ();
        BOOST_CHECK (i != subs.end ());
@@ -51,7 +51,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "My jacket was Idi Amin's");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.21, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "My corset was H.M. The Queen's");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -91,7 +91,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "My large wonderbra");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -117,7 +117,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "Once belonged to the Shah");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -143,7 +143,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "And these are Roy Hattersley's jeans");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -158,7 +158,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
 {
        ifstream file ("test/data/test2.xml");
        sub::DCPReader reader (file);
-       list<sub::Subtitle> subs = collect (reader.subtitles ());
+       list<sub::Subtitle> subs = sub::collect<list<sub::Subtitle> > (reader.subtitles ());
 
        list<sub::Subtitle>::iterator i = subs.begin ();
        BOOST_CHECK (i != subs.end ());
@@ -177,7 +177,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "At afternoon tea with John Peel");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -191,7 +191,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "I enquired if his accent was real");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -217,7 +217,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "He said \"out of the house");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -231,7 +231,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "I'm incredibly scouse");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -257,7 +257,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "At home it depends how I feel.\"");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -273,7 +273,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 2, 208 * 4));
                BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 4, 10 * 4));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "I spent a long weekend in Brighton");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -301,7 +301,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "With the legendary Miss Enid Blyton");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -315,7 +315,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "She said \"you be Noddy");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -341,7 +341,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "and I'll show you my body\"");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -355,7 +355,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "But Big Ears kept turning the light on.");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -381,7 +381,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "That curious creature the Sphinx");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -395,7 +395,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "Is smarter than anyone thinks");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -421,7 +421,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "It sits there and smirks");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -435,7 +435,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "And you don't think it works");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -461,7 +461,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "Then when you're not looking, it winks.");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -475,7 +475,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "When it snows you will find Sister Sledge");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -501,7 +501,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "Out mooning, at night, on the ledge");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -515,7 +515,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "One storey down");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -541,7 +541,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "Is the maestro, James Brown");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -555,7 +555,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "Displaying his meat and two veg.");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -581,7 +581,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "HELLO");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
@@ -595,7 +595,7 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
-               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+               BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "WORLD");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
index 2d82645a4cbcbd81ffef6e78ca8e0df4b1ac6f9a..95122627fdc2d8186bfa150e21b20fc81616885b 100644 (file)
@@ -25,6 +25,7 @@
 #include <fstream>
 
 using std::ifstream;
+using std::list;
 
 BOOST_AUTO_TEST_CASE (dcp_to_stl_binary_test1)
 {
@@ -35,7 +36,7 @@ BOOST_AUTO_TEST_CASE (dcp_to_stl_binary_test1)
        boost::filesystem::path p = private_test / "fd586c30-6d38-48f2-8241-27359acf184c_sub.xml";
        ifstream f (p.string().c_str ());
        sub::write_stl_binary (
-               sub::collect (sub::DCPReader(f).subtitles ()),
+               sub::collect<list<sub::Subtitle> > (sub::DCPReader(f).subtitles ()),
                25,
                sub::LANGUAGE_FRENCH,
                "", "",
@@ -63,7 +64,7 @@ BOOST_AUTO_TEST_CASE (dcp_to_stl_binary_test2)
        boost::filesystem::path p = private_test / "93e8a6bf-499e-4d36-9350-a9bfa2e6758a_sub.xml";
        ifstream f (p.string().c_str ());
        sub::write_stl_binary (
-               sub::collect (sub::DCPReader(f).subtitles ()),
+               sub::collect<list<sub::Subtitle> > (sub::DCPReader(f).subtitles ()),
                25,
                sub::LANGUAGE_FRENCH,
                "", "",
index 05b2cac58cbf93c2f2dc3e34ec897cb1325b45ca..90142a7d94aa9079123dc2a00cb340ed121a403e 100644 (file)
@@ -40,6 +40,7 @@ BOOST_AUTO_TEST_CASE (stl_binary_writer_test)
                        b.font_size.set_points (42);
                        sub::Line l;
                        l.vertical_position.line = 0;
+                       l.vertical_position.reference = sub::TOP_OF_SCREEN;
                        l.blocks.push_back (b);
                        s.lines.push_back (l);
                }
@@ -51,6 +52,7 @@ BOOST_AUTO_TEST_CASE (stl_binary_writer_test)
                        b.font_size.set_points (42);
                        sub::Line l;
                        l.vertical_position.line = 1;
+                       l.vertical_position.reference = sub::TOP_OF_SCREEN;
                        l.blocks.push_back (b);
                        s.lines.push_back (l);
                }
@@ -65,6 +67,7 @@ BOOST_AUTO_TEST_CASE (stl_binary_writer_test)
 
                sub::Line l;
                l.vertical_position.line = 0;
+               l.vertical_position.reference = sub::TOP_OF_SCREEN;
                
                sub::Block b;
                b.text = "This is some ";
index be58472a0208f193eee6530eed73eb366dbe0450..b21eceec74217195e351ddad5c2aae5f017d79d5 100644 (file)
@@ -32,7 +32,7 @@ BOOST_AUTO_TEST_CASE (stl_text_reader_test)
 {
        ifstream file ("test/data/test_text.stl");
        sub::STLTextReader reader (file);
-       list<sub::Subtitle> subs = sub::collect (reader.subtitles ());
+       list<sub::Subtitle> subs = sub::collect<list<sub::Subtitle> > (reader.subtitles ());
 
        list<sub::Subtitle>::iterator i = subs.begin ();
 
index e7680a98d5a4877f09a0dfdc59613f5f5154525d..42eacfba83c52555cd4416ee4e05bd15e105f492 100644 (file)
@@ -35,7 +35,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
        FILE* f = fopen ("test/data/test.srt", "r");
        sub::SubripReader reader (f);
        fclose (f);
-       list<sub::Subtitle> subs = sub::collect (reader.subtitles ());
+       list<sub::Subtitle> subs = sub::collect<std::list<sub::Subtitle> > (reader.subtitles ());
 
        list<sub::Subtitle>::iterator i = subs.begin ();
 
@@ -56,8 +56,8 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
        BOOST_CHECK_EQUAL (b.bold, false);
        BOOST_CHECK_EQUAL (b.italic, false);
        BOOST_CHECK_EQUAL (b.underline, false);
-       BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.7, 1);
-       BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+       BOOST_CHECK_EQUAL (j->vertical_position.line.get(), 0);
+       BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SUBTITLE);
        ++j;
 
        BOOST_CHECK (j != i->lines.end ());
@@ -69,8 +69,8 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
        BOOST_CHECK_EQUAL (b.bold, false);
        BOOST_CHECK_EQUAL (b.italic, false);
        BOOST_CHECK_EQUAL (b.underline, false);
-       BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.8, 1);
-       BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
+       BOOST_CHECK_EQUAL (j->vertical_position.line.get(), 1);
+       BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SUBTITLE);
        ++i;
 
        
@@ -83,7 +83,8 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
        BOOST_CHECK_EQUAL (i->lines.size(), 1);
        sub::Line l = i->lines.front ();
        BOOST_CHECK_EQUAL (l.blocks.size(), 7);
-       BOOST_CHECK_CLOSE (l.vertical_position.proportional.get(), 0.7, 1);
+       BOOST_CHECK_EQUAL (l.vertical_position.line.get(), 0);
+       BOOST_CHECK_EQUAL (l.vertical_position.reference.get(), sub::TOP_OF_SUBTITLE);
 
        list<sub::Block>::iterator k = l.blocks.begin ();
        
@@ -159,7 +160,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test2)
        FILE* f = fopen ("test/data/test2.srt", "r");
        sub::SubripReader reader (f);
        fclose (f);
-       list<sub::Subtitle> subs = sub::collect (reader.subtitles ());
+       list<sub::Subtitle> subs = sub::collect<list<sub::Subtitle> > (reader.subtitles ());
 
        list<sub::Subtitle>::const_iterator i = subs.begin();
 
index ac582e687c1404cf45d5516488fc200de71929d3..72030789e1ce6dddbf03c36d816058f4b289ec7d 100644 (file)
@@ -82,7 +82,7 @@ main (int argc, char* argv[])
                cout << i->first << ": " << i->second << "\n";
        }
 
-       list<sub::Subtitle> subs = collect (reader->subtitles ());
+       list<sub::Subtitle> subs = collect<list<sub::Subtitle> > (reader->subtitles ());
        for (list<sub::Subtitle>::const_iterator i = subs.begin(); i != subs.end(); ++i) {
                cout << "Subtitle at " << i->from << " -> " << i->to << "\n";
                for (list<sub::Line>::const_iterator j = i->lines.begin(); j != i->lines.end(); ++j) {