"vips im_avg poop.png" now works, amazing. Test a few more things before
we merge back to master.
This commit is contained in:
John Cupitt 2011-03-07 15:52:53 +00:00
parent 53f4eb7811
commit fd26b098b7
11 changed files with 94 additions and 30 deletions

33
TODO
View File

@ -18,6 +18,39 @@
- remove im__handle_eval etc. from headers - remove im__handle_eval etc. from headers
- png read/write needs redoing:
http://www.libpng.org/pub/png/src/libpng-1.4.x-to-1.5.x-summary.txt
... the ability to directly access
the main libpng control structures, png_struct and png_info, deprecated
in earlier versions of libpng, has been completely removed from
libpng 1.5.
argh
- sink.c, sinkdisc.c, sinkmemory.c all define this function:
static int
sink_progress( void *a )
{
Sink *sink = (Sink *) a;
VIPS_DEBUG_MSG( "sink_progress: %d x %d\n",
sink->tile_width, sink->tile_height );
/* Trigger any eval callbacks on our source image and
* check for errors.
*/
vips_image_eval( sink->im,
sink->tile_width, sink->tile_height );
if( vips_image_get_kill( im ) )
return( -1 );
return( 0 );
}
how dumb, common this up somehow
- pre/post/close should be on VipsObject, not VipsImage - pre/post/close should be on VipsObject, not VipsImage

View File

