Support PNG subs in DCPSubtitleDecoder (#1479).
[dcpomatic.git] / src / lib / util.cc
index ac1c96f975f9318f5b9588b9c6b37f0f724d6f59..b5265519413976328254749d63cb5236caa200cd 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "crypto.h"
 #include "compose.hpp"
 #include "audio_buffers.h"
+#include "string_text.h"
+#include "font.h"
+#include "render_text.h"
+#include "ffmpeg_image_proxy.h"
+#include "image.h"
+#include "text_decoder.h"
 #include <dcp/locale_convert.h>
 #include <dcp/util.h>
 #include <dcp/raw_convert.h>
@@ -363,9 +369,25 @@ dcpomatic_setup ()
        putenv (String::compose("FONTCONFIG_PATH=%1", shared_path().string()).c_str());
 #endif
 
+#ifdef DCPOMATIC_OSX
+       setenv ("PANGOCAIRO_BACKEND", "fontconfig", 1);
+       setenv ("FONTCONFIG_PATH", shared_path().string().c_str(), 1);
+#endif
+
        Pango::init ();
        dcp::init ();
 
+#ifdef DCPOMATIC_WINDOWS
+       /* Render something to fontconfig to create its cache */
+       list<StringText> subs;
+       dcp::SubtitleString ss(
+               optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HALIGN_CENTER, 0, dcp::VALIGN_CENTER, dcp::DIRECTION_LTR,
+               "Hello dolly", dcp::NONE, dcp::Colour(), dcp::Time(), dcp::Time()
+               );
+       subs.push_back (StringText(ss, 0));
+       render_text (subs, list<shared_ptr<Font> >(), dcp::Size(640, 480), DCPTime(), 24);
+#endif
+
        Ratio::setup_ratios ();
        PresetColourConversion::setup_colour_conversion_presets ();
        VideoContentScale::setup_scales ();
@@ -707,7 +729,7 @@ relaxed_string_to_float (string s)
        try {
                boost::algorithm::replace_all (s, ",", ".");
                return lexical_cast<float> (s);
-       } catch (bad_lexical_cast) {
+       } catch (bad_lexical_cast &) {
                boost::algorithm::replace_all (s, ".", ",");
                return lexical_cast<float> (s);
        }
@@ -839,6 +861,68 @@ utf8_strlen (string s)
        return N;
 }
 
+string
+day_of_week_to_string (boost::gregorian::greg_weekday d)
+{
+       switch (d.as_enum()) {
+       case boost::date_time::Sunday:
+               return _("Sunday");
+       case boost::date_time::Monday:
+               return _("Monday");
+       case boost::date_time::Tuesday:
+               return _("Tuesday");
+       case boost::date_time::Wednesday:
+               return _("Wednesday");
+       case boost::date_time::Thursday:
+               return _("Thursday");
+       case boost::date_time::Friday:
+               return _("Friday");
+       case boost::date_time::Saturday:
+               return _("Saturday");
+       }
+
+       return d.as_long_string ();
+}
+
+/** @param size Size of picture that the subtitle will be overlaid onto */
+void
+emit_subtitle_image (ContentTimePeriod period, dcp::SubtitleImage sub, dcp::Size size, shared_ptr<TextDecoder> decoder)
+{
+       /* XXX: this is rather inefficient; decoding the image just to get its size */
+       FFmpegImageProxy proxy (sub.png_image());
+       shared_ptr<Image> image = proxy.image().first;
+       /* set up rect with height and width */
+       dcpomatic::Rect<double> rect(0, 0, image->size().width / double(size.width), image->size().height / double(size.height));
+
+       /* add in position */
+
+       switch (sub.h_align()) {
+       case dcp::HALIGN_LEFT:
+               rect.x += sub.h_position();
+               break;
+       case dcp::HALIGN_CENTER:
+               rect.x += 0.5 + sub.h_position() - rect.width / 2;
+               break;
+       case dcp::HALIGN_RIGHT:
+               rect.x += 1 - sub.h_position() - rect.width;
+               break;
+       }
+
+       switch (sub.v_align()) {
+       case dcp::VALIGN_TOP:
+               rect.y += sub.v_position();
+               break;
+       case dcp::VALIGN_CENTER:
+               rect.y += 0.5 + sub.v_position() - rect.height / 2;
+               break;
+       case dcp::VALIGN_BOTTOM:
+               rect.y += 1 - sub.v_position() - rect.height;
+               break;
+       }
+
+       decoder->emit_bitmap (period, image, rect);
+}
+
 #ifdef DCPOMATIC_VARIANT_SWAROOP
 
 /* Make up a key from the machine UUID */