]> granicus.if.org Git - imagemagick/commitdiff
Account for negative pixels in ShadeImage()
authorCristy <urban-warrior@imagemagick.org>
Sat, 12 Jan 2019 15:36:50 +0000 (10:36 -0500)
committerCristy <urban-warrior@imagemagick.org>
Sat, 12 Jan 2019 15:36:50 +0000 (10:36 -0500)
ChangeLog
MagickCore/effect.c
MagickCore/fx.c

index 58a6b3f7f5118f6f2a2233c6526f9e29bec1fa2d..bac05ddd437e89fd0711ba168cdda3f3d7f8da30 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,7 @@
 2019-01-08  7.0.8-24 Cristy  <quetzlzacatenango@image...>
   * 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.
 
index 14e17040ba83ea4d3b1467ae354f7eb0bf449387..a3380f89ddde0ed8ce794461fee5196a9fac4cb8 100644 (file)
@@ -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;
index f3e211addaa23b9b43d653c0ab1802732b7d0c88..6bcd7ad368d75b936f4b243e6ea986ccd7432860 100644 (file)
@@ -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);