From 036bd0bb4b5ed30ed4451065217ef8fc955ff132 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Sat, 9 Jul 2016 19:20:33 +0100 Subject: [PATCH] convsep calls convasep when it can --- TODO | 2 ++ libvips/convolution/convsep.c | 40 +++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index 2daa7c23..30791a6c 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,5 @@ +- convasep does not handle offset correctly + - test new clip stuff? - add more webp tests to py suite diff --git a/libvips/convolution/convsep.c b/libvips/convolution/convsep.c index 7838ec41..27299c0a 100644 --- a/libvips/convolution/convsep.c +++ b/libvips/convolution/convsep.c @@ -63,6 +63,8 @@ vips_convsep_build( VipsObject *object ) VipsImage **t = (VipsImage **) vips_object_local_array( object, 3 ); + VipsImage *in; + g_object_set( convsep, "out", vips_image_new(), NULL ); if( VIPS_OBJECT_CLASS( vips_convsep_parent_class )->build( object ) ) @@ -71,20 +73,32 @@ vips_convsep_build( VipsObject *object ) if( vips_check_separable( class->nickname, convolution->M ) ) return( -1 ); - if( vips_rot( convolution->M, &t[0], VIPS_ANGLE_D90, NULL ) || - vips_conv( convolution->in, &t[1], convolution->M, - "precision", convsep->precision, - "layers", convsep->layers, - "cluster", convsep->cluster, - NULL ) || - vips_conv( t[1], &t[2], t[0], - "precision", convsep->precision, - "layers", convsep->layers, - "cluster", convsep->cluster, - NULL ) ) - return( -1 ); + in = convolution->in; - if( vips_image_write( t[2], convolution->out ) ) + if( convsep->precision == VIPS_PRECISION_APPROXIMATE ) { + if( vips_convasep( convolution->in, &t[0], convolution->M, + "layers", convsep->layers, + NULL ) ) + return( -1 ); + in = t[0]; + } + else { + if( vips_rot( convolution->M, &t[0], VIPS_ANGLE_D90, NULL ) || + vips_conv( convolution->in, &t[1], convolution->M, + "precision", convsep->precision, + "layers", convsep->layers, + "cluster", convsep->cluster, + NULL ) || + vips_conv( t[1], &t[2], t[0], + "precision", convsep->precision, + "layers", convsep->layers, + "cluster", convsep->cluster, + NULL ) ) + return( -1 ); + in = t[2]; + } + + if( vips_image_write( in, convolution->out ) ) return( -1 ); return( 0 );