From 404d0da35379e582eac5248a1b44184decd13eef Mon Sep 17 00:00:00 2001 From: cristy Date: Thu, 20 Dec 2012 13:04:30 +0000 Subject: [PATCH] --- MagickCore/paint.c | 57 ++++++++++++++++++++++++++++---------------- MagickCore/version.h | 4 ++-- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/MagickCore/paint.c b/MagickCore/paint.c index a5b09f1c7..00c2a35f8 100644 --- a/MagickCore/paint.c +++ b/MagickCore/paint.c @@ -540,6 +540,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, *paint_view; Image + *linear_image, *paint_image; MagickBooleanType @@ -566,17 +567,28 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, 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"); } @@ -585,15 +597,15 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, */ 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; @@ -610,7 +622,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, 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)) @@ -619,7 +631,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, 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, @@ -645,8 +657,8 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, { 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) { @@ -654,9 +666,9 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, 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; @@ -665,26 +677,27 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, 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; @@ -692,7 +705,8 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, #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; } @@ -700,6 +714,9 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, 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); diff --git a/MagickCore/version.h b/MagickCore/version.h index 51fa8183d..65e0fac67 100644 --- a/MagickCore/version.h +++ b/MagickCore/version.h @@ -27,14 +27,14 @@ extern "C" { */ #define MagickPackageName "ImageMagick" #define MagickCopyright "Copyright (C) 1999-2013 ImageMagick Studio LLC" -#define MagickSVNRevision "10255:10277M" +#define MagickSVNRevision "10302:10324M" #define MagickLibVersion 0x700 #define MagickLibVersionText "7.0.0" #define MagickLibVersionNumber 8,0,0 #define MagickLibAddendum "-0" #define MagickLibInterface 8 #define MagickLibMinInterface 8 -#define MagickReleaseDate "2012-12-17" +#define MagickReleaseDate "2012-12-20" #define MagickChangeDate "20121005" #define MagickAuthoritativeURL "http://www.imagemagick.org" #if defined(MAGICKCORE_OPENMP_SUPPORT) -- 2.40.0