magicksave polishing

- make better use of the magick.c wrappers in magickload
- disable magicksave if ImportImagePixels() is not found, fixing build
  against GM
This commit is contained in:
John Cupitt 2018-05-18 17:40:29 +01:00
parent e2aafa6ed3
commit c349b31c5f
5 changed files with 71 additions and 40 deletions

@ -744,6 +744,21 @@ AC_ARG_ENABLE([magicksave],
AS_HELP_STRING([--disable-magicksave], AS_HELP_STRING([--disable-magicksave],
[disable libMagic save (default: enabled)])) [disable libMagic save (default: enabled)]))
if test x"$enable_magicksave" != x"yes"; then
# we need ImportImagePixels ... GM is missing this sadly
save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS"
AC_CHECK_FUNCS(ImportImagePixels,[
AC_DEFINE(HAVE_IMPORTIMAGEPIXELS,1,
[define if you have ImportImagePixels.])
],[
AC_MSG_WARN([ImportImagePixels not found; disabling magicksave])
enable_magicksave=no
]
)
LIBS="$save_LIBS"
fi
if test x"$with_magick" != x"no"; then if test x"$with_magick" != x"no"; then
if test x"$enable_magickload" != x"no"; then if test x"$enable_magickload" != x"no"; then
AC_DEFINE(ENABLE_MAGICKLOAD,1,[define to enable load with libMagick]) AC_DEFINE(ENABLE_MAGICKLOAD,1,[define to enable load with libMagick])

