]> granicus.if.org Git - imagemagick/blobdiff - magick/gem.c
(no commit message)
[imagemagick] / magick / gem.c
index 278360ba0c7027cc1c1e3eb780f4618b3e4254bf..f2cd994e7cbd40f99a0368fdca26f487a80ff3e0 100644 (file)
@@ -17,7 +17,7 @@
 %                                 August 1996                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -276,7 +276,7 @@ MagickExport void ConvertHWBToRGB(const double hue,const double whiteness,
     r,
     v;
 
-  register long
+  register ssize_t
     i;
 
   /*
@@ -293,7 +293,7 @@ MagickExport void ConvertHWBToRGB(const double hue,const double whiteness,
       *blue=ClampToQuantum((MagickRealType) QuantumRange*v);
       return;
     }
-  i=(long) floor(6.0*hue);
+  i=(ssize_t) floor(6.0*hue);
   f=6.0*hue-i;
   if ((i & 0x01) != 0)
     f=1.0-f;
@@ -508,14 +508,14 @@ MagickExport void ConvertRGBToHSL(const Quantum red,const Quantum green,
 MagickExport void ConvertRGBToHWB(const Quantum red,const Quantum green,
   const Quantum blue,double *hue,double *whiteness,double *blackness)
 {
+  long
+    i;
+
   MagickRealType
     f,
     v,
     w;
 
-  register long
-    i;
-
   /*
     Convert RGB to HWB colorspace.
   */
@@ -641,8 +641,8 @@ MagickExport double GenerateDifferentialNoise(RandomInfo *random_info,
         alpha=1.0;
       beta=GetPseudoRandomValue(random_info);
       gamma=sqrt(-2.0*log(alpha));
-      sigma=gamma*cos(2.0*MagickPI*beta);
-      tau=gamma*sin(2.0*MagickPI*beta);
+      sigma=gamma*cos((double) (2.0*MagickPI*beta));
+      tau=gamma*sin((double) (2.0*MagickPI*beta));
       noise=(double) pixel+sqrt((double) pixel)*SigmaGaussian*sigma+
         TauGaussian*tau;
       break;
@@ -655,7 +655,7 @@ MagickExport double GenerateDifferentialNoise(RandomInfo *random_info,
         sigma=sqrt(-2.0*log(alpha));
       beta=GetPseudoRandomValue(random_info);
       noise=(double) pixel+pixel*SigmaMultiplicativeGaussian*sigma/2.0*
-        cos((2.0*MagickPI*beta));
+        cos((double) (2.0*MagickPI*beta));
       break;
     }
     case ImpulseNoise:
@@ -693,7 +693,7 @@ MagickExport double GenerateDifferentialNoise(RandomInfo *random_info,
       double
         poisson;
 
-      register long
+      register ssize_t
         i;
 
       poisson=exp(-SigmaPoisson*ScaleQuantumToChar(pixel));
@@ -731,7 +731,7 @@ MagickExport double GenerateDifferentialNoise(RandomInfo *random_info,
 %
 %  The format of the GetOptimalKernelWidth method is:
 %
-%      unsigned long GetOptimalKernelWidth(const double radius,
+%      size_t GetOptimalKernelWidth(const double radius,
 %        const double sigma)
 %
 %  A description of each parameter follows:
@@ -745,84 +745,89 @@ MagickExport double GenerateDifferentialNoise(RandomInfo *random_info,
 %    o sigma: the standard deviation of the Gaussian, in pixels.
 %
 */
-MagickExport unsigned long GetOptimalKernelWidth1D(const double radius,
+MagickExport size_t GetOptimalKernelWidth1D(const double radius,
   const double sigma)
 {
-#define MagickSigma  (fabs(sigma) <= MagickEpsilon ? 1.0 : sigma)
-
-  MagickRealType
+  double
+    alpha,
+    beta,
+    gamma,
     normalize,
     value;
 
-  long
-    j;
-
-  register long
+  register ssize_t
     i;
 
-  unsigned long
+  size_t
     width;
 
+  ssize_t
+    j;
+
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   if (radius > MagickEpsilon)
-    return((unsigned long) (2.0*ceil(radius)+1.0));
-  if (fabs(sigma) <= MagickEpsilon)
-    return(1UL);
+    return((size_t) (2.0*ceil(radius)+1.0));
+  gamma=fabs(sigma);
+  if (gamma <= MagickEpsilon)
+    return(3UL);
+  alpha=1.0/(2.0*gamma*gamma);
+  beta=(double) (1.0/(MagickSQ2PI*gamma));
   for (width=5; ; )
   {
     normalize=0.0;
-    j=(long) width/2;
+    j=(ssize_t) width/2;
     for (i=(-j); i <= j; i++)
-      normalize+=exp(-((double) i*i)/(2.0*MagickSigma*MagickSigma))/
-        (MagickSQ2PI*MagickSigma);
-    value=exp(-((double) j*j)/(2.0*MagickSigma*MagickSigma))/
-      (MagickSQ2PI*MagickSigma)/normalize;
+      normalize+=exp(-((double) (i*i))*alpha)*beta;
+    value=exp(-((double) (j*j))*alpha)*beta/normalize;
     if ((value < QuantumScale) || (value < MagickEpsilon))
       break;
     width+=2;
   }
-  return((unsigned long) (width-2));
+  return((size_t) (width-2));
 }
 
-MagickExport unsigned long GetOptimalKernelWidth2D(const double radius,
+MagickExport size_t GetOptimalKernelWidth2D(const double radius,
   const double sigma)
 {
   double
+    alpha,
+    beta,
+    gamma,
     normalize,
     value;
 
-  long
+  size_t
+    width;
+
+  ssize_t
     j,
     u,
     v;
 
-  unsigned long
-    width;
-
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   if (radius > MagickEpsilon)
-    return((unsigned long) (2.0*ceil(radius)+1.0));
-  if (fabs(sigma) <= MagickEpsilon)
-    return(1UL);
+    return((size_t) (2.0*ceil(radius)+1.0));
+  gamma=fabs(sigma);
+  if (gamma <= MagickEpsilon)
+    return(3UL);
+  alpha=1.0/(2.0*gamma*gamma);
+  beta=(double) (1.0/(Magick2PI*gamma*gamma));
   for (width=5; ; )
   {
     normalize=0.0;
-    j=(long) width/2;
+    j=(ssize_t) width/2;
     for (v=(-j); v <= j; v++)
-    {
       for (u=(-j); u <= j; u++)
-        normalize+=exp(-((double) u*u+v*v)/(2.0*MagickSigma*MagickSigma))/
-          (2.0*MagickPI*MagickSigma*MagickSigma);
-    }
-    value=exp(-((double) j*j)/(2.0*MagickSigma*MagickSigma))/normalize;
+        normalize+=exp(-((double) (u*u+v*v))*alpha)*beta;
+    value=exp(-((double) (j*j))*alpha)*beta/normalize;
     if ((value < QuantumScale) || (value < MagickEpsilon))
       break;
     width+=2;
   }
-  return((unsigned long) (width-2));
+  return((size_t) (width-2));
 }
 
-MagickExport unsigned long  GetOptimalKernelWidth(const double radius,
+MagickExport size_t  GetOptimalKernelWidth(const double radius,
   const double sigma)
 {
   return(GetOptimalKernelWidth1D(radius,sigma));