*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)
{
*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)
{
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*
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);
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
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.
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
/*
% 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.
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
/*
% 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)
{