nearest0neighbor now rounds to nearest

before it just truncated x/y downs, now it rounds to nearest ... this
removes a 0.5 shift compared to the other interpolators

thanks Nicolas
This commit is contained in:
John Cupitt 2012-03-26 09:35:22 +01:00
parent ea19e964be
commit ffb34c943c
2 changed files with 5 additions and 6 deletions

View File

@ -1,6 +1,8 @@
19/3/12 started 7.29.0 19/3/12 started 7.29.0
- better PNG alpha handling - better PNG alpha handling
- sanity-check PNG read geometry - sanity-check PNG read geometry
- nearest-neighbor interpolation rounds coordinates to nearest instead of
rounding down (thanks Nicolas)
13/3/12 started 7.28.2 13/3/12 started 7.28.2
- xres/yres tiffsave args were broken - xres/yres tiffsave args were broken

View File

@ -331,15 +331,12 @@ static void
vips_interpolate_nearest_interpolate( VipsInterpolate *interpolate, vips_interpolate_nearest_interpolate( VipsInterpolate *interpolate,
void *out, REGION *in, double x, double y ) void *out, REGION *in, double x, double y )
{ {
/* Pel size and line size.
*/
const int ps = IM_IMAGE_SIZEOF_PEL( in->im ); const int ps = IM_IMAGE_SIZEOF_PEL( in->im );
/* Top left corner we interpolate from. We know x/y are always /* We know x/y are always positive, so we can just (int) them.
* positive, so we can just (int) them.
*/ */
const int xi = (int) x; const int xi = (int) (x + 0.5);
const int yi = (int) y; const int yi = (int) (y + 0.5);
const VipsPel *p = IM_REGION_ADDR( in, xi, yi ); const VipsPel *p = IM_REGION_ADDR( in, xi, yi );
VipsPel *q = (VipsPel *) out; VipsPel *q = (VipsPel *) out;