X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fimage.cc;h=1107f0a4077964ef07b67e221ade50d98f9b0fcb;hb=5a5324ed3a381a86dfe0a6e3932c1d58fdcd596f;hp=92b850a62bce981e373cce86d199e25367fbfbad;hpb=631f905234537d2b0a24e9b3ff40f08a17c0fd8b;p=dcpomatic.git diff --git a/src/lib/image.cc b/src/lib/image.cc index 92b850a62..1107f0a40 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -1,19 +1,20 @@ /* Copyright (C) 2012-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 . */ @@ -26,7 +27,6 @@ #include "timer.h" #include "rect.h" #include "util.h" -#include "md5_digester.h" #include "dcpomatic_socket.h" extern "C" { #include @@ -34,6 +34,7 @@ extern "C" { #include #include } +#include #include #include "i18n.h" @@ -45,6 +46,7 @@ using std::cerr; using std::list; using std::runtime_error; using boost::shared_ptr; +using boost::make_shared; using dcp::Size; int @@ -149,7 +151,7 @@ Image::crop_scale_window ( To get around this, we ask Image to overallocate its buffers by the overrun. */ - shared_ptr out (new Image (out_format, out_size, out_aligned, (out_size.width - inter_size.width) / 2)); + shared_ptr out = make_shared (out_format, out_size, out_aligned, (out_size.width - inter_size.width) / 2); out->make_black (); /* Size of the image after any crop */ @@ -227,7 +229,7 @@ Image::scale (dcp::Size out_size, dcp::YUVToRGB yuv_to_rgb, AVPixelFormat out_fo */ DCPOMATIC_ASSERT (aligned ()); - shared_ptr scaled (new Image (out_format, out_size, out_aligned)); + shared_ptr scaled = make_shared (out_format, out_size, out_aligned); struct SwsContext* scale_context = sws_getContext ( size().width, size().height, pixel_format(), @@ -425,6 +427,7 @@ Image::make_transparent () void Image::alpha_blend (shared_ptr other, Position position) { + /* We're blending RGBA images; first byte is blue, second byte is green, third byte blue, fourth byte alpha */ DCPOMATIC_ASSERT (other->pixel_format() == AV_PIX_FMT_RGBA); int const other_bpp = 4; @@ -447,15 +450,16 @@ Image::alpha_blend (shared_ptr other, Position position) switch (_pixel_format) { case AV_PIX_FMT_RGB24: { + /* Going onto RGB24. First byte is red, second green, third blue */ int const this_bpp = 3; for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) { uint8_t* tp = data()[0] + ty * stride()[0] + start_tx * this_bpp; uint8_t* op = other->data()[0] + oy * other->stride()[0]; for (int tx = start_tx, ox = start_ox; tx < size().width && ox < other->size().width; ++tx, ++ox) { float const alpha = float (op[3]) / 255; - tp[0] = op[0] * alpha + tp[0] * (1 - alpha); + tp[0] = op[2] * alpha + tp[0] * (1 - alpha); tp[1] = op[1] * alpha + tp[1] * (1 - alpha); - tp[2] = op[2] * alpha + tp[2] * (1 - alpha); + tp[2] = op[0] * alpha + tp[2] * (1 - alpha); tp += this_bpp; op += other_bpp; @@ -817,7 +821,7 @@ merge (list images) 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)); + shared_ptr merged = make_shared (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 - all.position());