diff --git a/rtengine/color.cc b/rtengine/color.cc index 949e3c52e..41b7e7293 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1469,13 +1469,13 @@ void Color::calcGamma (double pwr, double ts, int mode, int imax, GammaValues &g } if (!mode--) { - gamma.gamma0 = g[0]; - gamma.gamma1 = g[1]; - gamma.gamma2 = g[2]; - gamma.gamma3 = g[3]; - gamma.gamma4 = g[4]; - gamma.gamma5 = g[5]; - gamma.gamma6 = 0.; + gamma[0] = g[0]; + gamma[1] = g[1]; + gamma[2] = g[2]; + gamma[3] = g[3]; + gamma[4] = g[4]; + gamma[5] = g[5]; + gamma[6] = 0.; return; } } diff --git a/rtengine/color.h b/rtengine/color.h index b08ad5948..03ae5afb4 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -30,6 +30,8 @@ namespace rtengine { +typedef std::array GammaValues; + #ifdef _DEBUG class MunsellDebugInfo @@ -95,17 +97,6 @@ private: #endif public: - class GammaValues { - public: - double gamma0; - double gamma1; - double gamma2; - double gamma3; - double gamma4; - double gamma5; - double gamma6; - }; - typedef enum Channel { CHANNEL_RED = 1 << 0, CHANNEL_GREEN = 1 << 1, diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 559a5d009..166ee1cc9 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -363,83 +363,79 @@ cmsHPROFILE ICCStore::workingSpaceGamma (const Glib::ustring& name) const } } -void ICCStore::getGammaArray(const procparams::ColorManagementParams &icm, Color::GammaValues &ga) +void ICCStore::getGammaArray(const procparams::ColorManagementParams &icm, GammaValues &ga) { const double eps = 0.000000001; // not divide by zero if (!icm.freegamma) {//if Free gamma not selected // gamma : ga[0],ga[1],ga[2],ga[3],ga[4],ga[5] by calcul if(icm.gamma == "BT709_g2.2_s4.5") { - ga.gamma0 = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin - ga.gamma1 = 0.909995; - ga.gamma2 = 0.090005; - ga.gamma3 = 0.222222; - ga.gamma4 = 0.081071; - ga.gamma5 = 0.0; + ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin + ga[1] = 0.909995; + ga[2] = 0.090005; + ga[3] = 0.222222; + ga[4] = 0.081071; } else if (icm.gamma == "sRGB_g2.4_s12.92") { - ga.gamma0 = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom - ga.gamma1 = 0.947858; - ga.gamma2 = 0.052142; - ga.gamma3 = 0.077399; - ga.gamma4 = 0.039293; - ga.gamma5 = 0.0; + ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom + ga[1] = 0.947858; + ga[2] = 0.052142; + ga[3] = 0.077399; + ga[4] = 0.039293; } else if (icm.gamma == "High_g1.3_s3.35") { - ga.gamma0 = 1.3 ; //for high dynamic images - ga.gamma1 = 0.998279; - ga.gamma2 = 0.001721; - ga.gamma3 = 0.298507; - ga.gamma4 = 0.005746; - ga.gamma5 = 0.0; + ga[0] = 1.3 ; //for high dynamic images + ga[1] = 0.998279; + ga[2] = 0.001721; + ga[3] = 0.298507; + ga[4] = 0.005746; } else if (icm.gamma == "Low_g2.6_s6.9") { - ga.gamma0 = 2.6 ; //gamma 2.6 variable : for low contrast images - ga.gamma1 = 0.891161; - ga.gamma2 = 0.108839; - ga.gamma3 = 0.144928; - ga.gamma4 = 0.076332; - ga.gamma5 = 0.0; - } else if (icm.gamma == "linear_g1.0") { - ga.gamma0 = 1.0; //gamma=1 linear : for high dynamic images (cf : D.Coffin...) - ga.gamma1 = 1.; - ga.gamma2 = 0.; - ga.gamma3 = 1. / eps; - ga.gamma4 = 0.; - ga.gamma5 = 0.0; + ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images + ga[1] = 0.891161; + ga[2] = 0.108839; + ga[3] = 0.144928; + ga[4] = 0.076332; } else if (icm.gamma == "standard_g2.2") { - ga.gamma0 = 2.2; //gamma=2.2 (as gamma of Adobe, Widegamut...) - ga.gamma1 = 1.; - ga.gamma2 = 0.; - ga.gamma3 = 1. / eps; - ga.gamma4 = 0.; - ga.gamma5 = 0.0; + ga[0] = 2.2; //gamma=2.2 (as gamma of Adobe, Widegamut...) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; } else if (icm.gamma == "standard_g1.8") { - ga.gamma0 = 1.8; //gamma=1.8 (as gamma of Prophoto) - ga.gamma1 = 1.; - ga.gamma2 = 0.; - ga.gamma3 = 1. / eps; - ga.gamma4 = 0.; - ga.gamma5 = 0.0; + ga[0] = 1.8; //gamma=1.8 (as gamma of Prophoto) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; + } else /* if (icm.gamma == "linear_g1.0") */ { + ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf : D.Coffin...) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; } + ga[5] = 0.0; + ga[6] = 0.0; } else { //free gamma selected - Color::GammaValues g_a; //gamma parameters + GammaValues g_a; //gamma parameters double pwr = 1.0 / icm.gampos; double ts = icm.slpos; double slope = icm.slpos == 0 ? eps : icm.slpos; int mode = 0, imax = 0; Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 - ga.gamma4 = g_a.gamma3 * ts; + ga[4] = g_a[3] * ts; //printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4); - ga.gamma0 = icm.gampos; - ga.gamma1 = 1. / (1.0 + g_a.gamma4); - ga.gamma2 = g_a.gamma4 / (1.0 + g_a.gamma4); - ga.gamma3 = 1. / slope; - ga.gamma5 = 0.0; + ga[0] = icm.gampos; + ga[1] = 1. / (1.0 + g_a[4]); + ga[2] = g_a[4] / (1.0 + g_a[4]); + ga[3] = 1. / slope; + ga[5] = 0.0; + ga[6] = 0.0; //printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]); } } -cmsHPROFILE ICCStore::createGammaProfile (const procparams::ColorManagementParams &icm, Color::GammaValues &ga) { +cmsHPROFILE ICCStore::createGammaProfile (const procparams::ColorManagementParams &icm, GammaValues &ga) { float p[6]; //primaries - ga.gamma6 = 0.0; + ga[6] = 0.0; enum class ColorTemp { D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50 @@ -520,7 +516,7 @@ cmsHPROFILE ICCStore::createGammaProfile (const procparams::ColorManagementParam cmsToneCurve* GammaTRC[3]; // 7 parameters for smoother curves - cmsFloat64Number Parameters[7] = { ga.gamma0, ga.gamma1, ga.gamma2, ga.gamma3, ga.gamma4, ga.gamma5, ga.gamma6 } ; + cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] } ; cmsWhitePointFromTemp(&xyD, (double)temp); GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, 5, Parameters); //5 = smoother than 4 @@ -531,7 +527,7 @@ cmsHPROFILE ICCStore::createGammaProfile (const procparams::ColorManagementParam return oprofdef; } -cmsHPROFILE ICCStore::createCustomGammaOutputProfile (const procparams::ColorManagementParams &icm, Color::GammaValues &ga) { +cmsHPROFILE ICCStore::createCustomGammaOutputProfile (const procparams::ColorManagementParams &icm, GammaValues &ga) { bool pro = false; Glib::ustring outProfile; cmsHPROFILE outputProfile = nullptr; @@ -590,7 +586,7 @@ cmsHPROFILE ICCStore::createCustomGammaOutputProfile (const procparams::ColorMan } // 7 parameters for smoother curves - cmsFloat64Number Parameters[7] = { ga.gamma0, ga.gamma1, ga.gamma2, ga.gamma3, ga.gamma4, ga.gamma5, ga.gamma6 }; + cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] }; //change desc Tag , to "free gamma", or "BT709", etc. cmsMLU *mlu; diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index dc2c5c12b..ac52c998a 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -88,11 +88,11 @@ public: void init (const Glib::ustring& usrICCDir, const Glib::ustring& stdICCDir); - static void getGammaArray(const procparams::ColorManagementParams &icm, Color::GammaValues &ga); + static void getGammaArray(const procparams::ColorManagementParams &icm, GammaValues &ga); static cmsHPROFILE makeStdGammaProfile (cmsHPROFILE iprof); static cmsHPROFILE createFromMatrix (const double matrix[3][3], bool gamma = false, const Glib::ustring& name = Glib::ustring()); - static cmsHPROFILE createGammaProfile (const procparams::ColorManagementParams &icm, Color::GammaValues &ga); - static cmsHPROFILE createCustomGammaOutputProfile (const procparams::ColorManagementParams &icm, Color::GammaValues &ga); + static cmsHPROFILE createGammaProfile (const procparams::ColorManagementParams &icm, GammaValues &ga); + static cmsHPROFILE createCustomGammaOutputProfile (const procparams::ColorManagementParams &icm, GammaValues &ga); // Main monitors standard profile name, from OS void findDefaultMonitorProfile (); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 081afdf43..7b98e54aa 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -92,13 +92,13 @@ void ImProcFunctions::updateColorProfiles (const ColorManagementParams& icm, con if (softProof) { cmsHPROFILE oprof; if(icm.gamma != "default" || icm.freegamma) { // if select gamma output between BT709, sRGB, linear, low, high, 2.2 , 1.8 - Color::GammaValues ga; + GammaValues ga; iccStore->getGammaArray(icm, ga); oprof = iccStore->createGammaProfile (icm, ga); } else if (!icm.output.empty() && icm.output != ColorManagementParams::NoICMString) { if(icm.gamma != "default" || icm.freegamma) { // if select gamma output between BT709, sRGB, linear, low, high, 2.2 , 1.8 - Color::GammaValues ga; + GammaValues ga; iccStore->getGammaArray(icm, ga); oprof = iccStore->createCustomGammaOutputProfile (icm, ga); } else { diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index ad7d6f56a..04b234cbd 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -362,7 +362,7 @@ public: void BadpixelsLab(LabImage * src, LabImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom); Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); - Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, Color::GammaValues *ga=NULL); + Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, GammaValues *ga=NULL); // CieImage *ciec; bool transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LCPMapper *pLCPMap = NULL); diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index eec8987b7..62af03f0a 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -280,7 +280,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, * If a custom gamma profile can be created, divide by 327.68, convert to xyz and apply the custom gamma transform * otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve */ -Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, Color::GammaValues *ga) +Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, GammaValues *ga) { //gamutmap(lab); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 27c129a44..8b19f3841 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1973,7 +1973,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar } else if(retinexParams.gammaretinex == "hig") { retinexgamtab = &(Color::gammatab_145_3); } else if(retinexParams.gammaretinex == "fre") { - Color::GammaValues g_a; + GammaValues g_a; double pwr = 1.0 / retinexParams.gam; double gamm = retinexParams.gam; double ts = retinexParams.slope; @@ -1991,14 +1991,14 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar double add; if(gamm2 < 1.) { - start = g_a.gamma2; - add = g_a.gamma4; + start = g_a[2]; + add = g_a[4]; } else { - start = g_a.gamma3; - add = g_a.gamma4; + start = g_a[3]; + add = g_a[4]; } - double mul = 1. + g_a.gamma4; + double mul = 1. + g_a[4]; lutTonereti(65536); @@ -2245,7 +2245,7 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC } else if(deh.gammaretinex == "hig") { retinexigamtab = &(Color::igammatab_145_3); } else if(deh.gammaretinex == "fre") { - Color::GammaValues g_a; + GammaValues g_a; double pwr = 1.0 / deh.gam; double gamm = deh.gam; double gamm2 = gamm; @@ -2258,16 +2258,16 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope - double mul = 1. + g_a.gamma4; + double mul = 1. + g_a[4]; double add; double start; if(gamm2 < 1.) { - start = g_a.gamma3; - add = g_a.gamma3; + start = g_a[3]; + add = g_a[3]; } else { - add = g_a.gamma4; - start = g_a.gamma2; + add = g_a[4]; + start = g_a[2]; } // printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 62e16f2f0..a01597d96 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1162,7 +1162,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p if(params.icm.gamma != "default" || params.icm.freegamma) { // if select gamma output between BT709, sRGB, linear, low, high, 2.2 , 1.8 - Color::GammaValues ga; + GammaValues ga; // if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm, bwonly, &ga); customGamma = true;