diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-03-04 20:27:27 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-03-04 20:27:27 +0000 |
| commit | a79d78d8bb6d51f6662f1f63b9f8fd19e1a0c5f1 (patch) | |
| tree | 4b696815a80903ade7df8eccec23160b97e5ee05 /src/lib/image.cc | |
| parent | 1b1bc528ee5ca1fee1bd33f9fb6f79cd551e3b33 (diff) | |
| parent | 5f66a692647fc901f7dca709ad08c65010bd84e7 (diff) | |
Merge master.
Diffstat (limited to 'src/lib/image.cc')
| -rw-r--r-- | src/lib/image.cc | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/lib/image.cc b/src/lib/image.cc index b706f7fdc..98645c299 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington <cth@carlh.net> + Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,9 +33,12 @@ extern "C" { #include "scaler.h" #include "timer.h" +#include "i18n.h" + using std::string; using std::min; using std::cout; +using std::cerr; using boost::shared_ptr; using dcp::Size; @@ -89,26 +92,38 @@ Image::crop_scale_window (Crop crop, dcp::Size inter_size, dcp::Size out_size, S */ assert (aligned ()); + assert (out_size.width >= inter_size.width); + assert (out_size.height >= inter_size.height); + + /* Here's an image of out_size */ shared_ptr<Image> out (new Image (out_format, out_size, out_aligned)); out->make_black (); - - dcp::Size cropped_size = crop.apply (size ()); + /* Size of the image after any crop */ + dcp::Size const cropped_size = crop.apply (size ()); + + /* Scale context for a scale from cropped_size to inter_size */ struct SwsContext* scale_context = sws_getContext ( cropped_size.width, cropped_size.height, pixel_format(), inter_size.width, inter_size.height, out_format, scaler->ffmpeg_id (), 0, 0, 0 ); + if (!scale_context) { + throw StringError (N_("Could not allocate SwsContext")); + } + + /* Prepare input data pointers with crop */ uint8_t* scale_in_data[components()]; for (int c = 0; c < components(); ++c) { scale_in_data[c] = data()[c] + int (rint (bytes_per_pixel(c) * crop.left)) + stride()[c] * (crop.top / line_factor(c)); } + /* Corner of the image within out_size */ Position<int> const corner ((out_size.width - inter_size.width) / 2, (out_size.height - inter_size.height) / 2); - uint8_t* scale_out_data[components()]; - for (int c = 0; c < components(); ++c) { + uint8_t* scale_out_data[out->components()]; + for (int c = 0; c < out->components(); ++c) { scale_out_data[c] = out->data()[c] + int (rint (out->bytes_per_pixel(c) * corner.x)) + out->stride()[c] * corner.y; } |
