From 82dbdedd6e64e965de6fdd98fbedf85fc19df773 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Thu, 24 Mar 2011 14:28:35 +0000 Subject: [PATCH] better vips7 progress compat make progress info on both the image being generated and the image we signal on --- libvips/iofuncs/image.c | 44 ++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/libvips/iofuncs/image.c b/libvips/iofuncs/image.c index 02fec7d2..b2c1a654 100644 --- a/libvips/iofuncs/image.c +++ b/libvips/iofuncs/image.c @@ -1323,6 +1323,24 @@ vips_progress_add( VipsImage *image ) return( 0 ); } +void +vips_progress_update( VipsProgress *progress, int w, int h ) +{ + float prop; + + g_assert( progress ); + + progress->run = g_timer_elapsed( progress->start, NULL ); + progress->npels += w * h; + prop = (float) progress->npels / (float) progress->tpels; + progress->percent = 100 * prop; + + /* Don't estiomate eta until we are 10% in. + */ + if( prop > 0.1 ) + progress->eta = (1.0 / prop) * progress->run - progress->run; +} + void vips_image_preeval( VipsImage *image ) { @@ -1332,6 +1350,12 @@ vips_image_preeval( VipsImage *image ) g_assert( vips_object_sanity( VIPS_OBJECT( image->progress_signal ) ) ); + (void) vips_progress_add( image ); + + /* For vips7 compat, we also have to make sure ->time on the + * image that was originally marked with + * vips_image_set_progress() is valid. + */ (void) vips_progress_add( image->progress_signal ); g_signal_emit( image->progress_signal, @@ -1346,25 +1370,21 @@ void vips_image_eval( VipsImage *image, int w, int h ) { if( image->progress_signal ) { - VipsProgress *progress = image->progress_signal->time; - float prop; - VIPS_DEBUG_MSG( "vips_image_eval: %p\n", image ); - g_assert( progress ); g_assert( vips_object_sanity( VIPS_OBJECT( image->progress_signal ) ) ); - progress->run = g_timer_elapsed( progress->start, NULL ); - progress->npels += w * h; - prop = (float) progress->npels / (float) progress->tpels; - progress->percent = 100 * prop; - if( prop > 0.1 ) - progress->eta = (1.0 / prop) * progress->run - - progress->run; + vips_progress_update( image->time, w, h ); + + /* For vips7 compat, update the ->time on the signalling image + * too, even though it may have a different width/height to + * the image we are actually generating. + */ + vips_progress_update( image->progress_signal->time, w, h ); g_signal_emit( image->progress_signal, - vips_image_signals[SIG_EVAL], 0, progress ); + vips_image_signals[SIG_EVAL], 0, image->time ); } }