]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/composite.c
(no commit message)
[imagemagick] / MagickCore / composite.c
index b146756254ff9aff051944fd1357e4d0937b98c6..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"
@@ -269,7 +270,7 @@ static void HCLComposite(const MagickRealType hue,const MagickRealType chroma,
                 r=c;
                 b=x;
               }
-  m=luma-(0.298839f*r+0.586811f*g+0.114350f*b);
+  m=luma-(0.298839*r+0.586811*g+0.114350*b);
   *red=QuantumRange*(r+m);
   *green=QuantumRange*(g+m);
   *blue=QuantumRange*(b+m);
@@ -303,7 +304,7 @@ static void CompositeHCL(const MagickRealType red,const MagickRealType green,
     h=0.0;
   else
     if (red == max)
-      h=fmod(6.0+(g-b)/c,6.0);
+      h=fmod((g-b)/c+6.0,6.0);
     else
       if (green == max)
         h=((b-r)/c)+2.0;
@@ -312,7 +313,7 @@ static void CompositeHCL(const MagickRealType red,const MagickRealType green,
           h=((r-g)/c)+4.0;
   *hue=(h/6.0);
   *chroma=QuantumScale*c;
-  *luma=QuantumScale*(0.298839f*r+0.586811f*g+0.114350f*b);
+  *luma=QuantumScale*(0.298839*r+0.586811*g+0.114350*b);
 }
 
 static MagickBooleanType CompositeOverImage(Image *image,
@@ -1720,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;
@@ -1769,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:
@@ -2080,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: