]> granicus.if.org Git - imagemagick/commitdiff
Compose Math Channel Handling Bug fixes
authoranthony <anthony@git.imagemagick.org>
Fri, 7 May 2010 06:37:03 +0000 (06:37 +0000)
committeranthony <anthony@git.imagemagick.org>
Fri, 7 May 2010 06:37:03 +0000 (06:37 +0000)
ChangeLog
magick/composite.c
magick/morphology.c

index 3cc543d67b1e9259c3d778b4e0642e69e072c120..2f424bf82c665eac8401c3012756bc25c27ad5e5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2010-05-07  6.6.1-6 Anthony Thyssen <A.Thyssen@griffith...>
   * Added % and ! modification flags to morphology distance kernel
     scaling factor.
+  * Bug fix for compose math channel handling and morphology diff usage
 
 2010-05-06  6.6.1-6 Cristy  <quetzlzacatenango@image...>
   * Do not claim gray colorspace if gray image includes a non-gray pixel.
index 0200d324aebe162f9e4eea78ae3f915ebba057e7..c811b08914dcf0495f7f0dd284607dd635693ef9 100644 (file)
@@ -389,15 +389,15 @@ static inline void CompositeDarken(const MagickPixelPacket *p,
       composite->index=gamma*Darken(p->index,p->opacity,q->index,q->opacity);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=MagickMax(p->opacity,q->opacity);
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=MagickMin(p->red,q->red);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=MagickMin(p->green,q->green);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=MagickMin(p->blue,q->blue);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=MagickMin(p->index,q->index);
   }
 }
@@ -432,15 +432,15 @@ static inline void CompositeDifference(const MagickPixelPacket *p,
       composite->index=gamma*Difference(p->index,Sa,q->index,Da);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
-      composite->opacity=fabs(p->opacity - q->opacity);
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
+      composite->opacity=QuantumRange-fabs(p->opacity - q->opacity);
+    if ( (channel & RedChannel) != 0 )
       composite->red=fabs(p->red - q->red);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=fabs(p->green - q->green);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=fabs(p->blue - q->blue);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=fabs(p->index - q->index);
   }
 }
@@ -491,18 +491,18 @@ static inline void CompositeDivide(const MagickPixelPacket *p,
         q->index*Da,Da);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange*(1.0-Divide(Sa,1.0,Da,1.0));
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=QuantumRange*
           Divide(QuantumScale*p->red,1.0,QuantumScale*q->red,1.0);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=QuantumRange*
           Divide(QuantumScale*p->green,1.0,QuantumScale*q->green,1.0);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=QuantumRange*
           Divide(QuantumScale*p->blue,1.0,QuantumScale*q->blue,1.0);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=QuantumRange*
           Divide(QuantumScale*p->index,1.0,QuantumScale*q->index,1.0);
   }
@@ -540,18 +540,18 @@ static inline void CompositeExclusion(const MagickPixelPacket *p,
         q->index*Da,Da);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange*(1.0-Exclusion(Sa,1.0,Da,1.0));
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=QuantumRange*
           Exclusion(QuantumScale*p->red,1.0,QuantumScale*q->red,1.0);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=QuantumRange*
           Exclusion(QuantumScale*p->green,1.0,QuantumScale*q->green,1.0);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=QuantumRange*
           Exclusion(QuantumScale*p->blue,1.0,QuantumScale*q->blue,1.0);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=QuantumRange*
           Exclusion(QuantumScale*p->index,1.0,QuantumScale*q->index,1.0);
   }
@@ -689,15 +689,15 @@ static inline void CompositeLighten(const MagickPixelPacket *p,
       composite->index=gamma*Lighten(p->index,p->opacity,q->index,q->opacity);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=MagickMin(p->opacity,q->opacity);
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=MagickMax(p->red,q->red);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=MagickMax(p->green,q->green);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=MagickMax(p->blue,q->blue);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=MagickMax(p->index,q->index);
   }
 }
@@ -868,18 +868,18 @@ static inline void CompositeMathematics(const MagickPixelPacket *p,
         q->index*Da,Da,args);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange*(1.0-Mathematics(Sa,1.0,Da,1.0,args));
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=QuantumRange*
           Mathematics(QuantumScale*p->red,1.0,QuantumScale*q->red,1.0,args);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=QuantumRange*
           Mathematics(QuantumScale*p->green,1.0,QuantumScale*q->green,1.0,args);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=QuantumRange*
           Mathematics(QuantumScale*p->blue,1.0,QuantumScale*q->blue,1.0,args);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=QuantumRange*
           Mathematics(QuantumScale*p->index,1.0,QuantumScale*q->index,1.0,args);
   }
@@ -909,21 +909,22 @@ static inline void CompositePlus(const MagickPixelPacket *p,
     MagickPixelCompositePlus(p,p->opacity,q,q->opacity,composite);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=p->opacity+q->opacity-QuantumRange;
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=p->red+q->red;
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=p->green+q->green;
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=p->blue+q->blue;
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=p->index+q->index;
   }
 }
 
 static inline MagickRealType Minus(const MagickRealType Sca,
-  const MagickRealType Sa,const MagickRealType Dca,const MagickRealType Da)
+  const MagickRealType Sa,const MagickRealType Dca,
+  const MagickRealType magick_unused(Da))
 {
   return(Sca + Dca - 2*Dca*Sa);
 }
