gem-private.h

Go to the documentation of this file.
00001 /*
00002   Copyright 1999-2020 ImageMagick Studio LLC, a non-profit organization
00003   dedicated to making software imaging solutions freely available.
00004   
00005   You may not use this file except in compliance with the License.  You may
00006   obtain a copy of the License at
00007   
00008     https://imagemagick.org/script/license.php
00009   
00010   Unless required by applicable law or agreed to in writing, software
00011   distributed under the License is distributed on an "AS IS" BASIS,
00012   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013   See the License for the specific language governing permissions and
00014   limitations under the License.
00015 
00016   MagickCore private graphic gems methods.
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     Convert RGB to XYZ colorspace.
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

Generated on 21 Sep 2020 for MagickCore by  doxygen 1.6.1