]> granicus.if.org Git - imagemagick/commitdiff
Revert -spread behavior
authorCristy <urban-warrior@imagemagick.org>
Mon, 24 Aug 2015 11:11:48 +0000 (07:11 -0400)
committerCristy <urban-warrior@imagemagick.org>
Mon, 24 Aug 2015 11:11:48 +0000 (07:11 -0400)
Magick++/lib/Image.cpp
MagickCore/effect.c
MagickCore/effect.h
MagickWand/magick-image.h
MagickWand/mogrify.c
MagickWand/operation.c
PerlMagick/Magick.xs
PerlMagick/quantum/quantum.xs.in
coders/msl.c

index 4c68be710d1240d9642430f7d9de7d10dcc543ae..9e16ee732f78bfe6da9459b2128f7fb3228d695a 100644 (file)
@@ -4415,7 +4415,7 @@ void Magick::Image::spread(const size_t amount_)
     *newImage;
 
   GetPPException;
-  newImage=SpreadImage(constImage(),amount_,exceptionInfo);
+  newImage=SpreadImage(constImage(),image()->interpolate,amount_,exceptionInfo);
   replaceImage(newImage);
   ThrowImageException;
 }
index e970fd500c6754a67bfd06dd7951d5feb4be429f..c0d73ef792b4a7ebd026a462f99fbef4dc7eb212 100644 (file)
@@ -2250,7 +2250,8 @@ MagickExport Image *PreviewImage(const Image *image,const PreviewType preview,
       }
       case SpreadPreview:
       {
-        preview_image=SpreadImage(thumbnail,radius,exception);
+        preview_image=SpreadImage(thumbnail,image->interpolate,radius,
+          exception);
         (void) FormatLocaleString(label,MagickPathExtent,"spread %g",
           radius+0.5);
         break;
@@ -3410,30 +3411,22 @@ MagickExport Image *SharpenImage(const Image *image,const double radius,
 %
 %  The format of the SpreadImage method is:
 %
-%      Image *SpreadImage(const Image *image,const double radius,
+%      Image *SpreadImage(const Image *image,
+%        const PixelInterpolateMethod method,const double radius,
 %        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
+%    o method:  intepolation method.
+%
 %    o radius:  choose a random pixel in a neighborhood of this extent.
 %
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-static void inline SwapPixelComponent(Quantum *p,Quantum *q)
-{
-  Quantum
-    pixel;
-
-  pixel=(*p);
-  (*p)=(*q);
-  (*q)=pixel;
-}
-
-static Image *InterpolateSpreadImage(const Image *image,
+MagickExport Image *SpreadImage(const Image *image,
   const PixelInterpolateMethod method,const double radius,
   ExceptionInfo *exception)
 {
@@ -3552,118 +3545,6 @@ static Image *InterpolateSpreadImage(const Image *image,
     spread_image=DestroyImage(spread_image);
   return(spread_image);
 }
-
-MagickExport Image *SpreadImage(const Image *image,const double radius,
-  ExceptionInfo *exception)
-{
-#define SpreadImageTag  "Spread/Image"
-
-  CacheView
-    *image_view,
-    *spread_view;
-
-  Image
-    *spread_image;
-
-  MagickBooleanType
-    status;
-
-  MagickOffsetType
-    progress;
-
-  RandomInfo
-    *restrict random_info;
-
-  size_t
-    width;
-
-  ssize_t
-    y;
-
-  /*
-    Initialize spread image attributes.
-  */
-  assert(image != (Image *) NULL);
-  assert(image->signature == MagickCoreSignature);
-  if (image->debug != MagickFalse)
-    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  assert(exception != (ExceptionInfo *) NULL);
-  assert(exception->signature == MagickCoreSignature);
-  if (image->interpolate != NearestInterpolatePixel)
-    return(InterpolateSpreadImage(image,image->interpolate,radius,exception));
-  spread_image=CloneImage(image,0,0,MagickTrue,exception);
-  if (spread_image == (Image *) NULL)
-    return((Image *) NULL);
-  /*
-    Spread image.
-  */
-  status=MagickTrue;
-  progress=0;
-  width=GetOptimalKernelWidth1D(radius,0.5);
-  random_info=AcquireRandomInfo();
-  image_view=AcquireAuthenticCacheView(spread_image,exception);
-  spread_view=AcquireAuthenticCacheView(spread_image,exception);
-  for (y=0; y < (ssize_t) image->rows; y++)
-  {
-    register ssize_t
-      x;
-
-    if (status == MagickFalse)
-      continue;
-    for (x=0; x < (ssize_t) image->columns; x++)
-    {
-      register Quantum
-        *restrict p,
-        *restrict q;
-
-      register ssize_t
-        i;
-
-      ssize_t
-        x_offset,
-        y_offset;
-
-      for ( ; ; )
-      {
-        x_offset=(ssize_t) floor((double) x+width*
-          (GetPseudoRandomValue(random_info)-0.5));
-        y_offset=(ssize_t) floor((double) y+width*
-          (GetPseudoRandomValue(random_info)-0.5));
-        if ((x_offset >= 0) && (x_offset < (ssize_t) image->columns) &&
-            (y_offset >= 0) && (y_offset < (ssize_t) image->rows))
-          break;
-      }
-      p=GetCacheViewAuthenticPixels(image_view,x_offset,y_offset,1,1,exception);
-      q=GetCacheViewAuthenticPixels(spread_view,x,y,1,1,exception);
-      if ((p == (Quantum *) NULL) || (q == (Quantum *) NULL))
-        {
-          status=MagickFalse;
-          continue;
-        }
-      for (i=0; i < (ssize_t) GetPixelChannels(spread_image); i++)
-        SwapPixelComponent(p+i,q+i);
-      if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
-        status=MagickFalse;
-      if (SyncCacheViewAuthenticPixels(spread_view,exception) == MagickFalse)
-        status=MagickFalse;
-    }
-    if (image->progress_monitor != (MagickProgressMonitor) NULL)
-      {
-        MagickBooleanType
-          proceed;
-
-        proceed=SetImageProgress(image,SpreadImageTag,progress++,image->rows);
-        if (proceed == MagickFalse)
-          status=MagickFalse;
-      }
-  }
-  spread_view=DestroyCacheView(spread_view);
-  image_view=DestroyCacheView(image_view);
-  random_info=DestroyRandomInfo(random_info);
-  if (status == MagickFalse)
-    spread_image=DestroyImage(spread_image);
-  return(spread_image);
-}
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index 2c35952475d83cff446d3195268534397da91bfc..960a668ca38569a39c8fc4df33391a3377aea9df 100644 (file)
@@ -78,7 +78,8 @@ extern MagickExport Image
   *ShadeImage(const Image *,const MagickBooleanType,const double,const double,
     ExceptionInfo *),
   *SharpenImage(const Image *,const double,const double,ExceptionInfo *),
-  *SpreadImage(const Image *,const double,ExceptionInfo *),
+  *SpreadImage(const Image *,const PixelInterpolateMethod,const double,
+    ExceptionInfo *),
   *UnsharpMaskImage(const Image *,const double,const double,const double,
     const double,ExceptionInfo *);
 
index 1f36650d033a0f4a52e40678f89d45de36efa0bb..6b59258c440547d5d26f0f5ab6521e22f2218e7a 100644 (file)
@@ -296,7 +296,7 @@ extern WandExport MagickBooleanType
     const double *),
   MagickSpliceImage(MagickWand *,const size_t,const size_t,const ssize_t,
     const ssize_t),
-  MagickSpreadImage(MagickWand *,const double),
+  MagickSpreadImage(MagickWand *,const PixelInterpolateMethod,const double),
   MagickStatisticImage(MagickWand *,const StatisticType,const size_t,
     const size_t),
   MagickStripImage(MagickWand *),
index 212fea50b7f1beddd999737692844e3ce13ef61a..f94a01ad0b0610bcd02c60b6298a68f8d8b3f369 100644 (file)
@@ -2946,7 +2946,8 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
             */
             (void) SyncImageSettings(mogrify_info,*image,exception);
             (void) ParseGeometry(argv[i+1],&geometry_info);
-            mogrify_image=SpreadImage(*image,geometry_info.rho,exception);
+            mogrify_image=SpreadImage(*image,interpolate_method,
+              geometry_info.rho,exception);
             break;
           }
         if (LocaleCompare("statistic",option+1) == 0)
index dbd4f9397b04f550e69c5cc7f0d120efe35c6758..e2174a8fc1c2b86d7cd25ab1490ffaf0966e3e45 100644 (file)
@@ -3320,7 +3320,8 @@ static MagickBooleanType CLISimpleOperatorImage(MagickCLI *cli_wand,
           flags=ParseGeometry(arg1,&geometry_info);
           if ((flags & RhoValue) == 0)
             CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg2);
-          new_image=SpreadImage(_image,geometry_info.rho,_exception);
+          new_image=SpreadImage(_image,_image->interpolate,geometry_info.rho,
+           _exception);
           break;
         }
       if (LocaleCompare("statistic",option+1) == 0)
index 2af911a3e0191108ad50092cd7c3ad83dc0dc316..f67af95857150982102eda0f861d3501f5ff541b 100644 (file)
@@ -260,7 +260,8 @@ static struct
     { "Shear", { {"geometry", StringReference}, {"x", RealReference},
       {"y", RealReference}, { "fill", StringReference},
       {"color", StringReference} } },
-    { "Spread", { {"radius", RealReference} } },
+    { "Spread", { {"radius", RealReference},
+       {"interpolate", MagickInterpolateOptions } },
     { "Swirl", { {"degrees", RealReference},
       {"interpolate", MagickInterpolateOptions} } },
     { "Resize", { {"geometry", StringReference}, {"width", IntegerReference},
@@ -8280,9 +8281,16 @@ Mogrify(ref,...)
         }
         case 29:  /* Spread */
         {
+          PixelInterpolateMethod
+            method;
+
           if (attribute_flag[0] == 0)
             argument_list[0].real_reference=1.0;
-          image=SpreadImage(image,argument_list[0].real_reference,exception);
+          method=UndefinedInterpolatePixel;
+          if (attribute_flag[1] != 0)
+            method=(PixelInterpolateMethod) argument_list[1].integer_reference;
+          image=SpreadImage(image,method,argument_list[0].real_reference,
+            exception);
           break;
         }
         case 30:  /* Swirl */
index 21f4ccd3878411ef251ffdd126b1522845de1b3c..b62c06113c850e2579b1b6467e9ece824cc43051 100644 (file)
@@ -260,7 +260,8 @@ static struct
     { "Shear", { {"geometry", StringReference}, {"x", RealReference},
       {"y", RealReference}, { "fill", StringReference},
       {"color", StringReference} } },
-    { "Spread", { {"radius", RealReference} } },
+    { "Spread", { {"radius", RealReference},
+      {"interpolate", MagickInterpolateOptions} } },
     { "Swirl", { {"degrees", RealReference},
       {"interpolate", MagickInterpolateOptions} } },
     { "Resize", { {"geometry", StringReference}, {"width", IntegerReference},
@@ -8280,9 +8281,16 @@ Mogrify(ref,...)
         }
         case 29:  /* Spread */
         {
+          PixelInterpolateMethod
+            method;
+
           if (attribute_flag[0] == 0)
             argument_list[0].real_reference=1.0;
-          image=SpreadImage(image,argument_list[0].real_reference,exception);
+          method=UndefinedInterpolatePixel;
+          if (attribute_flag[1] != 0)
+            method=(PixelInterpolateMethod) argument_list[1].integer_reference;
+          image=SpreadImage(image,method,argument_list[0].real_reference,
+            exception);
           break;
         }
         case 30:  /* Swirl */
index 084f78007a0ff3efc7710fd6a735c25d7ffff352..5ce4f7c4546eb880e504a84aeb0be979bd19080a 100644 (file)
@@ -6754,7 +6754,8 @@ static void MSLStartElement(void *context,const xmlChar *tag,
                 }
               }
             }
-          spread_image=SpreadImage(msl_info->image[n],geometry_info.rho,
+          spread_image=SpreadImage(msl_info->image[n],
+            msl_info->image[n]->interpolate,geometry_info.rho,
             msl_info->exception);
           if (spread_image == (Image *) NULL)
             break;