From cc332e32632b5d87d090320f768c2d0777f8860f Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 9 Aug 2015 12:15:50 -0400 Subject: [PATCH] http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=28043 --- Magick++/lib/Image.cpp | 3 +- MagickCore/effect.c | 109 +++++++++++++++---------------- MagickCore/effect.h | 3 +- MagickWand/magick-image.c | 11 ++-- MagickWand/magick-image.h | 2 +- MagickWand/mogrify.c | 3 +- MagickWand/operation.c | 3 +- PerlMagick/Magick.xs | 12 +--- PerlMagick/quantum/quantum.xs.in | 12 +--- coders/msl.c | 2 +- config/configure.xml | 46 +++++++++++++ 11 files changed, 113 insertions(+), 93 deletions(-) create mode 100644 config/configure.xml diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index 60098bdb4..4c68be710 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -4415,8 +4415,7 @@ void Magick::Image::spread(const size_t amount_) *newImage; GetPPException; - newImage=SpreadImage(constImage(),amount_,image()->interpolate, - exceptionInfo); + newImage=SpreadImage(constImage(),amount_,exceptionInfo); replaceImage(newImage); ThrowImageException; } diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 5b374d9eb..dcd7a16f5 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -2250,9 +2250,9 @@ MagickExport Image *PreviewImage(const Image *image,const PreviewType preview, } case SpreadPreview: { - preview_image=SpreadImage(thumbnail,radius,thumbnail->interpolate, - exception); - (void) FormatLocaleString(label,MagickPathExtent,"spread %g",radius+0.5); + preview_image=SpreadImage(thumbnail,radius,exception); + (void) FormatLocaleString(label,MagickPathExtent,"spread %g", + radius+0.5); break; } case SolarizePreview: @@ -3411,7 +3411,7 @@ MagickExport Image *SharpenImage(const Image *image,const double radius, % The format of the SpreadImage method is: % % Image *SpreadImage(const Image *image,const double radius, -% const PixelInterpolateMethod method,ExceptionInfo *exception) +% ExceptionInfo *exception) % % A description of each parameter follows: % @@ -3419,13 +3419,22 @@ MagickExport Image *SharpenImage(const Image *image,const double radius, % % o radius: choose a random pixel in a neighborhood of this extent. % -% o method: the pixel interpolation method. -% % 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; +} + MagickExport Image *SpreadImage(const Image *image,const double radius, - const PixelInterpolateMethod method,ExceptionInfo *exception) + ExceptionInfo *exception) { #define SpreadImageTag "Spread/Image" @@ -3443,7 +3452,7 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, progress; RandomInfo - **restrict random_info; + *restrict random_info; size_t width; @@ -3451,11 +3460,6 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, ssize_t y; -#if defined(MAGICKCORE_OPENMP_SUPPORT) - unsigned long - key; -#endif - /* Initialize spread image attributes. */ @@ -3465,72 +3469,65 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickCoreSignature); - spread_image=CloneImage(image,image->columns,image->rows,MagickTrue, - exception); + spread_image=CloneImage(image,0,0,MagickTrue,exception); if (spread_image == (Image *) NULL) return((Image *) NULL); - if (SetImageStorageClass(spread_image,DirectClass,exception) == MagickFalse) - { - spread_image=DestroyImage(spread_image); - return((Image *) NULL); - } /* Spread image. */ status=MagickTrue; progress=0; width=GetOptimalKernelWidth1D(radius,0.5); - random_info=AcquireRandomInfoThreadSet(); - image_view=AcquireVirtualCacheView(image,exception); + random_info=AcquireRandomInfo(); + image_view=AcquireAuthenticCacheView(spread_image,exception); spread_view=AcquireAuthenticCacheView(spread_image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - key=GetRandomSecretKey(random_info[0]); - #pragma omp parallel for schedule(static,4) shared(progress,status) \ - magick_threads(image,spread_image,image->rows,key == ~0UL) -#endif for (y=0; y < (ssize_t) image->rows; y++) { - const int - id = GetOpenMPThreadId(); - - register Quantum - *restrict q; - register ssize_t x; if (status == MagickFalse) continue; - q=QueueCacheViewAuthenticPixels(spread_view,0,y,spread_image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } for (x=0; x < (ssize_t) image->columns; x++) { - PointInfo - point; - - point.x=GetPseudoRandomValue(random_info[id]); - point.y=GetPseudoRandomValue(random_info[id]); - status=InterpolatePixelChannels(image,image_view,spread_image, - method == UndefinedInterpolatePixel ? NearestInterpolatePixel : method, - (double) x+width*(point.x-0.5),(double) y+width*(point.y-0.5),q, - exception); - q+=GetPixelChannels(spread_image); + register Quantum + *restrict p, + *restrict q; + + register ssize_t + i; + + ssize_t + x_offset, + y_offset; + + for ( ; ; ) + { + x_offset=(ssize_t) (x+width*GetPseudoRandomValue(random_info)); + y_offset=(ssize_t) (y+width*GetPseudoRandomValue(random_info)); + if ((x_offset >= 0) && (x_offset < image->columns) && + (y_offset >= 0) && (y_offset < 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 (SyncCacheViewAuthenticPixels(spread_view,exception) == MagickFalse) - status=MagickFalse; if (image->progress_monitor != (MagickProgressMonitor) NULL) { MagickBooleanType proceed; -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp critical (MagickCore_SpreadImage) -#endif proceed=SetImageProgress(image,SpreadImageTag,progress++,image->rows); if (proceed == MagickFalse) status=MagickFalse; @@ -3538,7 +3535,7 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, } spread_view=DestroyCacheView(spread_view); image_view=DestroyCacheView(image_view); - random_info=DestroyRandomInfoThreadSet(random_info); + 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 8302a8f9e..2c3595247 100644 --- a/MagickCore/effect.h +++ b/MagickCore/effect.h @@ -78,8 +78,7 @@ 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,const PixelInterpolateMethod, - ExceptionInfo *), + *SpreadImage(const Image *,const double,ExceptionInfo *), *UnsharpMaskImage(const Image *,const double,const double,const double, const double,ExceptionInfo *); diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c index 522ac3b45..cdc5bcaf6 100644 --- a/MagickWand/magick-image.c +++ b/MagickWand/magick-image.c @@ -11264,20 +11264,17 @@ WandExport MagickBooleanType MagickSpliceImage(MagickWand *wand, % % The format of the MagickSpreadImage method is: % -% MagickBooleanType MagickSpreadImage(MagickWand *wand,const double radius, -% const PixelInterpolateMethod method) -% +% MagickBooleanType MagickSpreadImage(MagickWand *wand,const double radius) +% % A description of each parameter follows: % % o wand: the magick wand. % % o radius: Choose a random pixel in a neighborhood of this extent. % -% o method: the pixel interpolation method. -% */ WandExport MagickBooleanType MagickSpreadImage(MagickWand *wand, - const double radius,const PixelInterpolateMethod method) + const double radius) { Image *spread_image; @@ -11288,7 +11285,7 @@ WandExport MagickBooleanType MagickSpreadImage(MagickWand *wand, (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); if (wand->images == (Image *) NULL) ThrowWandException(WandError,"ContainsNoImages",wand->name); - spread_image=SpreadImage(wand->images,radius,method,wand->exception); + spread_image=SpreadImage(wand->images,radius,wand->exception); if (spread_image == (Image *) NULL) return(MagickFalse); ReplaceImageInList(&wand->images,spread_image); diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h index fb886542c..1f36650d0 100644 --- a/MagickWand/magick-image.h +++ b/MagickWand/magick-image.h @@ -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,const PixelInterpolateMethod), + MagickSpreadImage(MagickWand *,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 10f20135d..212fea50b 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -2946,8 +2946,7 @@ 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, - interpolate_method,exception); + mogrify_image=SpreadImage(*image,geometry_info.rho,exception); break; } if (LocaleCompare("statistic",option+1) == 0) diff --git a/MagickWand/operation.c b/MagickWand/operation.c index e18705119..dbd4f9397 100644 --- a/MagickWand/operation.c +++ b/MagickWand/operation.c @@ -3320,8 +3320,7 @@ 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,_image->interpolate, - _exception); + new_image=SpreadImage(_image,geometry_info.rho,_exception); break; } if (LocaleCompare("statistic",option+1) == 0) diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs index 428df7d0e..2af911a3e 100644 --- a/PerlMagick/Magick.xs +++ b/PerlMagick/Magick.xs @@ -260,8 +260,7 @@ static struct { "Shear", { {"geometry", StringReference}, {"x", RealReference}, {"y", RealReference}, { "fill", StringReference}, {"color", StringReference} } }, - { "Spread", { {"radius", RealReference}, - {"interpolate", MagickInterpolateOptions} } }, + { "Spread", { {"radius", RealReference} } }, { "Swirl", { {"degrees", RealReference}, {"interpolate", MagickInterpolateOptions} } }, { "Resize", { {"geometry", StringReference}, {"width", IntegerReference}, @@ -8281,16 +8280,9 @@ Mogrify(ref,...) } case 29: /* Spread */ { - PixelInterpolateMethod - method; - if (attribute_flag[0] == 0) argument_list[0].real_reference=1.0; - method=UndefinedInterpolatePixel; - if (attribute_flag[1] != 0) - method=(PixelInterpolateMethod) argument_list[1].integer_reference; - image=SpreadImage(image,argument_list[0].real_reference,method, - exception); + image=SpreadImage(image,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 418ac4fb7..21f4ccd38 100644 --- a/PerlMagick/quantum/quantum.xs.in +++ b/PerlMagick/quantum/quantum.xs.in @@ -260,8 +260,7 @@ static struct { "Shear", { {"geometry", StringReference}, {"x", RealReference}, {"y", RealReference}, { "fill", StringReference}, {"color", StringReference} } }, - { "Spread", { {"radius", RealReference}, - {"interpolate", MagickInterpolateOptions} } }, + { "Spread", { {"radius", RealReference} } }, { "Swirl", { {"degrees", RealReference}, {"interpolate", MagickInterpolateOptions} } }, { "Resize", { {"geometry", StringReference}, {"width", IntegerReference}, @@ -8281,16 +8280,9 @@ Mogrify(ref,...) } case 29: /* Spread */ { - PixelInterpolateMethod - method; - if (attribute_flag[0] == 0) argument_list[0].real_reference=1.0; - method=UndefinedInterpolatePixel; - if (attribute_flag[1] != 0) - method=(PixelInterpolateMethod) argument_list[1].integer_reference; - image=SpreadImage(image,argument_list[0].real_reference,method, - exception); + image=SpreadImage(image,argument_list[0].real_reference,exception); break; } case 30: /* Swirl */ diff --git a/coders/msl.c b/coders/msl.c index 33abebde0..084f78007 100644 --- a/coders/msl.c +++ b/coders/msl.c @@ -6755,7 +6755,7 @@ static void MSLStartElement(void *context,const xmlChar *tag, } } spread_image=SpreadImage(msl_info->image[n],geometry_info.rho, - msl_info->image[n]->interpolate,msl_info->exception); + msl_info->exception); if (spread_image == (Image *) NULL) break; msl_info->image[n]=DestroyImage(msl_info->image[n]); diff --git a/config/configure.xml b/config/configure.xml new file mode 100644 index 000000000..d3c28ccf9 --- /dev/null +++ b/config/configure.xml @@ -0,0 +1,46 @@ + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.40.0