]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/fx.c
Fix CLUT interpolation method
[imagemagick] / MagickCore / fx.c
index f58c26582ceb2f931b127c5a29e7dd56bd5d4fe6..46875b6be541a6f5612a40874af208ff7edf5f2f 100644 (file)
@@ -48,6 +48,7 @@
 #include "MagickCore/cache-view.h"
 #include "MagickCore/color.h"
 #include "MagickCore/color-private.h"
+#include "MagickCore/colorspace-private.h"
 #include "MagickCore/composite.h"
 #include "MagickCore/decorate.h"
 #include "MagickCore/distort.h"
@@ -642,6 +643,8 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
   const PixelInfo *colorize,ExceptionInfo *exception)
 {
 #define ColorizeImageTag  "Colorize/Image"
+#define Colorize(pixel,blend_percentage,colorize)  \
+  (pixel)=((pixel)*(100.0-(blend_percentage))+(colorize)*(blend_percentage))/100.0;
 
   CacheView
     *colorize_view,
@@ -663,7 +666,7 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
     flags;
 
   PixelInfo
-    fill_color;
+    blend_percentage;
 
   ssize_t
     y;
@@ -686,37 +689,34 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
       colorize_image=DestroyImage(colorize_image);
       return((Image *) NULL);
     }
-  if ((colorize->matte != MagickFalse) &&
-      (colorize_image->matte == MagickFalse))
+  if ((IsGrayColorspace(image->colorspace) != MagickFalse) &&
+      (IsPixelInfoGray(colorize) != MagickFalse))
+    (void) SetImageColorspace(colorize_image,sRGBColorspace,exception);
+  if ((colorize_image->matte == MagickFalse) &&
+      (colorize->matte != MagickFalse))
     (void) SetImageAlpha(colorize_image,OpaqueAlpha,exception);
   if (blend == (const char *) NULL)
     return(colorize_image);
-  /*
-    Determine RGB values of the fill color for pixel
-  */
-  GetPixelInfo(image,&fill_color);
+  GetPixelInfo(image,&blend_percentage);
   flags=ParseGeometry(blend,&geometry_info);
-  fill_color.red=geometry_info.rho;
-  fill_color.green=geometry_info.rho;
-  fill_color.blue=geometry_info.rho;
-  fill_color.black=geometry_info.rho;
-  fill_color.alpha=100.0;
+  blend_percentage.red=geometry_info.rho;
+  blend_percentage.green=geometry_info.rho;
+  blend_percentage.blue=geometry_info.rho;
+  blend_percentage.black=geometry_info.rho;
+  blend_percentage.alpha=100.0;
   if ((flags & SigmaValue) != 0)
-    fill_color.green=geometry_info.sigma;
+    blend_percentage.green=geometry_info.sigma;
   if ((flags & XiValue) != 0)
-    fill_color.blue=geometry_info.xi;
+    blend_percentage.blue=geometry_info.xi;
   if ((flags & PsiValue) != 0)
-    fill_color.alpha=geometry_info.psi;
-  if (fill_color.colorspace == CMYKColorspace)
+    blend_percentage.alpha=geometry_info.psi;
+  if (blend_percentage.colorspace == CMYKColorspace)
     {
       if ((flags & PsiValue) != 0)
-        fill_color.black=geometry_info.psi;
+        blend_percentage.black=geometry_info.psi;
       if ((flags & ChiValue) != 0)
-        fill_color.alpha=geometry_info.chi;
+        blend_percentage.alpha=geometry_info.chi;
     }
-  if ((image->colorspace == GRAYColorspace) &&
-      (IsPixelInfoGray(&fill_color) != MagickFalse))
-    colorize_image->colorspace=sRGBColorspace;
   /*
     Colorize DirectClass image.
   */
@@ -757,17 +757,18 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend,
     GetPixelInfo(image,&pixel);
     for (x=0; x < (ssize_t) image->columns; x++)
     {
+      if (GetPixelMask(colorize_image,q) != 0)
+        {
+          p+=GetPixelChannels(image);
+          q+=GetPixelChannels(colorize_image);
+          continue;
+        }
       GetPixelInfoPixel(image,p,&pixel);
-      pixel.red=(pixel.red*(100.0-fill_color.red)+colorize->red*
-        fill_color.red)/100.0;
-      pixel.green=(pixel.green*(100.0-fill_color.green)+colorize->green*
-        fill_color.green)/100.0;
-      pixel.blue=(pixel.blue*(100.0-fill_color.blue)+colorize->blue*
-        fill_color.blue)/100.0;
-      pixel.black=(pixel.black*(100.0-fill_color.black)+colorize->black*
-        fill_color.black)/100.0;
-      pixel.alpha=(pixel.alpha*(100.0-fill_color.alpha)+colorize->alpha*
-        fill_color.alpha)/100.0;
+      Colorize(pixel.red,blend_percentage.red,colorize->red);
+      Colorize(pixel.green,blend_percentage.green,colorize->green);
+      Colorize(pixel.blue,blend_percentage.blue,colorize->blue);
+      Colorize(pixel.black,blend_percentage.black,colorize->black);
+      Colorize(pixel.alpha,blend_percentage.alpha,colorize->alpha);
       SetPixelInfoPixel(colorize_image,&pixel,q);
       p+=GetPixelChannels(image);
       q+=GetPixelChannels(colorize_image);
@@ -4251,6 +4252,8 @@ MagickExport Image *ShadowImage(const Image *image,const double alpha,
   clone_image=CloneImage(image,0,0,MagickTrue,exception);
   if (clone_image == (Image *) NULL)
     return((Image *) NULL);
+  if (IsGrayColorspace(image->colorspace) != MagickFalse)
+    (void) TransformImageColorspace(clone_image,sRGBColorspace,exception);
   (void) SetImageVirtualPixelMethod(clone_image,EdgeVirtualPixelMethod,
     exception);
   border_info.width=(size_t) floor(2.0*sigma+0.5);