*paint_view;
Image
+ *linear_image,
*paint_image;
MagickBooleanType
assert(exception != (ExceptionInfo *) NULL);
assert(exception->signature == MagickSignature);
width=GetOptimalKernelWidth2D(radius,sigma);
+ linear_image=CloneImage(image,0,0,MagickTrue,exception);
paint_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception);
- if (paint_image == (Image *) NULL)
- return((Image *) NULL);
+ if ((linear_image == (Image *) NULL) || (paint_image == (Image *) NULL))
+ {
+ if (linear_image != (Image *) NULL)
+ linear_image=DestroyImage(linear_image);
+ if (paint_image != (Image *) NULL)
+ linear_image=DestroyImage(paint_image);
+ return((Image *) NULL);
+ }
+ if (image->colorspace == sRGBColorspace)
+ (void) TransformImageColorspace(linear_image,sRGBColorspace,exception);
if (SetImageStorageClass(paint_image,DirectClass,exception) == MagickFalse)
{
+ linear_image=DestroyImage(linear_image);
paint_image=DestroyImage(paint_image);
return((Image *) NULL);
}
histograms=AcquireHistogramThreadSet(NumberPaintBins);
if (histograms == (size_t **) NULL)
{
+ linear_image=DestroyImage(linear_image);
paint_image=DestroyImage(paint_image);
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
}
*/
status=MagickTrue;
progress=0;
- center=(ssize_t) GetPixelChannels(image)*(image->columns+width)*(width/2L)+
- GetPixelChannels(image)*(width/2L);
- image_view=AcquireVirtualCacheView(image,exception);
+ center=(ssize_t) GetPixelChannels(linear_image)*(linear_image->columns+width)*
+ (width/2L)+GetPixelChannels(linear_image)*(width/2L);
+ image_view=AcquireVirtualCacheView(linear_image,exception);
paint_view=AcquireAuthenticCacheView(paint_image,exception);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp parallel for schedule(static,4) shared(progress,status) \
- magick_threads(image,paint_image,image->rows,1)
+ magick_threads(linear_image,paint_image,linear_image->rows,1)
#endif
- for (y=0; y < (ssize_t) image->rows; y++)
+ for (y=0; y < (ssize_t) linear_image->rows; y++)
{
register const Quantum
*restrict p;
if (status == MagickFalse)
continue;
p=GetCacheViewVirtualPixels(image_view,-((ssize_t) width/2L),y-(ssize_t)
- (width/2L),image->columns+width,width,exception);
+ (width/2L),linear_image->columns+width,width,exception);
q=QueueCacheViewAuthenticPixels(paint_view,0,y,paint_image->columns,1,
exception);
if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
continue;
}
histogram=histograms[GetOpenMPThreadId()];
- for (x=0; x < (ssize_t) image->columns; x++)
+ for (x=0; x < (ssize_t) linear_image->columns; x++)
{
register ssize_t
i,
{
for (u=0; u < (ssize_t) width; u++)
{
- n=(ssize_t) ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,
- p+GetPixelChannels(image)*(u+k))));
+ n=(ssize_t) ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(
+ linear_image,p+GetPixelChannels(linear_image)*(u+k))));
histogram[n]++;
if (histogram[n] > count)
{
count=histogram[n];
}
}
- k+=(ssize_t) (image->columns+width);
+ k+=(ssize_t) (linear_image->columns+width);
}
- for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ for (i=0; i < (ssize_t) GetPixelChannels(linear_image); i++)
{
PixelChannel
channel;
paint_traits,
traits;
- channel=GetPixelChannelChannel(image,i);
- traits=GetPixelChannelTraits(image,channel);
+ channel=GetPixelChannelChannel(linear_image,i);
+ traits=GetPixelChannelTraits(linear_image,channel);
paint_traits=GetPixelChannelTraits(paint_image,channel);
if ((traits == UndefinedPixelTrait) ||
(paint_traits == UndefinedPixelTrait))
continue;
if (((paint_traits & CopyPixelTrait) != 0) ||
- (GetPixelMask(image,p) != 0))
+ (GetPixelMask(linear_image,p) != 0))
{
SetPixelChannel(paint_image,channel,p[center+i],q);
continue;
}
- SetPixelChannel(paint_image,channel,p[j*GetPixelChannels(image)+i],q);
+ SetPixelChannel(paint_image,channel,p[j*GetPixelChannels(linear_image)+
+ i],q);
}
- p+=GetPixelChannels(image);
+ p+=GetPixelChannels(linear_image);
q+=GetPixelChannels(paint_image);
}
if (SyncCacheViewAuthenticPixels(paint_view,exception) == MagickFalse)
status=MagickFalse;
- if (image->progress_monitor != (MagickProgressMonitor) NULL)
+ if (linear_image->progress_monitor != (MagickProgressMonitor) NULL)
{
MagickBooleanType
proceed;
#if defined(MAGICKCORE_OPENMP_SUPPORT)
#pragma omp critical (MagickCore_OilPaintImage)
#endif
- proceed=SetImageProgress(image,OilPaintImageTag,progress++,image->rows);
+ proceed=SetImageProgress(linear_image,OilPaintImageTag,progress++,
+ linear_image->rows);
if (proceed == MagickFalse)
status=MagickFalse;
}
paint_view=DestroyCacheView(paint_view);
image_view=DestroyCacheView(image_view);
histograms=DestroyHistogramThreadSet(histograms);
+ linear_image=DestroyImage(linear_image);
+ if (image->colorspace == sRGBColorspace)
+ (void) TransformImageColorspace(paint_image,sRGBColorspace,exception);
if (status == MagickFalse)
paint_image=DestroyImage(paint_image);
return(paint_image);