]> granicus.if.org Git - imagemagick/commitdiff
Re-coding to correctly add a Polynomial Approximated Sinc resize filter
authoranthony <anthony@git.imagemagick.org>
Tue, 7 Sep 2010 10:05:14 +0000 (10:05 +0000)
committeranthony <anthony@git.imagemagick.org>
Tue, 7 Sep 2010 10:05:14 +0000 (10:05 +0000)
magick/option.c
magick/resample.h
magick/resize.c

index ee196be61f5bc6403b9d8caa8ae5232bd7ce9904..d484350f10946b2762f91ab8d239ec8fa27e142c 100644 (file)
@@ -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 }
index 794a029d8d4e885b8fae2158d37a09c163232c98..064734c0cda5445fe7d2321614e667eb919b3f1a 100644 (file)
@@ -48,6 +48,7 @@ typedef enum
   LagrangeFilter,
   BohmanFilter,
   BartlettFilter,
+  SincPolynomialFilter,
   SentinelFilter  /* a count of all the filters, not a real filter */
 } FilterTypes;
 
index d626b83cec9768cae887741c3419c5f057d4eea8..4c6c2a5f67ee24460e5317dbbc80f7a5412d751a 100644 (file)
@@ -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