From cadec42b9547665ac03a7180af374ebb40df7c78 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 13 Aug 2012 02:14:00 +0100 Subject: [PATCH] Subtitles at method. --- src/dcp_time.cc | 22 ++++++++++++++++++++++ src/dcp_time.h | 1 + src/subtitle_asset.cc | 29 ++++++++++++++++++++++++++++- src/subtitle_asset.h | 4 ++++ test/tests.cc | 3 +++ 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/dcp_time.cc b/src/dcp_time.cc index 2e79e742..5e8bf801 100644 --- a/src/dcp_time.cc +++ b/src/dcp_time.cc @@ -28,6 +28,28 @@ libdcp::operator== (Time const & a, Time const & b) return (a.h == b.h && a.m == b.m && a.s == b.s && a.ms == b.ms); } +bool +libdcp::operator<= (Time const & a, Time const & b) +{ + if (a.h != b.h) { + return a.h <= b.h; + } + + if (a.m != b.m) { + return a.m <= b.m; + } + + if (a.s != b.s) { + return a.s <= b.s; + } + + if (a.ms != b.ms) { + return a.ms <= b.ms; + } + + return true; +} + ostream & libdcp::operator<< (ostream& s, Time const & t) { diff --git a/src/dcp_time.h b/src/dcp_time.h index 4e91dc18..48560596 100644 --- a/src/dcp_time.h +++ b/src/dcp_time.h @@ -40,6 +40,7 @@ public: }; extern bool operator== (Time const & a, Time const & b); +extern bool operator<= (Time const & a, Time const & b); extern std::ostream & operator<< (std::ostream & s, Time const & t); } diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc index ca27d6da..22098213 100644 --- a/src/subtitle_asset.cc +++ b/src/subtitle_asset.cc @@ -19,9 +19,11 @@ #include "subtitle_asset.h" +using namespace std; +using namespace boost; using namespace libdcp; -SubtitleAsset::SubtitleAsset (std::string directory, std::string xml) +SubtitleAsset::SubtitleAsset (string directory, string xml) : Asset (directory, xml) , XMLFile (path().string(), "DCSubtitle") { @@ -55,3 +57,28 @@ Text::Text (xmlpp::Node const * node) _text = content (); _v_position = float_attribute ("VPosition"); } + +list > +SubtitleAsset::subtitles_at (Time t) const +{ + for (list >::const_iterator i = _fonts.begin(); i != _fonts.end(); ++i) { + list > s = (*i)->subtitles_at (t); + if (!s.empty ()) { + return s; + } + } + + return list > (); +} + +list > +Font::subtitles_at (Time t) const +{ + for (list >::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { + if ((*i)->in() <= t && t <= (*i)->out()) { + return (*i)->texts (); + } + } + + return list > (); +} diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h index 02db6815..6d584a0a 100644 --- a/src/subtitle_asset.h +++ b/src/subtitle_asset.h @@ -77,6 +77,8 @@ public: return _subtitles; } + std::list > subtitles_at (Time t) const; + private: std::list > _subtitles; }; @@ -95,6 +97,8 @@ public: return _language; } + std::list > subtitles_at (Time t) const; + std::list > const & fonts () const { return _fonts; } diff --git a/test/tests.cc b/test/tests.cc index b8d9ef97..cb180ec0 100644 --- a/test/tests.cc +++ b/test/tests.cc @@ -124,6 +124,9 @@ BOOST_AUTO_TEST_CASE (subtitles) BOOST_CHECK_EQUAL ((*i)->texts().size(), 1); BOOST_CHECK_EQUAL ((*i)->texts().front()->v_position(), 15); BOOST_CHECK_EQUAL ((*i)->texts().front()->text(), "And these are Roy Hattersley's jeans"); + + BOOST_CHECK_EQUAL (subs.subtitles_at (libdcp::Time (0, 0, 14, 042)).size(), 1); + BOOST_CHECK_EQUAL (subs.subtitles_at (libdcp::Time (0, 0, 14, 042)).front()->text(), "And these are Roy Hattersley's jeans"); } -- 2.30.2