works!
This commit is contained in:
parent
ff88087a28
commit
46a18118c6
@ -1,6 +1,6 @@
|
|||||||
29/1/16 started 8.3
|
29/1/16 started 8.3
|
||||||
- add vips_reduce*() ... a fast path for affine downsize
|
- add vips_reduce*() ... a fast path for affine downsize
|
||||||
- vips_resize() uses vips_reduce() with lanczos3 and better anti-alias
|
- vips_resize() uses vips_reduce() with lanczos3
|
||||||
- bicubic is better on 32-bit int images
|
- bicubic is better on 32-bit int images
|
||||||
- add pdfload, svgload, gifload for PDF, SVG and GIF rendering
|
- add pdfload, svgload, gifload for PDF, SVG and GIF rendering
|
||||||
- vipsthumbnail knows about pdfload and svgload
|
- vipsthumbnail knows about pdfload and svgload
|
||||||
@ -17,7 +17,7 @@
|
|||||||
- vipsthumbnail knows about webp shrink-on-load
|
- vipsthumbnail knows about webp shrink-on-load
|
||||||
- better behaviour for vips_cast() shift of non-int types (thanks apacheark)
|
- better behaviour for vips_cast() shift of non-int types (thanks apacheark)
|
||||||
- python .bandrank() now works like .bandjoin()
|
- python .bandrank() now works like .bandjoin()
|
||||||
- vipsthumbnail --interpolator and --sharpen are deprecated
|
- vipsthumbnail --interpolator and --sharpen switches are deprecated
|
||||||
- switches to disable PPM, Rad and Analyze support
|
- switches to disable PPM, Rad and Analyze support
|
||||||
|
|
||||||
27/1/16 started 8.2.3
|
27/1/16 started 8.2.3
|
||||||
|
@ -469,9 +469,6 @@ vips_reduceh_build( VipsObject *object )
|
|||||||
"%s", _( "reduce factors should be >= 1" ) );
|
"%s", _( "reduce factors should be >= 1" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
if( reduceh->xshrink > 3 )
|
|
||||||
vips_warn( object_class->nickname,
|
|
||||||
"%s", _( "reduce factor greater than 3" ) );
|
|
||||||
|
|
||||||
if( reduceh->xshrink == 1 )
|
if( reduceh->xshrink == 1 )
|
||||||
return( vips_image_write( in, resample->out ) );
|
return( vips_image_write( in, resample->out ) );
|
||||||
@ -480,6 +477,7 @@ vips_reduceh_build( VipsObject *object )
|
|||||||
*/
|
*/
|
||||||
reduceh->n_points =
|
reduceh->n_points =
|
||||||
vips_reduce_get_points( reduceh->kernel, reduceh->xshrink );
|
vips_reduce_get_points( reduceh->kernel, reduceh->xshrink );
|
||||||
|
vips_info( object_class->nickname, "%d point mask", reduceh->n_points );
|
||||||
if( reduceh->n_points > MAX_POINTS ) {
|
if( reduceh->n_points > MAX_POINTS ) {
|
||||||
vips_error( object_class->nickname,
|
vips_error( object_class->nickname,
|
||||||
"%s", _( "reduce factor too large" ) );
|
"%s", _( "reduce factor too large" ) );
|
||||||
|
@ -378,9 +378,6 @@ vips_reducev_build( VipsObject *object )
|
|||||||
"%s", _( "reduce factor should be >= 1" ) );
|
"%s", _( "reduce factor should be >= 1" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
if( reducev->yshrink > 3 )
|
|
||||||
vips_warn( object_class->nickname,
|
|
||||||
"%s", _( "reduce factor greater than 3" ) );
|
|
||||||
|
|
||||||
if( reducev->yshrink == 1 )
|
if( reducev->yshrink == 1 )
|
||||||
return( vips_image_write( in, resample->out ) );
|
return( vips_image_write( in, resample->out ) );
|
||||||
@ -394,6 +391,7 @@ vips_reducev_build( VipsObject *object )
|
|||||||
"%s", _( "reduce factor too large" ) );
|
"%s", _( "reduce factor too large" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
vips_info( object_class->nickname, "%d point mask", reducev->n_points );
|
||||||
for( int y = 0; y < VIPS_TRANSFORM_SCALE + 1; y++ ) {
|
for( int y = 0; y < VIPS_TRANSFORM_SCALE + 1; y++ ) {
|
||||||
reducev->matrixf[y] =
|
reducev->matrixf[y] =
|
||||||
VIPS_ARRAY( object, reducev->n_points, double );
|
VIPS_ARRAY( object, reducev->n_points, double );
|
||||||
|
@ -150,56 +150,6 @@ vips_resize_build( VipsObject *object )
|
|||||||
hresidual = (double) target_width / in->Xsize;
|
hresidual = (double) target_width / in->Xsize;
|
||||||
vresidual = (double) target_height / in->Ysize;
|
vresidual = (double) target_height / in->Ysize;
|
||||||
|
|
||||||
/* We want to make sure we read the image sequentially.
|
|
||||||
* However, the convolution we may be doing later will force us
|
|
||||||
* into SMALLTILE or maybe FATSTRIP mode and that will break
|
|
||||||
* sequentiality.
|
|
||||||
*
|
|
||||||
* So ... read into a cache where tiles are scanlines, and make sure
|
|
||||||
* we keep enough scanlines.
|
|
||||||
*
|
|
||||||
* We use a threaded tilecache to avoid a deadlock: suppose thread1,
|
|
||||||
* evaluating the top block of the output, is delayed, and thread2,
|
|
||||||
* evaluating the second block, gets here first (this can happen on
|
|
||||||
* a heavily-loaded system).
|
|
||||||
*
|
|
||||||
* With an unthreaded tilecache, thread2 will get
|
|
||||||
* the cache lock and start evaling the second block of the shrink.
|
|
||||||
* When it reaches the png reader it will stall until the first block
|
|
||||||
* has been used ... but it never will, since thread1 will block on
|
|
||||||
* this cache lock.
|
|
||||||
*
|
|
||||||
* Cache sizing: we double-buffer writes, so threads can be up to one
|
|
||||||
* line of tiles behind. For example, one thread could be allocated
|
|
||||||
* tile (0,0) and then stall, the whole write system won't stall until
|
|
||||||
* it tries to allocate tile (0, 2).
|
|
||||||
*
|
|
||||||
* We reduce down after this, which can be a scale of up to @residual,
|
|
||||||
* perhaps 0.5 or down as low as 0.3 depending on the interpolator. So
|
|
||||||
* the number of scanlines we need to keep for the worst case is
|
|
||||||
* 2 * @tile_height / @residual, plus a little extra.
|
|
||||||
*/
|
|
||||||
if( int_vshrink > 1 ) {
|
|
||||||
int tile_width;
|
|
||||||
int tile_height;
|
|
||||||
int n_lines;
|
|
||||||
|
|
||||||
int need_lines;
|
|
||||||
|
|
||||||
vips_get_tile_size( in,
|
|
||||||
&tile_width, &tile_height, &n_lines );
|
|
||||||
need_lines = 1.2 * n_lines / vresidual;
|
|
||||||
if( vips_tilecache( in, &t[6],
|
|
||||||
"tile_width", in->Xsize,
|
|
||||||
"tile_height", 10,
|
|
||||||
"max_tiles", 1 + need_lines / 10,
|
|
||||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
|
||||||
"threaded", TRUE,
|
|
||||||
NULL ) )
|
|
||||||
return( -1 );
|
|
||||||
in = t[6];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Any downsizing.
|
/* Any downsizing.
|
||||||
*/
|
*/
|
||||||
if( hresidual < 1.0 ||
|
if( hresidual < 1.0 ||
|
||||||
@ -226,21 +176,6 @@ vips_resize_build( VipsObject *object )
|
|||||||
in = t[3];
|
in = t[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we are upsizing, don't sharpen.
|
|
||||||
*/
|
|
||||||
if( int_hshrink >= 1 ) {
|
|
||||||
vips_info( class->nickname, "final sharpen" );
|
|
||||||
t[4] = vips_image_new_matrixv( 3, 3,
|
|
||||||
-1.0, -1.0, -1.0,
|
|
||||||
-1.0, 32.0, -1.0,
|
|
||||||
-1.0, -1.0, -1.0 );
|
|
||||||
vips_image_set_double( t[4], "scale", 24 );
|
|
||||||
|
|
||||||
if( vips_conv( in, &t[5], t[4], NULL ) )
|
|
||||||
return( -1 );
|
|
||||||
in = t[5];
|
|
||||||
}
|
|
||||||
|
|
||||||
if( vips_image_write( in, resample->out ) )
|
if( vips_image_write( in, resample->out ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user