Adjust line spacing even with subs with specified proportional position.
authorCarl Hetherington <cth@carlh.net>
Sun, 3 Jul 2016 20:44:50 +0000 (21:44 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 3 Jul 2016 20:44:50 +0000 (21:44 +0100)
ChangeLog
src/lib/subtitle_decoder.cc

index cb3cc77c106f9f8d393ed81c1573c0446d894bc0..9f92134adeffcab249b270160c553d12122f8c1c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2016-07-03  Carl Hetherington  <cth@carlh.net>
 
+       * Fix line spacing adjustment of SSA/ASS.
+
        * Updated nl_NL translation from Rob van Nieuwkerk.
 
 2016-07-02  Carl Hetherington  <cth@carlh.net>
index 72c6883fb548f7afb3fe85b9d6956cd7cfc5dc13..09f7a67004884fa4a006d3b44b037b6b4dd8bf19 100644 (file)
@@ -29,6 +29,7 @@
 using std::list;
 using std::cout;
 using std::string;
+using std::min;
 using boost::shared_ptr;
 using boost::optional;
 using boost::function;
@@ -158,6 +159,18 @@ SubtitleDecoder::give_text (ContentTimePeriod period, sub::Subtitle const & subt
                }
        }
 
+       /* 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) {
@@ -183,6 +196,12 @@ SubtitleDecoder::give_text (ContentTimePeriod period, sub::Subtitle const & subt
                                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;