@ -248,6 +248,7 @@ void vips_object_set_property( GObject *gobject,
void vips_object_get_property( GObject *gobject, void vips_object_get_property( GObject *gobject,
guint property_id, GValue *value, GParamSpec *pspec ); guint property_id, GValue *value, GParamSpec *pspec );
void vips_object_preclose( VipsObject *object );
int vips_object_build( VipsObject *object ); int vips_object_build( VipsObject *object );
void vips_object_print_class( VipsObjectClass *klass ); void vips_object_print_class( VipsObjectClass *klass );
void vips_object_print( VipsObject *object ); void vips_object_print( VipsObject *object );

View File

@ -155,10 +155,10 @@ extern "C" {
#define im_image vips_image_new_from_memory #define im_image vips_image_new_from_memory
#define im_binfile vips_image_new_from_file_raw #define im_binfile vips_image_new_from_file_raw
#define im__open_temp vips_image_new_disc_temp #define im__open_temp vips_image_new_disc_temp
#define im__test_kill( I ) (!vips_image_get_kill( I )) #define im__test_kill( I ) (vips_image_get_kill( I ))
#define im__start_eval( I ) (vips_image_preeval( I ), !vips_image_get_kill( I )) #define im__start_eval( I ) (vips_image_preeval( I ), vips_image_get_kill( I ))
#define im__handle_eval( I, W, H ) \ #define im__handle_eval( I, W, H ) \
(vips_image_eval( I, W, H ), !vips_image_get_kill( I )) (vips_image_eval( I, W, H ), vips_image_get_kill( I ))
#define im__end_eval vips_image_posteval #define im__end_eval vips_image_posteval
#define im_invalidate vips_image_invalidate_all #define im_invalidate vips_image_invalidate_all
#define im_isfile vips_image_isfile #define im_isfile vips_image_isfile

View File

@ -422,6 +422,8 @@ vips_image_dispose( GObject *gobject )
vips_object_print( VIPS_OBJECT( gobject ) ); vips_object_print( VIPS_OBJECT( gobject ) );
#endif /*VIPS_DEBUG*/ #endif /*VIPS_DEBUG*/
vips_object_preclose( VIPS_OBJECT( gobject ) );
G_OBJECT_CLASS( vips_image_parent_class )->dispose( gobject ); G_OBJECT_CLASS( vips_image_parent_class )->dispose( gobject );
} }
@ -479,6 +481,8 @@ lazy_new( VipsImage *image,
{ {
Lazy *lazy; Lazy *lazy;
VIPS_DEBUG_MSG( "lazy_new: \"%s\"\n", filename );
if( !(lazy = VIPS_NEW( image, Lazy )) ) if( !(lazy = VIPS_NEW( image, Lazy )) )
return( NULL ); return( NULL );
lazy->image = image; lazy->image = image;
@ -827,6 +831,11 @@ vips_image_build( VipsObject *object )
} }
} }
else { else {
/* Make this a partial, generate into it from the
* converter.
*/
image->dtype = VIPS_IMAGE_PARTIAL;
if( vips_image_open_lazy( image, format, if( vips_image_open_lazy( image, format,
filename, mode[1] == 'd' ) ) filename, mode[1] == 'd' ) )
return( -1 ); return( -1 );
@ -970,6 +979,9 @@ vips_image_class_init( VipsImageClass *class )
gobject_class->set_property = vips_object_set_property; gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property; gobject_class->get_property = vips_object_get_property;
vobject_class->nickname = "image";
vobject_class->description = _( "VIPS image class" );
vobject_class->print = vips_image_print; vobject_class->print = vips_image_print;
vobject_class->build = vips_image_build; vobject_class->build = vips_image_build;
@ -1342,8 +1354,8 @@ vips_image_get_kill( VipsImage *image )
void void
vips_image_set_kill( VipsImage *image, gboolean kill ) vips_image_set_kill( VipsImage *image, gboolean kill )
{ {
VIPS_DEBUG_MSG( "vips_image_set_kill: %s = %d\n", if( !image->kill )
image->filename, kill ); VIPS_DEBUG_MSG( "vips_image_set_kill: %s\n", image->filename );
image->kill = kill; image->kill = kill;
} }

View File

@ -30,8 +30,10 @@
*/ */
/* /*
#define DEBUG
*/ */
#define DEBUG
#define VIPS_DEBUG
#define DEBUG_REF
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
@ -73,7 +75,7 @@ static guint vips_object_signals[SIG_LAST] = { 0 };
G_DEFINE_ABSTRACT_TYPE( VipsObject, vips_object, G_TYPE_OBJECT ); G_DEFINE_ABSTRACT_TYPE( VipsObject, vips_object, G_TYPE_OBJECT );
static void void
vips_object_preclose( VipsObject *object ) vips_object_preclose( VipsObject *object )
{ {
if( !object->preclose ) { if( !object->preclose ) {
@ -152,7 +154,7 @@ vips_object_print( VipsObject *object )
vips_object_print_class( class ); vips_object_print_class( class );
vips_buf_init_static( &buf, str, 1000 ); vips_buf_init_static( &buf, str, 1000 );
class->print( object, &buf ); class->print( object, &buf );
printf( "\n%s (%p)\n", vips_buf_all( &buf ), object ); printf( "%s\n", vips_buf_all( &buf ) );
} }
/* Extra stuff we track for properties to do our argument handling. /* Extra stuff we track for properties to do our argument handling.
@ -394,9 +396,14 @@ vips_object_dispose( GObject *gobject )
/* Our subclasses should have already called this. Run it again, just /* Our subclasses should have already called this. Run it again, just
* in case. * in case.
*/ */
if( !object->preclose ) if( !object->preclose ) {
#ifdef VIPS_DEBUG
printf( "vips_object_dispose: no vips_object_preclose()\n" ); printf( "vips_object_dispose: no vips_object_preclose()\n" );
vips_object_preclose( object ); vips_object_print( VIPS_OBJECT( gobject ) );
#endif /*VIPS_DEBUG*/
vips_object_preclose( object );
}
/* Clear all our arguments: they may be holding refs we should drop. /* Clear all our arguments: they may be holding refs we should drop.
*/ */

View File

@ -274,6 +274,8 @@ vips_region_dispose( GObject *gobject )
vips_object_print( VIPS_OBJECT( gobject ) ); vips_object_print( VIPS_OBJECT( gobject ) );
#endif /*VIPS_DEBUG*/ #endif /*VIPS_DEBUG*/
vips_object_preclose( VIPS_OBJECT( gobject ) );
/* Stop this sequence. /* Stop this sequence.
*/ */
vips__region_stop( region ); vips__region_stop( region );

View File

@ -290,11 +290,14 @@ sink_progress( void *a )
{ {
Sink *sink = (Sink *) a; Sink *sink = (Sink *) a;
VIPS_DEBUG_MSG( "sink_progress: %d x %d\n",
sink->tile_width, sink->tile_height );
/* Trigger any eval callbacks on our source image and /* Trigger any eval callbacks on our source image and
* check for errors. * check for errors.
*/ */
if( im__handle_eval( sink->im, vips_image_eval( sink->im, sink->tile_width, sink->tile_height );
sink->tile_width, sink->tile_height ) ) if( vips_image_get_kill( sink->im ) )
return( -1 ); return( -1 );
return( 0 ); return( 0 );
@ -350,10 +353,7 @@ vips_sink_tile( VipsImage *im,
sink.tile_height = tile_height; sink.tile_height = tile_height;
} }
if( im__start_eval( sink.t ) ) { vips_image_preeval( sink.t );
sink_free( &sink );
return( -1 );
}
result = vips_threadpool_run( im, result = vips_threadpool_run( im,
sink_thread_state_new, sink_thread_state_new,
@ -362,7 +362,7 @@ vips_sink_tile( VipsImage *im,
sink_progress, sink_progress,
&sink ); &sink );
im__end_eval( sink.t ); vips_image_posteval( sink.t );
sink_free( &sink ); sink_free( &sink );

View File

@ -440,8 +440,8 @@ wbuffer_progress_fn( void *a )
/* Trigger any eval callbacks on our source image and /* Trigger any eval callbacks on our source image and
* check for errors. * check for errors.
*/ */
if( im__handle_eval( write->im, vips_image_eval( write->im, write->tile_width, write->tile_height );
write->tile_width, write->tile_height ) ) if( vips_image_get_kill( write->im ) )
return( -1 ); return( -1 );
return( 0 ); return( 0 );
@ -510,8 +510,7 @@ vips_sink_disc( VipsImage *im, VipsRegionWrite write_fn, void *a )
Write write; Write write;
int result; int result;
if( im__start_eval( im ) ) vips_image_preeval( im );
return( -1 );
write_init( &write, im, write_fn, a ); write_init( &write, im, write_fn, a );
@ -541,7 +540,7 @@ vips_sink_disc( VipsImage *im, VipsRegionWrite write_fn, void *a )
if( !result ) if( !result )
im_semaphore_down( &write.buf->done ); im_semaphore_down( &write.buf->done );
im__end_eval( im ); vips_image_posteval( im );
write_free( &write ); write_free( &write );

View File

@ -166,8 +166,8 @@ sink_progress( void *a )
/* Trigger any eval callbacks on our source image and /* Trigger any eval callbacks on our source image and
* check for errors. * check for errors.
*/ */
if( im__handle_eval( sink->im, vips_image_eval( sink->im, sink->tile_width, sink->tile_height );
sink->tile_width, sink->tile_height ) ) if( vips_image_get_kill( sink->im ) )
return( -1 ); return( -1 );
return( 0 ); return( 0 );
@ -200,10 +200,7 @@ vips_sink_memory( VipsImage *im )
if( sink_init( &sink, im ) ) if( sink_init( &sink, im ) )
return( -1 ); return( -1 );
if( im__start_eval( im ) ) { vips_image_preeval( im );
sink_free( &sink );
return( -1 );
}
result = vips_threadpool_run( im, result = vips_threadpool_run( im,
vips_thread_state_new, vips_thread_state_new,
@ -212,7 +209,7 @@ vips_sink_memory( VipsImage *im )
sink_progress, sink_progress,
&sink ); &sink );
im__end_eval( im ); vips_image_posteval( im );
sink_free( &sink ); sink_free( &sink );

View File

@ -91,7 +91,8 @@ typedef struct {
static void static void
im_add_callback_cb( VipsImage *im, Callback *callback ) im_add_callback_cb( VipsImage *im, Callback *callback )
{ {
callback->fn( callback->a, callback->b ); if( callback->fn( callback->a, callback->b ) )
vips_image_set_kill( im, TRUE );
} }
int int

View File

@ -65,6 +65,7 @@
/* /*
#define DEBUG_FATAL #define DEBUG_FATAL
#define DEBUG_LEAK
*/ */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
@ -78,6 +79,7 @@
#include <locale.h> #include <locale.h>
#include <vips/vips.h> #include <vips/vips.h>
#include <vips/internal.h>
#ifdef OS_WIN32 #ifdef OS_WIN32
#define strcasecmp(a,b) _stricmp(a,b) #define strcasecmp(a,b) _stricmp(a,b)
@ -919,6 +921,10 @@ main( int argc, char **argv )
fprintf( stderr, "*** DEBUG_FATAL: will abort() on first warning\n" ); fprintf( stderr, "*** DEBUG_FATAL: will abort() on first warning\n" );
#endif /*!DEBUG_FATAL*/ #endif /*!DEBUG_FATAL*/
#ifdef DEBUG_LEAK
fprintf( stderr, "*** DEBUG_LEAK: will leak test on exit\n" );
#endif /*!DEBUG_LEAK*/
context = g_option_context_new( _( "- VIPS driver program" ) ); context = g_option_context_new( _( "- VIPS driver program" ) );
g_option_context_add_main_entries( context, g_option_context_add_main_entries( context,
@ -1020,5 +1026,11 @@ main( int argc, char **argv )
im_close_plugins(); im_close_plugins();
#ifdef DEBUG_LEAK
printf( "** leak test on exit:\n" );
im__print_all();
printf( "** leak test done\n" );
#endif /*DEBUG_LEAK*/
return( 0 ); return( 0 );
} }