From: anthony Date: Tue, 7 Sep 2010 10:05:14 +0000 (+0000) Subject: Re-coding to correctly add a Polynomial Approximated Sinc resize filter X-Git-Tag: 7.0.1-0~8972 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=720660ffe883e3519581f941c35d5114f2a7069c;p=imagemagick Re-coding to correctly add a Polynomial Approximated Sinc resize filter --- diff --git a/magick/option.c b/magick/option.c index ee196be61..d484350f1 100644 --- a/magick/option.c +++ b/magick/option.c @@ -952,6 +952,7 @@ static const OptionInfo { "Point", (ssize_t) PointFilter, MagickFalse }, { "Quadratic", (ssize_t) QuadraticFilter, MagickFalse }, { "Sinc", (ssize_t) SincFilter, MagickFalse }, + { "SincPolynomial", (ssize_t) SincPolynomialFilter, MagickFalse }, { "Triangle", (ssize_t) TriangleFilter, MagickFalse }, { "Welsh", (ssize_t) WelshFilter, MagickFalse }, { (char *) NULL, (ssize_t) UndefinedFilter, MagickFalse } diff --git a/magick/resample.h b/magick/resample.h index 794a029d8..064734c0c 100644 --- a/magick/resample.h +++ b/magick/resample.h @@ -48,6 +48,7 @@ typedef enum LagrangeFilter, BohmanFilter, BartlettFilter, + SincPolynomialFilter, SentinelFilter /* a count of all the filters, not a real filter */ } FilterTypes; diff --git a/magick/resize.c b/magick/resize.c index d626b83ce..4c6c2a5f6 100644 --- a/magick/resize.c +++ b/magick/resize.c @@ -306,10 +306,22 @@ static MagickRealType Quadratic(const MagickRealType x, static MagickRealType Sinc(const MagickRealType x, const ResizeFilter *magick_unused(resize_filter)) +{ + /* + This function actually a X-scaled Sinc(x) function. + */ + if (x == 0.0) + return(1.0); + return(sin(MagickPI*(double) x)/(MagickPI*(double) x)); +} + +static MagickRealType SincPolynomial(const MagickRealType x, + const ResizeFilter *magick_unused(resize_filter)) { const double xd = x; if (fabs(xd) > 4.0) return(sin(MagickPI*xd)/(MagickPI*x)); + { /* Approximations of the sinc function over the interval [-4,4] @@ -544,28 +556,29 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, window; } const mapping[SentinelFilter] = { - { UndefinedFilter, BoxFilter }, /* undefined */ - { PointFilter, BoxFilter }, /* special, nearest-neighbour filter */ - { BoxFilter, BoxFilter }, /* Box averaging Filter */ - { TriangleFilter, BoxFilter }, /* Linear Interpolation Filter */ - { HermiteFilter, BoxFilter }, /* Hermite interpolation filter */ - { SincFilter, HanningFilter }, /* Hanning -- Cosine-Sinc */ - { SincFilter, HammingFilter }, /* Hamming -- '' variation */ - { SincFilter, BlackmanFilter }, /* Blackman -- 2*Cosine-Sinc */ - { GaussianFilter, BoxFilter }, /* Gaussain Blurring filter */ - { QuadraticFilter, BoxFilter }, /* Quadratic Gaussian approximation */ - { CubicFilter, BoxFilter }, /* Cubic Gaussian approximation */ - { CatromFilter, BoxFilter }, /* Cubic Interpolator */ - { MitchellFilter, BoxFilter }, /* 'ideal' Cubic Filter */ - { LanczosFilter, SincFilter }, /* Special, 3 lobed Sinc-Sinc */ - { BesselFilter, BlackmanFilter }, /* 3 lobed bessel -specific request */ - { SincFilter, BlackmanFilter }, /* 4 lobed sinc - specific request */ - { SincFilter, KaiserFilter }, /* Kaiser -- SqRoot-Sinc */ - { SincFilter, WelshFilter }, /* Welsh -- Parabolic-Sinc */ - { SincFilter, CubicFilter }, /* Parzen -- Cubic-Sinc */ - { LagrangeFilter, BoxFilter }, /* Lagrange self-windowing filter */ - { SincFilter, BohmanFilter }, /* Bohman -- 2*Cosine-Sinc */ - { SincFilter, TriangleFilter } /* Bartlett -- Triangle-Sinc */ + { UndefinedFilter, BoxFilter }, /* undefined */ + { PointFilter, BoxFilter }, /* special, nearest-neighbour filter */ + { BoxFilter, BoxFilter }, /* Box averaging Filter */ + { TriangleFilter, BoxFilter }, /* Linear Interpolation Filter */ + { HermiteFilter, BoxFilter }, /* Hermite interpolation filter */ + { SincFilter, HanningFilter }, /* Hanning -- Cosine-Sinc */ + { SincFilter, HammingFilter }, /* Hamming -- '' variation */ + { SincFilter, BlackmanFilter }, /* Blackman -- 2*Cosine-Sinc */ + { GaussianFilter, BoxFilter }, /* Gaussain Blurring filter */ + { QuadraticFilter, BoxFilter }, /* Quadratic Gaussian approximation */ + { CubicFilter, BoxFilter }, /* Cubic Gaussian approximation */ + { CatromFilter, BoxFilter }, /* Cubic Interpolator */ + { MitchellFilter, BoxFilter }, /* 'ideal' Cubic Filter */ + { LanczosFilter, SincFilter }, /* Special, 3 lobed Sinc-Sinc */ + { BesselFilter, BlackmanFilter }, /* 3 lobed bessel -specific request */ + { SincFilter, BlackmanFilter }, /* 4 lobed sinc - specific request */ + { SincFilter, KaiserFilter }, /* Kaiser -- SqRoot-Sinc */ + { SincFilter, WelshFilter }, /* Welsh -- Parabolic-Sinc */ + { SincFilter, CubicFilter }, /* Parzen -- Cubic-Sinc */ + { LagrangeFilter, BoxFilter }, /* Lagrange self-windowing filter */ + { SincFilter, BohmanFilter }, /* Bohman -- 2*Cosine-Sinc */ + { SincFilter, TriangleFilter }, /* Bartlett -- Triangle-Sinc */ + { SincPolynomialFilter, BlackmanFilter } /* Polynomial Approximated Sinc */ }; /* Table maping the filter/window function from the above table to the actual @@ -604,7 +617,8 @@ MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, { CubicBC, 2.0f, 2.0f, 1.0f, 0.0f }, /* Parzen, B-Spline windowing */ { Lagrange, 2.0f, 1.0f, 0.0f, 0.0f }, /* Lagrangian Filter */ { Bohman, 1.0f, 1.0f, 0.0f, 0.0f }, /* Bohman, 2*Cosine windowing */ - { Triangle, 1.0f, 1.0f, 0.0f, 0.0f } /* Bartlett, Triangle windowing */ + { Triangle, 1.0f, 1.0f, 0.0f, 0.0f }, /* Bartlett, Triangle windowing */ + { SincPolynomial, 4.0f, 1.0f, 0.0f, 0.0f } /* Poly Approx Sinc */ }; /* The known zero crossings of the Bessel() or the Jinc(x*PI) function found