]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/composite.c
(no commit message)
[imagemagick] / MagickCore / composite.c
index c4e807ea3c4746af5b9ee2bf90411b98676c6616..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,
@@ -431,7 +432,7 @@ static MagickBooleanType CompositeOverImage(Image *image,
               Sc: source color.
               Dc: destination color.
           */
-          if (GetPixelMask(image,q) == 0)
+          if (GetPixelReadMask(image,q) == 0)
             {
               q+=GetPixelChannels(image);
               continue;
@@ -457,7 +458,7 @@ static MagickBooleanType CompositeOverImage(Image *image,
           Sa:  normalized source alpha.
           Da:  normalized destination alpha.
       */
-      if (GetPixelMask(composite_image,p) == 0)
+      if (GetPixelReadMask(composite_image,p) == 0)
         {
           p+=GetPixelChannels(composite_image);
           channels=GetPixelChannels(composite_image);
@@ -647,7 +648,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           register ssize_t
             i;
 
-          if (GetPixelMask(composite_image,p) == 0)
+          if (GetPixelReadMask(composite_image,p) == 0)
             {
               p+=GetPixelChannels(composite_image);
               q+=GetPixelChannels(image);
@@ -1287,7 +1288,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           */
           (void) GetOneVirtualPixel(composite_image,x-x_offset,y-y_offset,
             source,exception);
-          if (GetPixelMask(image,q) == 0)
+          if (GetPixelReadMask(image,q) == 0)
             {
               q+=GetPixelChannels(image);
               continue;
@@ -1453,7 +1454,7 @@ MagickExport MagickBooleanType CompositeImage(Image *image,
           break;
         }
       }
-      if (GetPixelMask(image,q) == 0)
+      if (GetPixelReadMask(image,q) == 0)
         {
           p+=GetPixelChannels(composite_image);
           q+=GetPixelChannels(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:
@@ -2365,7 +2362,8 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture,
     exception);
   status=MagickTrue;
   if ((image->compose != CopyCompositeOp) &&
-      ((image->compose != OverCompositeOp) || (image->alpha_trait == BlendPixelTrait) ||
+      ((image->compose != OverCompositeOp) ||
+       (image->alpha_trait == BlendPixelTrait) ||
        (texture_image->alpha_trait == BlendPixelTrait)))
     {
       /*
@@ -2461,7 +2459,7 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture,
         register ssize_t
           i;
 
-        if (GetPixelMask(image,q) == 0)
+        if (GetPixelReadMask(image,q) == 0)
           {
             p+=GetPixelChannels(texture_image);
             q+=GetPixelChannels(image);