diff --git a/TODO b/TODO index 82fbfc18..ccbc0538 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,10 @@ +- try + + $ vips add babe.jpg babe2.jpg out.v + + VIPS:ERROR:object.c:815:vips_object_real_build: assertion failed: + (!object->constructed) + - also VipsFormat ... could this replace vips_image_new_from_string()? or diff --git a/libvips/conversion/im_copy.c b/libvips/conversion/im_copy.c index 6ea8f4b8..21c2c634 100644 --- a/libvips/conversion/im_copy.c +++ b/libvips/conversion/im_copy.c @@ -114,7 +114,7 @@ static int im_copy_set_all( IMAGE *in, IMAGE *out, VipsType type, float xres, float yres, int xoffset, int yoffset, int bands, VipsBandFmt bandfmt, VipsCoding coding ) -{ +{ /* Check args. */ if( im_check_coding_known( "im_copy", in ) || @@ -162,25 +162,6 @@ im_copy_set_all( IMAGE *in, IMAGE *out, return( 0 ); } -/** - * im_copy: - * @in: input image - * @out: output image - * - * Copy an image. VIPS copies images by copying pointers, so this operation is - * fast, even for very large images. - * - * See also: im_copy(), im_copy_set(), im_copy_morph(). - * - * Returns: 0 on success, -1 on error. - */ -int -im_copy( IMAGE *in, IMAGE *out ) -{ - return( im_copy_set( in, out, - in->Type, in->Xres, in->Yres, 0, 0 ) ); -} - /** * im_copy_set: * @in: input image @@ -234,6 +215,25 @@ im_copy_morph( IMAGE *in, IMAGE *out, bands, bandfmt, coding ) ); } +/** + * im_copy: + * @in: input image + * @out: output image + * + * Copy an image. VIPS copies images by copying pointers, so this operation is + * fast, even for very large images. + * + * See also: im_copy(), im_copy_set(), im_copy_morph(). + * + * Returns: 0 on success, -1 on error. + */ +int +im_copy( IMAGE *in, IMAGE *out ) +{ + return( im_copy_set( in, out, + in->Type, in->Xres, in->Yres, 0, 0 ) ); +} + /** * im_copy_set_meta: * @in: input image diff --git a/libvips/deprecated/package.c b/libvips/deprecated/package.c index 697b9b00..b63bc620 100644 --- a/libvips/deprecated/package.c +++ b/libvips/deprecated/package.c @@ -974,14 +974,6 @@ build_args( im_function *fn, im_object *vargv, int argc, char **argv ) return( 0 ); } -/* Free a region, but return 0 so we can be used as a close callback. - */ -static void -region_local_image_cb( VipsImage *main, VipsRegion *reg ) -{ - g_object_unref( reg ); -} - /* Make a region on sub, closed by callback on main. */ static int @@ -991,8 +983,7 @@ region_local_image( IMAGE *main, IMAGE *sub ) if( !(reg = vips_region_new( sub )) ) return( -1 ); - g_signal_connect( main, "close", - G_CALLBACK( region_local_image_cb ), reg ); + vips_object_local( main, reg ); return( 0 ); } diff --git a/libvips/deprecated/vips7compat.c b/libvips/deprecated/vips7compat.c index ff2f080f..33e52cb7 100644 --- a/libvips/deprecated/vips7compat.c +++ b/libvips/deprecated/vips7compat.c @@ -815,7 +815,13 @@ im_add( IMAGE *in1, IMAGE *in2, IMAGE *out ) g_object_unref( x ); return( -1 ); } - g_object_unref( x ); + + /* When im_copy() is vips8'd it'll make a ref to in which will be + * junked when the copy shuts down and we can unref x directly. + * + * Until then, we have to use the "close" signal to delay the unref. + */ + vips_object_local( out, x ); return( 0 ); } diff --git a/libvips/format/fits.c b/libvips/format/fits.c index 914f2dec..e5cd292d 100644 --- a/libvips/format/fits.c +++ b/libvips/format/fits.c @@ -146,6 +146,12 @@ vips_fits_close( VipsFits *fits ) VIPS_FREE( fits->buffer ); } +static void +vips_fits_close_cb( VipsImage *image, VipsFits *fits ) +{ + vips_fits_close( fits ); +} + static VipsFits * vips_fits_new_read( const char *filename, VipsImage *out, int band_select ) { @@ -162,7 +168,7 @@ vips_fits_new_read( const char *filename, VipsImage *out, int band_select ) fits->band_select = band_select; fits->buffer = NULL; g_signal_connect( out, "close", - G_CALLBACK( vips_fits_close ), fits ); + G_CALLBACK( vips_fits_close_cb ), fits ); status = 0; if( fits_open_file( &fits->fptr, filename, READONLY, &status ) ) { @@ -444,7 +450,7 @@ fits2vips( const char *filename, VipsImage *out, int band_select ) return( -1 ); } - /* Don't vips_fits_close(), we need it to stcik around for the + /* Don't vips_fits_close(), we need it to stick around for the * generate. */ @@ -605,7 +611,7 @@ vips_fits_new_write( VipsImage *in, const char *filename ) fits->band_select = -1; fits->buffer = NULL; g_signal_connect( in, "close", - G_CALLBACK( vips_fits_close ), fits ); + G_CALLBACK( vips_fits_close_cb ), fits ); if( !(fits->filename = im_strdup( NULL, filename )) ) return( NULL ); diff --git a/libvips/iofuncs/generate.c b/libvips/iofuncs/generate.c index 31b27fd4..7d00b3ac 100644 --- a/libvips/iofuncs/generate.c +++ b/libvips/iofuncs/generate.c @@ -79,7 +79,7 @@ */ /* -#define DEBUG_IO +#define VIPS_DEBUG */ #ifdef HAVE_CONFIG_H @@ -605,6 +605,7 @@ vips_image_generate( VipsImage *image, VIPS_DEBUG_MSG( "vips_image_generate: %p\n", image ); + g_assert( generate ); g_assert( vips_object_sanity( VIPS_OBJECT( image ) ) ); if( !image->hint_set ) { diff --git a/libvips/iofuncs/image.c b/libvips/iofuncs/image.c index a4bea8a9..feb67572 100644 --- a/libvips/iofuncs/image.c +++ b/libvips/iofuncs/image.c @@ -1226,6 +1226,8 @@ vips_image_class_init( VipsImageClass *class ) static void vips_image_init( VipsImage *image ) { + VIPS_DEBUG_MSG( "vips_image_init: %p\n", image ); + /* Default to native order. */ image->magic = vips_amiMSBfirst() ? VIPS_MAGIC_SPARC : VIPS_MAGIC_INTEL; @@ -1412,8 +1414,8 @@ void vips_image_set_progress( VipsImage *image, gboolean progress ) { if( progress && !image->progress_signal ) { - VIPS_DEBUG_MSG( "vips_image_set_progress: %s\n", - image->filename ); + VIPS_DEBUG_MSG( "vips_image_set_progress: %p %s\n", + image, image->filename ); image->progress_signal = image; } else diff --git a/libvips/iofuncs/object.c b/libvips/iofuncs/object.c index 9823ff99..72d69274 100644 --- a/libvips/iofuncs/object.c +++ b/libvips/iofuncs/object.c @@ -179,6 +179,8 @@ vips_object_sanity( VipsObject *object ) printf( "sanity failure: " ); vips_object_print_name( object ); printf( " %s\n", vips_buf_all( &buf ) ); + + return( FALSE ); } return( TRUE ); diff --git a/libvips/iofuncs/region.c b/libvips/iofuncs/region.c index 0eb144b4..2584b971 100644 --- a/libvips/iofuncs/region.c +++ b/libvips/iofuncs/region.c @@ -205,8 +205,6 @@ vips__region_start( VipsRegion *region ) { VipsImage *image = region->im; - /* Have we a sequence running on this region? Start one if not. - */ if( !region->seq && image->start ) { g_mutex_lock( image->sslock ); region->seq = @@ -231,8 +229,6 @@ vips__region_stop( VipsRegion *region ) { IMAGE *image = region->im; - /* Stop any running sequence. - */ if( region->seq && image->stop ) { int result; @@ -318,6 +314,28 @@ vips_region_print( VipsObject *object, VipsBuf *buf ) VIPS_OBJECT_CLASS( vips_region_parent_class )->print( object, buf ); } +static void +vips_region_sanity( VipsObject *object, VipsBuf *buf ) +{ + VipsRegion *region = VIPS_REGION( object ); + + vips_object_sanity( VIPS_OBJECT( region->im ) ); + + switch( region->im->dtype ) { + case VIPS_IMAGE_PARTIAL: + /* Start and stop can be NULL, but not generate. + */ + if( !region->im->generate ) + vips_buf_appends( buf, "generate NULL in partial\n" ); + break; + + default: + break; + } + + VIPS_OBJECT_CLASS( vips_region_parent_class )->sanity( object, buf ); +} + /* If a region is being created in one thread (eg. the main thread) and then * used in another (eg. a worker thread), the new thread needs to tell VIPS * to stop sanity g_assert() fails. The previous owner needs to @@ -407,6 +425,7 @@ vips_region_class_init( VipsRegionClass *class ) gobject_class->dispose = vips_region_dispose; vobject_class->print = vips_region_print; + vobject_class->print = vips_region_sanity; vobject_class->build = vips_region_build; } @@ -442,6 +461,11 @@ vips_region_new( VipsImage *image ) return( NULL ); } +#ifdef DEBUG +#endif /*DEBUG*/ + g_assert( vips_object_sanity( VIPS_OBJECT( image ) ) ); + g_assert( vips_object_sanity( VIPS_OBJECT( region ) ) ); + return( region ); } diff --git a/libvips/iofuncs/sink.c b/libvips/iofuncs/sink.c index 1a0bf5fb..0106d8e8 100644 --- a/libvips/iofuncs/sink.c +++ b/libvips/iofuncs/sink.c @@ -218,6 +218,8 @@ sink_init( Sink *sink, VipsStartFn start, VipsGenerateFn generate, VipsStopFn stop, void *a, void *b ) { + g_assert( generate ); + vips_sink_base_init( &sink->sink_base, image ); sink->t = NULL;