From efd0e5133efa98185123092320841b2a9dd25fe2 Mon Sep 17 00:00:00 2001 From: Cristy Date: Sat, 12 Jan 2019 10:36:50 -0500 Subject: [PATCH] Account for negative pixels in ShadeImage() --- ChangeLog | 2 +- MagickCore/effect.c | 28 ++++++++++++++-------------- MagickCore/fx.c | 7 +------ 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 58a6b3f7f..bac05ddd4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ 2019-01-08 7.0.8-24 Cristy * Support -clahe option real clip limit (reference https://imagemagick.org/discourse-server/viewtopic.php?f=2&t=35292). - * Edge kernels can return negative pixels, clamp to range (reference + * ShadeImage() kernels can return negative pixels, clamp to range (reference https://github.com/ImageMagick/ImageMagick/issues/1319). * Annotate with negative offsets no longer renders slanted text. diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 14e17040b..a3380f89d 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -1225,8 +1225,6 @@ MagickExport Image *EdgeImage(const Image *image,const double radius, kernel_info->values[i]=(-1.0); kernel_info->values[i/2]=(double) kernel_info->width*kernel_info->height-1.0; edge_image=ConvolveImage(image,kernel_info,exception); - if (edge_image != (Image *) NULL) - (void) ClampImage(edge_image,exception); kernel_info=DestroyKernelInfo(kernel_info); return(edge_image); } @@ -3413,6 +3411,8 @@ MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, const double azimuth,const double elevation,ExceptionInfo *exception) { +#define GetShadeIntensity(image,pixel) \ + ClampPixel(GetPixelIntensity((image),(pixel))) #define ShadeImageTag "Shade/Image" CacheView @@ -3528,19 +3528,19 @@ MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, center=pre+(linear_image->columns+2)*GetPixelChannels(linear_image); post=center+(linear_image->columns+2)*GetPixelChannels(linear_image); normal.x=(double) ( - GetPixelIntensity(linear_image,pre-GetPixelChannels(linear_image))+ - GetPixelIntensity(linear_image,center-GetPixelChannels(linear_image))+ - GetPixelIntensity(linear_image,post-GetPixelChannels(linear_image))- - GetPixelIntensity(linear_image,pre+GetPixelChannels(linear_image))- - GetPixelIntensity(linear_image,center+GetPixelChannels(linear_image))- - GetPixelIntensity(linear_image,post+GetPixelChannels(linear_image))); + GetShadeIntensity(linear_image,pre-GetPixelChannels(linear_image))+ + GetShadeIntensity(linear_image,center-GetPixelChannels(linear_image))+ + GetShadeIntensity(linear_image,post-GetPixelChannels(linear_image))- + GetShadeIntensity(linear_image,pre+GetPixelChannels(linear_image))- + GetShadeIntensity(linear_image,center+GetPixelChannels(linear_image))- + GetShadeIntensity(linear_image,post+GetPixelChannels(linear_image))); normal.y=(double) ( - GetPixelIntensity(linear_image,post-GetPixelChannels(linear_image))+ - GetPixelIntensity(linear_image,post)+ - GetPixelIntensity(linear_image,post+GetPixelChannels(linear_image))- - GetPixelIntensity(linear_image,pre-GetPixelChannels(linear_image))- - GetPixelIntensity(linear_image,pre)- - GetPixelIntensity(linear_image,pre+GetPixelChannels(linear_image))); + GetShadeIntensity(linear_image,post-GetPixelChannels(linear_image))+ + GetShadeIntensity(linear_image,post)+ + GetShadeIntensity(linear_image,post+GetPixelChannels(linear_image))- + GetShadeIntensity(linear_image,pre-GetPixelChannels(linear_image))- + GetShadeIntensity(linear_image,pre)- + GetShadeIntensity(linear_image,pre+GetPixelChannels(linear_image))); if ((fabs(normal.x) <= MagickEpsilon) && (fabs(normal.y) <= MagickEpsilon)) shade=light.z; diff --git a/MagickCore/fx.c b/MagickCore/fx.c index f3e211add..6bcd7ad36 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -595,7 +595,6 @@ MagickExport Image *CharcoalImage(const Image *image,const double radius, { Image *charcoal_image, - *clone_image, *edge_image; assert(image != (Image *) NULL); @@ -604,11 +603,7 @@ MagickExport Image *CharcoalImage(const Image *image,const double radius, (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickCoreSignature); - clone_image=CloneImage(image,0,0,MagickTrue,exception); - if (clone_image == (Image *) NULL) - return((Image *) NULL); - edge_image=EdgeImage(clone_image,radius,exception); - clone_image=DestroyImage(clone_image); + edge_image=EdgeImage(image,radius,exception); if (edge_image == (Image *) NULL) return((Image *) NULL); charcoal_image=BlurImage(edge_image,radius,sigma,exception); -- 2.40.0