diff --git a/ChangeLog b/ChangeLog index 0ad1b630..cf626f52 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 31/10/07 started 7.13.2 - build cimg on windows fixes +- various include cleanups, updated man pages +- break im_wbuffer() out to a separate API +- use im_wbuffer() to make im_vips2jpeg() compress in the background +- also im_vips2png() 28/9/07 started 7.13.1 - vips2dj can print RGB images diff --git a/include/vips/Makefile.am b/include/vips/Makefile.am index 42edea2e..b2108620 100644 --- a/include/vips/Makefile.am +++ b/include/vips/Makefile.am @@ -8,7 +8,6 @@ pkginclude_HEADERS = \ debug.h \ dispatch.h \ fmask.h \ - history.h \ mosaic.h \ proto.h \ rect.h \ @@ -18,7 +17,6 @@ pkginclude_HEADERS = \ semaphore.h \ threadgroup.h \ thread.h \ - time.h \ util.h \ meta.h \ version.h \ diff --git a/include/vips/history.h b/include/vips/history.h deleted file mode 100644 index 5af9d69b..00000000 --- a/include/vips/history.h +++ /dev/null @@ -1,59 +0,0 @@ -/* @(#) Useful macros for appending one line in the History field of the - * @(#) output image descriptor when a function is called - * @(#) The main program should use im_updatehist() - * @(#) The added line corresponds to the command relevant to the function - * @(#) for instance - * @(#) for the function: im_add(in1, in2, out) the following lines of code can - * @(#) be used to add a line of history in the Hist member - * @(#) of the out image descriptor - * @(#) .... - * @(#) IMAGE *in1, *in2, *out; - * @(#) .... - * @(#) if ( im_add(in1, in2, out) == -1 ) return(-1); - * @(#) if ( IM_ADD(in1, in2, out) == -1 ) return(-1); - * @(#) .... - * @(#) - * @(#) The first function will add the two images in1 and in2, - * @(#) whereas the second call will append - * @(#) at the history descriptor of out the line: - * @(#) add infile outfile # date - * @(#) where infile is in.filename and outfile is out.filename - * @(#) The history line has been prepared in such a way that the first - * @(#) argument is the UNIX command which corresponds to the function - * @(#) As a general rule, all functions in im_funcs directory which - * @(#) have a correponding command in src directory are listed here - * @(#) - * @(#) Since the macros presented in this file correspond to the function - * @(#) im_histlin() the returned value is 0 on success and -1 on error. - * @(#) - */ - -/* - - 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 - - */ - -/* Made obsolete by the function database stuff ... just here in case anyone - * still includes it. - */ diff --git a/include/vips/internal.h b/include/vips/internal.h index cea8d469..0db0c601 100644 --- a/include/vips/internal.h +++ b/include/vips/internal.h @@ -54,6 +54,7 @@ int im__readhist( IMAGE *image ); int im__write_extension_block( IMAGE *im, void *buf, int size ); int im__writehist( IMAGE *image ); int im__handle_eval( IMAGE *im, int w, int h ); +int im__time_destroy( IMAGE *im ); extern int im__read_test; extern int im__mmap_limit; diff --git a/include/vips/region.h b/include/vips/region.h index cdc57f38..eded9db1 100644 --- a/include/vips/region.h +++ b/include/vips/region.h @@ -36,12 +36,12 @@ extern "C" { #endif /*__cplusplus*/ +/* Profiling madness only, who cares about portability. + */ #ifdef TIME_THREAD #include #endif /*TIME_THREAD*/ -#include "rect.h" - /* Per-thread buffer cache. Held in a GPrivate. */ typedef struct im__buffer_cache_t { diff --git a/include/vips/time.h b/include/vips/time.h deleted file mode 100644 index d8827039..00000000 --- a/include/vips/time.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Definitions for time struct. - * - * J.Cupitt, 8/4/93 - */ - -/* - - 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 - - */ - -#ifndef IM_TIME_H -#define IM_TIME_H - -#ifdef __cplusplus -extern "C" { -#endif /*__cplusplus*/ - - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ - -#endif /*IM_TIME_H*/ diff --git a/libsrc/conversion/im_vips2png.c b/libsrc/conversion/im_vips2png.c index 20ee37f4..1e3728c1 100644 --- a/libsrc/conversion/im_vips2png.c +++ b/libsrc/conversion/im_vips2png.c @@ -10,6 +10,8 @@ * - auto convert to sRGB/mono (with optional alpha) for save * 1/5/06 * - from vips_png.c + * 2/11/07 + * - use im_wbuffer() API for BG writes */ /* @@ -166,6 +168,26 @@ write_new( IMAGE *in ) return( write ); } +static int +write_png_block( REGION *region, Rect *area, void *a, void *b ) +{ + Write *write = (Write *) a; + int i; + + /* Catch PNG errors. Yuk. + */ + if( setjmp( write->pPng->jmpbuf ) ) + return( -1 ); + + for( i = 0; i < area->height; i++ ) + write->row_pointer[i] = (png_bytep) + IM_REGION_ADDR( region, 0, area->top + i ); + + png_write_rows( write->pPng, write->row_pointer, area->height ); + + return( 0 ); +} + /* Write a VIPS image to PNG. */ static int @@ -229,22 +251,13 @@ write_vips( Write *write, int compress, int interlace ) /* Write data. */ for( i = 0; i < nb_passes; i++ ) - for( y = 0; y < in->Ysize; y += write->tg->nlines ) { - area.left = 0; - area.top = y; - area.width = in->Xsize; - area.height = IM_MIN( write->tg->nlines, - in->Ysize - y ); + if( im_wbuffer( write->tg, write_png_block, write, NULL ) ) + return( -1 ); - if( im_prepare_thread( write->tg, write->reg, &area ) ) - return( -1 ); - - for( j = 0; j < area.height; j++ ) - write->row_pointer[j] = (png_bytep) - IM_REGION_ADDR( write->reg, 0, y + j ); - png_write_rows( write->pPng, - write->row_pointer, area.height ); - } + /* The setjmp() was held by our background writer: reset it. + */ + if( setjmp( write->pPng->jmpbuf ) ) + return( -1 ); png_write_end( write->pPng, write->pInfo ); diff --git a/libsrc/iofuncs/im_close.c b/libsrc/iofuncs/im_close.c index d7353b8a..9b74834c 100644 --- a/libsrc/iofuncs/im_close.c +++ b/libsrc/iofuncs/im_close.c @@ -104,7 +104,6 @@ #include #include #include -#include #ifdef WITH_DMALLOC #include @@ -297,6 +296,7 @@ im_close( IMAGE *im ) IM_FREEF( im__gslist_gvalue_free, im->history_list ); im__meta_destroy( im ); im__open_images = g_slist_remove( im__open_images, im ); + im__time_destroy( im ); IM_FREE( im ); return( result ); diff --git a/libsrc/iofuncs/time.c b/libsrc/iofuncs/time.c index 3fc88c7b..387e800f 100644 --- a/libsrc/iofuncs/time.c +++ b/libsrc/iofuncs/time.c @@ -38,39 +38,45 @@ #include #include #include -#include #include #include -#include #ifdef WITH_DMALLOC #include #endif /*WITH_DMALLOC*/ -/* Allocate a new time struct and fill in start values. - */ -static int -new_time( IMAGE *im ) +int +im__time_destroy( IMAGE *im ) { - struct time_info *tim = IM_NEW( im, struct time_info ); - - if( !tim ) - return( -1 ); - if( im->time ) { - im_errormsg( "new_time: sanity failure" ); - return( -1 ); + g_timer_destroy( im->time->start ); + im_free( im->time ); + im->time = NULL; } - tim->im = im; - tim->start = time( NULL ); - tim->run = 0; - tim->eta = 0; - tim->tpels = (gint64) im->Xsize * im->Ysize; - tim->npels = 0; - tim->percent = 0; - im->time = tim; + return( 0 ); +} + +/* Attach a new time struct and fill in start values. + */ +int +time_add( IMAGE *im ) +{ + im_time_t *time; + + if( im__time_destroy( im ) || + !(time = IM_NEW( NULL, im_time_t )) ) + return( -1 ); + + time->im = im; + time->start = g_timer_new(); + time->run = 0; + time->eta = 0; + time->tpels = (gint64) im->Xsize * im->Ysize; + time->npels = 0; + time->percent = 0; + im->time = time; return( 0 ); } @@ -78,16 +84,16 @@ new_time( IMAGE *im ) /* A new tile has been computed. Update time_info. */ static int -update_time( struct time_info *tim, int w, int h ) +update_time( im_time_t *time, int w, int h ) { float prop; - tim->run = time( NULL ) - tim->start; - tim->npels += w * h; - prop = (float) tim->npels / (float) tim->tpels; - tim->percent = 100 * prop; + time->run = g_timer_elapsed( time->start, NULL ); + time->npels += w * h; + prop = (float) time->npels / (float) time->tpels; + time->percent = 100 * prop; if( prop > 0 ) - tim->eta = (1.0 / prop) * tim->run - tim->run; + time->eta = (1.0 / prop) * time->run - time->run; return( 0 ); } @@ -99,7 +105,7 @@ im__handle_eval( IMAGE *im, int w, int h ) { if( im->evalfns ) { if( !im->time ) - if( new_time( im ) ) + if( time_add( im ) ) return( -1 ); if( update_time( im->time, w, h ) ) return( -1 );