From ee77b3cf5f59f775e75e628aa28e8f2f9f941530 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 25 Mar 2014 09:41:36 +0000 Subject: It builds. --- src/lib/image.cc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/lib/image.cc') diff --git a/src/lib/image.cc b/src/lib/image.cc index 926aefd36..432cfbd54 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -31,6 +31,7 @@ extern "C" { #include "exceptions.h" #include "scaler.h" #include "timer.h" +#include "rect.h" #include "i18n.h" @@ -38,6 +39,7 @@ using std::string; using std::min; using std::cout; using std::cerr; +using std::list; using boost::shared_ptr; using dcp::Size; @@ -342,6 +344,16 @@ Image::make_black () } } +void +Image::make_transparent () +{ + if (_pixel_format != PIX_FMT_RGBA) { + throw PixelFormatError ("make_transparent()", _pixel_format); + } + + memset (data()[0], 0, lines(0) * stride()[0]); +} + void Image::alpha_blend (shared_ptr other, Position position) { @@ -630,3 +642,23 @@ Image::aligned () const return _aligned; } +PositionImage +merge (list images) +{ + if (images.empty ()) { + return PositionImage (); + } + + dcpomatic::Rect all (images.front().position, images.front().image->size().width, images.front().image->size().height); + for (list::const_iterator i = images.begin(); i != images.end(); ++i) { + all.extend (dcpomatic::Rect (i->position, i->image->size().width, i->image->size().height)); + } + + shared_ptr merged (new Image (images.front().image->pixel_format (), dcp::Size (all.width, all.height), true)); + merged->make_transparent (); + for (list::const_iterator i = images.begin(); i != images.end(); ++i) { + merged->alpha_blend (i->image, i->position); + } + + return PositionImage (merged, all.position ()); +} -- cgit v1.2.3