@@ -950,15 +951,15 @@ static inline void CompositeMinus(const MagickPixelPacket *p,
       composite->index=gamma*Minus(p->index*Sa,Sa,q->index*Da,Da);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange*(1.0-(Sa-Da));
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=p->red-q->red;
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=p->green-q->green;
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=p->blue-q->blue;
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=p->index-q->index;
   }
 }
@@ -997,16 +998,16 @@ static inline void CompositeModulusAdd(const MagickPixelPacket *p,
       composite->index=ModulusAdd(p->index,Sa,q->index,Da);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange-ModulusAdd(QuantumRange-p->opacity,
            1.0,QuantumRange-q->opacity,1.0);
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=ModulusAdd(p->red,1.0,q->red,1.0);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=ModulusAdd(p->green,1.0,q->green,1.0);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=ModulusAdd(p->blue,1.0,q->blue,1.0);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=ModulusAdd(p->index,1.0,q->index,1.0);
   }
 }
@@ -1045,16 +1046,16 @@ static inline void CompositeModulusSubtract(const MagickPixelPacket *p,
       composite->index=ModulusSubtract(p->index,Sa,q->index,Da);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange-ModulusSubtract(QuantumRange-p->opacity,
            1.0,QuantumRange-q->opacity,1.0);
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=ModulusSubtract(p->red,1.0,q->red,1.0);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=ModulusSubtract(p->green,1.0,q->green,1.0);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=ModulusSubtract(p->blue,1.0,q->blue,1.0);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=ModulusSubtract(p->index,1.0,q->index,1.0);
   }
 }
@@ -1091,15 +1092,15 @@ static inline void CompositeMultiply(const MagickPixelPacket *p,
         q->index*Da,Da);
   }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange*(1.0-Sa*Da);
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=QuantumScale*p->red*q->red;
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=QuantumScale*p->green*q->green;
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=QuantumScale*p->blue*q->blue;
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=QuantumScale*p->index*q->index;
   }
 }
@@ -1243,18 +1244,18 @@ static inline void CompositeScreen(const MagickPixelPacket *p,
       composite->index=gamma*Screen(p->index*Sa,q->index*Da);
     }
   else { /* handle channels as separate grayscale channels */
-    if ( (channel | AlphaChannel) != 0 )
+    if ( (channel & AlphaChannel) != 0 )
       composite->opacity=QuantumRange*(1.0-Screen(Sa,Da));
-    if ( (channel | RedChannel) != 0 )
+    if ( (channel & RedChannel) != 0 )
       composite->red=QuantumRange*Screen(QuantumScale*p->red,
            QuantumScale*q->red);
-    if ( (channel | GreenChannel) != 0 )
+    if ( (channel & GreenChannel) != 0 )
       composite->green=QuantumRange*Screen(QuantumScale*p->green,
            QuantumScale*q->green);
-    if ( (channel | BlueChannel) != 0 )
+    if ( (channel & BlueChannel) != 0 )
       composite->blue=QuantumRange*Screen(QuantumScale*p->blue,
            QuantumScale*q->blue);
-    if ( (channel | IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+    if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
       composite->index=QuantumRange*Screen(QuantumScale*p->index,
            QuantumScale*q->index);
   }
@@ -1905,7 +1906,7 @@ MagickExport MagickBooleanType CompositeImageChannel(Image *image,
            Displace offset relative to a fixed absolute point
            Select that point according to +X+Y user inputs.
            default = center of overlay image
-           flag '!' = locations/percentage relative to background image
+           arg flag '!' = locations/percentage relative to background image
       */
       center.x=(MagickRealType) x_offset;
       center.y=(MagickRealType) y_offset;
index f688a00c79e05c435fac04d7964c9874ac894243..89eed86d0541546c93685b85fbd4764fbd67ef27 100644 (file)
@@ -1341,7 +1341,8 @@ static unsigned long MorphologyApply(const Image *image, Image
                 Minimize(result.red,     (double) k_pixels[u].red);
                 Minimize(result.green,   (double) k_pixels[u].green);
                 Minimize(result.blue,    (double) k_pixels[u].blue);
-                Minimize(result.opacity, QuantumRange-(double) k_pixels[u].opacity);
+                Minimize(result.opacity,
+                            QuantumRange-(double) k_pixels[u].opacity);
                 if ( image->colorspace == CMYKColorspace)
                   Minimize(result.index,   (double) k_indexes[u]);
               }
@@ -1371,7 +1372,8 @@ static unsigned long MorphologyApply(const Image *image, Image
                 Maximize(result.red,     (double) k_pixels[u].red);
                 Maximize(result.green,   (double) k_pixels[u].green);
                 Maximize(result.blue,    (double) k_pixels[u].blue);
-                Maximize(result.opacity, QuantumRange-(double) k_pixels[u].opacity);
+                Maximize(result.opacity,
+                            QuantumRange-(double) k_pixels[u].opacity);
                 if ( image->colorspace == CMYKColorspace)
                   Maximize(result.index,   (double) k_indexes[u]);
               }