magick7 tests for all frames equal before load
it used to crash if pages changed in size
This commit is contained in:
parent
05fd7d9301
commit
3a9d322574
|
@ -425,6 +425,26 @@ vips_foreign_load_magick7_error( VipsForeignLoadMagick7 *magick7 )
|
||||||
magick7->exception->description );
|
magick7->exception->description );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
magick7_get_bands( Image *image )
|
||||||
|
{
|
||||||
|
int bands;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* We skip all index channels. Lots of images can have these, it's not
|
||||||
|
* just the palette ones.
|
||||||
|
*/
|
||||||
|
bands = 0;
|
||||||
|
for( i = 0; i < GetPixelChannels( image ); i++ ) {
|
||||||
|
PixelChannel channel = GetPixelChannelChannel( image, i );
|
||||||
|
|
||||||
|
if( channel != IndexPixelChannel )
|
||||||
|
bands += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( bands );
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
|
vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
|
||||||
Image *image, VipsImage *out )
|
Image *image, VipsImage *out )
|
||||||
|
@ -432,7 +452,7 @@ vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
|
||||||
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( magick7 );
|
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( magick7 );
|
||||||
|
|
||||||
const char *key;
|
const char *key;
|
||||||
int i;
|
Image *p;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf( "image->depth = %zd\n", image->depth );
|
printf( "image->depth = %zd\n", image->depth );
|
||||||
|
@ -448,17 +468,7 @@ vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
|
||||||
out->Xsize = image->columns;
|
out->Xsize = image->columns;
|
||||||
out->Ysize = image->rows;
|
out->Ysize = image->rows;
|
||||||
magick7->frame_height = image->rows;
|
magick7->frame_height = image->rows;
|
||||||
|
out->Bands = magick7_get_bands( image );
|
||||||
/* We skip all index channels. Lots of images can have these, it's not
|
|
||||||
* just the palette ones.
|
|
||||||
*/
|
|
||||||
out->Bands = 0;
|
|
||||||
for( i = 0; i < GetPixelChannels( image ); i++ ) {
|
|
||||||
PixelChannel channel = GetPixelChannelChannel( image, i );
|
|
||||||
|
|
||||||
if( channel != IndexPixelChannel )
|
|
||||||
out->Bands += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Depth can be 'fractional'. You'd think we should use
|
/* Depth can be 'fractional'. You'd think we should use
|
||||||
* GetImageDepth() but that seems to compute something very complex.
|
* GetImageDepth() but that seems to compute something very complex.
|
||||||
|
@ -556,21 +566,46 @@ vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
|
||||||
vips_image_set_string( out, vips_buf_all( &name ), value );
|
vips_image_set_string( out, vips_buf_all( &name ), value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
magick7->n_pages = GetImageListLength( GetFirstImageInList( image ) );
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf( "image has %d pages\n", magick7->n_pages );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
/* Do we have a set of equal-sized frames? Append them.
|
/* Do we have a set of equal-sized frames? Append them.
|
||||||
|
|
||||||
FIXME ... there must be an attribute somewhere from dicom read
|
FIXME ... there must be an attribute somewhere from dicom read
|
||||||
which says this is a volumetric image
|
which says this is a volumetric image
|
||||||
|
|
||||||
*/
|
*/
|
||||||
magick7->n_pages = GetImageListLength( GetFirstImageInList( image ) );
|
magick7->n_frames = 0;
|
||||||
|
for( p = image; p; (p = GetNextImageInList( p )) ) {
|
||||||
|
if( p->columns != (unsigned int) out->Xsize ||
|
||||||
|
p->rows != (unsigned int) out->Ysize ||
|
||||||
|
magick7_get_bands( p ) != out->Bands ) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf( "image has %d pages\n", magick7->n_pages );
|
printf( "frame %d differs\n", magick7->n_frames );
|
||||||
|
printf( "%zdx%zd, %d bands\n",
|
||||||
|
p->columns, p->rows, magick7_get_bands( p ) );
|
||||||
|
printf( "first frame is %dx%d, %d bands\n",
|
||||||
|
out->Xsize, out->Ysize, out->Bands );
|
||||||
#endif /*DEBUG*/
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
magick7->n_frames = magick7->n != -1 ?
|
break;
|
||||||
VIPS_MIN( magick7->n_pages, magick7->n ) :
|
}
|
||||||
magick7->n_pages;
|
|
||||||
|
magick7->n_frames += 1;
|
||||||
|
}
|
||||||
|
if( p )
|
||||||
|
/* Nope ... just do the first image in the list.
|
||||||
|
*/
|
||||||
|
magick7->n_frames = 1;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf( "will read %d frames\n", magick7->n_frames );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
|
if( magick7->n != -1 )
|
||||||
|
magick7->n_frames = VIPS_MIN( magick7->n_frames, magick7->n );
|
||||||
|
|
||||||
/* So we can finally set the height.
|
/* So we can finally set the height.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue