summaryrefslogtreecommitdiff
path: root/MagickCore/effect.c
diff options
context:
space:
mode:
Diffstat (limited to 'MagickCore/effect.c')
-rw-r--r--MagickCore/effect.c239
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++)