X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fsubrip_decoder.cc;h=2f8b8a5f36f4bccaa64543861cd58881f9c47421;hb=7998c12eb59c07f583db27a250ff566b543bf40b;hp=3c93292a166ef8208cda997893a7e54005f5fc79;hpb=9e025d3f85f9d6d855b3d5e6c90bca0eac3a3d49;p=dcpomatic.git diff --git a/src/lib/subrip_decoder.cc b/src/lib/subrip_decoder.cc index 3c93292a1..2f8b8a5f3 100644 --- a/src/lib/subrip_decoder.cc +++ b/src/lib/subrip_decoder.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2015 Carl Hetherington 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 @@ -17,17 +17,20 @@ */ -#include #include "subrip_decoder.h" #include "subrip_content.h" +#include +#include #include using std::list; using std::vector; using std::string; using std::cout; +using std::max; using boost::shared_ptr; using boost::optional; +using boost::dynamic_pointer_cast; SubRipDecoder::SubRipDecoder (shared_ptr content) : SubtitleDecoder (content) @@ -49,7 +52,7 @@ SubRipDecoder::seek (ContentTime time, bool accurate) } bool -SubRipDecoder::pass (PassReason) +SubRipDecoder::pass (PassReason, bool) { if (_next >= _subtitles.size ()) { return true; @@ -57,25 +60,41 @@ SubRipDecoder::pass (PassReason) /* XXX: we are ignoring positioning specified in the file */ + shared_ptr content = dynamic_pointer_cast (_subtitle_content); + DCPOMATIC_ASSERT (content); + list out; - 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) { + + /* Highest line index in this subtitle */ + int highest = 0; + BOOST_FOREACH (sub::Line i, _subtitles[_next].lines) { + DCPOMATIC_ASSERT (i.vertical_position.reference && i.vertical_position.reference.get() == sub::TOP_OF_SUBTITLE); + DCPOMATIC_ASSERT (i.vertical_position.line); + highest = max (highest, i.vertical_position.line.get()); + } + + BOOST_FOREACH (sub::Line i, _subtitles[_next].lines) { + BOOST_FOREACH (sub::Block j, i.blocks) { 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), + j.italic, + /* force the colour to whatever is configured */ + content->colour(), + 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, + /* This 1.015 is an arbitrary value to lift the bottom sub off the bottom + of the screen a bit to a pleasing degree. + */ + 1.015 - ((1 + highest - i.vertical_position.line.get()) * 1.5 / 22), dcp::VALIGN_TOP, - j->text, - dcp::NONE, - dcp::Colour (255, 255, 255), + j.text, + content->outline() ? dcp::BORDER : dcp::NONE, + content->outline_colour(), dcp::Time (0, 1000), dcp::Time (0, 1000) )