]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Wed, 3 Apr 2013 19:10:51 +0000 (19:10 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Wed, 3 Apr 2013 19:10:51 +0000 (19:10 +0000)
MagickCore/colorspace.c
MagickCore/gem-private.h
MagickCore/gem.c

index de57bd9c8fe93f5c2d3bd75c5cb221c4d97a01a6..4a142c44e3ea7aad7fcf315ebc86de4ece22b362 100644 (file)
@@ -137,59 +137,6 @@ static inline void ConvertXYZToLMS(const double x,const double y,
   *S=QuantumRange*s;
 }
 
-static inline void ConvertRGBToXYZ(const double red,const double green,
-  const double blue,double *X,double *Y,double *Z)
-{
-  double
-    b,
-    g,
-    r;
-
-  assert(X != (double *) NULL);
-  assert(Y != (double *) NULL);
-  assert(Z != (double *) NULL);
-  r=QuantumScale*red;
-  g=QuantumScale*green;
-  b=QuantumScale*blue;
-  *X=0.41239558896741421610*r+0.35758343076371481710*g+0.18049264738170157350*b;
-  *Y=0.21258623078559555160*r+0.71517030370341084990*g+0.07220049864333622685*b;
-  *Z=0.01929721549174694484*r+0.11918386458084853180*g+0.95049712513157976600*b;
-}
-
-static inline void ConvertXYZToLab(const double X,const double Y,const double Z,
-  double *L,double *a,double *b)
-{
-#define D65X  (0.950456f)
-#define D65Y  (1.0f)
-#define D65Z  (1.088754f)
-#define CIEEpsilon  (216.0f/24389.0f)
-#define CIEK  (24389.0f/27.0f)
-
-  double
-    x,
-    y,
-    z;
-
-  assert(L != (double *) NULL);
-  assert(a != (double *) NULL);
-  assert(b != (double *) NULL);
-  if ((X/D65X) > CIEEpsilon)
-    x=pow(X/D65X,1.0/3.0);
-  else
-    x=(CIEK*X/D65X+16.0f)/116.0f;
-  if ((Y/D65Y) > CIEEpsilon)
-    y=pow(Y/D65Y,1.0/3.0);
-  else
-    y=(CIEK*Y/D65Y+16.0f)/116.0f;
-  if ((Z/D65Z) > CIEEpsilon)
-    z=pow(Z/D65Z,1.0/3.0);
-  else
-    z=(CIEK*Z/D65Z+16.0f)/116.0f;
-  *L=((116.0f*y)-16.0f)/100.0f;
-  *a=(500.0f*(x-y))/255.0f+0.5f;
-  *b=(200.0f*(y-z))/255.0f+0.5f;
-}
-
 static inline void ConvertXYZToLuv(const double X,const double Y,const double Z,
   double *L,double *u,double *v)
 {
@@ -1794,37 +1741,6 @@ static inline void ConvertLMSToXYZ(const double L,const double M,const double S,
   *Z=(-0.009627608738429)*l-0.005698031216113*m+1.015325639954543*s;
 }
 
-static inline void ConvertLabToXYZ(const double L,const double a,const double b,
-  double *X,double *Y,double *Z)
-{
-  double
-    x,
-    y,
-    z;
-
-  assert(X != (double *) NULL);
-  assert(Y != (double *) NULL);
-  assert(Z != (double *) NULL);
-  y=(100.0f*L+16.0f)/116.0f;
-  x=y+255.0f*(a-0.5f)/500.0f;
-  z=y-255.0f*(b-0.5f)/200.0f;
-  if ((x*x*x) > CIEEpsilon)
-    x=(x*x*x);
-  else
-    x=(116.0f*x-16.0f)/CIEK;
-  if ((y*y*y) > CIEEpsilon)
-    y=(y*y*y);
-  else
-    y=(100.0f*L)/CIEK;
-  if ((z*z*z) > CIEEpsilon)
-    z=(z*z*z);
-  else
-    z=(116.0f*z-16.0f)/CIEK;
-  *X=D65X*x;
-  *Y=D65Y*y;
-  *Z=D65Z*z;
-}
-
 static inline void ConvertLuvToXYZ(const double L,const double u,const double v,
   double *X,double *Y,double *Z)
 {
@@ -1852,28 +1768,6 @@ static inline ssize_t RoundToYCC(const double value)
   return((ssize_t) (value+0.5f));
 }
 
-static inline void ConvertXYZToRGB(const double x,const double y,const double z,
-  double *red,double *green,double *blue)
-{
-  double
-    b,
-    g,
-    r;
-
-  /*
-    Convert XYZ to sRGB colorspace.
-  */
-  assert(red != (double *) NULL);
-  assert(green != (double *) NULL);
-  assert(blue != (double *) NULL);
-  r=3.2406f*x-1.5372f*y-0.4986f*z;
-  g=(-0.9689f*x+1.8758f*y+0.0415f*z);
-  b=0.0557f*x-0.2040f*y+1.0570f*z;
-  *red=QuantumRange*r;
-  *green=QuantumRange*g;
-  *blue=QuantumRange*b;
-}
-
 static inline void ConvertCMYKToRGB(PixelInfo *pixel)
 {
   pixel->red=((QuantumRange-(QuantumScale*pixel->red*
index f4baac18098120f7f0d679a5aba9382c40a79a4a..7dcfafafabf7f104c5be28b96f29543f415f6dc5 100644 (file)
 extern "C" {
 #endif
 
+#define D65X  (0.950456f)
+#define D65Y  (1.0f)
+#define D65Z  (1.088754f)
+#define CIEEpsilon  (216.0f/24389.0f)
+#define CIEK  (24389.0f/27.0f)
+
 extern MagickPrivate double
   GenerateDifferentialNoise(RandomInfo *,const Quantum,const NoiseType,
     const double);
@@ -45,6 +51,106 @@ extern MagickPrivate void
   ConvertRGBToHWB(const double,const double,const double,double *,double *,
     double *);
 
+static inline void ConvertLabToXYZ(const double L,const double a,const double b,
+  double *X,double *Y,double *Z)
+{
+  double
+    x,
+    y,
+    z;
+
+  assert(X != (double *) NULL);
+  assert(Y != (double *) NULL);
+  assert(Z != (double *) NULL);
+  y=(100.0f*L+16.0f)/116.0f;
+  x=y+255.0f*(a-0.5f)/500.0f;
+  z=y-255.0f*(b-0.5f)/200.0f;
+  if ((x*x*x) > CIEEpsilon)
+    x=(x*x*x);
+  else
+    x=(116.0f*x-16.0f)/CIEK;
+  if ((y*y*y) > CIEEpsilon)
+    y=(y*y*y);
+  else
+    y=(100.0f*L)/CIEK;
+  if ((z*z*z) > CIEEpsilon)
+    z=(z*z*z);
+  else
+    z=(116.0f*z-16.0f)/CIEK;
+  *X=D65X*x;
+  *Y=D65Y*y;
+  *Z=D65Z*z;
+}
+
+static inline void ConvertRGBToXYZ(const double red,const double green,
+  const double blue,double *X,double *Y,double *Z)
+{
+  double
+    b,
+    g,
+    r;
+
+  assert(X != (double *) NULL);
+  assert(Y != (double *) NULL);
+  assert(Z != (double *) NULL);
+  r=QuantumScale*red;
+  g=QuantumScale*green;
+  b=QuantumScale*blue;
+  *X=0.41239558896741421610*r+0.35758343076371481710*g+0.18049264738170157350*b;
+  *Y=0.21258623078559555160*r+0.71517030370341084990*g+0.07220049864333622685*b;
+  *Z=0.01929721549174694484*r+0.11918386458084853180*g+0.95049712513157976600*b;
+}
+
+static inline void ConvertXYZToLab(const double X,const double Y,const double Z,
+  double *L,double *a,double *b)
+{
+  double
+    x,
+    y,
+    z;
+  assert(L != (double *) NULL);
+  assert(a != (double *) NULL);
+  assert(b != (double *) NULL);
+  if ((X/D65X) > CIEEpsilon)
+    x=pow(X/D65X,1.0/3.0);
+  else
+    x=(CIEK*X/D65X+16.0f)/116.0f;
+  if ((Y/D65Y) > CIEEpsilon)
+    y=pow(Y/D65Y,1.0/3.0);
+  else
+    y=(CIEK*Y/D65Y+16.0f)/116.0f;
+  if ((Z/D65Z) > CIEEpsilon)
+    z=pow(Z/D65Z,1.0/3.0);
+  else
+    z=(CIEK*Z/D65Z+16.0f)/116.0f;
+  *L=((116.0f*y)-16.0f)/100.0f;
+  *a=(500.0f*(x-y))/255.0f+0.5f;
+  *b=(200.0f*(y-z))/255.0f+0.5f;
+}
+
+static inline void ConvertXYZToRGB(const double x,const double y,const double z,
+  double *red,double *green,double *blue)
+{
+  double
+    b,
+    g,
+    r;
+
+  /*
+    Convert XYZ to sRGB colorspace.
+  */
+  assert(red != (double *) NULL);
+  assert(green != (double *) NULL);
+  assert(blue != (double *) NULL);
+  r=3.2406f*x-1.5372f*y-0.4986f*z;
+  g=(-0.9689f*x+1.8758f*y+0.0415f*z);
+  b=0.0557f*x-0.2040f*y+1.0570f*z;
+  *red=QuantumRange*r;
+  *green=QuantumRange*g;
+  *blue=QuantumRange*b;
+}
+
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif
index 36d466c985627f6fa07e8d205bfa574b6a3b24a9..fb53d08f1a0a6f2012a2c183335a255edab4979f 100644 (file)
@@ -89,13 +89,14 @@ MagickPrivate void ConvertHCLToRGB(const double hue,const double chroma,
   const double luma,double *red,double *green,double *blue)
 {
   double
+    a,
     b,
-    c,
-    g,
-    h,
-    m,
-    r,
-    x;
+    C,
+    H,
+    L,
+    X,
+    Y,
+    Z;
 
   /*
     Convert HCL to RGB colorspace.
@@ -103,51 +104,13 @@ MagickPrivate void ConvertHCLToRGB(const double hue,const double chroma,
   assert(red != (double *) NULL);
   assert(green != (double *) NULL);
   assert(blue != (double *) NULL);
-  h=6.0*hue;
-  c=chroma;
-  x=c*(1.0-fabs(fmod(h,2.0)-1.0));
-  r=0.0;
-  g=0.0;
-  b=0.0;
-  if ((0.0 <= h) && (h < 1.0))
-    {
-      r=c;
-      g=x;
-    }
-  else
-    if ((1.0 <= h) && (h < 2.0))
-      {
-        r=x;
-        g=c;
-      }
-    else
-      if ((2.0 <= h) && (h < 3.0))
-        {
-          g=c;
-          b=x;
-        }
-      else
-        if ((3.0 <= h) && (h < 4.0))
-          {
-            g=x;
-            b=c;
-          }
-        else
-          if ((4.0 <= h) && (h < 5.0))
-            {
-              r=x;
-              b=c;
-            }
-          else
-            if ((5.0 <= h) && (h < 6.0))
-              {
-                r=c;
-                b=x;
-              }
-  m=luma-(0.298839f*r+0.586811f*g+0.114350f*b);
-  *red=QuantumRange*(r+m);
-  *green=QuantumRange*(g+m);
-  *blue=QuantumRange*(b+m);
+  L=luma;
+  C=chroma;
+  H=hue;
+  a=C*cos(360.0*H*(MagickPI/180.0));
+  b=C*sin(360.0*H*(MagickPI/180.0));
+  ConvertLabToXYZ(L,a,b,&X,&Y,&Z);
+  ConvertXYZToRGB(X,Y,Z,red,green,blue);
 }
 \f
 /*
@@ -436,31 +399,18 @@ MagickPrivate void ConvertHWBToRGB(const double hue,const double whiteness,
 %      component of the HCL color space.
 %
 */
-
-static inline double MagickMax(const double x,const double y)
-{
-  if (x > y)
-    return(x);
-  return(y);
-}
-
-static inline double MagickMin(const double x,const double y)
-{
-  if (x < y)
-    return(x);
-  return(y);
-}
-
 MagickPrivate void ConvertRGBToHCL(const double red,const double green,
   const double blue,double *hue,double *chroma,double *luma)
 {
   double
+    a,
     b,
-    c,
-    g,
-    h,
-    max,
-    r;
+    C,
+    H,
+    L,
+    X,
+    Y,
+    Z;
 
   /*
     Convert RGB to HCL colorspace.
@@ -468,26 +418,17 @@ MagickPrivate void ConvertRGBToHCL(const double red,const double green,
   assert(hue != (double *) NULL);
   assert(chroma != (double *) NULL);
   assert(luma != (double *) NULL);
-  r=red;
-  g=green;
-  b=blue;
-  max=MagickMax(r,MagickMax(g,b));
-  c=max-(double) MagickMin(r,MagickMin(g,b));
-  h=0.0;
-  if (c == 0.0)
-    h=0.0;
-  else
-    if (red == max)
-      h=fmod((g-b)/c+6.0,6.0);
-    else
-      if (green == max)
-        h=((b-r)/c)+2.0;
-      else
-        if (blue == max)
-          h=((r-g)/c)+4.0;
-  *hue=(h/6.0);
-  *chroma=QuantumScale*c;
-  *luma=QuantumScale*(0.298839f*r+0.586811f*g+0.114350f*b);
+  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
+  ConvertXYZToLab(X,Y,Z,&L,&a,&b);
+  C=hypot(a,b);
+  H=180.0*atan2(b,a)/MagickPI;
+  if (H < 360.0)
+    H+=360.0;
+  if (H > 360.0)
+    H-=360.0;
+  *hue=H/360.0;
+  *chroma=C;
+  *luma=L;
 }
 \f
 /*
@@ -594,6 +535,21 @@ MagickPrivate void ConvertRGBToHSB(const double red,const double green,
 %      component of the HSL color space.
 %
 */
+
+static inline double MagickMax(const double x,const double y)
+{
+  if (x > y)
+    return(x);
+  return(y);
+}
+
+static inline double MagickMin(const double x,const double y)
+{
+  if (x < y)
+    return(x);
+  return(y);
+}
+
 MagickExport void ConvertRGBToHSL(const double red,const double green,
   const double blue,double *hue,double *saturation,double *lightness)
 {