summaryrefslogtreecommitdiff
path: root/src/lib/image.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-07-08 23:26:21 +0100
committerCarl Hetherington <cth@carlh.net>2018-07-08 23:26:21 +0100
commit54ef3f25f924a677de0d71e1f773898b56ab5852 (patch)
treeb2d57ad1a77a17076c8044f089a3d266778e042c /src/lib/image.cc
parent64a6a87dd4a3fd43665242b8a8b2b35a675a7839 (diff)
Write image subs to DCPs.
Diffstat (limited to 'src/lib/image.cc')
-rw-r--r--src/lib/image.cc43
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());
+}