diff options
Diffstat (limited to 'MagickCore/effect.c')
-rw-r--r-- | MagickCore/effect.c | 239 |
1 files changed, 133 insertions, 106 deletions
diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 5344bf536..4b450caac 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -17,7 +17,7 @@ % October 1996 % % % % % -% Copyright 1999-2020 ImageMagick Studio LLC, a non-profit organization % +% Copyright 1999-2021 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 % @@ -152,7 +152,7 @@ MagickExport Image *AdaptiveBlurImage(const Image *image,const double radius, MagickOffsetType progress; - register ssize_t + ssize_t i; size_t @@ -257,13 +257,13 @@ MagickExport Image *AdaptiveBlurImage(const Image *image,const double radius, #endif for (y=0; y < (ssize_t) blur_image->rows; y++) { - register const Quantum + const Quantum *magick_restrict r; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -278,18 +278,18 @@ MagickExport Image *AdaptiveBlurImage(const Image *image,const double radius, } for (x=0; x < (ssize_t) blur_image->columns; x++) { - register const Quantum + const Quantum *magick_restrict p; - register ssize_t + ssize_t i; ssize_t center, j; - j=(ssize_t) ceil((double) width*(1.0-QuantumScale* - GetPixelIntensity(edge_image,r))-0.5); + j=CastDoubleToLong(ceil((double) width*(1.0-QuantumScale* + GetPixelIntensity(edge_image,r))-0.5)); if (j < 0) j=0; else @@ -317,13 +317,13 @@ MagickExport Image *AdaptiveBlurImage(const Image *image,const double radius, blur_traits, traits; - register const double + const double *magick_restrict k; - register const Quantum + const Quantum *magick_restrict pixels; - register ssize_t + ssize_t u; ssize_t @@ -473,7 +473,7 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, MagickOffsetType progress; - register ssize_t + ssize_t i; size_t @@ -578,13 +578,13 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, #endif for (y=0; y < (ssize_t) sharp_image->rows; y++) { - register const Quantum + const Quantum *magick_restrict r; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -599,18 +599,18 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, } for (x=0; x < (ssize_t) sharp_image->columns; x++) { - register const Quantum + const Quantum *magick_restrict p; - register ssize_t + ssize_t i; ssize_t center, j; - j=(ssize_t) ceil((double) width*(1.0-QuantumScale* - GetPixelIntensity(edge_image,r))-0.5); + j=CastDoubleToLong(ceil((double) width*(1.0-QuantumScale* + GetPixelIntensity(edge_image,r))-0.5)); if (j < 0) j=0; else @@ -638,13 +638,13 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, sharp_traits, traits; - register const double + const double *magick_restrict k; - register const Quantum + const Quantum *magick_restrict pixels; - register ssize_t + ssize_t u; ssize_t @@ -860,41 +860,38 @@ static inline double BlurGaussian(const double x,const double sigma) PerceptibleReciprocal(Magick2PI*sigma*sigma)); } -static double **DestroyBilateralThreadSet(double **weights) +static double **DestroyBilateralThreadSet(const ssize_t number_threads, + double **weights) { - register ssize_t + ssize_t i; assert(weights != (double **) NULL); - for (i=0; i < (ssize_t) GetMagickResourceLimit(ThreadResource); i++) + for (i=0; i <= (ssize_t) number_threads; i++) if (weights[i] != (double *) NULL) weights[i]=(double *) RelinquishMagickMemory(weights[i]); weights=(double **) RelinquishMagickMemory(weights); return(weights); } -static double **AcquireBilateralThreadSet(const size_t width, - const size_t height) +static double **AcquireBilateralThreadSet(const size_t number_threads, + const size_t width,const size_t height) { double **weights; - register ssize_t + ssize_t i; - size_t - number_threads; - - number_threads=(size_t) GetMagickResourceLimit(ThreadResource); - weights=(double **) AcquireQuantumMemory(number_threads,sizeof(*weights)); + weights=(double **) AcquireQuantumMemory(number_threads+1,sizeof(*weights)); if (weights == (double **) NULL) return((double **) NULL); (void) memset(weights,0,number_threads*sizeof(*weights)); - for (i=0; i < (ssize_t) number_threads; i++) + for (i=0; i <= (ssize_t) number_threads; i++) { weights[i]=(double *) AcquireQuantumMemory(width,height*sizeof(**weights)); if (weights[i] == (double *) NULL) - return(DestroyBilateralThreadSet(weights)); + return(DestroyBilateralThreadSet(number_threads,weights)); } return(weights); } @@ -903,13 +900,16 @@ MagickExport Image *BilateralBlurImage(const Image *image,const size_t width, const size_t height,const double intensity_sigma,const double spatial_sigma, ExceptionInfo *exception) { -#define BilateralBlurImageTag "Convolve/Image" +#define MaxIntensity (255) +#define BilateralBlurImageTag "Blur/Image" CacheView *blur_view, *image_view; double + intensity_gaussian[2*(MaxIntensity+1)], + *spatial_gaussian, **weights; Image @@ -925,6 +925,15 @@ MagickExport Image *BilateralBlurImage(const Image *image,const size_t width, mid; ssize_t + u; + + ssize_t + n, + number_threads, + v; + + ssize_t + i, y; assert(image != (const Image *) NULL); @@ -941,19 +950,28 @@ MagickExport Image *BilateralBlurImage(const Image *image,const size_t width, blur_image=DestroyImage(blur_image); return((Image *) NULL); } - weights=AcquireBilateralThreadSet(width,height); + number_threads=(size_t) GetMagickResourceLimit(ThreadResource); + weights=AcquireBilateralThreadSet(number_threads,width,height); if (weights == (double **) NULL) { blur_image=DestroyImage(blur_image); ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); } + for (i=(-MaxIntensity); i < MaxIntensity; i++) + intensity_gaussian[i+MaxIntensity]=BlurGaussian((double) i,intensity_sigma); + spatial_gaussian=weights[number_threads]; + n=0; + mid.x=(ssize_t) (width/2L); + mid.y=(ssize_t) (height/2L); + for (v=0; v < (ssize_t) height; v++) + for (u=0; u < (ssize_t) width; u++) + spatial_gaussian[n++]=BlurGaussian(BlurDistance(0,0,u-mid.x,v-mid.y), + spatial_sigma); /* Bilateral blur image. */ status=MagickTrue; progress=0; - mid.x=(ssize_t) (width/2L); - mid.y=(ssize_t) (height/2L); image_view=AcquireVirtualCacheView(image,exception); blur_view=AcquireAuthenticCacheView(blur_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) @@ -965,10 +983,10 @@ MagickExport Image *BilateralBlurImage(const Image *image,const size_t width, const int id = GetOpenMPThreadId(); - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -986,11 +1004,11 @@ MagickExport Image *BilateralBlurImage(const Image *image,const size_t width, gamma, pixel; - register const Quantum + const Quantum *magick_restrict p, *magick_restrict r; - register ssize_t + ssize_t i, u; @@ -1005,19 +1023,26 @@ MagickExport Image *BilateralBlurImage(const Image *image,const size_t width, exception); if (p == (const Quantum *) NULL) break; - p+=(ssize_t) GetPixelChannels(image)*width*mid.y+ - GetPixelChannels(image)*mid.x; + p+=(ssize_t) GetPixelChannels(image)*width*mid.y+GetPixelChannels(image)* + mid.x; n=0; for (v=0; v < (ssize_t) height; v++) { for (u=0; u < (ssize_t) width; u++) { + double + intensity; + r=p+(ssize_t) GetPixelChannels(image)*(ssize_t) width*(mid.y-v)+ GetPixelChannels(image)*(mid.x-u); - weights[id][n]=BlurGaussian(ScaleQuantumToChar( - GetPixelIntensity(image,r))-(double) ScaleQuantumToChar( - GetPixelIntensity(image,p)),intensity_sigma)*BlurGaussian( - BlurDistance(x,y,x+u-mid.x,y+v-mid.y),spatial_sigma); + intensity=ScaleQuantumToChar(GetPixelIntensity(image,r))- + (double) ScaleQuantumToChar(GetPixelIntensity(image,p)); + if ((intensity >= -MaxIntensity) && (intensity <= MaxIntensity)) + weights[id][n]=intensity_gaussian[(ssize_t) intensity+MaxIntensity]* + spatial_gaussian[n]; + else + weights[id][n]=BlurGaussian(intensity,intensity_sigma)* + BlurGaussian(BlurDistance(x,y,x+u-mid.x,y+v-mid.y),spatial_sigma); n++; } } @@ -1109,7 +1134,7 @@ MagickExport Image *BilateralBlurImage(const Image *image,const size_t width, blur_image->type=image->type; blur_view=DestroyCacheView(blur_view); image_view=DestroyCacheView(image_view); - weights=DestroyBilateralThreadSet(weights); + weights=DestroyBilateralThreadSet(number_threads,weights); if (status == MagickFalse) blur_image=DestroyImage(blur_image); return(blur_image); @@ -1193,7 +1218,7 @@ static void Hull(const Image *image,const ssize_t x_offset, const ssize_t y_offset,const size_t columns,const size_t rows, const int polarity,Quantum *magick_restrict f,Quantum *magick_restrict g) { - register Quantum + Quantum *p, *q, *r, @@ -1220,7 +1245,7 @@ static void Hull(const Image *image,const ssize_t x_offset, MagickRealType v; - register ssize_t + ssize_t i, x; @@ -1254,7 +1279,7 @@ static void Hull(const Image *image,const ssize_t x_offset, #endif for (y=0; y < (ssize_t) rows; y++) { - register ssize_t + ssize_t i, x; @@ -1307,7 +1332,7 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) *magick_restrict buffer, *magick_restrict pixels; - register ssize_t + ssize_t i; size_t @@ -1373,7 +1398,7 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) despeckle_traits, traits; - register ssize_t + ssize_t k, x; @@ -1395,7 +1420,7 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) j=(ssize_t) image->columns+2; for (y=0; y < (ssize_t) image->rows; y++) { - register const Quantum + const Quantum *magick_restrict p; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); @@ -1426,7 +1451,7 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) MagickBooleanType sync; - register Quantum + Quantum *magick_restrict q; q=GetCacheViewAuthenticPixels(despeckle_view,0,y,despeckle_image->columns, @@ -1506,7 +1531,7 @@ MagickExport Image *EdgeImage(const Image *image,const double radius, KernelInfo *kernel_info; - register ssize_t + ssize_t i; size_t @@ -1590,7 +1615,7 @@ MagickExport Image *EmbossImage(const Image *image,const double radius, KernelInfo *kernel_info; - register ssize_t + ssize_t i; size_t @@ -1815,10 +1840,10 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, #endif for (y=0; y < (ssize_t) gaussian_image->rows; y++) { - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -1842,7 +1867,7 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, quadrant, target; - register size_t + size_t i; min_variance=MagickMaximumValue; @@ -1858,7 +1883,7 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, mean[MaxPixelChannels], variance; - register ssize_t + ssize_t n; ssize_t @@ -2095,7 +2120,7 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius, *pix, *pixels; - register ssize_t + ssize_t y; ssize_t @@ -2173,10 +2198,10 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius, *pix, *pixels; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; ssize_t @@ -2298,7 +2323,7 @@ static MagickRealType *GetMotionBlurKernel(const size_t width, *kernel, normalize; - register ssize_t + ssize_t i; /* @@ -2349,7 +2374,7 @@ MagickExport Image *MotionBlurImage(const Image *image,const double radius, PointInfo point; - register ssize_t + ssize_t i; size_t @@ -2377,8 +2402,10 @@ MagickExport Image *MotionBlurImage(const Image *image,const double radius, point.y=(double) width*cos(DegreesToRadians(angle)); for (i=0; i < (ssize_t) width; i++) { - offset[i].x=(ssize_t) ceil((double) (i*point.y)/hypot(point.x,point.y)-0.5); - offset[i].y=(ssize_t) ceil((double) (i*point.x)/hypot(point.x,point.y)-0.5); + offset[i].x=CastDoubleToLong(ceil((double) (i*point.y)/ + hypot(point.x,point.y)-0.5)); + offset[i].y=CastDoubleToLong(ceil((double) (i*point.x)/ + hypot(point.x,point.y)-0.5)); } /* Motion blur image. @@ -2417,13 +2444,13 @@ MagickExport Image *MotionBlurImage(const Image *image,const double radius, #endif for (y=0; y < (ssize_t) image->rows; y++) { - register const Quantum + const Quantum *magick_restrict p; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -2438,7 +2465,7 @@ MagickExport Image *MotionBlurImage(const Image *image,const double radius, } for (x=0; x < (ssize_t) image->columns; x++) { - register ssize_t + ssize_t i; for (i=0; i < (ssize_t) GetPixelChannels(image); i++) @@ -2455,13 +2482,13 @@ MagickExport Image *MotionBlurImage(const Image *image,const double radius, blur_traits, traits; - register const Quantum + const Quantum *magick_restrict r; - register MagickRealType + MagickRealType *magick_restrict k; - register ssize_t + ssize_t j; channel=GetPixelChannelChannel(image,i); @@ -2612,7 +2639,7 @@ MagickExport Image *PreviewImage(const Image *image,const PreviewType preview, RectangleInfo geometry; - register ssize_t + ssize_t i, x; @@ -3135,7 +3162,7 @@ MagickExport Image *RotationalBlurImage(const Image *image,const double angle, PointInfo blur_center; - register ssize_t + ssize_t i; size_t @@ -3205,13 +3232,13 @@ MagickExport Image *RotationalBlurImage(const Image *image,const double angle, #endif for (y=0; y < (ssize_t) image->rows; y++) { - register const Quantum + const Quantum *magick_restrict p; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -3232,7 +3259,7 @@ MagickExport Image *RotationalBlurImage(const Image *image,const double angle, PointInfo center; - register ssize_t + ssize_t i; size_t @@ -3265,10 +3292,10 @@ MagickExport Image *RotationalBlurImage(const Image *image,const double angle, blur_traits, traits; - register const Quantum + const Quantum *magick_restrict r; - register ssize_t + ssize_t j; channel=GetPixelChannelChannel(image,i); @@ -3413,7 +3440,7 @@ MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, MagickRealType *kernel; - register ssize_t + ssize_t i; size_t @@ -3454,7 +3481,7 @@ MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, format[MagickPathExtent], *message; - register const MagickRealType + const MagickRealType *k; ssize_t @@ -3527,14 +3554,14 @@ MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, MagickBooleanType sync; - register const Quantum + const Quantum *magick_restrict l, *magick_restrict p; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -3556,7 +3583,7 @@ MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, double intensity; - register ssize_t + ssize_t i; intensity=GetPixelIntensity(image,p+center); @@ -3574,14 +3601,14 @@ MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, blur_traits, traits; - register const MagickRealType + const MagickRealType *magick_restrict k; - register const Quantum + const Quantum *magick_restrict luminance_pixels, *magick_restrict pixels; - register ssize_t + ssize_t u; ssize_t @@ -3806,16 +3833,16 @@ MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, PrimaryInfo normal; - register const Quantum + const Quantum *magick_restrict center, *magick_restrict p, *magick_restrict post, *magick_restrict pre; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -3835,7 +3862,7 @@ MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, normal.z=2.0*(double) QuantumRange; /* constant Z of surface normal */ for (x=0; x < (ssize_t) linear_image->columns; x++) { - register ssize_t + ssize_t i; /* @@ -3984,7 +4011,7 @@ MagickExport Image *SharpenImage(const Image *image,const double radius, KernelInfo *kernel_info; - register ssize_t + ssize_t i; size_t @@ -4144,10 +4171,10 @@ MagickExport Image *SpreadImage(const Image *image, const int id = GetOpenMPThreadId(); - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -4291,13 +4318,13 @@ MagickExport Image *UnsharpMaskImage(const Image *image,const double radius, #endif for (y=0; y < (ssize_t) image->rows; y++) { - register const Quantum + const Quantum *magick_restrict p; - register Quantum + Quantum *magick_restrict q; - register ssize_t + ssize_t x; if (status == MagickFalse) @@ -4312,7 +4339,7 @@ MagickExport Image *UnsharpMaskImage(const Image *image,const double radius, } for (x=0; x < (ssize_t) image->columns; x++) { - register ssize_t + ssize_t i; for (i=0; i < (ssize_t) GetPixelChannels(image); i++) |