]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Thu, 9 Dec 2010 12:34:06 +0000 (12:34 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Thu, 9 Dec 2010 12:34:06 +0000 (12:34 +0000)
magick/color.c

index 3f1bc1be3e91e6c8c9a24236a6485b152f96bbf0..332bd84d9fe023b2cc8bcf418f3fed3b5341160b 100644 (file)
@@ -1553,50 +1553,63 @@ MagickExport MagickBooleanType IsColorSimilar(const Image *image,
     pixel;
 
   register MagickRealType
-    alpha,
-    beta,
+    scale,
     distance;
 
   if ((image->fuzz == 0.0) && (image->matte == MagickFalse))
     return(IsColorEqual(p,q));
-  fuzz=3.0*MagickMax(image->fuzz,MagickSQ1_2)*MagickMax(image->fuzz,
-    MagickSQ1_2);
-  alpha=1.0;
-  beta=1.0;
+  fuzz=MagickMax(image->fuzz,MagickSQ1_2)*MagickMax(image->fuzz,MagickSQ1_2);
+  scale=1.0;
+  distance=0.0;
   if (image->matte != MagickFalse)
     {
-      alpha=(MagickRealType) (QuantumScale*(GetAlphaPixelComponent(p)));
-      beta=(MagickRealType) (QuantumScale*GetAlphaPixelComponent(q));
+      /* transparencies are involved - set alpha distance */
+      pixel = (MagickRealType) (( image->matte != MagickFalse ? p->opacity : OpaqueOpacity )
+            - ( image->matte != MagickFalse ? q->opacity : OpaqueOpacity ));
+      distance=pixel*pixel;
+      if (distance > fuzz)
+        return(MagickFalse);
+
+      /* generate a alpha scaling factor to generate a 4D cone on colorspace
+        Note that if one color is transparent, distance has no color component
+      */
+      if (image->matte != MagickFalse)
+        scale=(QuantumScale*GetAlphaPixelComponent(p));
+      if (image->matte != MagickFalse)
+        scale*=(QuantumScale*GetAlphaPixelComponent(q));
+      if (scale < MagickEpsilon)
+        return(MagickTrue);
     }
+
+  /* RGB or CMY color cube */
+  distance*=3.0;  /* rescale appropriately */
+  fuzz*=3.0;
+
+  pixel=(MagickRealType) p->red-q->red;
   if ((image->colorspace == HSLColorspace) ||
       (image->colorspace == HSBColorspace) ||
       (image->colorspace == HWBColorspace))
     {
+      /* This calculates a arc distance for hue
+         Really if should be a vector angle of 'S'/'W' length
+         with 'L'/'B' forming appropriate cones.
+         In other words this is a hack - Anthony
+      */
       if (fabs((double) (p->red-q->red)) > (QuantumRange/2))
-        {
-          if (p->red > (QuantumRange/2))
-            pixel=alpha*(p->red-QuantumRange)-beta*q->red;
-          else
-            pixel=alpha*p->red-beta*(q->red-QuantumRange);
-        }
-        pixel*=2;
-     }
-  pixel=alpha*p->red-beta*q->red;
-  distance=pixel*pixel;
-  if (distance > fuzz)
-    return(MagickFalse);
-  pixel=alpha*p->green-beta*q->green;
-  distance+=pixel*pixel;
+        pixel=(MagickRealType) p->red-q->red-QuantumRange;
+      pixel*=2;
+    }
+  distance += pixel*pixel*scale;
   if (distance > fuzz)
     return(MagickFalse);
-  pixel=alpha*p->blue-beta*q->blue;
-  distance+=pixel*pixel;
+
+  pixel=(MagickRealType) p->green-q->green;
+  distance+=pixel*pixel*scale;
   if (distance > fuzz)
     return(MagickFalse);
-  pixel=(MagickRealType) OpaqueOpacity;
-  if (image->matte != MagickFalse)
-    pixel=(MagickRealType) p->opacity-q->opacity;
-  distance+=pixel*pixel;
+
+  pixel=(MagickRealType) p->blue-q->blue;
+  distance+=pixel*pixel*scale;
   if (distance > fuzz)
     return(MagickFalse);
   return(MagickTrue);