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 ConvertRGBToLCHab(const double,const double,const double,double *,double *,
00073 double *),
00074 ConvertRGBToLCHuv(const double,const double,const double,double *,double *,
00075 double *);
00076
00077 static inline void ConvertLabToXYZ(const double L,const double a,const double b,
00078 double *X,double *Y,double *Z)
00079 {
00080 double
00081 x,
00082 y,
00083 z;
00084
00085 assert(X != (double *) NULL);
00086 assert(Y != (double *) NULL);
00087 assert(Z != (double *) NULL);
00088 y=(L+16.0)/116.0;
00089 x=y+a/500.0;
00090 z=y-b/200.0;
00091 if ((x*x*x) > CIEEpsilon)
00092 x=(x*x*x);
00093 else
00094 x=(116.0*x-16.0)/CIEK;
00095 if ((y*y*y) > CIEEpsilon)
00096 y=(y*y*y);
00097 else
00098 y=L/CIEK;
00099 if ((z*z*z) > CIEEpsilon)
00100 z=(z*z*z);
00101 else
00102 z=(116.0*z-16.0)/CIEK;
00103 *X=D65X*x;
00104 *Y=D65Y*y;
00105 *Z=D65Z*z;
00106 }
00107
00108 static inline void ConvertLuvToXYZ(const double L,const double u,const double v,
00109 double *X,double *Y,double *Z)
00110 {
00111 double
00112 gamma;
00113
00114 assert(X != (double *) NULL);
00115 assert(Y != (double *) NULL);
00116 assert(Z != (double *) NULL);
00117 if (L > (CIEK*CIEEpsilon))
00118 *Y=(double) pow((L+16.0)/116.0,3.0);
00119 else
00120 *Y=L/CIEK;
00121 gamma=PerceptibleReciprocal((((52.0*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+
00122 3.0*D65Z))))-1.0)/3.0)-(-1.0/3.0));
00123 *X=gamma*((*Y*((39.0*L/(v+13.0*L*(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))))-5.0))+
00124 5.0*(*Y));
00125 *Z=(*X*(((52.0*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/3.0))-
00126 5.0*(*Y);
00127 }
00128
00129 static inline void ConvertRGBToXYZ(const double red,const double green,
00130 const double blue,double *X,double *Y,double *Z)
00131 {
00132 double
00133 b,
00134 g,
00135 r;
00136
00137
00138
00139
00140 assert(X != (double *) NULL);
00141 assert(Y != (double *) NULL);
00142 assert(Z != (double *) NULL);
00143 r=QuantumScale*DecodePixelGamma(red);
00144 g=QuantumScale*DecodePixelGamma(green);
00145 b=QuantumScale*DecodePixelGamma(blue);
00146 *X=0.4124564*r+0.3575761*g+0.1804375*b;
00147 *Y=0.2126729*r+0.7151522*g+0.0721750*b;
00148 *Z=0.0193339*r+0.1191920*g+0.9503041*b;
00149 }
00150
00151 static inline void ConvertXYZToLab(const double X,const double Y,const double Z,
00152 double *L,double *a,double *b)
00153 {
00154 double
00155 x,
00156 y,
00157 z;
00158
00159 assert(L != (double *) NULL);
00160 assert(a != (double *) NULL);
00161 assert(b != (double *) NULL);
00162 if ((X/D65X) > CIEEpsilon)
00163 x=pow(X/D65X,1.0/3.0);
00164 else
00165 x=(CIEK*X/D65X+16.0)/116.0;
00166 if ((Y/D65Y) > CIEEpsilon)
00167 y=pow(Y/D65Y,1.0/3.0);
00168 else
00169 y=(CIEK*Y/D65Y+16.0)/116.0;
00170 if ((Z/D65Z) > CIEEpsilon)
00171 z=pow(Z/D65Z,1.0/3.0);
00172 else
00173 z=(CIEK*Z/D65Z+16.0)/116.0;
00174 *L=((116.0*y)-16.0)/100.0;
00175 *a=(500.0*(x-y))/255.0+0.5;
00176 *b=(200.0*(y-z))/255.0+0.5;
00177 }
00178
00179 static inline void ConvertXYZToLuv(const double X,const double Y,const double Z,
00180 double *L,double *u,double *v)
00181 {
00182 double
00183 alpha;
00184
00185 assert(L != (double *) NULL);
00186 assert(u != (double *) NULL);
00187 assert(v != (double *) NULL);
00188 if ((Y/D65Y) > CIEEpsilon)
00189 *L=(double) (116.0*pow(Y/D65Y,1.0/3.0)-16.0);
00190 else
00191 *L=CIEK*(Y/D65Y);
00192 alpha=PerceptibleReciprocal(X+15.0*Y+3.0*Z);
00193 *u=13.0*(*L)*((4.0*alpha*X)-(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z)));
00194 *v=13.0*(*L)*((9.0*alpha*Y)-(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z)));
00195 *L/=100.0;
00196 *u=(*u+134.0)/354.0;
00197 *v=(*v+140.0)/262.0;
00198 }
00199
00200 static inline void ConvertXYZToRGB(const double X,const double Y,const double Z,
00201 double *red,double *green,double *blue)
00202 {
00203 double
00204 b,
00205 g,
00206 r;
00207
00208 assert(red != (double *) NULL);
00209 assert(green != (double *) NULL);
00210 assert(blue != (double *) NULL);
00211 r=3.2404542*X-1.5371385*Y-0.4985314*Z;
00212 g=(-0.9692660)*X+1.8760108*Y+0.0415560*Z;
00213 b=0.0556434*X-0.2040259*Y+1.0572252*Z;
00214 *red=EncodePixelGamma(QuantumRange*r);
00215 *green=EncodePixelGamma(QuantumRange*g);
00216 *blue=EncodePixelGamma(QuantumRange*b);
00217 }
00218
00219 #if defined(__cplusplus) || defined(c_plusplus)
00220 }
00221 #endif
00222
00223 #endif