From affb274d858e47dd94e821465cad3b1a8c2c42e4 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Thu, 23 Jan 2014 13:19:37 +0000 Subject: [PATCH] more auto unpack hacking --- TODO | 52 ++++++++++++++++++++++++++ libvips/arithmetic/hist_find_indexed.c | 2 +- libvips/arithmetic/statistic.c | 21 +++++------ libvips/colour/colour.c | 22 +++-------- libvips/conversion/bandary.c | 12 +++--- libvips/conversion/cast.c | 23 +++++++----- libvips/conversion/falsecolour.c | 10 ++--- 7 files changed, 93 insertions(+), 49 deletions(-) diff --git a/TODO b/TODO index d2bf16ed..733fbad8 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,55 @@ +- try: + + $ vips falsecolour k2.jpg x.jpg + vips warning: VipsJpeg: read gave 896 warnings + vips warning: VipsJpeg: Application transferred too many scanlines + + seems to read twice? + + problem in 7.38 too + +- check_uncoded() left to do: + + conversion/falsecolour.c + conversion/flatten.c + conversion/recomb.c + convolution/sharpen.c + deprecated/im_gradcor.c + deprecated/im_lab_morph.c + deprecated/im_maxpos_avg.c + deprecated/im_measure.c + deprecated/im_vips2mask.c + deprecated/im_zerox.c + deprecated/rename.c + deprecated/tone.c + deprecated/vips7compat.c + foreign/csv.c + foreign/ppm.c + freqfilt/fwfft.c + freqfilt/invfft.c + histogram/hist_local.c + histogram/histogram.c + histogram/hist_plot.c + histogram/maplut.c + histogram/stdif.c + inplace/flood.c + inplace/im_draw_mask.c + inplace/inplace_dispatch.c + iofuncs/error.c + morphology/hitmiss.c + resample/quadratic.c + +- we vips_image_write() a lot, could we do this by + + int + vips_image_write( in, out ) + { + g_object_ref( in) + vips_object_local( out,in ) + } + + i.e. do everything at pipe build time + - inplace can we set a region for the pixels we will modify? diff --git a/libvips/arithmetic/hist_find_indexed.c b/libvips/arithmetic/hist_find_indexed.c index e2632a42..17612e83 100644 --- a/libvips/arithmetic/hist_find_indexed.c +++ b/libvips/arithmetic/hist_find_indexed.c @@ -130,7 +130,7 @@ vips_hist_find_indexed_build( VipsObject *object ) VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object ); VipsStatistic *statistic = VIPS_STATISTIC( object ); VipsHistFindIndexed *indexed = (VipsHistFindIndexed *) object; - VipsImage **t = (VipsImage **) vips_object_local_array( object, 1 ); + VipsImage **t = (VipsImage **) vips_object_local_array( object, 2 ); g_object_set( object, "out", vips_image_new(), diff --git a/libvips/arithmetic/statistic.c b/libvips/arithmetic/statistic.c index fc340984..1ab1cc2f 100644 --- a/libvips/arithmetic/statistic.c +++ b/libvips/arithmetic/statistic.c @@ -50,6 +50,7 @@ #include #include +#include #include "statistic.h" @@ -109,9 +110,7 @@ vips_statistic_build( VipsObject *object ) { VipsStatistic *statistic = VIPS_STATISTIC( object ); VipsStatisticClass *sclass = VIPS_STATISTIC_GET_CLASS( statistic ); - VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object ); - const char *domain = class->nickname; - VipsImage **t = (VipsImage **) vips_object_local_array( object, 1 ); + VipsImage **t = (VipsImage **) vips_object_local_array( object, 2 ); #ifdef DEBUG printf( "vips_statistic_build: " ); @@ -122,20 +121,20 @@ vips_statistic_build( VipsObject *object ) if( VIPS_OBJECT_CLASS( vips_statistic_parent_class )->build( object ) ) return( -1 ); + statistic->ready = statistic->in; + + if( vips__image_decode( statistic->ready, &t[0] ) ) + return( -1 ); + statistic->ready = t[0]; + /* If there's a format table, cast the input. */ if( sclass->format_table ) { - if( vips_cast( statistic->in, &t[0], + if( vips_cast( statistic->ready, &t[1], sclass->format_table[statistic->in->BandFmt], NULL ) ) return( -1 ); - statistic->ready = t[0]; + statistic->ready = t[1]; } - else - statistic->ready = statistic->in; - - if( vips_image_pio_input( statistic->ready ) || - vips_check_uncoded( domain, statistic->ready ) ) - return( -1 ); if( vips_sink( statistic->ready, vips_statistic_scan_start, diff --git a/libvips/colour/colour.c b/libvips/colour/colour.c index f313851d..3645dc88 100644 --- a/libvips/colour/colour.c +++ b/libvips/colour/colour.c @@ -627,30 +627,18 @@ vips_colour_difference_build( VipsObject *object ) right = difference->right; extra = NULL; - /* Unpack LABQ images, - */ - if( left && - left->Coding == VIPS_CODING_LABQ ) { - if( vips_LabQ2Lab( left, &t[0], NULL ) ) + if( left ) { + if( vips__image_decode( left, &t[0] ) ) return( -1 ); left = t[0]; } - if( right && - right->Coding == VIPS_CODING_LABQ ) { - if( vips_LabQ2Lab( right, &t[1], NULL ) ) + + if( right ) { + if( vips__image_decode( right, &t[1] ) ) return( -1 ); right = t[1]; } - if( left && - vips_check_uncoded( VIPS_OBJECT_CLASS( class )->nickname, - left ) ) - return( -1 ); - if( right && - vips_check_uncoded( VIPS_OBJECT_CLASS( class )->nickname, - right ) ) - return( -1 ); - /* Detach and reattach extra bands, if any. If both left and right * have extra bands, give up. */ diff --git a/libvips/conversion/bandary.c b/libvips/conversion/bandary.c index 194878c4..06ede11a 100644 --- a/libvips/conversion/bandary.c +++ b/libvips/conversion/bandary.c @@ -123,6 +123,7 @@ vips_bandary_build( VipsObject *object ) VipsBandary *bandary = (VipsBandary *) object; int i; + VipsImage **decode; VipsImage **format; VipsImage **size; @@ -139,14 +140,15 @@ vips_bandary_build( VipsObject *object ) "%s", _( "too many input images" ) ); return( -1 ); } - for( i = 0; i < bandary->n; i++ ) - if( vips_image_pio_input( bandary->in[i] ) || - vips_check_uncoded( class->nickname, bandary->in[i] ) ) - return( -1 ); + decode = (VipsImage **) vips_object_local_array( object, bandary->n ); format = (VipsImage **) vips_object_local_array( object, bandary->n ); size = (VipsImage **) vips_object_local_array( object, bandary->n ); - if( vips__formatalike_vec( bandary->in, format, bandary->n ) || + + for( i = 0; i < bandary->n; i++ ) + if( vips__image_decode( bandary->in[i], &decode[i] ) ) + return( -1 ); + if( vips__formatalike_vec( decode, format, bandary->n ) || vips__sizealike_vec( format, size, bandary->n ) ) return( -1 ); bandary->ready = size; diff --git a/libvips/conversion/cast.c b/libvips/conversion/cast.c index 17384521..9a080fdb 100644 --- a/libvips/conversion/cast.c +++ b/libvips/conversion/cast.c @@ -429,36 +429,41 @@ vips_cast_gen( VipsRegion *or, void *vseq, void *a, void *b, static int vips_cast_build( VipsObject *object ) { - VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object ); VipsConversion *conversion = VIPS_CONVERSION( object ); VipsCast *cast = (VipsCast *) object; + VipsImage **t = (VipsImage **) + vips_object_local_array( object, 2 ); + + VipsImage *in; if( VIPS_OBJECT_CLASS( vips_cast_parent_class )->build( object ) ) return( -1 ); + in = cast->in; + /* Trivial case: fall back to copy(). */ - if( cast->in->BandFmt == cast->format ) - return( vips_image_write( cast->in, conversion->out ) ); + if( in->BandFmt == cast->format ) + return( vips_image_write( in, conversion->out ) ); - if( vips_check_uncoded( class->nickname, cast->in ) || - vips_image_pio_input( cast->in ) ) + if( vips__image_decode( in, &t[0] ) ) return( -1 ); + in = t[0]; if( vips_image_pipelinev( conversion->out, - VIPS_DEMAND_STYLE_THINSTRIP, cast->in, NULL ) ) + VIPS_DEMAND_STYLE_THINSTRIP, in, NULL ) ) return( -1 ); conversion->out->BandFmt = cast->format; - g_signal_connect( cast->in, "preeval", + g_signal_connect( in, "preeval", G_CALLBACK( vips_cast_preeval ), cast ); - g_signal_connect( cast->in, "posteval", + g_signal_connect( in, "posteval", G_CALLBACK( vips_cast_posteval ), cast ); if( vips_image_generate( conversion->out, vips_cast_start, vips_cast_gen, vips_cast_stop, - cast->in, cast ) ) + in, cast ) ) return( -1 ); return( 0 ); diff --git a/libvips/conversion/falsecolour.c b/libvips/conversion/falsecolour.c index 697c7125..ff03ae39 100644 --- a/libvips/conversion/falsecolour.c +++ b/libvips/conversion/falsecolour.c @@ -329,10 +329,9 @@ static unsigned char vips_falsecolour_pet[][3] = { static int vips_falsecolour_build( VipsObject *object ) { - VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object ); VipsConversion *conversion = VIPS_CONVERSION( object ); VipsFalsecolour *falsecolour = (VipsFalsecolour *) object; - VipsImage **t = (VipsImage **) vips_object_local_array( object, 4 ); + VipsImage **t = (VipsImage **) vips_object_local_array( object, 5 ); if( VIPS_OBJECT_CLASS( vips_falsecolour_parent_class )-> build( object ) ) @@ -345,10 +344,9 @@ vips_falsecolour_build( VipsObject *object ) /* Force to mono 8-bit. */ - if( vips_check_uncoded( class->nickname, falsecolour->in ) || - vips_extract_band( falsecolour->in, &t[1], 0, NULL ) || - vips_cast( t[1], &t[2], VIPS_FORMAT_UCHAR, NULL ) || - vips_maplut( falsecolour->in, &t[3], t[0], NULL ) || + if( vips_colourspace( falsecolour->in, &t[1], + VIPS_INTERPRETATION_B_W, NULL ) || + vips_maplut( t[1], &t[3], t[0], NULL ) || vips_image_write( t[3], conversion->out ) ) return( -1 );