Revert -spread behavior
diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp
index 4c68be7..9e16ee7 100644
--- a/Magick++/lib/Image.cpp
+++ b/Magick++/lib/Image.cpp
@@ -4415,7 +4415,7 @@
*newImage;
GetPPException;
- newImage=SpreadImage(constImage(),amount_,exceptionInfo);
+ newImage=SpreadImage(constImage(),image()->interpolate,amount_,exceptionInfo);
replaceImage(newImage);
ThrowImageException;
}
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index e970fd5..c0d73ef 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -2250,7 +2250,8 @@
}
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 @@
%
% 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 @@
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);
-}
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/MagickCore/effect.h b/MagickCore/effect.h
index 2c35952..960a668 100644
--- a/MagickCore/effect.h
+++ b/MagickCore/effect.h
@@ -78,7 +78,8 @@
*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 *);
diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h
index 1f36650..6b59258 100644
--- a/MagickWand/magick-image.h
+++ b/MagickWand/magick-image.h
@@ -296,7 +296,7 @@
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 *),
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index 212fea5..f94a01a 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -2946,7 +2946,8 @@
*/
(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)
diff --git a/MagickWand/operation.c b/MagickWand/operation.c
index dbd4f93..e2174a8 100644
--- a/MagickWand/operation.c
+++ b/MagickWand/operation.c
@@ -3320,7 +3320,8 @@
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)
diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs
index 2af911a..f67af95 100644
--- a/PerlMagick/Magick.xs
+++ b/PerlMagick/Magick.xs
@@ -260,7 +260,8 @@
{ "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 @@
}
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 */
diff --git a/PerlMagick/quantum/quantum.xs.in b/PerlMagick/quantum/quantum.xs.in
index 21f4ccd..b62c061 100644
--- a/PerlMagick/quantum/quantum.xs.in
+++ b/PerlMagick/quantum/quantum.xs.in
@@ -260,7 +260,8 @@
{ "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 @@
}
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 */
diff --git a/coders/msl.c b/coders/msl.c
index 084f780..5ce4f7c 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -6754,7 +6754,8 @@
}
}
}
- 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;