X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fsubrip_decoder.cc;h=32d50d86b14e62ad44b0f28015799fea1ce1514b;hb=6708d52b5c2ff9ccb6ee99f3b793d791bb95f26b;hp=3d971fd4b4fe8516ec43d5b7111b9f095b6176be;hpb=4616b19fb5241a54c9d57f7a91bb975f41aed14b;p=dcpomatic.git diff --git a/src/lib/subrip_decoder.cc b/src/lib/subrip_decoder.cc index 3d971fd4b..32d50d86b 100644 --- a/src/lib/subrip_decoder.cc +++ b/src/lib/subrip_decoder.cc @@ -20,10 +20,14 @@ #include #include "subrip_decoder.h" #include "subrip_content.h" +#include using std::list; using std::vector; +using std::string; +using std::cout; using boost::shared_ptr; +using boost::optional; SubRipDecoder::SubRipDecoder (shared_ptr content) : SubtitleDecoder (content) @@ -37,13 +41,11 @@ void SubRipDecoder::seek (ContentTime time, bool accurate) { SubtitleDecoder::seek (time, accurate); - + _next = 0; - list::const_iterator i = _subtitles[_next].pieces.begin(); - while (i != _subtitles[_next].pieces.end() && _subtitles[_next].period.from < time) { - ++i; + while (_next < _subtitles.size() && ContentTime::from_seconds (_subtitles[_next].from.all_as_seconds ()) < time) { + ++_next; } - } bool @@ -52,43 +54,69 @@ SubRipDecoder::pass () if (_next >= _subtitles.size ()) { return true; } - + + /* XXX: we are ignoring positioning specified in the file */ + list out; - for (list::const_iterator i = _subtitles[_next].pieces.begin(); i != _subtitles[_next].pieces.end(); ++i) { - out.push_back ( - dcp::SubtitleString ( - "Arial", - i->italic, - dcp::Color (255, 255, 255), - 72, - dcp::Time (rint (_subtitles[_next].period.from.seconds() * 250)), - dcp::Time (rint (_subtitles[_next].period.to.seconds() * 250)), - 0.9, - dcp::BOTTOM, - i->text, - dcp::NONE, - dcp::Color (255, 255, 255), - 0, - 0 - ) - ); + for (list::const_iterator i = _subtitles[_next].lines.begin(); i != _subtitles[_next].lines.end(); ++i) { + for (list::const_iterator j = i->blocks.begin(); j != i->blocks.end(); ++j) { + out.push_back ( + dcp::SubtitleString ( + SubRipContent::font_id, + j->italic, + dcp::Colour (j->colour.r * 255, j->colour.g * 255, j->colour.b * 255), + j->font_size.points (72 * 11), + 1.0, + dcp::Time (_subtitles[_next].from.all_as_seconds(), 1000), + dcp::Time (_subtitles[_next].to.all_as_seconds(), 1000), + 0, + dcp::HALIGN_CENTER, + i->vertical_position.line.get() * (1.5 / 22) + 0.8, + dcp::VALIGN_TOP, + j->text, + dcp::NONE, + dcp::Colour (255, 255, 255), + dcp::Time (0, 1000), + dcp::Time (0, 1000) + ) + ); + } } - text_subtitle (out); - _next++; + text_subtitle (content_time_period (_subtitles[_next]), out); + + ++_next; return false; } -bool -SubRipDecoder::has_subtitle_during (ContentTimePeriod p) const +list +SubRipDecoder::image_subtitles_during (ContentTimePeriod, bool) const +{ + return list (); +} + +list +SubRipDecoder::text_subtitles_during (ContentTimePeriod p, bool starting) const { /* XXX: inefficient */ - for (vector::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { - if (p.overlaps (i->period)) { - return true; + list d; + + for (vector::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { + ContentTimePeriod t = content_time_period (*i); + if ((starting && p.contains (t.from)) || (!starting && p.overlaps (t))) { + d.push_back (t); } } - return false; + return d; +} + +ContentTimePeriod +SubRipDecoder::content_time_period (sub::Subtitle s) const +{ + return ContentTimePeriod ( + ContentTime::from_seconds (s.from.all_as_seconds()), + ContentTime::from_seconds (s.to.all_as_seconds()) + ); }