#include <pangomm.h>
DCPOMATIC_ENABLE_WARNINGS
#include <pango/pangocairo.h>
-#ifndef DCPOMATIC_HAVE_SHOW_IN_CAIRO_CONTEXT
-#include <pango/pangocairo.h>
-#endif
#include <boost/algorithm/string.hpp>
#include <iostream>
using std::pair;
using std::shared_ptr;
using std::string;
-using boost::optional;
-using boost::algorithm::replace_all;
using namespace dcpomatic;
static list<pair<boost::filesystem::path, string>> fc_config_fonts;
+/** Create a Pango layout using a dummy context which we can use to calculate the size
+ * of the text we will render. Then we can transfer the layout over to the real context
+ * for the actual render.
+ */
+static Glib::RefPtr<Pango::Layout>
+create_layout()
+{
+ auto c_font_map = pango_cairo_font_map_new ();
+ DCPOMATIC_ASSERT (c_font_map);
+ auto font_map = Glib::wrap (c_font_map);
+ auto c_context = pango_font_map_create_context (c_font_map);
+ DCPOMATIC_ASSERT (c_context);
+ auto context = Glib::wrap (c_context);
+ return Pango::Layout::create (context);
+}
+
+
+static void
+setup_layout (Glib::RefPtr<Pango::Layout> layout, string font_name, string markup)
+{
+ layout->set_alignment (Pango::ALIGN_LEFT);
+ Pango::FontDescription font (font_name);
+ layout->set_font_description (font);
+ layout->set_markup (markup);
+}
+
+
string
marked_up (list<StringText> subtitles, int target_height, float fade_factor)
{
/* Between 1-65535 inclusive, apparently... */
out += "alpha=\"" + dcp::raw_convert<string>(int(floor(fade_factor * 65534)) + 1) + "\" ";
out += "color=\"#" + i.colour().to_rgb_string() + "\">";
-
- string t = i.text();
- replace_all(t, "&", "&");
- out += t;
-
+ out += i.text();
out += "</span>";
}
static shared_ptr<Image>
create_image (dcp::Size size)
{
- /* FFmpeg BGRA means first byte blue, second byte green, third byte red, fourth byte alpha */
- auto image = make_shared<Image>(AV_PIX_FMT_BGRA, size, false);
+ /* FFmpeg BGRA means first byte blue, second byte green, third byte red, fourth byte alpha.
+ * This must be COMPACT as we're using it with Cairo::ImageSurface::create
+ */
+ auto image = make_shared<Image>(AV_PIX_FMT_BGRA, size, Image::Alignment::COMPACT);
image->make_black ();
return image;
}
static Cairo::RefPtr<Cairo::ImageSurface>
create_surface (shared_ptr<Image> image)
{
-#ifdef DCPOMATIC_HAVE_FORMAT_STRIDE_FOR_WIDTH
- auto surface = Cairo::ImageSurface::create (
+ /* XXX: I don't think it's guaranteed that format_stride_for_width will return a stride without any padding,
+ * so it's lucky that this works.
+ */
+ DCPOMATIC_ASSERT (image->alignment() == Image::Alignment::COMPACT);
+ DCPOMATIC_ASSERT (image->pixel_format() == AV_PIX_FMT_BGRA);
+ return Cairo::ImageSurface::create (
image->data()[0],
Cairo::FORMAT_ARGB32,
image->size().width,
/* Cairo ARGB32 means first byte blue, second byte green, third byte red, fourth byte alpha */
Cairo::ImageSurface::format_stride_for_width (Cairo::FORMAT_ARGB32, image->size().width)
);
-#else
- /* Centos 5 does not have Cairo::ImageSurface::format_stride_for_width, so just use width * 4
- which I hope is safe (if slow)
- */
- auto surface = Cairo::ImageSurface::create (
- image->data()[0],
- Cairo::FORMAT_ARGB32,
- image->size().width,
- image->size().height,
- image->size().width * 4
- );
-#endif
-
- return surface;
}
}
-static void
-setup_layout (Glib::RefPtr<Pango::Layout> layout, string font_name, string markup)
-{
- layout->set_alignment (Pango::ALIGN_LEFT);
- Pango::FontDescription font (font_name);
- layout->set_font_description (font);
- layout->set_markup (markup);
-}
-
-
-/** Create a Pango layout using a dummy context which we can use to calculate the size
- * of the text we will render. Then we can transfer the layout over to the real context
- * for the actual render.
- */
-static Glib::RefPtr<Pango::Layout>
-create_layout()
-{
- auto c_font_map = pango_cairo_font_map_new ();
- DCPOMATIC_ASSERT (c_font_map);
- auto font_map = Glib::wrap (c_font_map);
- auto c_context = pango_font_map_create_context (c_font_map);
- DCPOMATIC_ASSERT (c_context);
- auto context = Glib::wrap (c_context);
- return Pango::Layout::create (context);
-}
-
-
/** @param subtitles A list of subtitles that are all on the same line,
* at the same time and with the same fade in/out.
*/