From be134f4b82a048faad4c750cf4af80d141ff2c73 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Tue, 1 Mar 2011 22:07:48 +0000 Subject: [PATCH] remove setbuf ... and start on sink*(). --- libvips/iofuncs/Makefile.am | 1 - libvips/iofuncs/im_cp_desc.c | 11 +---- libvips/iofuncs/im_demand_hint.c | 38 +++++++++++----- libvips/iofuncs/im_setbuf.c | 74 -------------------------------- libvips/iofuncs/im_setupout.c | 22 +++++----- libvips/iofuncs/sinkmemory.c | 2 +- libvips/iofuncs/sinkscreen.c | 44 ++++++++----------- 7 files changed, 59 insertions(+), 133 deletions(-) delete mode 100644 libvips/iofuncs/im_setbuf.c diff --git a/libvips/iofuncs/Makefile.am b/libvips/iofuncs/Makefile.am index 9b741b32..ce759ea4 100644 --- a/libvips/iofuncs/Makefile.am +++ b/libvips/iofuncs/Makefile.am @@ -17,7 +17,6 @@ libiofuncs_la_SOURCES = \ im_histlin.c \ im_mapfile.c \ im_prepare.c \ - im_setbuf.c \ im_setupout.c \ im_guess_prefix.c \ sinkmemory.c \ diff --git a/libvips/iofuncs/im_cp_desc.c b/libvips/iofuncs/im_cp_desc.c index bed1d0b0..8e69b61d 100644 --- a/libvips/iofuncs/im_cp_desc.c +++ b/libvips/iofuncs/im_cp_desc.c @@ -1,13 +1,4 @@ -/* @(#) Function which copies IMAGE descriptor image2 to image1; - * @(#) data, fd and filename are not copied - * @(#) used to make programs simpler by copying most parameters - * @(#) - * @(#) int - * @(#) im_cp_desc( image1, image2 ) - * @(#) IMAGE *image1, *image2; - * @(#) - * @(#) Returns 0 on success or -1 on fail. - * @(#) +/* copy iamge descriptors * * Copyright: Nicos Dessipris * Written on: 09/02/1990 diff --git a/libvips/iofuncs/im_demand_hint.c b/libvips/iofuncs/im_demand_hint.c index bb6ff76a..b52f8b53 100644 --- a/libvips/iofuncs/im_demand_hint.c +++ b/libvips/iofuncs/im_demand_hint.c @@ -143,6 +143,14 @@ im__link_mapp( IMAGE *im, VSListMap2Fn fn, int *serial, void *a, void *b ) (VSListMap4Fn) im__link_mapp, fn, serial, a, b ) ); } +static void * +im__link_map_cb( VipsImage *image, GSList **images ) +{ + *images = g_slist_prepend( *images, image ); + + return( NULL ); +} + /* Apply a function to an image and all downstream images, direct and indirect. */ void * @@ -150,21 +158,29 @@ im__link_map( IMAGE *im, VSListMap2Fn fn, void *a, void *b ) { static int serial = 0; - /* Invalidate callbacks might do anything, including removing images + GSList *images; + GSList *p; + void *result; + + /* The function might do anything, including removing images * or invalidating other images, so we can't trigger them from within - * the image loop. Instead we collect a list of image to invalidate - * and trigger them all in one go, checking that they are not - * invalidated. + * the image loop. Instead we collect a list of images, ref them, + * run the functions, and unref. */ - /* im__link_mapp() needs to make the list, ref all the images, call - * the callbacks, then unref and free the list. - */ - - FIXME - serial += 1; - return( im__link_mapp( im, fn, &serial, a, b ) ); + images = NULL; + im__link_mapp( im, + (VSListMap2Fn) im__link_map_cb, &serial, &images, NULL ); + + for( p = images; p; p = p->next ) + g_object_ref( p->data ); + result = im_slist_map2( images, fn, a, b ); + for( p = images; p; p = p->next ) + g_object_unref( p->data ); + g_slist_free( images ); + + return( result ); } /* Given two im_demand_type, return the most restrictive. diff --git a/libvips/iofuncs/im_setbuf.c b/libvips/iofuncs/im_setbuf.c deleted file mode 100644 index c71e85f9..00000000 --- a/libvips/iofuncs/im_setbuf.c +++ /dev/null @@ -1,74 +0,0 @@ -/* @(#) im_setbuf: initialise a buffer IMAGE - * @(#) Initialise the data pointer of the image descriptor to an arbitrary - * @(#) non NULL value and copies the file_name onto the filename of the - * @(#) image structure. - * @(#) - * @(#) Right call: - * @(#) IMAGE *im_setbuf(file_name) - * @(#) char *file_name; - * @(#) - * - * Copyright: Nicos Dessipris - * Written on: 13/02/1990 - * Modified on : 25/04/1990 KM, 20/03/1991 ND - * 16/4/93 J.Cupitt - * - support for type field added - */ - -/* - - This file is part of VIPS. - - VIPS is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - */ - -/* - - These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk - - */ - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ -#include - -#include -#include -#include - -#include -#include - -#ifdef WITH_DMALLOC -#include -#endif /*WITH_DMALLOC*/ - -IMAGE * -im_setbuf( const char *file_name ) -{ - IMAGE *im; - - if( !(im = im_init( file_name )) ) - return( NULL ); - im->dtype = IM_SETBUF; - - /* Set demand style. Allow the most permissive sort. - */ - im->dhint = IM_ANY; - - return( im ); -} diff --git a/libvips/iofuncs/im_setupout.c b/libvips/iofuncs/im_setupout.c index 54322d83..2b880c51 100644 --- a/libvips/iofuncs/im_setupout.c +++ b/libvips/iofuncs/im_setupout.c @@ -91,7 +91,7 @@ im_setupout( IMAGE *im ) g_assert( !im_image_sanity( im ) ); if( im->Xsize <= 0 || im->Ysize <= 0 || im->Bands <= 0 ) { - im_error( "im_setupout", + vips_error( "im_setupout", "%s", _( "bad dimensions" ) ); return( -1 ); } @@ -101,7 +101,7 @@ im_setupout( IMAGE *im ) */ im->Bbits = im_bits_of_fmt( im->BandFmt ); - if( im->dtype == IM_PARTIAL ) { + if( im->dtype == VIPS_IMAGE_PARTIAL ) { /* Make it into a im_setbuf() image. */ #ifdef DEBUG_IO @@ -109,33 +109,33 @@ im_setupout( IMAGE *im ) im->filename ); #endif /*DEBUG_IO*/ - im->dtype = IM_SETBUF; + im->dtype = VIPS_IMAGE_SETBUF; } switch( im->dtype ) { - case IM_MMAPINRW: - case IM_SETBUF_FOREIGN: + case VIPS_IMAGE_MMAPINRW: + case VIPS_IMAGE_SETBUF_FOREIGN: /* No action. */ break; - case IM_SETBUF: + case VIPS_IMAGE_SETBUF: /* Allocate memory. */ if( im->data ) { /* Sanity failure! */ - im_error( "im_setupout", + vips_error( "im_setupout", "%s", _( "called twice!" ) ); return( -1 ); } if( !(im->data = im_malloc( NULL, - IM_IMAGE_SIZEOF_LINE( im ) * im->Ysize )) ) + VIPS_IMAGE_SIZEOF_LINE( im ) * im->Ysize )) ) return( -1 ); break; - case IM_OPENOUT: + case VIPS_IMAGE_OPENOUT: { /* Don't use im->sizeof_header here, but we know we're * writing a VIPS image anyway. @@ -143,7 +143,7 @@ im_setupout( IMAGE *im ) unsigned char header[IM_SIZEOF_HEADER]; if( (im->fd = open( im->filename, MODE, 0666 )) < 0 ) { - im_error( "im_setupout", + vips_error( "im_setupout", _( "unable to write to \"%s\"" ), im->filename ); return( -1 ); @@ -156,7 +156,7 @@ im_setupout( IMAGE *im ) } default: - im_error( "im_setupout", + vips_error( "im_setupout", "%s", _( "bad image descriptor" ) ); return( -1 ); } diff --git a/libvips/iofuncs/sinkmemory.c b/libvips/iofuncs/sinkmemory.c index 82028348..d08b16fe 100644 --- a/libvips/iofuncs/sinkmemory.c +++ b/libvips/iofuncs/sinkmemory.c @@ -75,7 +75,7 @@ typedef struct _Sink { static void sink_free( Sink *sink ) { - IM_FREEF( im_region_free, sink->all ); + VIPS_FREEF( im_region_free, sink->all ); } static int diff --git a/libvips/iofuncs/sinkscreen.c b/libvips/iofuncs/sinkscreen.c index f41968c3..7419ae8d 100644 --- a/libvips/iofuncs/sinkscreen.c +++ b/libvips/iofuncs/sinkscreen.c @@ -208,7 +208,7 @@ tile_free( Tile *tile ) { VIPS_DEBUG_MSG_AMBER( "tile_free\n" ); - IM_FREEF( im_region_free, tile->region ); + VIPS_FREEF( im_region_free, tile->region ); im_free( tile ); return( NULL ); @@ -236,10 +236,10 @@ render_free( Render *render ) g_mutex_free( render->lock ); im_slist_map2( render->all, (VSListMap2Fn) tile_free, NULL, NULL ); - IM_FREEF( g_slist_free, render->all ); + VIPS_FREEF( g_slist_free, render->all ); render->ntiles = 0; - IM_FREEF( g_slist_free, render->dirty ); - IM_FREEF( g_hash_table_destroy, render->tiles ); + VIPS_FREEF( g_slist_free, render->dirty ); + VIPS_FREEF( g_hash_table_destroy, render->tiles ); im_free( render ); @@ -536,7 +536,7 @@ render_thread_create( void ) render_thread_main, NULL, IM__DEFAULT_STACK_SIZE, TRUE, FALSE, G_THREAD_PRIORITY_NORMAL, NULL )) ) { - im_error( "im_render", + vips_error( "im_render", "%s", _( "unable to create thread" ) ); return( -1 ); } @@ -594,7 +594,7 @@ render_new( VipsImage *in, VipsImage *out, VipsImage *mask, /* Don't use auto-free for render, we do our own lifetime management * with _ref() and _unref(). */ - if( !(render = IM_NEW( NULL, Render )) ) + if( !(render = VIPS_NEW( NULL, Render )) ) return( NULL ); render->ref_count = 1; @@ -622,19 +622,12 @@ render_new( VipsImage *in, VipsImage *out, VipsImage *mask, /* Both out and mask must close before we can free the render. */ - - if( im_add_close_callback( out, - (im_callback_fn) render_close_cb, render, NULL ) ) { - (void) render_unref( render ); - return( NULL ); - } + g_signal_connect( out, "close", + G_CALLBACK( render_close_cb ), render ); if( mask ) { - if( im_add_close_callback( mask, - (im_callback_fn) render_close_cb, render, NULL ) ) { - (void) render_unref( render ); - return( NULL ); - } + g_signal_connect( mask, "close", + G_CALLBACK( render_close_cb ), render ); render_ref( render ); } @@ -659,7 +652,7 @@ tile_new( Render *render ) /* Don't use auto-free: we need to make sure we free the tile after * Render. */ - if( !(tile = IM_NEW( NULL, Tile )) ) + if( !(tile = VIPS_NEW( NULL, Tile )) ) return( NULL ); tile->render = render; @@ -884,7 +877,7 @@ tile_copy( Tile *tile, REGION *to ) * zero. */ if( tile->painted && !tile->region->invalid ) { - int len = IM_IMAGE_SIZEOF_PEL( to->im ) * ovlap.width; + int len = VIPS_IMAGE_SIZEOF_PEL( to->im ) * ovlap.width; VIPS_DEBUG_MSG( "tile_copy: " "copying calculated pixels for %p %dx%d\n", @@ -1087,24 +1080,25 @@ vips_sink_screen( VipsImage *in, VipsImage *out, VipsImage *mask, if( tile_width <= 0 || tile_height <= 0 || max_tiles < -1 ) { - im_error( "vips_sink_screen", "%s", _( "bad parameters" ) ); + vips_error( "vips_sink_screen", "%s", _( "bad parameters" ) ); return( -1 ); } if( im_piocheck( in, out ) || im_cp_desc( out, in ) || - im_demand_hint( out, IM_SMALLTILE, in, NULL ) ) + im_demand_hint( out, VIPS_DEMAND_STYLE_SMALLTILE, in, NULL ) ) return( -1 ); if( mask ) { if( im_poutcheck( mask ) || im_cp_desc( mask, in ) || - im_demand_hint( mask, IM_SMALLTILE, in, NULL ) ) + im_demand_hint( mask, + VIPS_DEMAND_STYLE_SMALLTILE, in, NULL ) ) return( -1 ); mask->Bands = 1; - mask->BandFmt = IM_BANDFMT_UCHAR; - mask->Type = IM_TYPE_B_W; - mask->Coding = IM_CODING_NONE; + mask->BandFmt = VIPS_FORMAT_UCHAR; + mask->Type = VIPS_INTERPRETATION_B_W; + mask->Coding = VIPS_CODING_NONE; } if( !(render = render_new( in, out, mask,