fix build with IM7

This commit is contained in:
John Cupitt 2019-08-07 20:29:19 +01:00
parent f36927e78d
commit 675c150500
2 changed files with 80 additions and 71 deletions

View File

@ -48,6 +48,46 @@
#include "pforeign.h"
#include "magick.h"
/* ImageMagick can't detect some formats, like ICO, by examining the contents --
* ico.c simply does not have a recogniser.
*
* For these formats, do the detection ourselves.
*
* Return an IM format specifier, or NULL to let IM do the detection.
*/
static const char *
magick_sniff( const unsigned char *bytes, size_t length )
{
if( length >= 4 &&
bytes[0] == 0 &&
bytes[1] == 0 &&
bytes[2] == 1 &&
bytes[3] == 0 )
return( "ICO" );
return( NULL );
}
void
magick_sniff_bytes( ImageInfo *image_info,
const unsigned char *bytes, size_t length )
{
const char *format;
if( (format = magick_sniff( bytes, length )) )
vips_strncpy( image_info->magick, format, MaxTextExtent );
}
void
magick_sniff_file( ImageInfo *image_info, const char *filename )
{
unsigned char bytes[256];
size_t length;
if( (length = vips__get_bytes( filename, bytes, 256 )) >= 4 )
magick_sniff_bytes( image_info, bytes, 256 );
}
#ifdef HAVE_MAGICK7
Image *
@ -165,6 +205,21 @@ magick_set_number_scenes( ImageInfo *image_info, int scene, int number_scenes )
image_info->scenes = strdup( page );
}
/* Does a few bytes look like a file IM can handle?
*/
gboolean
magick_ismagick( const unsigned char *bytes, size_t length )
{
char format[MagickPathExtent];
magick_genesis();
/* Try with our custom sniffers first.
*/
return( magick_sniff( bytes, length ) ||
GetImageMagick( bytes, length, format ) );
}
#endif /*HAVE_MAGICK7*/
#ifdef HAVE_MAGICK6
@ -390,6 +445,30 @@ magick_set_number_scenes( ImageInfo *image_info, int scene, int number_scenes )
#endif
}
/* Does a few bytes look like a file IM can handle?
*/
gboolean
magick_ismagick( const unsigned char *bytes, size_t length )
{
magick_genesis();
/* Try with our custom sniffers first.
*/
#ifdef HAVE_GETIMAGEMAGICK3
{
char format[MaxTextExtent];
return( magick_sniff( bytes, length ) ||
GetImageMagick( bytes, length, format ) );
}
#else /*!HAVE_GETIMAGEMAGICK3*/
/* The GM one returns a static string.
*/
return( magick_sniff( bytes, length ) ||
GetImageMagick( bytes, length ) );
#endif
}
#endif /*HAVE_MAGICK6*/
#if defined(HAVE_MAGICK6) || defined(HAVE_MAGICK7)
@ -467,46 +546,6 @@ magick_ColorspaceType2str( ColorspaceType colorspace )
return( "<unknown ColorspaceType>" );
}
/* ImageMagick can't detect some formats, like ICO, by examining the contents --
* ico.c simply does not have a recogniser.
*
* For these formats, do the detection ourselves.
*
* Return an IM format specifier, or NULL to let IM do the detection.
*/
static const char *
magick_sniff( const unsigned char *bytes, size_t length )
{
if( length >= 4 &&
bytes[0] == 0 &&
bytes[1] == 0 &&
bytes[2] == 1 &&
bytes[3] == 0 )
return( "ICO" );
return( NULL );
}
void
magick_sniff_bytes( ImageInfo *image_info,
const unsigned char *bytes, size_t length )
{
const char *format;
if( (format = magick_sniff( bytes, length )) )
vips_strncpy( image_info->magick, format, MaxTextExtent );
}
void
magick_sniff_file( ImageInfo *image_info, const char *filename )
{
unsigned char bytes[256];
size_t length;
if( (length = vips__get_bytes( filename, bytes, 256 )) >= 4 )
magick_sniff_bytes( image_info, bytes, 256 );
}
void
magick_vips_error( const char *domain, ExceptionInfo *exception )
{
@ -646,32 +685,4 @@ magick_set_magick_profile( Image *image,
return( 0 );
}
/* Does a few bytes look like a file IM can handle?
*/
gboolean
magick_ismagick( const unsigned char *bytes, size_t length )
{
magick_genesis();
/* Try with our custom sniffers first.
*/
#ifdef HAVE_GETIMAGEMAGICK3
{
#ifdef HAVE_MAGICK7
char format[MagickPathExtent];
#else /*HAVE_MAGICK6*/
char format[MaxTextExtent];
#endif
return( magick_sniff( bytes, length ) ||
GetImageMagick( bytes, length, format ) );
}
#else /*!HAVE_GETIMAGEMAGICK3*/
/* The GM one returns a static string.
*/
return( magick_sniff( bytes, length ) ||
GetImageMagick( bytes, length ) );
#endif
}
#endif /*HAVE_MAGICK*/

View File

@ -402,12 +402,10 @@ class TestForeign:
# assert im.width == width * 2
# assert im.height == height * 2
# all-frames should load every frame of the animation
# (though all-frames is deprecated)
im = pyvips.Image.magickload(GIF_ANIM_FILE)
width = im.width
height = im.height
im = pyvips.Image.magickload(GIF_ANIM_FILE, all_frames=True)
im = pyvips.Image.magickload(GIF_ANIM_FILE, n=-1)
assert im.width == width
assert im.height == height * 5