00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef MAGICKCORE_GEM_PRIVATE_H
00019 #define MAGICKCORE_GEM_PRIVATE_H
00020
00021 #include "MagickCore/pixel-accessor.h"
00022 #include "MagickCore/visual-effects.h"
00023
00024 #if defined(__cplusplus) || defined(c_plusplus)
00025 extern "C" {
00026 #endif
00027
00028 #define D65X 0.950456
00029 #define D65Y 1.0
00030 #define D65Z 1.088754
00031 #define CIEEpsilon (216.0/24389.0)
00032 #define CIEK (24389.0/27.0)
00033
00034 extern MagickPrivate double
00035 GenerateDifferentialNoise(RandomInfo *,const Quantum,const NoiseType,
00036 const double);
00037
00038 extern MagickPrivate size_t
00039 GetOptimalKernelWidth(const double,const double),
00040 GetOptimalKernelWidth1D(const double,const double),
00041 GetOptimalKernelWidth2D(const double,const double);
00042
00043 extern MagickPrivate void
00044 ConvertHCLToRGB(const double,const double,const double,double *,double *,
00045 double *),
00046 ConvertHCLpToRGB(const double,const double,const double,double *,double *,
00047 double *),
00048 ConvertHSBToRGB(const double,const double,const double,double *,double *,
00049 double *),
00050 ConvertHSIToRGB(const double,const double,const double,double *,double *,
00051 double *),
00052 ConvertHSVToRGB(const double,const double,const double,double *,double *,
00053 double *),
00054 ConvertHWBToRGB(const double,const double,const double,double *,double *,
00055 double *),
00056 ConvertLCHabToRGB(const double,const double,const double,double *,double *,
00057 double *),
00058 ConvertLCHuvToRGB(const double,const double,const double,double *,double *,
00059 double *),
00060 ConvertRGBToHCL(const double,const double,const double,double *,double *,
00061 double *),
00062 ConvertRGBToHCLp(const double,const double,const double,double *,double *,
00063 double *),
00064 ConvertRGBToHSB(const double,const double,const double,double *,double *,
00065 double *),
00066 ConvertRGBToHSI(const double,const double,const double,double *,double *,
00067 double *),
00068 ConvertRGBToHSV(const double,const double,const double,double *,double *,
00069 double *),
00070 ConvertRGBToHWB(const double,const double,const double,double *,double *,
00071 double *),
00072 ConvertRGBToLab(const double,const double,const double,double *,double *,
00073 double *),
00074 ConvertRGBToLCHab(const double,const double,const double,double *,double *,
00075 double *),
00076 ConvertRGBToLCHuv(const double,const double,const double,double *,double *,
00077 double *);
00078
00079 static inline void ConvertLabToXYZ(const double L,const double a,const double b,
00080 double *X,double *Y,double *Z)
00081 {
00082 double
00083 x,
00084 y,
00085 z;
00086
00087 assert(X != (double *) NULL);
00088 assert(Y != (double *) NULL);
00089 assert(Z != (double *) NULL);
00090 y=(L+16.0)/116.0;
00091 x=y+a/500.0;
00092 z=y-b/200.0;
00093 if ((x*x*x) > CIEEpsilon)
00094 x=(x*x*x);
00095 else
00096 x=(116.0*x-16.0)/CIEK;
00097 if ((y*y*y) > CIEEpsilon)
00098 y=(y*y*y);
00099 else
00100 y=L/CIEK;
00101 if ((z*z*z) > CIEEpsilon)
00102 z=(z*z*z);
00103 else
00104 z=(116.0*z-16.0)/CIEK;
00105 *X=D65X*x;
00106 *Y=D65Y*y;
00107 *Z=D65Z*z;
00108 }
00109
00110 static inline void ConvertLuvToXYZ(const double L,const double u,const double v,
00111 double *X,double *Y,double *Z)
00112 {
00113 double
00114 gamma;
00115
00116 assert(X != (double *) NULL);
00117 assert(Y != (double *) NULL);
00118 assert(Z != (double *) NULL);
00119 if (L > (CIEK*CIEEpsilon))
00120 *Y=(double) pow((L+16.0)/116.0,3.0);
00121 else
00122 *Y=L/CIEK;
00123 gamma=PerceptibleReciprocal((((52.0*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+
00124 3.0*D65Z))))-1.0)/3.0)-(-1.0/3.0));
00125 *X=gamma*((*Y*((39.0*L/(v+13.0*L*(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))))-5.0))+
00126 5.0*(*Y));
00127 *Z=(*X*(((52.0*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/3.0))-
00128 5.0*(*Y);
00129 }
00130
00131 static inline void ConvertRGBToXYZ(const double red,const double green,
00132 const double blue,double *X,double *Y,double *Z)
00133 {
00134 double
00135 b,
00136 g,
00137 r;
00138
00139
00140
00141
00142 assert(X != (double *) NULL);
00143 assert(Y != (double *) NULL);
00144 assert(Z != (double *) NULL);
00145 r=QuantumScale*DecodePixelGamma(red);
00146 g=QuantumScale*DecodePixelGamma(green);
00147 b=QuantumScale*DecodePixelGamma(blue);
00148 *X=0.4124564*r+0.3575761*g+0.1804375*b;
00149 *Y=0.2126729*r+0.7151522*g+0.0721750*b;
00150 *Z=0.0193339*r+0.1191920*g+0.9503041*b;
00151 }
00152
00153 static inline void ConvertXYZToLab(const double X,const double Y,const double Z,
00154 double *L,double *a,double *b)
00155 {
00156 double
00157 x,
00158 y,
00159 z;
00160
00161 assert(L != (double *) NULL);
00162 assert(a != (double *) NULL);
00163 assert(b != (double *) NULL);
00164 if ((X/D65X) > CIEEpsilon)
00165 x=pow(X/D65X,1.0/3.0);
00166 else
00167 x=(CIEK*X/D65X+16.0)/116.0;
00168 if ((Y/D65Y) > CIEEpsilon)
00169 y=pow(Y/D65Y,1.0/3.0);
00170 else
00171 y=(CIEK*Y/D65Y+16.0)/116.0;
00172 if ((Z/D65Z) > CIEEpsilon)
00173 z=pow(Z/D65Z,1.0/3.0);
00174 else
00175 z=(CIEK*Z/D65Z+16.0)/116.0;
00176 *L=((116.0*y)-16.0)/100.0;
00177 *a=(500.0*(x-y))/255.0+0.5;
00178 *b=(200.0*(y-z))/255.0+0.5;
00179 }
00180
00181 static inline void ConvertXYZToLuv(const double X,const double Y,const double Z,
00182 double *L,double *u,double *v)
00183 {
00184 double
00185 alpha;
00186
00187 assert(L != (double *) NULL);
00188 assert(u != (double *) NULL);
00189 assert(v != (double *) NULL);
00190 if ((Y/D65Y) > CIEEpsilon)
00191 *L=(double) (116.0*pow(Y/D65Y,1.0/3.0)-16.0);
00192 else
00193 *L=CIEK*(Y/D65Y);
00194 alpha=PerceptibleReciprocal(X+15.0*Y+3.0*Z);
00195 *u=13.0*(*L)*((4.0*alpha*X)-(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z)));
00196 *v=13.0*(*L)*((9.0*alpha*Y)-(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z)));
00197 *L/=100.0;
00198 *u=(*u+134.0)/354.0;
00199 *v=(*v+140.0)/262.0;
00200 }
00201
00202 static inline void ConvertXYZToRGB(const double X,const double Y,const double Z,
00203 double *red,double *green,double *blue)
00204 {
00205 double
00206 b,
00207 g,
00208 r;
00209
00210 assert(red != (double *) NULL);
00211 assert(green != (double *) NULL);
00212 assert(blue != (double *) NULL);
00213 r=3.2404542*X-1.5371385*Y-0.4985314*Z;
00214 g=(-0.9692660)*X+1.8760108*Y+0.0415560*Z;
00215 b=0.0556434*X-0.2040259*Y+1.0572252*Z;
00216 *red=EncodePixelGamma(QuantumRange*r);
00217 *green=EncodePixelGamma(QuantumRange*g);
00218 *blue=EncodePixelGamma(QuantumRange*b);
00219 }
00220
00221 #if defined(__cplusplus) || defined(c_plusplus)
00222 }
00223 #endif
00224
00225 #endif