propogate progress feedback down pipelines

This commit is contained in:
John Cupitt 2007-11-02 19:05:00 +00:00
parent c8825917df
commit 67e7cdc4d6
9 changed files with 40 additions and 12 deletions

View File

@ -4,6 +4,8 @@
- break im_wbuffer() out to a separate API
- use im_wbuffer() to make im_vips2jpeg() compress in the background
- also im_vips2png()
- new system for propogating progress settings down pipelines unbreaks save
feedback in nip2
28/9/07 started 7.13.1
- vips2dj can print RGB images

5
TODO
View File

@ -1,5 +1,6 @@
- wrap API around the double-buffered write stuff and get
jpeg/tiff/png/ppm/etc. all writing double-buffered as well
- im__convert_saveable() is not propogating 'progress' for wtc2.jpg
- done jpeg, png ... make others dbl-buf writes too
- missing libstdc++ in link? what if we configure with no openexr?

View File

@ -326,6 +326,10 @@ typedef struct im__IMAGE {
* efficiently.
*/
GSList *history_list;
/* The IMAGE (if any) we should signal eval progress on.
*/
struct im__IMAGE *progress;
} IMAGE;
/* Only define if IM_ENABLE_DEPRECATED is set.

View File

@ -195,8 +195,7 @@ write_vips( Write *write, int compress, int interlace )
{
IMAGE *in = write->in;
Rect area;
int j, y, i, nb_passes;
int i, nb_passes;
assert( in->BandFmt == IM_BANDFMT_UCHAR );
assert( in->Coding == IM_CODING_NONE );

View File

@ -475,6 +475,11 @@ im__link_make( IMAGE *parent, IMAGE *child )
parent->children = g_slist_prepend( parent->children, child );
child->parents = g_slist_prepend( child->parents, parent );
/* Propogate the progress indicator.
*/
if( !child->progress && parent->progress )
child->progress = parent->progress;
}
/* Break link.

View File

@ -88,11 +88,18 @@ im_add_close_callback( IMAGE *im, int (*fn)(), void *a, void *b )
return( add_callback( im, &im->closefns, fn, a, b ) );
}
/* Add an eval callback to an IMAGE.
/* Add an eval callback to an IMAGE. You must call this after opening the
* image, but before using it as an argument to an operation.
*/
int
im_add_eval_callback( IMAGE *im, int (*fn)(), void *a, void *b )
{
{
/* Mark this image as needing progress feedback. im__link_make()
* propogates this value to our children as we build a pipeline.
* im__handle_eval() looks up the IMAGE it should signal on.
*/
im->progress = im;
return( add_callback( im, &im->evalfns, fn, a, b ) );
}

View File

@ -59,7 +59,7 @@
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>

View File

@ -157,6 +157,8 @@ im_init( const char *filename )
im->history_list = NULL;
im->progress = NULL;
if( !(im->filename = im_strdup( NULL, filename )) ) {
im_close( im );
return( NULL );

View File

@ -99,18 +99,26 @@ update_time( im_time_t *time, int w, int h )
}
/* Handle eval callbacks. w and h are the size of the tile we made this time.
* We signal progress on the ->progress IMAGE, see im_add_eval_callback(). We
* assume there's no geometry change between adding the feedback request and
* evaling the image.
*/
int
im__handle_eval( IMAGE *im, int w, int h )
{
if( im->evalfns ) {
if( !im->time )
if( time_add( im ) )
if( im->progress ) {
if( !im->progress->time ) {
/* So we just check sanity first time around.
*/
im_image_sanity( im->progress );
if( time_add( im->progress ) )
return( -1 );
if( update_time( im->time, w, h ) )
}
if( update_time( im->progress->time, w, h ) )
return( -1 );
if( im__trigger_callbacks( im->evalfns ) )
if( im__trigger_callbacks( im->progress->evalfns ) )
return( -1 );
}