oop, overflow in sharpen

plus another tweak of the defaults
This commit is contained in:
John Cupitt 2016-02-28 11:24:35 +00:00
parent ee1874c5ca
commit b197773095
3 changed files with 22 additions and 18 deletions

View File

@ -9,6 +9,7 @@
- lower mem use for progressive jpg decode - lower mem use for progressive jpg decode
- sharpen has a new @sigma param, @radius is deprecated - sharpen has a new @sigma param, @radius is deprecated
- sharpen allows a much greater range of parameters - sharpen allows a much greater range of parameters
- sharpen defaults now suitable for screen output
- better handling of deprecated args in python - better handling of deprecated args in python
- much better handling of arrayimage command-line args - much better handling of arrayimage command-line args

10
TODO
View File

@ -1,3 +1,8 @@
- use the incremental webp decoding api to support seq for webp images
https://developers.google.com/speed/webp/docs/api#decodingadvancedapi
- try - try
$ vips sharpen babe.jpg x.v $ vips sharpen babe.jpg x.v
@ -222,11 +227,6 @@
use it from nip2 for zooming? only if the partial flag is set though, we use it from nip2 for zooming? only if the partial flag is set though, we
don't want to use it on jpg files don't want to use it on jpg files
- use the webp advanced encoding api to set a write function for webp save to
file
- use g_log() instead of vips_info()?
- quadratic doesn't work for order 3 - quadratic doesn't work for order 3

View File

@ -128,11 +128,11 @@ vips_sharpen_generate( VipsRegion *or,
VIPS_GATE_START( "vips_sharpen_generate: work" ); VIPS_GATE_START( "vips_sharpen_generate: work" );
for( y = 0; y < r->height; y++ ) { for( y = 0; y < r->height; y++ ) {
short *p1 = (short * restrict ) short *p1 = (short * restrict)
VIPS_REGION_ADDR( in[0], r->left, r->top + y ); VIPS_REGION_ADDR( in[0], r->left, r->top + y );
short *p2 = (short * restrict ) short *p2 = (short * restrict)
VIPS_REGION_ADDR( in[1], r->left, r->top + y ); VIPS_REGION_ADDR( in[1], r->left, r->top + y );
short *q = (short * restrict ) short *q = (short * restrict)
VIPS_REGION_ADDR( or, r->left, r->top + y ); VIPS_REGION_ADDR( or, r->left, r->top + y );
for( x = 0; x < r->width; x++ ) { for( x = 0; x < r->width; x++ ) {
@ -143,11 +143,14 @@ vips_sharpen_generate( VipsRegion *or,
* difference to be in this range, both must be 0 - * difference to be in this range, both must be 0 -
* 32767. * 32767.
*/ */
int d = (v1 & 0x8fff) - (v2 & 0x8fff); int diff = ((v1 & 0x7fff) - (v2 & 0x7fff));
int out; int out;
out = v1 + lut[d + 32768]; g_assert( diff + 32768 >= 0 );
g_assert( diff + 32768 < 65536 );
out = v1 + lut[diff + 32768];
if( out < 0 ) if( out < 0 )
out = 0; out = 0;
@ -331,7 +334,7 @@ vips_sharpen_class_init( VipsSharpenClass *class )
_( "Flat/jaggy threshold" ), _( "Flat/jaggy threshold" ),
VIPS_ARGUMENT_OPTIONAL_INPUT, VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsSharpen, x1 ), G_STRUCT_OFFSET( VipsSharpen, x1 ),
0, 1000000, 1.5 ); 0, 1000000, 2.0 );
VIPS_ARG_DOUBLE( class, "y2", 6, VIPS_ARG_DOUBLE( class, "y2", 6,
_( "y2" ), _( "y2" ),
@ -359,7 +362,7 @@ vips_sharpen_class_init( VipsSharpenClass *class )
_( "Slope for jaggy areas" ), _( "Slope for jaggy areas" ),
VIPS_ARGUMENT_OPTIONAL_INPUT, VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsSharpen, m2 ), G_STRUCT_OFFSET( VipsSharpen, m2 ),
0, 1000000, 0.5 ); 0, 1000000, 3.0 );
/* We used to have a radius control. /* We used to have a radius control.
*/ */
@ -376,11 +379,11 @@ static void
vips_sharpen_init( VipsSharpen *sharpen ) vips_sharpen_init( VipsSharpen *sharpen )
{ {
sharpen->sigma = 0.5; sharpen->sigma = 0.5;
sharpen->x1 = 1.5; sharpen->x1 = 2.0;
sharpen->y2 = 10.0; sharpen->y2 = 10.0;
sharpen->y3 = 20.0; sharpen->y3 = 20.0;
sharpen->m1 = 0.0; sharpen->m1 = 0.0;
sharpen->m2 = 0.5; sharpen->m2 = 3.0;
} }
/** /**
@ -432,11 +435,11 @@ vips_sharpen_init( VipsSharpen *sharpen )
* *
* |[ * |[
* sigma == 0.5 * sigma == 0.5
* x1 == 1.5 * x1 == 2
* y2 == 10 (don't brighten by more than 10 L*) * y2 == 10 (don't brighten by more than 10 L*)
* y3 == 20 (can darken by up to 52 L*) * y3 == 20 (can darken by up to 20 L*)
* m1 == 0 (no sharpening in flat areas) * m1 == 0 (no sharpening in flat areas)
* m2 == 0.5 (some sharpening in jaggy areas) * m2 == 3 (some sharpening in jaggy areas)
* ]| * ]|
* *
* If you want more or less sharpening, we suggest you just change the * If you want more or less sharpening, we suggest you just change the
@ -444,7 +447,7 @@ vips_sharpen_init( VipsSharpen *sharpen )
* *
* The @sigma parameter changes the width of the fringe and can be * The @sigma parameter changes the width of the fringe and can be
* adjusted according to the output printing resolution. As an approximate * adjusted according to the output printing resolution. As an approximate
* guideline, use 0.5 for 4 pixels/mm (CRT display resolution), * guideline, use 0.5 for 4 pixels/mm (display resolution),
* 1.0 for 12 pixels/mm and 1.5 for 16 pixels/mm (300 dpi == 12 * 1.0 for 12 pixels/mm and 1.5 for 16 pixels/mm (300 dpi == 12
* pixels/mm). These figures refer to the image raster, not the half-tone * pixels/mm). These figures refer to the image raster, not the half-tone
* resolution. * resolution.