]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/composite.c
(no commit message)
[imagemagick] / MagickCore / composite.c
index fa9d3d79b6e3d7414bc49b6c0622e03afbf08ff6..d604805b56d59fac1bc8555ffd647bd6b901edd0 100644 (file)
 %                     MagickCore Image Composite Methods                      %
 %                                                                             %
 %                              Software Design                                %
-%                                John Cristy                                  %
+%                                   Cristy                                    %
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -45,6 +45,7 @@
 #include "MagickCore/cache.h"
 #include "MagickCore/cache-private.h"
 #include "MagickCore/cache-view.h"
+#include "MagickCore/channel.h"
 #include "MagickCore/client.h"
 #include "MagickCore/color.h"
 #include "MagickCore/color-private.h"
@@ -220,8 +221,7 @@ static void HCLComposite(const MagickRealType hue,const MagickRealType chroma,
     h,
     m,
     r,
-    x,
-    z;
+    x;
 
   /*
     Convert HCL to RGB colorspace.
@@ -271,21 +271,9 @@ static void HCLComposite(const MagickRealType hue,const MagickRealType chroma,
                 b=x;
               }
   m=luma-(0.298839*r+0.586811*g+0.114350*b);
-  z=1.0;
-  if (m < 0.0)
-    {
-      z=luma/(luma-m);
-      m=0.0;
-    }
-  else
-    if (m+c > 1.0)
-      {
-        z=(1.0-luma)/(m+c-luma);
-        m=1.0-z*c;
-      }
-  *red=QuantumRange*(z*r+m);
-  *green=QuantumRange*(z*g+m);
-  *blue=QuantumRange*(z*b+m);
+  *red=QuantumRange*(r+m);
+  *green=QuantumRange*(g+m);
+  *blue=QuantumRange*(b+m);
 }
 
 static void CompositeHCL(const MagickRealType red,const MagickRealType green,
@@ -1733,12 +1721,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           }
           case ColorDodgeCompositeOp:
           {
-            if ((fabs(Sca-Sa) < MagickEpsilon) && (fabs(Dca) < MagickEpsilon))
-              {
-                pixel=QuantumRange*gamma*(Sca*(1.0-Da)+Dca*(1.0-Sa));
-                break;
-              }
-            if (fabs(Sca-Sa) < MagickEpsilon)
+            if ((Sca*Da+Dca*Sa) >= Sa*Da)
               {
                 pixel=QuantumRange*gamma*(Sa*Da+Sca*(1.0-Da)+Dca*(1.0-Sa));
                 break;
@@ -1782,7 +1765,8 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           case CopyBlackCompositeOp:
           {
             if (channel == BlackPixelChannel)
-              pixel=(MagickRealType) GetPixelBlack(composite_image,p);
+              pixel=(MagickRealType) (QuantumRange-
+                GetPixelBlack(composite_image,p));
             break;
           }
           case CopyBlueCompositeOp:
@@ -2093,16 +2077,16 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           {
             pixel=Sc+Dc;
             if (pixel > QuantumRange)
-              pixel-=(QuantumRange+1.0);
-            pixel=gamma*(pixel*Sa*Da+Sa*Sc*(1.0-Da)+Da*Dc*(1.0-Sa));
+              pixel-=QuantumRange;
+            pixel=gamma*(Sa*Da*pixel+Sa*Sc*(1.0-Da)+Da*Dc*(1.0-Sa));
             break;
           }
           case ModulusSubtractCompositeOp:
           {
             pixel=Sc-Dc;
             if (pixel < 0.0)
-              pixel+=(QuantumRange+1.0);
-            pixel=gamma*(pixel*Sa*Da+Sa*Sc*(1.0-Da)+Da*Dc*(1.0-Sa));
+              pixel+=QuantumRange;
+            pixel=gamma*(Sa*Da*pixel+Sa*Sc*(1.0-Da)+Da*Dc*(1.0-Sa));
             break;
           }
           case MultiplyCompositeOp: