diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-09-02 01:11:11 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-09-02 01:11:11 +0100 |
| commit | a18e837cb56da42a500a438a09afcbddad8b3a94 (patch) | |
| tree | eb9f2c17477d9b813a03a8fd14dde4c5fade0cd9 /src/lib/image.cc | |
| parent | da4a15c2e613b9604b3b7247811576a8567d1c7c (diff) | |
Play PNG subtitles from DCPs; possibly not in the right scale.
Diffstat (limited to 'src/lib/image.cc')
| -rw-r--r-- | src/lib/image.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/lib/image.cc b/src/lib/image.cc index 08507ec5f..b75c0f083 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -791,6 +791,34 @@ Image::Image (AVPixelFormat p, dcp::Size s, bool aligned, int extra_pixels) allocate (); } +/** Construct an Image from some PNG data */ +Image::Image (dcp::Data png) +{ + Magick::Blob blob; + blob.update (png.data().get(), png.size()); + Magick::Image* magick_image = new Magick::Image (blob); + _size = dcp::Size(magick_image->columns(), magick_image->rows()); + _pixel_format = AV_PIX_FMT_BGRA; + _aligned = true; + _extra_pixels = 0; + allocate (); + + /* Write line-by-line here as _image must be aligned, and write() cannot be told about strides */ + uint8_t* p = data()[0]; + for (int i = 0; i < _size.height; ++i) { +#ifdef DCPOMATIC_HAVE_MAGICKCORE_NAMESPACE + using namespace MagickCore; +#endif +#ifdef DCPOMATIC_HAVE_MAGICKLIB_NAMESPACE + using namespace MagickLib; +#endif + magick_image->write (0, i, _size.width, 1, "BGRA", CharPixel, p); + p += stride()[0]; + } + + delete magick_image; +} + void Image::allocate () { |
