Basic and slightly inaccurate support for <Space> in subtitles (#2103).
[dcpomatic.git] / src / lib / text_decoder.cc
index 0a7bdf95da75ffc32f428d095929d8b891bb4b0d..99b68faba2b8ae570d7a60cc1cf28f4d67565923 100644 (file)
@@ -36,7 +36,6 @@ using std::min;
 using std::max;
 using std::shared_ptr;
 using boost::optional;
-using std::function;
 using namespace dcpomatic;
 
 
@@ -61,7 +60,7 @@ TextDecoder::TextDecoder (
  *  of the video frame)
  */
 void
-TextDecoder::emit_bitmap_start (ContentTime from, shared_ptr<Image> image, dcpomatic::Rect<double> rect)
+TextDecoder::emit_bitmap_start (ContentTime from, shared_ptr<const Image> image, dcpomatic::Rect<double> rect)
 {
        BitmapStart (ContentBitmapText (from, image, rect));
        _position = from;
@@ -72,10 +71,11 @@ void
 TextDecoder::emit_plain_start (ContentTime from, list<dcp::SubtitleString> s)
 {
        for (auto& i: s) {
-               /* We must escape < and > in strings, otherwise they might confuse our subtitle
-                  renderer (which uses some HTML-esque markup to do bold/italic etc.)
+               /* We must escape some things, otherwise they might confuse our subtitle
+                  renderer (which uses entities and some HTML-esque markup to do bold/italic etc.)
                */
                string t = i.text ();
+               boost::algorithm::replace_all (t, "&", "&amp;");
                boost::algorithm::replace_all (t, "<", "&lt;");
                boost::algorithm::replace_all (t, ">", "&gt;");
                i.set_text (t);
@@ -247,7 +247,8 @@ TextDecoder::emit_plain_start (ContentTime from, sub::Subtitle const & subtitle)
                                           use libsub for DCP subs) we can cheat by just putting 0 in here.
                                        */
                                        dcp::Time (),
-                                       dcp::Time ()
+                                       dcp::Time (),
+                                       0
                                        )
                                );
                }
@@ -285,7 +286,7 @@ TextDecoder::emit_plain (ContentTimePeriod period, sub::Subtitle const & s)
  *  of the video frame)
  */
 void
-TextDecoder::emit_bitmap (ContentTimePeriod period, shared_ptr<Image> image, dcpomatic::Rect<double> rect)
+TextDecoder::emit_bitmap (ContentTimePeriod period, shared_ptr<const Image> image, dcpomatic::Rect<double> rect)
 {
        emit_bitmap_start (period.from, image, rect);
        emit_stop (period.to);