Changed default values for LocalContrastImage and added a fix for a negative radius.
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index 661a2c3..e9f86a8 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -1691,7 +1691,8 @@
ssize_t
scanLineSize,
- thread_count;
+ thread_count,
+ width;
/*
Initialize contrast image attributes.
@@ -1716,6 +1717,7 @@
image_view=AcquireVirtualCacheView(image,exception);
contrast_view=AcquireAuthenticCacheView(contrast_image,exception);
thread_count=1;
+ width=fabs(radius);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp parallel magick_threads(image,image,image->rows,1)
{
@@ -1726,7 +1728,7 @@
}
#endif
scanLineSize=(ssize_t) MagickMax(image->columns,image->rows);
- scanLineSize+=(2*radius);
+ scanLineSize+=(2*width);
scanLinePixels_info=AcquireVirtualMemory(thread_count*scanLineSize,
sizeof(*scanLinePixels));
if (scanLinePixels_info == (MemoryInfo *) NULL)
@@ -1738,7 +1740,7 @@
}
scanLinePixels=(float *) GetVirtualMemoryBlob(scanLinePixels_info);
/* Create intermediate buffer */
- interImage_info=AcquireVirtualMemory((image->rows+(2*radius))*image->columns,
+ interImage_info=AcquireVirtualMemory((image->rows+(2*width))*image->columns,
sizeof(*interImage));
if (interImage_info == (MemoryInfo *) NULL)
{
@@ -1749,7 +1751,7 @@
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
}
interImage=(float *) GetVirtualMemoryBlob(interImage_info);
- totalWeight=(radius+1)*(radius+1);
+ totalWeight=(width+1)*(width+1);
/* Vertical Pass */
{
@@ -1781,16 +1783,16 @@
pixels+=scanLineSize*omp_get_thread_num();
#endif
pix=pixels;
- p=GetCacheViewVirtualPixels(image_view,x,-radius,1,image->rows+
- (2*radius),exception);
+ p=GetCacheViewVirtualPixels(image_view,x,-width,1,image->rows+(2*width),
+ exception);
- for (y=0; y < (ssize_t) image->rows+(2*radius); y++)
+ for (y=0; y < (ssize_t) image->rows+(2*width); y++)
{
*pix++=(float)GetPixelLuma(image,p);
p+=image->number_channels;
}
- out=interImage+x+(size_t) radius;
+ out=interImage+x+width;
for (y = 0; y < (ssize_t) image->rows; y++)
{
@@ -1801,12 +1803,12 @@
weight=1.0f;
sum=0;
pix=pixels+y;
- for (i=0; i < radius; i++)
+ for (i=0; i < width; i++)
{
sum+=weight*(*pix++);
weight+=1.0f;
}
- for (i=radius+1; i < (2*radius); i++)
+ for (i=width+1; i < (2*width); i++)
{
sum+=weight*(*pix++);
weight-=1.0f;
@@ -1814,12 +1816,12 @@
/* write to output */
*out=sum/totalWeight;
/* mirror into padding */
- if (x <= radius && x != 0)
+ if (x <= width && x != 0)
*(out-(x*2))=*out;
- if ((x > image->columns-radius-2) && (x != (ssize_t) image->columns-1))
+ if ((x > image->columns-width-2) && (x != (ssize_t) image->columns-1))
*(out+((image->columns-x-1)*2))=*out;
- out+=image->columns+((size_t) radius*2);
+ out+=image->columns+(width*2);
}
}
}
@@ -1859,8 +1861,8 @@
q=GetCacheViewAuthenticPixels(contrast_view,0,y,image->columns,1,
exception);
- memcpy(pixels,interImage+(y*(image->columns+(2*(size_t) radius))),
- (image->columns+(2*radius))*sizeof(float));
+ memcpy(pixels,interImage+(y*(image->columns+(2*width))),(image->columns+
+ (2*width))*sizeof(float));
for (x=0; x < (ssize_t) image->columns; x++)
{
@@ -1873,12 +1875,12 @@
weight=1.0f;
sum=0;
pix=pixels+x;
- for (i=0; i < radius; i++)
+ for (i=0; i < width; i++)
{
sum+=weight*(*pix++);
weight+=1.0f;
}
- for (i=radius+1; i < (2*radius); i++)
+ for (i=width+1; i < (2*width); i++)
{
sum+=weight*(*pix++);
weight-=1.0f;