]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/distort.c
(no commit message)
[imagemagick] / MagickCore / distort.c
index 2a81a32614703f3f3dfc0fb8df8cb907fb130338..e4202ba4bf85a629cd8ff97ba72f32865730beed 100644 (file)
 %                     MagickCore Image Distortion Methods                     %
 %                                                                             %
 %                              Software Design                                %
-%                                John Cristy                                  %
+%                                   Cristy                                    %
 %                              Anthony Thyssen                                %
 %                                 June 2007                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2014 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  %
@@ -44,6 +44,7 @@
 #include "MagickCore/artifact.h"
 #include "MagickCore/cache.h"
 #include "MagickCore/cache-view.h"
+#include "MagickCore/channel.h"
 #include "MagickCore/colorspace-private.h"
 #include "MagickCore/composite-private.h"
 #include "MagickCore/distort.h"
@@ -131,16 +132,6 @@ static void InvertPerspectiveCoefficients(const double *coeff,
   inverse[7]=determinant*(coeff[6]*coeff[1]-coeff[0]*coeff[7]);
 }
 
-static inline double MagickRound(double x)
-{
-  /*
-    Round the fraction to nearest integer.
-  */
-  if (x >= 0.0)
-    return((double) ((ssize_t) (x+0.5)));
-  return((double) ((ssize_t) (x-0.5)));
-}
-
 /*
  * Polynomial Term Defining Functions
  *
@@ -378,6 +369,16 @@ MagickExport Image *AffineTransformImage(const Image *image,
 %  outside other MagickCore library methods.
 */
 
+static inline double MagickRound(double x)
+{
+  /*
+    Round the fraction to nearest integer.
+  */
+  if ((x-floor(x)) < (ceil(x)-x))
+    return(floor(x));
+  return(ceil(x));
+}
+
 static double *GenerateCoefficients(const Image *image,
   DistortImageMethod *method,const size_t number_arguments,
   const double *arguments,size_t number_values,ExceptionInfo *exception)
@@ -495,7 +496,7 @@ static double *GenerateCoefficients(const Image *image,
       number_coeff=10;
       break;
     default:
-      assert(! "Unknown Method Given"); /* just fail assertion */
+      perror("unknown method given"); /* just fail assertion */
   }
 
   /* allocate the array of coefficients needed */
@@ -1433,7 +1434,7 @@ static double *GenerateCoefficients(const Image *image,
       break;
   }
   /* you should never reach this point */
-  assert(! "No Method Handler"); /* just fail assertion */
+  perror("no method handler"); /* just fail assertion */
   return((double *) NULL);
 }
 \f
