From d1f84b0985e977374c6ea126eca9e70a71c43467 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Fri, 16 Oct 2020 00:05:17 +0100 Subject: [PATCH] better GraphicsMagick image write We were not setting matte or depth correctly, thanks bfriesen. --- ChangeLog | 1 + libvips/foreign/magick.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/ChangeLog b/ChangeLog index 5d3d2d60..f7af435c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ - add VImage::new_from_memory_steal [Zeranoe] - vipsthumbnail supports stdin / stdout thumbnailing - have a lock just for pdfium [DarthSim] +- better GraphicsMagick image write [bfriesen] 6/9/20 started 8.10.2 - update magicksave/load profile handling [kelilevi] diff --git a/libvips/foreign/magick.c b/libvips/foreign/magick.c index ce6000f4..f4a5eab0 100644 --- a/libvips/foreign/magick.c +++ b/libvips/foreign/magick.c @@ -4,6 +4,8 @@ * * 24/7/18 * - add the sniffer + * 16/10/20 [bfriesen] + * - set matte and depth appropriately for GM in magick_import_pixels() */ /* @@ -319,6 +321,7 @@ magick_import_pixels( Image *image, const ssize_t x, const ssize_t y, type, pixels ) ); #else /*!HAVE_IMPORTIMAGEPIXELS*/ Image *constitute_image; + unsigned int storage_type_depth; g_assert( image ); g_assert( image->signature == MagickSignature ); @@ -328,7 +331,43 @@ magick_import_pixels( Image *image, const ssize_t x, const ssize_t y, if( !constitute_image ) return( MagickFalse ); + /* image needs to inherit these fields from constitute_image. + */ + switch( type ) { + case CharPixel: + storage_type_depth = sizeof( unsigned char ) * 8; + break; + + case ShortPixel: + storage_type_depth = sizeof( unsigned short ) * 8; + break; + + case IntegerPixel: + storage_type_depth = sizeof( unsigned short ) * 8; + break; + + case LongPixel: + storage_type_depth = sizeof( unsigned long ) * 8; + break; + + case FloatPixel: + storage_type_depth = sizeof( float ) * 8; + break; + + case DoublePixel: + storage_type_depth = sizeof( double ) * 8; + break; + + default: + storage_type_depth = QuantumDepth; + break; + + } + image->depth = VIPS_MIN( storage_type_depth, QuantumDepth ); + image->matte = constitute_image->matte; + (void) CompositeImage( image, CopyCompositeOp, constitute_image, x, y ); + DestroyImage( constitute_image ); return( image->exception.severity == UndefinedException );