From d803bd05ce8811911a593ac32d8730f2205f94d7 Mon Sep 17 00:00:00 2001 From: cristy Date: Wed, 3 Apr 2013 19:10:51 +0000 Subject: [PATCH] --- MagickCore/colorspace.c | 106 ------------------------------ MagickCore/gem-private.h | 106 ++++++++++++++++++++++++++++++ MagickCore/gem.c | 138 +++++++++++++-------------------------- 3 files changed, 153 insertions(+), 197 deletions(-) diff --git a/MagickCore/colorspace.c b/MagickCore/colorspace.c index de57bd9c8..4a142c44e 100644 --- a/MagickCore/colorspace.c +++ b/MagickCore/colorspace.c @@ -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* diff --git a/MagickCore/gem-private.h b/MagickCore/gem-private.h index f4baac180..7dcfafafa 100644 --- a/MagickCore/gem-private.h +++ b/MagickCore/gem-private.h @@ -22,6 +22,12 @@ 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 diff --git a/MagickCore/gem.c b/MagickCore/gem.c index 36d466c98..fb53d08f1 100644 --- a/MagickCore/gem.c +++ b/MagickCore/gem.c @@ -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); } /* @@ -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; } /* @@ -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) { -- 2.40.0