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