]> granicus.if.org Git - imagemagick/blobdiff - magick/color-private.h
(no commit message)
[imagemagick] / magick / color-private.h
index 5daeb03c44ebf07182343b051f82081bd2e05439..93b7292bdc740b27f1e3dc041dfb0a016adf42c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization
+  Copyright 1999-2011 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.
@@ -29,14 +29,17 @@ extern "C" {
 static inline MagickBooleanType IsColorEqual(const PixelPacket *p,
   const PixelPacket *q)
 {
-  if ((p->red == q->red) && (p->green == q->green) && (p->blue == q->blue))
+  if ((GetRedPixelComponent(p) == GetRedPixelComponent(q)) &&
+      (GetGreenPixelComponent(p) == GetGreenPixelComponent(q)) &&
+      (GetBluePixelComponent(p) == GetBluePixelComponent(q)))
     return(MagickTrue);
   return(MagickFalse);
 }
 
 static inline MagickBooleanType IsGray(const PixelPacket *pixel)
 {
-  if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
+  if ((GetRedPixelComponent(pixel) == GetGreenPixelComponent(pixel)) &&
+      (GetGreenPixelComponent(pixel) == GetBluePixelComponent(pixel)))
     return(MagickTrue);
   return(MagickFalse);
 }
@@ -44,6 +47,7 @@ static inline MagickBooleanType IsGray(const PixelPacket *pixel)
 static inline MagickBooleanType IsMagickColorEqual(const MagickPixelPacket *p,
   const MagickPixelPacket *q)
 {
+#if !defined(MAGICKCORE_HDRI_SUPPORT)
   if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
       (p->opacity != OpaqueOpacity))
     return(MagickFalse);
@@ -65,6 +69,29 @@ static inline MagickBooleanType IsMagickColorEqual(const MagickPixelPacket *p,
     return(MagickFalse);
   if ((p->colorspace == CMYKColorspace) && (p->index != q->index))
     return(MagickFalse);
+#else
+  if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
+      (fabs(p->opacity-OpaqueOpacity) > 0.5))
+    return(MagickFalse);
+  if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
+      (fabs(q->opacity-OpaqueOpacity)) > 0.5)
+    return(MagickFalse);
+  if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
+    {
+      if (fabs(p->opacity-q->opacity) > 0.5)
+        return(MagickFalse);
+      if (fabs(p->opacity-TransparentOpacity) <= 0.5)
+        return(MagickTrue);
+    }
+  if (fabs(p->red-q->red) > 0.5)
+    return(MagickFalse);
+  if (fabs(p->green-q->green) > 0.5)
+    return(MagickFalse);
+  if (fabs(p->blue-q->blue) > 0.5)
+    return(MagickFalse);
+  if ((p->colorspace == CMYKColorspace) && (fabs(p->index-q->index) > 0.5))
+    return(MagickFalse);
+#endif
   return(MagickTrue);
 }
 
@@ -80,11 +107,7 @@ static inline MagickBooleanType IsMagickGray(const MagickPixelPacket *pixel)
 static inline MagickRealType MagickPixelIntensity(
   const MagickPixelPacket *pixel)
 {
-  MagickRealType
-    intensity;
-
-  intensity=0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue;
-  return(intensity);
+  return((MagickRealType) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue));
 }
 
 static inline Quantum MagickPixelIntensityToQuantum(
@@ -112,29 +135,35 @@ static inline MagickRealType PixelIntensity(const PixelPacket *pixel)
   MagickRealType
     intensity;
 
-  if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
+  if ((GetRedPixelComponent(pixel) == GetGreenPixelComponent(pixel)) &&
+      (GetGreenPixelComponent(pixel) == GetBluePixelComponent(pixel)))
     return((MagickRealType) pixel->red);
-  intensity=(MagickRealType) (0.299*pixel->red+0.587*pixel->green+0.114*
-    pixel->blue);
+  intensity=(MagickRealType) (0.299*GetRedPixelComponent(pixel)+0.587*
+    GetGreenPixelComponent(pixel)+0.114*GetBluePixelComponent(pixel));
   return(intensity);
 }
 
 static inline Quantum PixelIntensityToQuantum(const PixelPacket *pixel)
 {
 #if !defined(MAGICKCORE_HDRI_SUPPORT)
-  if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
-    return(pixel->red);
-#if (MAGICKCORE_QUANTUM_DEPTH <= 16)
-  return((Quantum) ((306U*(unsigned int) pixel->red+
-    601U*(unsigned int) pixel->green+117U*(unsigned int) pixel->blue) >> 10U));
-#else
-  return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue+0.5));
-#endif
+  if ((GetRedPixelComponent(pixel) == GetGreenPixelComponent(pixel)) &&
+      (GetGreenPixelComponent(pixel) == GetBluePixelComponent(pixel)))
+    return(GetRedPixelComponent(pixel));
+  return((Quantum) (0.299*GetRedPixelComponent(pixel)+0.587*
+    GetGreenPixelComponent(pixel)+0.114*GetBluePixelComponent(pixel)+0.5));
 #else
-  if ((fabs(pixel->red-pixel->green) <= MagickEpsilon) &&
-      (fabs(pixel->green-pixel->blue) <= MagickEpsilon))
-    return((Quantum) pixel->red);
-  return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue));
+  {
+    double
+      alpha,
+      beta;
+
+    alpha=GetRedPixelComponent(pixel)-GetGreenPixelComponent(pixel);
+    beta=GetGreenPixelComponent(pixel)-GetBluePixelComponent(pixel);
+    if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
+      return(GetRedPixelComponent(pixel));
+    return((Quantum) (0.299*GetRedPixelComponent(pixel)+0.587*
+      GetGreenPixelComponent(pixel)+0.114*GetBluePixelComponent(pixel)));
+  }
 #endif
 }