using std::list;
using std::cout;
using std::string;
+using std::min;
using boost::shared_ptr;
using boost::optional;
using boost::function;
void
SubtitleDecoder::seek (ContentTime, bool)
+{
+ reset ();
+}
+
+void
+SubtitleDecoder::reset ()
{
_decoded_text.clear ();
_decoded_image.clear ();
}
}
+ /* Find the lowest proportional postion */
+ optional<float> lowest_proportional;
+ BOOST_FOREACH (sub::Line i, subtitle.lines) {
+ if (i.vertical_position.proportional) {
+ if (!lowest_proportional) {
+ lowest_proportional = i.vertical_position.proportional;
+ } else {
+ lowest_proportional = min (lowest_proportional.get(), i.vertical_position.proportional.get());
+ }
+ }
+ }
+
list<dcp::SubtitleString> out;
BOOST_FOREACH (sub::Line i, subtitle.lines) {
BOOST_FOREACH (sub::Block j, i.blocks) {
dcp::VAlign v_align;
if (needs_placement) {
DCPOMATIC_ASSERT (i.vertical_position.line);
- /* This 0.053 is an arbitrary value to lift the bottom sub off the bottom
+ /* This 1.015 is an arbitrary value to lift the bottom sub off the bottom
of the screen a bit to a pleasing degree.
*/
- v_position = 1.015 - (1 + bottom_line.get() - i.vertical_position.line.get()) * 1.2 * j.font_size.proportional (72 * 11);
+ v_position = 1.015 -
+ (1 + bottom_line.get() - i.vertical_position.line.get())
+ * 1.2 * content()->line_spacing() * content()->y_scale() * j.font_size.proportional (72 * 11);
+
v_align = dcp::VALIGN_TOP;
} else {
DCPOMATIC_ASSERT (i.vertical_position.proportional);
DCPOMATIC_ASSERT (i.vertical_position.reference);
v_position = i.vertical_position.proportional.get();
+
+ if (lowest_proportional) {
+ /* Adjust line spacing */
+ v_position = ((v_position - lowest_proportional.get()) * content()->line_spacing()) + lowest_proportional.get();
+ }
+
switch (i.vertical_position.reference.get()) {
case sub::TOP_OF_SCREEN:
v_align = dcp::VALIGN_TOP;
}
}
+ dcp::Effect effect = dcp::NONE;
+ if (content()->outline()) {
+ effect = dcp::BORDER;
+ } else if (content()->shadow()) {
+ effect = dcp::SHADOW;
+ }
+
out.push_back (
dcp::SubtitleString (
string(TEXT_FONT_ID),
v_align,
dcp::DIRECTION_LTR,
j.text,
- content()->outline() ? dcp::BORDER : dcp::NONE,
- content()->outline_colour(),
+ effect,
+ content()->effect_colour(),
dcp::Time (0, 1000),
dcp::Time (0, 1000)
)