const double intensity,double *red,double *green,double *blue)
{
double
- h;
+ b,
+ g,
+ h,
+ r;
/*
Convert HSI to RGB colorspace.
h-=360.0*floor(h/360.0);
if (h < 120.0)
{
- *blue=intensity*(1.0-saturation);
- *red=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
+ b=intensity*(1.0-saturation);
+ r=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
(MagickPI/180.0)));
- *green=3.0*intensity-*red-*blue;
+ g=3.0*intensity-r-b;
}
else
if (h < 240.0)
{
h-=120.0;
- *red=intensity*(1.0-saturation);
- *green=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
+ r=intensity*(1.0-saturation);
+ g=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
(MagickPI/180.0)));
- *blue=3.0*intensity-*red-*green;
+ b=3.0*intensity-r-g;
}
else
{
h-=240.0;
- *green=intensity*(1.0-saturation);
- *blue=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
+ g=intensity*(1.0-saturation);
+ b=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
(MagickPI/180.0)));
- *red=3.0*intensity-*green-*blue;
+ r=3.0*intensity-g-b;
}
- *red*=QuantumRange;
- *green*=QuantumRange;
- *blue*=QuantumRange;
+ *red=QuantumRange*r;
+ *green=QuantumRange*g;
+ *blue=QuantumRange*b;
}
\f
/*
% o red, green, blue: A pointer to a pixel component of type Quantum.
%
*/
+
+static inline void ConvertLCHabToXYZ(const double luma,const double chroma,
+ const double hue,double *X,double *Y,double *Z)
+{
+ ConvertLabToXYZ(luma,chroma*cos(hue*MagickPI/180.0),chroma*
+ sin(hue*MagickPI/180.0),X,Y,Z);
+}
+
MagickPrivate void ConvertLCHabToRGB(const double luma,const double chroma,
const double hue,double *red,double *green,double *blue)
{
double
- a,
- b,
- C,
- H,
- L,
X,
Y,
Z;
assert(red != (double *) NULL);
assert(green != (double *) NULL);
assert(blue != (double *) NULL);
- 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(((116.0*L)-16.0)/100.0,(500.0*a)/255.0+0.5,(200.0*b)/255.0+
- 0.5,&X,&Y,&Z);
+ ConvertLCHabToXYZ(100.0*luma,255.0*(chroma-0.5),360.0*(hue-0.5),&X,&Y,&Z);
ConvertXYZToRGB(X,Y,Z,red,green,blue);
}
\f
% o red, green, blue: A pointer to a pixel component of type Quantum.
%
*/
+
+static inline void ConvertLCHuvToXYZ(const double luma,const double chroma,
+ const double hue,double *X,double *Y,double *Z)
+{
+ ConvertLuvToXYZ(luma,chroma*cos(hue*MagickPI/180.0),chroma*
+ sin(hue*MagickPI/180.0),X,Y,Z);
+}
+
MagickPrivate void ConvertLCHuvToRGB(const double luma,const double chroma,
const double hue,double *red,double *green,double *blue)
{
double
- C,
- H,
- L,
- u,
- v,
X,
Y,
Z;
assert(red != (double *) NULL);
assert(green != (double *) NULL);
assert(blue != (double *) NULL);
- L=luma;
- C=chroma;
- H=hue;
- u=C*cos(360.0*H*MagickPI/180.0);
- v=C*sin(360.0*H*MagickPI/180.0);
- ConvertLuvToXYZ(L,(u+1.34)/3.54,(v+1.4)/2.62,&X,&Y,&Z);
+ ConvertLCHuvToXYZ(100.0*luma,255.0*(chroma-0.5),360.0*(hue-0.5),&X,&Y,&Z)
ConvertXYZToRGB(X,Y,Z,red,green,blue);
}
\f
% component of the LCH color space.
%
*/
+
+static inline void ConvertXYZToLCHab(const double X,const double Y,
+ const double Z,double *luma,double *chroma,double *hue)
+{
+ double
+ a,
+ b;
+
+ ConvertXYZToLab(X,Y,Z,luma,&a,&b);
+ *chroma=hypot(255.0*(a-0.5),255.0*(b-0.5))/255.0+0.5;
+ *hue=180.0*atan2(255.0*(b-0.5),255.0*(a-0.5))/MagickPI/360.0+0.5;
+ if (*hue < 0.0)
+ *hue+=1.0;
+}
+
MagickPrivate void ConvertRGBToLCHab(const double red,const double green,
const double blue,double *luma,double *chroma,double *hue)
{
double
- a,
- b,
- C,
- H,
- L,
X,
Y,
Z;
assert(chroma != (double *) NULL);
assert(hue != (double *) NULL);
ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
- ConvertXYZToLab(X,Y,Z,&L,&a,&b);
- C=hypot(255.0*(a-0.5)/500.0,255.0*(b-0.5)/200.0);
- H=180.0*atan2(255.0*(b-0.5)/200.0,255.0*(a-0.5)/500.0)/MagickPI/360.0;
- if (H < 0.0)
- H+=1.0;
- if (H >= 1.0)
- H-=1.0;
- *luma=(100.0*L+16.0)/116.0;
- *chroma=C;
- *hue=H;
+ ConvertXYZToLCHab(X,Y,Z,luma,chroma,hue);
}
\f
/*
% component of the LCHuv color space.
%
*/
+
+static inline void ConvertXYZToLCHuv(const double X,const double Y,
+ const double Z,double *luma,double *chroma,double *hue)
+{
+ double
+ u,
+ v;
+
+ ConvertXYZToLuv(X,Y,Z,luma,&u,&v);
+ *chroma=hypot(354.0*u-134.0,262.0*v-140.0)/255.0+0.5;
+ *hue=180.0*atan2(262.0*v-140.0,354.0*u-134.0)/MagickPI/360.0+0.5;
+ if (*hue < 0.0)
+ *hue+=1.0;
+}
+
MagickPrivate void ConvertRGBToLCHuv(const double red,const double green,
const double blue,double *luma,double *chroma,double *hue)
{
double
- C,
- H,
- L,
- u,
- v,
X,
Y,
Z;
assert(chroma != (double *) NULL);
assert(hue != (double *) NULL);
ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
- ConvertXYZToLuv(X,Y,Z,&L,&u,&v);
- C=hypot(3.54*u-1.34,2.62*v-1.4);
- H=180.0*atan2(2.62*v-1.4,3.54*u-1.34)/MagickPI/360.0;
- if (H < 0.0)
- H+=1.0;
- if (H >= 1.0)
- H-=1.0;
- *luma=L;
- *chroma=C;
- *hue=H;
+ ConvertXYZToLCHuv(X,Y,Z,luma,chroma,hue);
}
\f
/*