diff --git a/libvips/resample/shrinkv.c b/libvips/resample/shrinkv.c index 2b91737a..97ef418d 100644 --- a/libvips/resample/shrinkv.c +++ b/libvips/resample/shrinkv.c @@ -199,12 +199,13 @@ vips_shrinkv_add_line( VipsShrinkv *shrink, VipsShrinkvSequence *seq, /* Integer average. */ -#define IAVG( TYPE ) { \ +#define IAVG( TYPE, BTYPE ) { \ int * restrict sum = (int *) seq->sum; \ TYPE * restrict q = (TYPE *) out; \ \ for( x = 0; x < sz; x++ ) \ - q[x] = (sum[x] + shrink->vshrink / 2) / shrink->vshrink; \ + q[x] = ((BTYPE) sum[x] + shrink->vshrink / 2) / \ + shrink->vshrink; \ } /* Float average. @@ -234,17 +235,17 @@ vips_shrinkv_write_line( VipsShrinkv *shrink, VipsShrinkvSequence *seq, VipsPel *out = VIPS_REGION_ADDR( or, left, top ); switch( resample->in->BandFmt ) { case VIPS_FORMAT_UCHAR: - IAVG( unsigned char ); break; + IAVG( unsigned char, int ); break; case VIPS_FORMAT_CHAR: - IAVG( char ); break; + IAVG( char, int ); break; case VIPS_FORMAT_USHORT: - IAVG( unsigned short ); break; + IAVG( unsigned short, int ); break; case VIPS_FORMAT_SHORT: - IAVG( short ); break; + IAVG( short, int ); break; case VIPS_FORMAT_UINT: - IAVG( unsigned int ); break; + IAVG( unsigned int, int ); break; case VIPS_FORMAT_INT: - IAVG( int ); break; + IAVG( int, gint64 ); break; case VIPS_FORMAT_FLOAT: FAVG( float ); break; case VIPS_FORMAT_DOUBLE: