diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-07-08 23:26:21 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-07-08 23:26:21 +0100 |
| commit | 54ef3f25f924a677de0d71e1f773898b56ab5852 (patch) | |
| tree | b2d57ad1a77a17076c8044f089a3d266778e042c /src/lib/image.cc | |
| parent | 64a6a87dd4a3fd43665242b8a8b2b35a675a7839 (diff) | |
Write image subs to DCPs.
Diffstat (limited to 'src/lib/image.cc')
| -rw-r--r-- | src/lib/image.cc | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/src/lib/image.cc b/src/lib/image.cc index 792bf3ab4..bdd4f61d8 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -30,6 +30,7 @@ #include "dcpomatic_socket.h" #include <dcp/rgb_xyz.h> #include <dcp/transfer_function.h> +#include <Magick++.h> extern "C" { #include <libswscale/swscale.h> #include <libavutil/pixfmt.h> @@ -825,7 +826,8 @@ Image::allocate () } Image::Image (Image const & other) - : _size (other._size) + : enable_shared_from_this<Image>(other) + , _size (other._size) , _pixel_format (other._pixel_format) , _aligned (other._aligned) , _extra_pixels (other._extra_pixels) @@ -1125,8 +1127,8 @@ Image::fade (float f) } } -shared_ptr<Image> -Image::ensure_aligned (shared_ptr<Image> image) +shared_ptr<const Image> +Image::ensure_aligned (shared_ptr<const Image> image) { if (image->aligned()) { return image; @@ -1144,3 +1146,38 @@ Image::memory_used () const } return m; } + +dcp::Data +Image::as_png () const +{ +#ifdef DCPOMATIC_IMAGE_MAGICK + using namespace MagickCore; +#else + using namespace MagickLib; +#endif + + string format; + switch (_pixel_format) { + case AV_PIX_FMT_RGB24: + format = "RGB"; + break; + case AV_PIX_FMT_BGRA: + format = "BGRA"; + break; + default: + DCPOMATIC_ASSERT (false); + break; + } + + shared_ptr<const Image> use; + if (aligned()) { + use.reset (new Image(shared_from_this(), false)); + } + + Magick::Image m (size().width, size().height, format, CharPixel, (void *) use->data()[0]); + m.magick ("PNG"); + Magick::Blob blob; + m.write (&blob); + /* XXX: could use a subclass of Data here (storing its data in a Blob) */ + return dcp::Data (static_cast<const uint8_t*>(blob.data()), blob.length()); +} |
