Basics of splitting up Decoder tree like Content.
[dcpomatic.git] / src / lib / text_subtitle_decoder.cc
index 893fd5d3c3099cd1277a9c64a2b609aa93d44056..f76bb7f75f60b9578c5f3fd9a6a0d7326df9dfc2 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "text_subtitle_decoder.h"
 #include "text_subtitle_content.h"
+#include "subtitle_content.h"
 #include <dcp/subtitle_string.h>
 #include <boost/foreach.hpp>
 #include <iostream>
@@ -33,17 +34,23 @@ using boost::optional;
 using boost::dynamic_pointer_cast;
 
 TextSubtitleDecoder::TextSubtitleDecoder (shared_ptr<const TextSubtitleContent> content)
-       : SubtitleDecoder (content)
-       , TextSubtitle (content)
+       : TextSubtitle (content)
        , _next (0)
 {
-
+       subtitle.reset (
+               new SubtitleDecoder (
+                       this,
+                       content->subtitle,
+                       bind (&TextSubtitleDecoder::image_subtitles_during, this, _1, _2),
+                       bind (&TextSubtitleDecoder::text_subtitles_during, this, _1, _2)
+                       )
+               );
 }
 
 void
 TextSubtitleDecoder::seek (ContentTime time, bool accurate)
 {
-       SubtitleDecoder::seek (time, accurate);
+       subtitle->seek (time, accurate);
 
        _next = 0;
        while (_next < _subtitles.size() && ContentTime::from_seconds (_subtitles[_next].from.all_as_seconds ()) < time) {
@@ -60,9 +67,6 @@ TextSubtitleDecoder::pass (PassReason, bool)
 
        /* XXX: we are ignoring positioning specified in the file */
 
-       shared_ptr<const TextSubtitleContent> content = dynamic_pointer_cast<const TextSubtitleContent> (_subtitle_content);
-       DCPOMATIC_ASSERT (content);
-
        list<dcp::SubtitleString> out;
 
        /* Highest line index in this subtitle */
@@ -79,8 +83,9 @@ TextSubtitleDecoder::pass (PassReason, bool)
                                dcp::SubtitleString (
                                        TextSubtitleContent::font_id,
                                        j.italic,
+                                       j.bold,
                                        /* force the colour to whatever is configured */
-                                       content->colour(),
+                                       subtitle->content()->colour(),
                                        j.font_size.points (72 * 11),
                                        1.0,
                                        dcp::Time (_subtitles[_next].from.all_as_seconds(), 1000),
@@ -92,9 +97,10 @@ TextSubtitleDecoder::pass (PassReason, bool)
                                        */
                                        1.015 - ((1 + highest - i.vertical_position.line.get()) * 1.5 / 22),
                                        dcp::VALIGN_TOP,
+                                       dcp::DIRECTION_LTR,
                                        j.text,
-                                       content->outline() ? dcp::BORDER : dcp::NONE,
-                                       content->outline_colour(),
+                                       subtitle->content()->outline() ? dcp::BORDER : dcp::NONE,
+                                       subtitle->content()->outline_colour(),
                                        dcp::Time (0, 1000),
                                        dcp::Time (0, 1000)
                                        )
@@ -102,7 +108,7 @@ TextSubtitleDecoder::pass (PassReason, bool)
                }
        }
 
-       text_subtitle (content_time_period (_subtitles[_next]), out);
+       subtitle->text_subtitle (content_time_period (_subtitles[_next]), out);
 
        ++_next;
        return false;