@@ -1516,6 +1517,7 @@ MagickExport Image *DistortResizeImage(const Image *image,
     return((Image *) NULL);
   (void) SetImageVirtualPixelMethod(tmp_image,TransparentVirtualPixelMethod,
     exception);
+  tmp_image->image_info=image->image_info; /* preserve global options */
 
   if (image->alpha_trait != BlendPixelTrait)
     {
@@ -1556,6 +1558,7 @@ MagickExport Image *DistortResizeImage(const Image *image,
       tmp_image=CloneImage(image,0,0,MagickTrue,exception);
       if ( tmp_image == (Image *) NULL )
         return((Image *) NULL);
+      tmp_image->image_info=image->image_info; /* preserve global options */
       (void) SetImageVirtualPixelMethod(tmp_image,
         TransparentVirtualPixelMethod,exception);
       resize_image=DistortImage(tmp_image,AffineDistortion,12,distort_args,
@@ -1705,7 +1708,6 @@ MagickExport Image *DistortImage(const Image *image,DistortImageMethod method,
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
 
-
   /*
     Handle Special Compound Distortions
   */
@@ -2179,7 +2181,7 @@ MagickExport Image *DistortImage(const Image *image,DistortImageMethod method,
           (void) FormatLocaleFile(stderr, "  c%.20g = %+lf\n", (double) i, coeff[i]);
         (void) FormatLocaleFile(stderr, "DePolar Distort, FX Equivelent:\n");
         (void) FormatLocaleFile(stderr, "%s", image_gen);
-        (void) FormatLocaleFile(stderr, "  -fx 'aa=(i+.5)*%lf %+lf;\n", coeff[6], -coeff[4] );
+        (void) FormatLocaleFile(stderr, "  -fx 'aa=(i+.5)*%lf %+lf;\n", coeff[6], +coeff[4] );
         (void) FormatLocaleFile(stderr, "       rr=(j+.5)*%lf %+lf;\n", coeff[7], +coeff[1] );
         (void) FormatLocaleFile(stderr, "       xx=rr*sin(aa) %+lf;\n", coeff[2] );
         (void) FormatLocaleFile(stderr, "       yy=rr*cos(aa) %+lf;\n", coeff[3] );
@@ -2292,7 +2294,7 @@ MagickExport Image *DistortImage(const Image *image,DistortImageMethod method,
     }
   if ((IsPixelInfoGray(&distort_image->background_color) == MagickFalse) &&
       (IsGrayColorspace(distort_image->colorspace) != MagickFalse))
-    (void) TransformImageColorspace(distort_image,RGBColorspace,exception);
+    (void) SetImageColorspace(distort_image,sRGBColorspace,exception);
   if (distort_image->background_color.alpha_trait == BlendPixelTrait)
     distort_image->alpha_trait=BlendPixelTrait;
   distort_image->page.x=geometry.x;
@@ -2324,10 +2326,10 @@ MagickExport Image *DistortImage(const Image *image,DistortImageMethod method,
     GetPixelInfo(distort_image,&zero);
     resample_filter=AcquireResampleFilterThreadSet(image,
       UndefinedVirtualPixelMethod,MagickFalse,exception);
-    distort_view=AcquireAuthenticCacheView(distort_image);
+    distort_view=AcquireAuthenticCacheView(distort_image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
     #pragma omp parallel for schedule(static,4) shared(progress,status) \
-      dynamic_number_threads(image,image->columns,image->rows,1)
+      magick_threads(image,distort_image,distort_image->rows,1)
 #endif
     for (j=0; j < (ssize_t) distort_image->rows; j++)
     {
@@ -2565,7 +2567,7 @@ MagickExport Image *DistortImage(const Image *image,DistortImageMethod method,
           case DePolarDistortion:
           { /* @D Polar to Carteasain  */
             /* ignore all destination virtual offsets */
-            d.x = ((double)i+0.5)*output_scaling*coeff[6]-coeff[4];
+            d.x = ((double)i+0.5)*output_scaling*coeff[6]+coeff[4];
             d.y = ((double)j+0.5)*output_scaling*coeff[7]+coeff[1];
             s.x = d.y*sin(d.x) + coeff[2];
             s.y = d.y*cos(d.x) + coeff[3];
@@ -3047,10 +3049,10 @@ MagickExport Image *SparseColorImage(const Image *image,
 
     status=MagickTrue;
     progress=0;
-    sparse_view=AcquireAuthenticCacheView(sparse_image);
+    sparse_view=AcquireAuthenticCacheView(sparse_image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
     #pragma omp parallel for schedule(static,4) shared(progress,status) \
-      dynamic_number_threads(image,image->columns,image->rows,1)
+      magick_threads(image,sparse_image,sparse_image->rows,1)
 #endif
     for (j=0; j < (ssize_t) sparse_image->rows; j++)
     {
@@ -3181,13 +3183,17 @@ MagickExport Image *SparseColorImage(const Image *image,
           }
           case VoronoiColorInterpolate:
           default:
-          { /* Just use the closest control point you can find! */
+          {
             size_t
               k;
+
             double
-              minimum = MagickHuge;
+              minimum = MagickMaximumValue;
 
-            for(k=0; k<number_arguments; k+=2+number_colors) {
+            /*
+              Just use the closest control point you can find!
+            */
+            for (k=0; k<number_arguments; k+=2+number_colors) {
               double distance =
                   ((double)i-arguments[ k ])*((double)i-arguments[ k ])
                 + ((double)j-arguments[k+1])*((double)j-arguments[k+1]);