fix odd tile height + no overlap
dzsave with zero overlap and odd height was broken also, fix cache init
This commit is contained in:
parent
df534ec0d0
commit
89527b80eb
|
@ -9,6 +9,8 @@
|
||||||
- much more gentle sharpening in thumbnails
|
- much more gentle sharpening in thumbnails
|
||||||
- added "minimise" signal, used by tilecache to drop
|
- added "minimise" signal, used by tilecache to drop
|
||||||
- add :seq support to im_tiff2vips(), im_jpeg2vips() ... helps ruby-vips
|
- add :seq support to im_tiff2vips(), im_jpeg2vips() ... helps ruby-vips
|
||||||
|
- better thread safety for vips8 operation dispatch
|
||||||
|
- better thread safety for upstream / downstream image linking
|
||||||
|
|
||||||
18/6/12 started 7.28.9
|
18/6/12 started 7.28.9
|
||||||
- slightly more memory debugging output
|
- slightly more memory debugging output
|
||||||
|
|
8
TODO
8
TODO
|
@ -4,6 +4,14 @@
|
||||||
|
|
||||||
have "rs" mode? ie. open for sequential read?
|
have "rs" mode? ie. open for sequential read?
|
||||||
|
|
||||||
|
- need a flag on operations for "is sequential"
|
||||||
|
|
||||||
|
should be on the object, not the class, since it can change with params
|
||||||
|
|
||||||
|
- we probably have more threading issues :-(
|
||||||
|
|
||||||
|
look through image and operation init and unref and see what gets called
|
||||||
|
|
||||||
blocking bugs
|
blocking bugs
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
|
|
@ -168,13 +168,16 @@ pyramid_build( VipsForeignSaveDz *dz, Layer *above, int w, int h )
|
||||||
|
|
||||||
/* Build a line of tiles here. Normally strips are height + 2 *
|
/* Build a line of tiles here. Normally strips are height + 2 *
|
||||||
* overlap, but the first row is missing the top edge.
|
* overlap, but the first row is missing the top edge.
|
||||||
|
*
|
||||||
|
* We add one so that we will have the extra scan line for the shrink
|
||||||
|
* in case tile_height is odd and there's no overlap.
|
||||||
*/
|
*/
|
||||||
layer->y = 0;
|
layer->y = 0;
|
||||||
layer->write_y = 0;
|
layer->write_y = 0;
|
||||||
strip.left = 0;
|
strip.left = 0;
|
||||||
strip.top = 0;
|
strip.top = 0;
|
||||||
strip.width = w;
|
strip.width = w;
|
||||||
strip.height = dz->tile_height + dz->overlap;
|
strip.height = dz->tile_height + dz->overlap + 1;
|
||||||
if( vips_region_buffer( layer->strip, &strip ) ) {
|
if( vips_region_buffer( layer->strip, &strip ) ) {
|
||||||
layer_free( layer );
|
layer_free( layer );
|
||||||
return( NULL );
|
return( NULL );
|
||||||
|
@ -506,6 +509,9 @@ strip_shrink( Layer *layer )
|
||||||
source.top = target.top * 2;
|
source.top = target.top * 2;
|
||||||
source.width = target.width * 2;
|
source.width = target.width * 2;
|
||||||
source.height = target.height * 2;
|
source.height = target.height * 2;
|
||||||
|
|
||||||
|
/* Of which we have these available.
|
||||||
|
*/
|
||||||
vips_rect_intersectrect( &source, &from->valid, &source );
|
vips_rect_intersectrect( &source, &from->valid, &source );
|
||||||
|
|
||||||
/* So these are the pixels in the layer below we can provide.
|
/* So these are the pixels in the layer below we can provide.
|
||||||
|
@ -515,7 +521,7 @@ strip_shrink( Layer *layer )
|
||||||
target.width = source.width / 2;
|
target.width = source.width / 2;
|
||||||
target.height = source.height / 2;
|
target.height = source.height / 2;
|
||||||
|
|
||||||
/* Are we empty? All done.
|
/* None? All done.
|
||||||
*/
|
*/
|
||||||
if( source.height < 2 )
|
if( source.height < 2 )
|
||||||
break;
|
break;
|
||||||
|
@ -558,13 +564,15 @@ strip_arrived( Layer *layer )
|
||||||
strip_shrink( layer ) )
|
strip_shrink( layer ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
/* Position our strip down the image.
|
/* Position our strip down the image. We add one to the strip height
|
||||||
|
* to make sure we will have enough pixels for any shrinking even if
|
||||||
|
* tile_height is odd and there's no overlap.
|
||||||
*/
|
*/
|
||||||
layer->y += dz->tile_height;
|
layer->y += dz->tile_height;
|
||||||
new_strip.left = 0;
|
new_strip.left = 0;
|
||||||
new_strip.top = layer->y - dz->overlap;
|
new_strip.top = layer->y - dz->overlap;
|
||||||
new_strip.width = layer->image->Xsize;
|
new_strip.width = layer->image->Xsize;
|
||||||
new_strip.height = dz->tile_height + 2 * dz->overlap;
|
new_strip.height = dz->tile_height + 2 * dz->overlap + 1;
|
||||||
|
|
||||||
/* What pixels that we will need do we already have? Save them in
|
/* What pixels that we will need do we already have? Save them in
|
||||||
* overlap.
|
* overlap.
|
||||||
|
@ -622,7 +630,8 @@ pyramid_strip( VipsRegion *region, VipsRect *area, void *a )
|
||||||
/* And copy those pixels in.
|
/* And copy those pixels in.
|
||||||
*
|
*
|
||||||
* FIXME: If the strip fits inside the region we've just
|
* FIXME: If the strip fits inside the region we've just
|
||||||
* received, we could skip the copy.
|
* received, we could skip the copy. Will this happen very
|
||||||
|
* often? Unclear.
|
||||||
*/
|
*/
|
||||||
vips_region_copy( region, layer->strip,
|
vips_region_copy( region, layer->strip,
|
||||||
&target, target.left, target.top );
|
&target, target.left, target.top );
|
||||||
|
|
|
@ -83,6 +83,8 @@ extern char *vips__cache_max_files;
|
||||||
extern gboolean vips__cache_dump;
|
extern gboolean vips__cache_dump;
|
||||||
extern gboolean vips__cache_trace;
|
extern gboolean vips__cache_trace;
|
||||||
|
|
||||||
|
void vips__cache_init( void );
|
||||||
|
|
||||||
typedef int (*im__fftproc_fn)( VipsImage *, VipsImage *, VipsImage * );
|
typedef int (*im__fftproc_fn)( VipsImage *, VipsImage *, VipsImage * );
|
||||||
|
|
||||||
/* iofuncs
|
/* iofuncs
|
||||||
|
|
|
@ -409,8 +409,8 @@ vips_operation_equal( VipsOperation *a, VipsOperation *b )
|
||||||
return( FALSE );
|
return( FALSE );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
vips_cache_init( void )
|
vips__cache_init( void )
|
||||||
{
|
{
|
||||||
if( !vips_cache_table ) {
|
if( !vips_cache_table ) {
|
||||||
vips_cache_lock = g_mutex_new();
|
vips_cache_lock = g_mutex_new();
|
||||||
|
@ -670,8 +670,6 @@ vips_cache_operation_buildp( VipsOperation **operation )
|
||||||
vips_object_print_dump( VIPS_OBJECT( *operation ) );
|
vips_object_print_dump( VIPS_OBJECT( *operation ) );
|
||||||
#endif /*VIPS_DEBUG*/
|
#endif /*VIPS_DEBUG*/
|
||||||
|
|
||||||
vips_cache_init();
|
|
||||||
|
|
||||||
vips_cache_trim();
|
vips_cache_trim();
|
||||||
|
|
||||||
g_mutex_lock( vips_cache_lock );
|
g_mutex_lock( vips_cache_lock );
|
||||||
|
|
|
@ -227,6 +227,10 @@ vips_init( const char *argv0 )
|
||||||
vips__interpolate_init();
|
vips__interpolate_init();
|
||||||
im__format_init();
|
im__format_init();
|
||||||
|
|
||||||
|
/* Start up operator cache.
|
||||||
|
*/
|
||||||
|
vips__cache_init();
|
||||||
|
|
||||||
/* Start up packages.
|
/* Start up packages.
|
||||||
*/
|
*/
|
||||||
vips_arithmetic_operation_init();
|
vips_arithmetic_operation_init();
|
||||||
|
|
Loading…
Reference in New Issue