d588620e70bf15da29cc242e4ae8d86977e8f36a from master; fix hang if you cancel a paused...
[dcpomatic.git] / src / lib / render_subtitles.cc
index c18cb4272440958db21d27f055ae0eb003131b5c..9620eacbf5c58ebe4a3dc847262067c6802ea54e 100644 (file)
@@ -28,6 +28,7 @@ using std::cout;
 using std::string;
 using std::min;
 using std::max;
+using std::pair;
 using boost::shared_ptr;
 using boost::optional;
 
@@ -36,24 +37,19 @@ calculate_position (dcp::VAlign v_align, double v_position, int target_height, i
 {
        switch (v_align) {
        case dcp::TOP:
-               return (v_position / 100) * target_height - offset;
+               return v_position * target_height - offset;
        case dcp::CENTER:
-               return (0.5 + v_position / 100) * target_height - offset;
+               return (0.5 + v_position) * target_height - offset;
        case dcp::BOTTOM:
-               return (1.0 - v_position / 100) * target_height - offset;
+               return (1.0 - v_position) * target_height - offset;
        }
 
        return 0;
 }
 
-void
-render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target, shared_ptr<Image>& image, Position<int>& position)
+PositionImage
+render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target)
 {
-       if (subtitles.empty ()) {
-               image.reset ();
-               return;
-       }
-
        /* Estimate height that the subtitle image needs to be */
        optional<int> top;
        optional<int> bottom;
@@ -68,7 +64,7 @@ render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target, shared_
        top = top.get() - 32;
        bottom = bottom.get() + 32;
 
-       image.reset (new Image (PIX_FMT_RGBA, dcp::Size (target.width, bottom.get() - top.get ()), false));
+       shared_ptr<Image> image (new Image (PIX_FMT_RGBA, dcp::Size (target.width, bottom.get() - top.get ()), false));
        image->make_black ();
 
        Cairo::RefPtr<Cairo::ImageSurface> surface = Cairo::ImageSurface::create (
@@ -88,11 +84,7 @@ render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target, shared_
        context->set_line_width (1);
 
        for (list<dcp::SubtitleString>::const_iterator i = subtitles.begin(); i != subtitles.end(); ++i) {
-               string f = i->font ();
-               if (f.empty ()) {
-                       f = "Arial";
-               }
-               Pango::FontDescription font (f);
+               Pango::FontDescription font (i->font().get_value_or ("Arial"));
                font.set_absolute_size (i->size_in_pixels (target.height) * PANGO_SCALE);
                if (i->italic ()) {
                        font.set_style (Pango::STYLE_ITALIC);
@@ -103,16 +95,6 @@ render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target, shared_
                /* Compute fade factor */
                /* XXX */
                float fade_factor = 1;
-#if 0          
-               dcp::Time now (time * 1000 / (4 * TIME_HZ));
-               dcp::Time end_fade_up = i->in() + i->fade_up_time ();
-               dcp::Time start_fade_down = i->out() - i->fade_down_time ();
-               if (now < end_fade_up) {
-                       fade_factor = (now - i->in()) / i->fade_up_time();
-               } else if (now > start_fade_down) {
-                       fade_factor = 1.0 - ((now - start_fade_down) / i->fade_down_time ());
-               }
-#endif         
 
                layout->update_from_cairo_context (context);
                
@@ -123,7 +105,7 @@ render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target, shared_
 
                if (i->effect() == dcp::SHADOW) {
                        /* Drop-shadow effect */
-                       dcp::Color const ec = i->effect_color ();
+                       dcp::Colour const ec = i->effect_colour ();
                        context->set_source_rgba (float(ec.r) / 255, float(ec.g) / 255, float(ec.b) / 255, fade_factor);
                        context->move_to (x + 4, y + 4);
                        layout->add_to_cairo_context (context);
@@ -132,7 +114,7 @@ render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target, shared_
 
                /* The actual subtitle */
                context->move_to (x, y);
-               dcp::Color const c = i->color ();
+               dcp::Colour const c = i->colour ();
                context->set_source_rgba (float(c.r) / 255, float(c.g) / 255, float(c.b) / 255, fade_factor);
                layout->add_to_cairo_context (context);
                context->fill ();
@@ -140,11 +122,13 @@ render_subtitles (list<dcp::SubtitleString> subtitles, dcp::Size target, shared_
                if (i->effect() == dcp::BORDER) {
                        /* Border effect */
                        context->move_to (x, y);
-                       dcp::Color ec = i->effect_color ();
+                       dcp::Colour ec = i->effect_colour ();
                        context->set_source_rgba (float(ec.r) / 255, float(ec.g) / 255, float(ec.b) / 255, fade_factor);
                        layout->add_to_cairo_context (context);
                        context->stroke ();
                }
        }
+
+       return PositionImage (image, Position<int> (0, top.get ()));
 }