(*weights)[2]=x-(*weights)[3]-gamma;
}
+static inline double ConstrainPixelOffset(double x)
+{
+ if (x < (double) -(SSIZE_MAX-512))
+ return((double) -(SSIZE_MAX-512));
+ if (x > (double) (SSIZE_MAX-512))
+ return((double) (SSIZE_MAX-512));
+ return(x);
+}
+
static inline void SplineWeights(const double x,double (*weights)[4])
{
double
return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
}
-/*
-static inline ssize_t NearestNeighbor(const double x)
-{
- if (x >= 0.0)
- return((ssize_t) (x+0.5));
- return((ssize_t) (x-0.5));
-}
-*/
-
MagickExport MagickBooleanType InterpolatePixelChannel(
const Image *magick_restrict image,const CacheView_ *image_view,
const PixelChannel channel,const PixelInterpolateMethod method,
status=MagickTrue;
*pixel=0.0;
traits=GetPixelChannelTraits(image,channel);
- x_offset=(ssize_t) floor(x);
- y_offset=(ssize_t) floor(y);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
interpolate=method;
if (interpolate == UndefinedInterpolatePixel)
interpolate=image->interpolate;
if (interpolate == Average9InterpolatePixel)
{
count=3;
- x_offset=(ssize_t) (floor(x+0.5)-1);
- y_offset=(ssize_t) (floor(y+0.5)-1);
+ x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
+ y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
}
else
if (interpolate == Average16InterpolatePixel)
}
case NearestInterpolatePixel:
{
- x_offset=(ssize_t) floor(x+0.5);
- y_offset=(ssize_t) floor(y+0.5);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
if (p == (const Quantum *) NULL)
{
assert(source->signature == MagickCoreSignature);
assert(source_view != (CacheView *) NULL);
status=MagickTrue;
- x_offset=(ssize_t) floor(x);
- y_offset=(ssize_t) floor(y);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
interpolate=method;
if (interpolate == UndefinedInterpolatePixel)
interpolate=source->interpolate;
if (interpolate == Average9InterpolatePixel)
{
count=3;
- x_offset=(ssize_t) (floor(x+0.5)-1);
- y_offset=(ssize_t) (floor(y+0.5)-1);
+ x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
+ y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
}
else
if (interpolate == Average16InterpolatePixel)
}
case NearestInterpolatePixel:
{
- x_offset=(ssize_t) floor(x+0.5);
- y_offset=(ssize_t) floor(y+0.5);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
if (p == (const Quantum *) NULL)
{
assert(image->signature == MagickCoreSignature);
assert(image_view != (CacheView *) NULL);
status=MagickTrue;
- x_offset=(ssize_t) floor(x);
- y_offset=(ssize_t) floor(y);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
interpolate=method;
if (interpolate == UndefinedInterpolatePixel)
interpolate=image->interpolate;
if (interpolate == Average9InterpolatePixel)
{
count=3;
- x_offset=(ssize_t) (floor(x+0.5)-1);
- y_offset=(ssize_t) (floor(y+0.5)-1);
+ x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
+ y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
}
else if (interpolate == Average16InterpolatePixel)
{
}
case NearestInterpolatePixel:
{
- x_offset=(ssize_t) floor(x+0.5);
- y_offset=(ssize_t) floor(y+0.5);
+ x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
+ y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
if (p == (const Quantum *) NULL)
{