@ -97,6 +97,7 @@ Image*
magick_acquire_image( const ImageInfo *image_info, ExceptionInfo *exception ) magick_acquire_image( const ImageInfo *image_info, ExceptionInfo *exception )
{ {
(void) exception; (void) exception;
#ifdef HAVE_ACQUIREIMAGE #ifdef HAVE_ACQUIREIMAGE
return( AcquireImage( image_info ) ); return( AcquireImage( image_info ) );
#else /*!HAVE_ACQUIREIMAGE*/ #else /*!HAVE_ACQUIREIMAGE*/
@ -157,8 +158,12 @@ magick_import_pixels( Image *image, const ssize_t x, const ssize_t y,
* *
* then repack pixels into that area using map and storage_type. * then repack pixels into that area using map and storage_type.
*/ */
#ifdef HAVE_IMPORTIMAGEPIXELS
return( ImportImagePixels( image, x, y, width, height, map, return( ImportImagePixels( image, x, y, width, height, map,
type, pixels ) ); type, pixels ) );
#else /*!HAVE_IMPORTIMAGEPIXELS*/
return( MagickFalse );
#endif /*HAVE_IMPORTIMAGEPIXELS*/
} }
void void
@ -185,6 +190,38 @@ magick_inherit_exception( ExceptionInfo *exception, Image *image )
#if defined(HAVE_MAGICK6) || defined(HAVE_MAGICK7) #if defined(HAVE_MAGICK6) || defined(HAVE_MAGICK7)
void
magick_set_image_option( ImageInfo *image_info,
const char *name, const char *value )
{
#ifdef HAVE_SETIMAGEOPTION
SetImageOption( image_info, name, value );
#endif /*HAVE_SETIMAGEOPTION*/
}
void
magick_set_number_scenes( ImageInfo *image_info, int scene, int number_scenes )
{
#ifdef HAVE_NUMBER_SCENES
/* I can't find docs for these fields, but this seems to work.
*/
char page[256];
image_info->scene = scene;
image_info->number_scenes = number_scenes;
/* Some IMs must have the string version set as well.
*/
vips_snprintf( page, 256, "%d-%d", scene, scene + number_scenes );
image_info->scenes = strdup( page );
#else /*!HAVE_NUMBER_SCENES*/
/* This works with GM 1.2.31 and probably others.
*/
image_info->subimage = scene;
image_info->subrange = number_scenes;
#endif
}
void void
magick_vips_error( const char *domain, ExceptionInfo *exception ) magick_vips_error( const char *domain, ExceptionInfo *exception )
{ {

@ -53,6 +53,10 @@ int magick_import_pixels( Image *image, const ssize_t x, const ssize_t y,
const StorageType type,const void *pixels, ExceptionInfo *exception ); const StorageType type,const void *pixels, ExceptionInfo *exception );
void magick_set_property( Image *image, const char *property, const char *value, void magick_set_property( Image *image, const char *property, const char *value,
ExceptionInfo *exception ); ExceptionInfo *exception );
void magick_set_image_option( ImageInfo *image_info,
const char *name, const char *value );
void magick_set_number_scenes( ImageInfo *image_info,
int scene, int number_scenes );
void magick_inherit_exception( ExceptionInfo *exception, Image *image ); void magick_inherit_exception( ExceptionInfo *exception, Image *image );
void magick_vips_error( const char *domain, ExceptionInfo *exception ); void magick_vips_error( const char *domain, ExceptionInfo *exception );

@ -228,7 +228,6 @@ read_new( const char *filename, VipsImage *im,
*/ */
VIPS_SETSTR( read->image_info->density, density ); VIPS_SETSTR( read->image_info->density, density );
#ifdef HAVE_SETIMAGEOPTION
/* When reading DICOM images, we want to ignore any /* When reading DICOM images, we want to ignore any
* window_center/_width setting, since it may put pixels outside the * window_center/_width setting, since it may put pixels outside the
* 0-65535 range and lose data. * 0-65535 range and lose data.
@ -236,30 +235,12 @@ read_new( const char *filename, VipsImage *im,
* These window settings are attached as vips metadata, so our caller * These window settings are attached as vips metadata, so our caller
* can interpret them if it wants. * can interpret them if it wants.
*/ */
SetImageOption( read->image_info, "dcm:display-range", "reset" ); magick_set_image_option( read->image_info,
#endif /*HAVE_SETIMAGEOPTION*/ "dcm:display-range", "reset" );
if( read->page > 0 ) { if( read->page > 0 )
#ifdef HAVE_NUMBER_SCENES magick_set_number_scenes( read->image_info,
/* I can't find docs for these fields, but this seems to work. read->page, read->n );
*/
char page[256];
read->image_info->scene = read->page;
read->image_info->number_scenes = read->n;
/* Some IMs must have the string version set as well.
*/
vips_snprintf( page, 256, "%d-%d",
read->page, read->page + read->n );
read->image_info->scenes = strdup( page );
#else /*!HAVE_NUMBER_SCENES*/
/* This works with GM 1.2.31 and probably others.
*/
read->image_info->subimage = read->page;
read->image_info->subrange = read->n;
#endif
}
#ifdef DEBUG #ifdef DEBUG
printf( "magick2vips: read_new: %s\n", read->filename ); printf( "magick2vips: read_new: %s\n", read->filename );
@ -703,7 +684,9 @@ get_pixels( Image *image, int left, int top, int width, int height )
IndexPacket *indexes = (IndexPacket *) IndexPacket *indexes = (IndexPacket *)
GetVirtualIndexQueue( image ); GetVirtualIndexQueue( image );
#else #else
IndexPacket *indexes = GetIndexes( image ); /* Was GetIndexes(), but that's now deprecated.
*/
IndexPacket *indexes = AccessMutableIndexes( image );
#endif #endif
int i; int i;

@ -325,20 +325,12 @@ vips_foreign_load_magick7_build( VipsObject *object )
* These window settings are attached as vips metadata, so our caller * These window settings are attached as vips metadata, so our caller
* can interpret them if it wants. * can interpret them if it wants.
*/ */
SetImageOption( magick7->image_info, "dcm:display-range", "reset" ); magick_set_image_option( magick7->image_info,
"dcm:display-range", "reset" );
if( magick7->page > 0 ) { if( magick7->page > 0 )
/* I can't find docs for these fields, but this seems to work. magick_set_number_scenes( magick7->image_info,
*/ magick7->page, magick7->n );
char page[256];
magick7->image_info->scene = magick7->page;
magick7->image_info->number_scenes = magick7->n;
vips_snprintf( page, 256, "%d-%d",
magick7->page, magick7->page + magick7->n );
magick7->image_info->scenes = strdup( page );
}
if( VIPS_OBJECT_CLASS( vips_foreign_load_magick7_parent_class )-> if( VIPS_OBJECT_CLASS( vips_foreign_load_magick7_parent_class )->
build( object ) ) build( object ) )