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   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     Convert RGB to XYZ colorspace.
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

Generated on 10 Feb 2020 for MagickCore by  doxygen 1.6.1