X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Frender_subtitles.cc;h=76aa092297d9c880a6a5949f78354d953e249e93;hb=a8a0dfd1b21de6c0facf965ab119833ff6f790bf;hp=9b5f585e59bf79dcc0ab86d0f06d05b7f7df88e4;hpb=9bf2cf3509380663e6943f6b0d22dbec6002c332;p=dcpomatic.git diff --git a/src/lib/render_subtitles.cc b/src/lib/render_subtitles.cc index 9b5f585e5..76aa09229 100644 --- a/src/lib/render_subtitles.cc +++ b/src/lib/render_subtitles.cc @@ -1,19 +1,20 @@ /* - Copyright (C) 2014-2015 Carl Hetherington + Copyright (C) 2014-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -23,6 +24,7 @@ #include "cross.h" #include "font.h" #include "dcpomatic_assert.h" +#include #include #include #include @@ -81,6 +83,7 @@ render_line (list subtitles, list > fonts, shared_ptr image (new Image (AV_PIX_FMT_RGBA, dcp::Size (target.width, height), false)); image->make_black (); +#ifdef DCPOMATIC_HAVE_FORMAT_STRIDE_FOR_WIDTH Cairo::RefPtr surface = Cairo::ImageSurface::create ( image->data()[0], Cairo::FORMAT_ARGB32, @@ -88,6 +91,18 @@ render_line (list subtitles, list > fonts, image->size().height, 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) + */ + Cairo::RefPtr surface = Cairo::ImageSurface::create ( + image->data()[0], + Cairo::FORMAT_ARGB32, + image->size().width, + image->size().height, + image->size().width * 4 + ); +#endif Cairo::RefPtr context = Cairo::Context::create (surface); @@ -185,6 +200,7 @@ render_line (list subtitles, list > fonts, string marked_up; bool italic = false; + bool bold = false; BOOST_FOREACH (dcp::SubtitleString const & i, subtitles) { if (i.italic() != italic) { if (i.italic()) { @@ -195,6 +211,15 @@ render_line (list subtitles, list > fonts, italic = i.italic (); } + if (i.bold() != bold) { + if (i.bold()) { + marked_up += ""; + } else { + marked_up += ""; + } + bold = i.bold (); + } + marked_up += i.text (); } @@ -202,15 +227,18 @@ render_line (list subtitles, list > fonts, marked_up += ""; } + if (bold) { + marked_up += ""; + } + layout->set_markup (marked_up); /* Compute fade factor */ /* XXX */ float fade_factor = 1; - layout->update_from_cairo_context (context); - context->scale (xscale, yscale); + layout->update_from_cairo_context (context); if (subtitles.front().effect() == dcp::SHADOW) { /* Drop-shadow effect */ @@ -240,7 +268,9 @@ render_line (list subtitles, list > fonts, int layout_width; int layout_height; - layout->get_size (layout_width, layout_height); + layout->get_pixel_size (layout_width, layout_height); + layout_width *= xscale; + layout_height *= yscale; int x = 0; switch (subtitles.front().h_align ()) { @@ -250,31 +280,36 @@ render_line (list subtitles, list > fonts, break; case dcp::HALIGN_CENTER: /* h_position is distance between centre of frame and centre of subtitle */ - x = (0.5 + subtitles.front().h_position()) * target.width - layout_width / (PANGO_SCALE * 2); + x = (0.5 + subtitles.front().h_position()) * target.width - layout_width / 2; break; case dcp::HALIGN_RIGHT: /* h_position is distance between right of frame and right of subtitle */ - x = (1.0 - subtitles.front().h_position()) * target.width - layout_width / PANGO_SCALE; + x = (1.0 - subtitles.front().h_position()) * target.width - layout_width; break; } int y = 0; switch (subtitles.front().v_align ()) { case dcp::VALIGN_TOP: - /* v_position is distance between top of frame and top of subtitle */ - y = subtitles.front().v_position() * target.height; + /* SMPTE says that v_position is the distance between top + of frame and top of subtitle, but this doesn't always seem to be + the case in practice; Gunnar Ásgeirsson's Dolby server appears + to put VALIGN_TOP subs with v_position as the distance between top + of frame and bottom of subtitle. + */ + y = subtitles.front().v_position() * target.height - layout_height; break; case dcp::VALIGN_CENTER: /* v_position is distance between centre of frame and centre of subtitle */ - y = (0.5 + subtitles.front().v_position()) * target.height - layout_height / (PANGO_SCALE * 2); + y = (0.5 + subtitles.front().v_position()) * target.height - layout_height / 2; break; case dcp::VALIGN_BOTTOM: /* v_position is distance between bottom of frame and bottom of subtitle */ - y = (1.0 - subtitles.front().v_position()) * target.height - layout_height / PANGO_SCALE; + y = (1.0 - subtitles.front().v_position()) * target.height - layout_height; break; } - return PositionImage (image, Position (x, y)); + return PositionImage (image, Position (max (0, x), max (0, y))); } list