diff --git a/rtdata/languages/default b/rtdata/languages/default index e957a5e2a..313f7055a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -804,8 +804,10 @@ HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_THRESWAV;Balance threshold HISTORY_MSG_SOFTWAV;Soft radius +HISTORY_MSG_WAVOLDSH;Old algorithm +HISTORY_MSG_WAVOFFSET;Offset HISTORY_MSG_TMSHAPE;Compression by level -HISTORY_MSG_WAVTM;Tone mapping wavelet +HISTORY_MSG_WAVBL;Blur levels HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -2151,6 +2153,7 @@ TP_WAVELET_CHRO;Saturated/pastel threshold TP_WAVELET_CHROMAFRAME;Chroma TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" +TP_WAVELET_CHRWAV;Blur chroma TP_WAVELET_CHSL;Sliders TP_WAVELET_CHTYPE;Chrominance method TP_WAVELET_CLA;Clarity @@ -2247,6 +2250,7 @@ TP_WAVELET_NPLOW;Low TP_WAVELET_NPNONE;None TP_WAVELET_NPTYPE;Neighboring pixels TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. +TP_WAVELET_OLDSH;Old algorithm using negatives values TP_WAVELET_OPACITY;Opacity Blue-Yellow TP_WAVELET_OPACITYW;Contrast balance d/v-h curve TP_WAVELET_OPACITYWL;Final local contrast @@ -2287,7 +2291,7 @@ TP_WAVELET_TILESFULL;Full image TP_WAVELET_TILESIZE;Tiling method TP_WAVELET_TILESLIT;Little tiles TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. -TP_WAVELET_TM;Tone mapping wavelet +TP_WAVELET_BL;Blur levels TP_WAVELET_TMEDGS;Edge stopping TP_WAVELET_TMSCALE;Scale TP_WAVELET_TMSTRENGTH;Compression strength @@ -2299,6 +2303,7 @@ TP_WAVELET_USH;None TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. +TP_WAVELET_WAVOFFSET;Offset TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_AUTOOLD;Auto RGB grey diff --git a/rtengine/curves.cc b/rtengine/curves.cc index a3e327dbf..14711c730 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1209,28 +1209,28 @@ void WavCurve::Set(const std::vector &curvePoints) } } -WavtmCurve::WavtmCurve() {} +Wavblcurve::Wavblcurve() {} -void WavtmCurve::Reset() +void Wavblcurve::Reset() { - luttmCurve.reset(); + lutblcurve.reset(); } -void WavtmCurve::Set(const Curve &pCurve) +void Wavblcurve::Set(const Curve &pCurve) { if (pCurve.isIdentity()) { Reset(); // raise this value if the quality suffers from this number of samples return; } - luttmCurve(501); // raise this value if the quality suffers from this number of samples + lutblcurve(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - luttmCurve[i] = pCurve.getVal(double(i) / 500.); + lutblcurve[i] = pCurve.getVal(double(i) / 500.); } } -void WavtmCurve::Set(const std::vector &curvePoints) +void Wavblcurve::Set(const std::vector &curvePoints) { if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); diff --git a/rtengine/curves.h b/rtengine/curves.h index 380bad9d6..03fa3e812 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -627,26 +627,26 @@ public: } }; -class WavtmCurve +class Wavblcurve { private: - LUTf luttmCurve; // 0xffff range + LUTf lutblcurve; // 0xffff range void Set(const Curve &pCurve); public: - virtual ~WavtmCurve() {}; - WavtmCurve(); + virtual ~Wavblcurve() {}; + Wavblcurve(); void Reset(); // void Set(const std::vector &curvePoints, bool &opautili); void Set(const std::vector &curvePoints); float operator[](float index) const { - return luttmCurve[index]; + return lutblcurve[index]; } operator bool (void) const { - return luttmCurve; + return lutblcurve; } }; diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 8c3f4f140..11bf19edf 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -967,14 +967,14 @@ void Crop::update(int todo) } WavCurve wavCLVCurve; - WavtmCurve wavtmCurve; + Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; LUTf wavclCurve; - params.wavelet.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); LabImage *unshar = nullptr; Glib::ustring provis; LabImage *provradius = nullptr; @@ -1003,7 +1003,7 @@ void Crop::update(int todo) unshar = new LabImage(labnCrop->W, labnCrop->H); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); unshar->CopyFrom(labnCrop); params.wavelet.CLmethod = provis; @@ -1016,7 +1016,7 @@ void Crop::update(int todo) WaveParams.expnoise = false; } - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 1ad3a0be1..45f9f2e56 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -867,7 +867,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; - WaveParams.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); int kall = 0; LabImage *unshar = nullptr; Glib::ustring provis; @@ -898,7 +898,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) unshar = new LabImage(pW, pH); provis = params->wavelet.CLmethod; params->wavelet.CLmethod = "all"; - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); unshar->CopyFrom(nprevl); @@ -912,7 +912,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expnoise = false; } - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c797986e5..d7d6052e9 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -139,7 +139,7 @@ protected: NoiseCurve noiseLCurve; NoiseCurve noiseCCurve; WavCurve wavCLVCurve; - WavtmCurve wavtmCurve; + Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index caad76a4f..d896342d5 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -53,7 +53,7 @@ class OpacityCurve; class PipetteBuffer; class ToneCurve; class WavCurve; -class WavtmCurve; +class Wavblcurve; class WavOpacityCurveBY; class WavOpacityCurveRG; class WavOpacityCurveW; @@ -202,9 +202,9 @@ public: int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/); void Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip); - void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavtmCurve & wavtmCurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); + void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); - void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, + void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW, diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 9d5237273..456a3bd1e 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -34,6 +34,8 @@ #include "improcfun.h" #include "imagefloat.h" #include "labimage.h" +#include "gauss.h" +#include "boxblur.h" #include "LUT.h" #include "median.h" #include "opthelper.h" @@ -64,6 +66,7 @@ struct cont_params { float conresH; float radius; float chrores; + bool oldsh; float hueres; float sky; float b_l, t_l, b_r, t_r; @@ -124,7 +127,7 @@ struct cont_params { bool finena; bool toningena; bool noiseena; - bool tmena; + bool blena; int maxilev; float edgsens; float edgampl; @@ -135,7 +138,7 @@ struct cont_params { int wavNestedLevels = 1; -void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavtmCurve & wavtmCurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) { @@ -205,7 +208,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.finena = params->wavelet.expfinal; cp.toningena = params->wavelet.exptoning; cp.noiseena = params->wavelet.expnoise; - cp.tmena = params->wavelet.exptm; + cp.blena = params->wavelet.expbl; if (params->wavelet.Backmethod == "black") { cp.backm = 0; @@ -390,6 +393,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.conresH = waparams.resconH; cp.radius = waparams.radius; cp.chrores = waparams.reschro; + cp.oldsh = waparams.oldsh; //cp.hueres=waparams.reshue; cp.hueres = 2.f; cp.th = float(waparams.thr); @@ -847,7 +851,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (cp.val > 0 || ref || contr) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } - +/* //here TM wavelet if(cp.tmena ){ float mean2[10]; @@ -981,7 +985,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } // end TM wavelet - +*/ //init for edge and denoise float vari[4]; @@ -1015,8 +1019,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Chutili = true; } - - WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); + WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); if (cp.val > 0 || ref || contr || cp.diagcurv) { //edge Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); @@ -1688,7 +1691,7 @@ void ImProcFunctions::WaveletcontAllLfinal(const wavelet_decomposition &WaveletC } -void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, +void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) { const int maxlvl = WaveletCoeffs_L.maxlevel(); @@ -1827,7 +1830,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } - if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + if ((cp.conres >= 0.f || cp.conresH >= 0.f) && cp.resena && !cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step LabImage *temp = nullptr; temp = new LabImage(W_L, H_L); #ifdef _OPENMP @@ -1858,6 +1861,53 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } +#ifdef _OPENMP + #pragma omp barrier +#endif + + if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int i = 0; i < W_L * H_L; i++) { + float LL = WavCoeffs_L0[i]; + float LL100 = LL / 327.68f; + float tran = 5.f;//transition + //shadow + float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? + + if(cp.th > (100.f - tran)) { + tran = 100.f - cp.th; + } + + if(LL100 < cp.th) { + float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th + float kk = aalp * LL100 + alp; + WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); + } else if(LL100 < cp.th + tran) { + float ath = -cp.conres / tran; + float bth = cp.conres - ath * cp.th; + WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); + } + + //highlight + tran = 5.f; + + if(cp.thH < (tran)) { + tran = cp.thH; + } + + if(LL100 > cp.thH) { + WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); + } else if(LL100 > (cp.thH - tran)) { + float athH = cp.conresH / tran; + float bthH = cp.conresH - athH * cp.thH; + WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); + } + } + } + #ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) @@ -2002,6 +2052,15 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // end } + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } + } + } #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) @@ -2016,8 +2075,28 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); + //blur levels + float klev = 1.f; + if(wavblcurve && wavcurvecomp && cp.blena) { + float * bef = new float[Wlvl_L * Hlvl_L]; + float * aft = new float[Wlvl_L * Hlvl_L]; + for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { + bef[co] = WavCoeffs_L[dir][co]; + } + klev = 0.25f * (wavblcurve[lvl * 55.5f]); + + klev *= 50.f / skip; + boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); + + for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { + WavCoeffs_L[dir][co] = aft[co]; + } + + delete bef; + delete aft; + } } } } @@ -2983,13 +3062,14 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); + const float offs = params->wavelet.offset; //to adjust increase contrast with local contrast //for each pixel and each level float beta; float mea[9]; - float rap = mean[level] - 2.f * cp.sigm * sigma[level]; + float rap = offs * mean[level] - 2.f * cp.sigm * sigma[level]; if (rap > 0.f) { mea[0] = rap; @@ -2997,7 +3077,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz mea[0] = mean[level] / 6.f; } - rap = mean[level] - cp.sigm * sigma[level]; + rap = offs * mean[level] - cp.sigm * sigma[level]; if (rap > 0.f) { mea[1] = rap; @@ -3005,13 +3085,13 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz mea[1] = mean[level] / 2.f; } - mea[2] = mean[level]; // 50% data - mea[3] = mean[level] + cp.sigm * sigma[level] / 2.f; - mea[4] = mean[level] + cp.sigm * sigma[level]; //66% - mea[5] = mean[level] + cp.sigm * 1.2f * sigma[level]; - mea[6] = mean[level] + cp.sigm * 1.5f * sigma[level]; // - mea[7] = mean[level] + cp.sigm * 2.f * sigma[level]; //95% - mea[8] = mean[level] + cp.sigm * 2.5f * sigma[level]; //99% + mea[2] = offs * mean[level]; // 50% data + mea[3] = offs * mean[level] + cp.sigm * sigma[level] / 2.f; + mea[4] = offs * mean[level] + cp.sigm * sigma[level]; //66% + mea[5] = offs * mean[level] + cp.sigm * 1.2f * sigma[level]; + mea[6] = offs * mean[level] + cp.sigm * 1.5f * sigma[level]; // + mea[7] = offs * mean[level] + cp.sigm * 2.f * sigma[level]; //95% + mea[8] = offs * mean[level] + cp.sigm * 2.5f * sigma[level]; //99% bool useChromAndHue = (skinprot != 0.f || cp.HSmet); float modchro; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index cf5a693f8..0c76e3003 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2164,16 +2164,17 @@ WaveletParams::WaveletParams() : 0.35, 0.35 }, - tmcurve{ + blcurve{ static_cast(FCT_MinMaxCPoints), - 0.0, +0.0, 0.0, 0.0, 0.35, 0.5, 0., 0.35, 0.35, 1.0, 0.0, 0.35, 0.35 +/* 0.0, 0.75, 0.35, 0.35, 1.0, 0.75, 0.35, - 0.35 + 0.35*/ }, opacityCurveRG{ static_cast(FCT_MinMaxCPoints), @@ -2254,6 +2255,7 @@ WaveletParams::WaveletParams() : lipst(false), avoid(false), showmask(false), + oldsh(true), tmr(false), strength(100), balance(0), @@ -2263,7 +2265,7 @@ WaveletParams::WaveletParams() : c{}, ch{}, expedge(false), - exptm(false), + expbl(false), expresid(false), expfinal(false), exptoning(false), @@ -2285,6 +2287,7 @@ WaveletParams::WaveletParams() : Dirmethod("all"), HSmethod("with"), sigma(1.0), + offset(1.0), rescon(0), resconH(0), reschro(0), @@ -2312,7 +2315,7 @@ WaveletParams::WaveletParams() : thrH(70), radius(40), skinprotect(0.0), - threswav(1.4), + chrwav(0.), softwav(1.0), hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), @@ -2332,7 +2335,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const { return ccwcurve == other.ccwcurve - && tmcurve == other.tmcurve + && blcurve == other.blcurve && opacityCurveRG == other.opacityCurveRG && opacityCurveBY == other.opacityCurveBY && opacityCurveW == other.opacityCurveW @@ -2358,6 +2361,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && lipst == other.lipst && avoid == other.avoid && showmask == other.showmask + && oldsh == other.oldsh && tmr == other.tmr && strength == other.strength && balance == other.balance @@ -2374,7 +2378,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const return true; }() && expedge == other.expedge - && exptm == other.exptm + && expbl == other.expbl && expresid == other.expresid && expfinal == other.expfinal && expclari == other.expclari @@ -2396,6 +2400,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && Dirmethod == other.Dirmethod && HSmethod == other.HSmethod && sigma == other.sigma + && offset == other.offset && rescon == other.rescon && resconH == other.resconH && reschro == other.reschro @@ -2423,7 +2428,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && thrH == other.thrH && radius == other.radius && skinprotect == other.skinprotect - && threswav == other.threswav + && chrwav == other.chrwav && softwav == other.softwav && hueskin == other.hueskin && hueskin2 == other.hueskin2 @@ -2445,7 +2450,7 @@ bool WaveletParams::operator !=(const WaveletParams& other) const void WaveletParams::getCurves( WavCurve& cCurve, - WavtmCurve& tCurve, + Wavblcurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, WavOpacityCurveBY& opacityCurveLUTBY, WavOpacityCurveW& opacityCurveLUTW, @@ -2453,7 +2458,7 @@ void WaveletParams::getCurves( ) const { cCurve.Set(this->ccwcurve); - tCurve.Set(this->tmcurve); + tCurve.Set(this->blcurve); opacityCurveLUTRG.Set(this->opacityCurveRG); opacityCurveLUTBY.Set(this->opacityCurveBY); opacityCurveLUTW.Set(this->opacityCurveW); @@ -3514,7 +3519,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.exptm, "Wavelet", "Exptm", wavelet.exptm, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expbl, "Wavelet", "expbl", wavelet.expbl, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expresid, "Wavelet", "Expresid", wavelet.expresid, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile); saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); @@ -3562,7 +3567,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.TMmethod, "Wavelet", "TMMethod", wavelet.TMmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chro, "Wavelet", "ChromaLink", wavelet.chro, keyFile); saveToKeyfile(!pedited || pedited->wavelet.ccwcurve, "Wavelet", "ContrastCurve", wavelet.ccwcurve, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.tmcurve, "Wavelet", "TMCurve", wavelet.tmcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.blcurve, "Wavelet", "blcurve", wavelet.blcurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); @@ -3578,7 +3583,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.cbenab, "Wavelet", "CBenab", wavelet.cbenab, keyFile); saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.threswav, "Wavelet", "Threswav", wavelet.threswav, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chrwav, "Wavelet", "chrwav", wavelet.chrwav, keyFile); saveToKeyfile(!pedited || pedited->wavelet.softwav, "Wavelet", "Softwav", wavelet.softwav, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); @@ -3586,8 +3591,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); saveToKeyfile(!pedited || pedited->wavelet.showmask, "Wavelet", "Showmask", wavelet.showmask, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.oldsh, "Wavelet", "Oldsh", wavelet.oldsh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigma, "Wavelet", "Sigma", wavelet.sigma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.offset, "Wavelet", "Offset", wavelet.offset, keyFile); saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); @@ -4678,6 +4685,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); assignFromKeyfile(keyFile, "Wavelet", "Showmask", pedited, wavelet.showmask, pedited->wavelet.showmask); + assignFromKeyfile(keyFile, "Wavelet", "Oldsh", pedited, wavelet.oldsh, pedited->wavelet.oldsh); assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); if (ppVersion < 331) { // wavelet.Lmethod was a string before version 331 @@ -4707,6 +4715,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); assignFromKeyfile(keyFile, "Wavelet", "Sigma", pedited, wavelet.sigma, pedited->wavelet.sigma); + assignFromKeyfile(keyFile, "Wavelet", "Offset", pedited, wavelet.offset, pedited->wavelet.offset); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); @@ -4734,7 +4743,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH); assignFromKeyfile(keyFile, "Wavelet", "Residualradius", pedited, wavelet.radius, pedited->wavelet.radius); assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); - assignFromKeyfile(keyFile, "Wavelet", "TMCurve", pedited, wavelet.tmcurve, pedited->wavelet.tmcurve); + assignFromKeyfile(keyFile, "Wavelet", "blcurve", pedited, wavelet.blcurve, pedited->wavelet.blcurve); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); @@ -4876,7 +4885,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); - assignFromKeyfile(keyFile, "Wavelet", "Threswav", pedited, wavelet.threswav, pedited->wavelet.threswav); + assignFromKeyfile(keyFile, "Wavelet", "chrwav", pedited, wavelet.chrwav, pedited->wavelet.chrwav); assignFromKeyfile(keyFile, "Wavelet", "Softwav", pedited, wavelet.softwav, pedited->wavelet.softwav); assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); @@ -4908,7 +4917,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Wavelet", "Expedge", pedited, wavelet.expedge, pedited->wavelet.expedge); - assignFromKeyfile(keyFile, "Wavelet", "Exptm", pedited, wavelet.exptm, pedited->wavelet.exptm); + assignFromKeyfile(keyFile, "Wavelet", "expbl", pedited, wavelet.expbl, pedited->wavelet.expbl); assignFromKeyfile(keyFile, "Wavelet", "Expresid", pedited, wavelet.expresid, pedited->wavelet.expresid); assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal); assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 9bfdaab13..e78c8fc47 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -40,7 +40,7 @@ class OpacityCurve; class RetinexgaintransmissionCurve; class RetinextransmissionCurve; class WavCurve; -class WavtmCurve; +class Wavblcurve; class WavOpacityCurveBY; class WavOpacityCurveRG; class WavOpacityCurveW; @@ -1186,7 +1186,7 @@ private: struct WaveletParams { std::vector ccwcurve; - std::vector tmcurve; + std::vector blcurve; std::vector opacityCurveRG; std::vector opacityCurveBY; std::vector opacityCurveW; @@ -1213,6 +1213,7 @@ struct WaveletParams { bool lipst; bool avoid; bool showmask; + bool oldsh; bool tmr; int strength; int balance; @@ -1222,7 +1223,7 @@ struct WaveletParams { int c[9]; int ch[9]; bool expedge; - bool exptm; + bool expbl; bool expresid; bool expfinal; bool exptoning; @@ -1245,6 +1246,7 @@ struct WaveletParams { Glib::ustring Dirmethod; Glib::ustring HSmethod; double sigma; + double offset; int rescon; int resconH; int reschro; @@ -1272,7 +1274,7 @@ struct WaveletParams { int thrH; int radius; double skinprotect; - double threswav; + double chrwav; double softwav; Threshold hueskin; Threshold hueskin2; @@ -1293,7 +1295,7 @@ struct WaveletParams { void getCurves( WavCurve& cCurve, - WavtmCurve& tCurve, + Wavblcurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, WavOpacityCurveBY& opacityCurveLUTBY, diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index f5bfd81df..14df16550 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1120,7 +1120,7 @@ private: bool wavcontlutili = false; WaveletParams WaveParams = params.wavelet; WavCurve wavCLVCurve; - WavtmCurve wavtmCurve; + Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; @@ -1144,7 +1144,7 @@ private: provradius->CopyFrom(labView); } - params.wavelet.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); @@ -1152,7 +1152,7 @@ private: unshar = new LabImage(fw, fh); provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); unshar->CopyFrom(labView); params.wavelet.CLmethod = provis; @@ -1164,7 +1164,7 @@ private: WaveParams.expnoise = false; } - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index f954a171a..b568d3b52 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -494,6 +494,7 @@ void ParamsEdited::set(bool v) wavelet.ushamethod = v; wavelet.avoid = v; wavelet.showmask = v; + wavelet.oldsh = v; wavelet.tmr = v; wavelet.Lmethod = v; wavelet.CLmethod = v; @@ -509,7 +510,8 @@ void ParamsEdited::set(bool v) wavelet.HSmethod = v; wavelet.Dirmethod = v; wavelet.sigma = v; - wavelet.rescon = v; + wavelet.sigma = v; + wavelet.offset = v; wavelet.resconH = v; wavelet.reschro = v; wavelet.tmrs = v; @@ -541,14 +543,14 @@ void ParamsEdited::set(bool v) wavelet.hllev = v; wavelet.bllev = v; wavelet.edgcont = v; - wavelet.threswav = v; + wavelet.chrwav = v; wavelet.softwav = v; wavelet.level0noise = v; wavelet.level1noise = v; wavelet.level2noise = v; wavelet.level3noise = v; wavelet.ccwcurve = v; - wavelet.tmcurve = v; + wavelet.blcurve = v; wavelet.opacityCurveRG = v; wavelet.opacityCurveBY = v; wavelet.opacityCurveW = v; @@ -568,7 +570,7 @@ void ParamsEdited::set(bool v) wavelet.expcontrast = v; wavelet.expchroma = v; wavelet.expedge = v; - wavelet.exptm = v; + wavelet.expbl = v; wavelet.expresid = v; wavelet.exptoning = v; wavelet.expnoise = v; @@ -1094,6 +1096,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.ushamethod = wavelet.ushamethod && p.wavelet.ushamethod == other.wavelet.ushamethod; wavelet.avoid = wavelet.avoid && p.wavelet.avoid == other.wavelet.avoid; wavelet.showmask = wavelet.showmask && p.wavelet.showmask == other.wavelet.showmask; + wavelet.oldsh = wavelet.oldsh && p.wavelet.oldsh == other.wavelet.oldsh; wavelet.tmr = wavelet.tmr && p.wavelet.tmr == other.wavelet.tmr; wavelet.Lmethod = wavelet.Lmethod && p.wavelet.Lmethod == other.wavelet.Lmethod; wavelet.CLmethod = wavelet.CLmethod && p.wavelet.CLmethod == other.wavelet.CLmethod; @@ -1109,6 +1112,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod; wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod; wavelet.sigma = wavelet.sigma && p.wavelet.sigma == other.wavelet.sigma; + wavelet.offset = wavelet.offset && p.wavelet.offset == other.wavelet.offset; wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon; wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; @@ -1140,7 +1144,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.hllev = wavelet.hllev && p.wavelet.hllev == other.wavelet.hllev; wavelet.bllev = wavelet.bllev && p.wavelet.bllev == other.wavelet.bllev; wavelet.edgcont = wavelet.edgcont && p.wavelet.edgcont == other.wavelet.edgcont; - wavelet.threswav = wavelet.threswav && p.wavelet.threswav == other.wavelet.threswav; + wavelet.chrwav = wavelet.chrwav && p.wavelet.chrwav == other.wavelet.chrwav; wavelet.softwav = wavelet.softwav && p.wavelet.softwav == other.wavelet.softwav; wavelet.level0noise = wavelet.level0noise && p.wavelet.level0noise == other.wavelet.level0noise; wavelet.level1noise = wavelet.level1noise && p.wavelet.level1noise == other.wavelet.level1noise; @@ -1149,7 +1153,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.pastlev = wavelet.pastlev && p.wavelet.pastlev == other.wavelet.pastlev; wavelet.satlev = wavelet.satlev && p.wavelet.satlev == other.wavelet.satlev; wavelet.ccwcurve = wavelet.ccwcurve && p.wavelet.ccwcurve == other.wavelet.ccwcurve; - wavelet.tmcurve = wavelet.tmcurve && p.wavelet.tmcurve == other.wavelet.tmcurve; + wavelet.blcurve = wavelet.blcurve && p.wavelet.blcurve == other.wavelet.blcurve; wavelet.opacityCurveRG = wavelet.opacityCurveRG && p.wavelet.opacityCurveRG == other.wavelet.opacityCurveRG; wavelet.opacityCurveBY = wavelet.opacityCurveBY && p.wavelet.opacityCurveBY == other.wavelet.opacityCurveBY; wavelet.opacityCurveW = wavelet.opacityCurveW && p.wavelet.opacityCurveW == other.wavelet.opacityCurveW; @@ -1162,7 +1166,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.expcontrast = wavelet.expcontrast && p.wavelet.expcontrast == other.wavelet.expcontrast; wavelet.expchroma = wavelet.expchroma && p.wavelet.expchroma == other.wavelet.expchroma; wavelet.expedge = wavelet.expedge && p.wavelet.expedge == other.wavelet.expedge; - wavelet.exptm = wavelet.exptm && p.wavelet.exptm == other.wavelet.exptm; + wavelet.expbl = wavelet.expbl && p.wavelet.expbl == other.wavelet.expbl; wavelet.expresid = wavelet.expresid && p.wavelet.expresid == other.wavelet.expresid; wavelet.expfinal = wavelet.expfinal && p.wavelet.expfinal == other.wavelet.expfinal; wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning; @@ -2953,6 +2957,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.showmask = mods.wavelet.showmask; } + if (wavelet.oldsh) { + toEdit.wavelet.oldsh = mods.wavelet.oldsh; + } + if (wavelet.tmr) { toEdit.wavelet.tmr = mods.wavelet.tmr; } @@ -3045,8 +3053,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.edgcont = mods.wavelet.edgcont; } - if (wavelet.threswav) { - toEdit.wavelet.threswav = mods.wavelet.threswav; + if (wavelet.chrwav) { + toEdit.wavelet.chrwav = mods.wavelet.chrwav; } if (wavelet.softwav) { @@ -3081,8 +3089,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.ccwcurve = mods.wavelet.ccwcurve; } - if (wavelet.tmcurve) { - toEdit.wavelet.tmcurve = mods.wavelet.tmcurve; + if (wavelet.blcurve) { + toEdit.wavelet.blcurve = mods.wavelet.blcurve; } if (wavelet.opacityCurveRG) { @@ -3126,8 +3134,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.expedge = mods.wavelet.expedge; } - if (wavelet.exptm) { - toEdit.wavelet.exptm = mods.wavelet.exptm; + if (wavelet.expbl) { + toEdit.wavelet.expbl = mods.wavelet.expbl; } if (wavelet.expresid) { @@ -3186,6 +3194,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.sigma = mods.wavelet.sigma; } + if (wavelet.offset) { + toEdit.wavelet.offset = mods.wavelet.offset; + } + if (wavelet.resconH) { toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 619521c05..8e02ba58f 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -508,6 +508,7 @@ struct WaveletParamsEdited { bool ushamethod; bool avoid; bool showmask; + bool oldsh; bool tmr; bool c[9]; bool ch[9]; @@ -525,6 +526,7 @@ struct WaveletParamsEdited { bool daubcoeffmethod; bool Dirmethod; bool sigma; + bool offset; bool rescon; bool resconH; bool reschro; @@ -557,14 +559,14 @@ struct WaveletParamsEdited { bool hllev; bool bllev; bool edgcont; - bool threswav; + bool chrwav; bool softwav; bool level0noise; bool level1noise; bool level2noise; bool level3noise; bool ccwcurve; - bool tmcurve; + bool blcurve; bool opacityCurveBY; bool opacityCurveRG; bool opacityCurveW; @@ -587,7 +589,7 @@ struct WaveletParamsEdited { bool expcontrast; bool expchroma; bool expedge; - bool exptm; + bool expbl; bool expresid; bool expfinal; bool exptoning; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index a65e3c789..1bea8a3fa 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -80,10 +80,12 @@ Wavelet::Wavelet() : avoid(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_AVOID")))), tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))), showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), + oldsh(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_OLDSH")))), neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))), sigma(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMA"), 0.2, 2.5, 0.01, 1.))), - rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), 0, 100, 1, 0))), - resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))), + offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), + resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), @@ -127,7 +129,7 @@ Wavelet::Wavelet() : mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), - threswav(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESWAV"), 0.9, 2., 0.01, 1.4))), + chrwav(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRWAV"), 0., 100., 0., 0.))), softwav(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFWAV"), -10.0, 1000.0, 0.5, 1.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), @@ -162,7 +164,7 @@ Wavelet::Wavelet() : expsettings(Gtk::manage(new MyExpander(false, M("TP_WAVELET_SETTINGS")))), exptoning(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TON")))), expclari(Gtk::manage(new MyExpander(true, M("TP_WAVELET_CLARI")))), - exptm(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TM")))), + expbl(Gtk::manage(new MyExpander(true, M("TP_WAVELET_BL")))), neutrHBox(Gtk::manage(new Gtk::HBox())), usharpHBox(Gtk::manage(new Gtk::HBox())) { @@ -179,10 +181,12 @@ Wavelet::Wavelet() : EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA"); - EvWavenatm = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVTM"); - EvWavthreswav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_THRESWAV"); + EvWavenabl = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBL"); + EvWavchrwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_chrwav"); + EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); + EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); EvWavsoftwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SOFTWAV"); - EvWavtmshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_TMSHAPE"); + EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_blshape"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -201,8 +205,8 @@ Wavelet::Wavelet() : expedge->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expedge)); enableEdgeConn = expedge->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expedge)); - exptm->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), exptm)); - enabletmConn = exptm->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), exptm)); + expbl->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expbl)); + enabletmConn = expbl->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expbl)); expgamut->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expgamut)); @@ -340,6 +344,8 @@ Wavelet::Wavelet() : sigma->setAdjusterListener(this); levBox->pack_start(*sigma, Gtk::PACK_SHRINK); + offset->setAdjusterListener(this); + levBox->pack_start(*offset, Gtk::PACK_SHRINK); levBox->pack_start(*sup); sup->setAdjusterListener(this); @@ -634,29 +640,29 @@ Wavelet::Wavelet() : edgBox->pack_start(*ctboxES); -//TM Wavelet - ToolParamBlock* const tmBox = Gtk::manage(new ToolParamBlock()); +//Blur Wavelet + ToolParamBlock* const blBox = Gtk::manage(new ToolParamBlock()); curveEditortm->setCurveListener(this); - tmshape = static_cast(curveEditortm->addCurve(CT_Flat, "", nullptr, false, false)); + blshape = static_cast(curveEditortm->addCurve(CT_Flat, "", nullptr, false, false)); - tmshape->setIdentityValue(0.); - tmshape->setResetCurve(FlatCurveType(default_params.tmcurve.at(0)), default_params.tmcurve); - tmshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CC_TOOLTIP")); + blshape->setIdentityValue(0.); + blshape->setResetCurve(FlatCurveType(default_params.blcurve.at(0)), default_params.blcurve); + blshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CC_TOOLTIP")); curveEditortm->curveListComplete(); curveEditortm->show(); - tmBox->pack_start(*curveEditortm, Gtk::PACK_SHRINK, 4); + blBox->pack_start(*curveEditortm, Gtk::PACK_SHRINK, 4); - threswav->setAdjusterListener(this); - tmBox->pack_start(*threswav); + chrwav->setAdjusterListener(this); + blBox->pack_start(*chrwav); softwav->setLogScale(10, -10); softwav->setAdjusterListener(this); - tmBox->pack_start(*softwav); + blBox->pack_start(*softwav); // Gamut @@ -711,6 +717,9 @@ Wavelet::Wavelet() : // Residual Image ToolParamBlock* const resBox = Gtk::manage(new ToolParamBlock()); + oldsh->set_active(true); + oldshConn = oldsh->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::oldshToggled)); + resBox->pack_start(*oldsh); rescon->setAdjusterListener(this); resBox->pack_start(*rescon, Gtk::PACK_SHRINK); @@ -975,9 +984,9 @@ Wavelet::Wavelet() : expedge->setLevel(2); pack_start(*expedge); - exptm->add(*tmBox, false); - exptm->setLevel(2); - pack_start(*exptm); + expbl->add(*blBox, false); + expbl->setLevel(2); + pack_start(*expbl); expclari->add(*clariBox, false); expclari->setLevel(2); @@ -1218,7 +1227,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) Lmethod->set_active(selectedLevel == -1 ? 4 : selectedLevel); ccshape->setCurve(pp->wavelet.ccwcurve); - tmshape->setCurve(pp->wavelet.tmcurve); + blshape->setCurve(pp->wavelet.blcurve); opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); opacityShape->setCurve(pp->wavelet.opacityCurveW); @@ -1229,7 +1238,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) expcontrast->setEnabled(pp->wavelet.expcontrast); expchroma->setEnabled(pp->wavelet.expchroma); expedge->setEnabled(pp->wavelet.expedge); - exptm->setEnabled(pp->wavelet.exptm); + expbl->setEnabled(pp->wavelet.expbl); expresid->setEnabled(pp->wavelet.expresid); expfinal->setEnabled(pp->wavelet.expfinal); exptoning->setEnabled(pp->wavelet.exptoning); @@ -1243,6 +1252,9 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) showmaskConn.block(true); showmask->set_active(pp->wavelet.showmask); showmaskConn.block(false); + oldshConn.block(true); + oldsh->set_active(pp->wavelet.oldsh); + oldshConn.block(false); tmrConn.block(true); tmr->set_active(pp->wavelet.tmr); tmrConn.block(false); @@ -1273,8 +1285,10 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) lastlipst = pp->wavelet.lipst; lastavoid = pp->wavelet.avoid; lastshowmask = pp->wavelet.showmask; + lastoldsh = pp->wavelet.oldsh; lasttmr = pp->wavelet.tmr; sigma->setValue(pp->wavelet.sigma); + offset->setValue(pp->wavelet.offset); rescon->setValue(pp->wavelet.rescon); resconH->setValue(pp->wavelet.resconH); reschro->setValue(pp->wavelet.reschro); @@ -1309,7 +1323,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) pastlev->setValue(pp->wavelet.pastlev); satlev->setValue(pp->wavelet.satlev); edgcont->setValue(pp->wavelet.edgcont); - threswav->setValue(pp->wavelet.threswav); + chrwav->setValue(pp->wavelet.chrwav); softwav->setValue(pp->wavelet.softwav); greenlow->setValue(pp->wavelet.greenlow); @@ -1408,11 +1422,11 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) set_inconsistent(multiImage && !pedited->wavelet.enabled); ccshape->setUnChanged(!pedited->wavelet.ccwcurve); - tmshape->setUnChanged(!pedited->wavelet.tmcurve); + blshape->setUnChanged(!pedited->wavelet.blcurve); expcontrast->set_inconsistent(!pedited->wavelet.expcontrast); expchroma->set_inconsistent(!pedited->wavelet.expchroma); expedge->set_inconsistent(!pedited->wavelet.expedge); - exptm->set_inconsistent(!pedited->wavelet.exptm); + expbl->set_inconsistent(!pedited->wavelet.expbl); expresid->set_inconsistent(!pedited->wavelet.expresid); expfinal->set_inconsistent(!pedited->wavelet.expfinal); expclari->set_inconsistent(!pedited->wavelet.expclari); @@ -1427,10 +1441,12 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) clshape->setUnChanged(!pedited->wavelet.wavclCurve); avoid->set_inconsistent(!pedited->wavelet.avoid); showmask->set_inconsistent(!pedited->wavelet.showmask); + oldsh->set_inconsistent(!pedited->wavelet.oldsh); tmr->set_inconsistent(!pedited->wavelet.tmr); edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); sigma->setEditedState(pedited->wavelet.sigma ? Edited : UnEdited); + offset->setEditedState(pedited->wavelet.offset ? Edited : UnEdited); resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); @@ -1484,7 +1500,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) satlev->setEditedState(pedited->wavelet.satlev ? Edited : UnEdited); strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited); edgcont->setEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); - threswav->setEditedState(pedited->wavelet.threswav ? Edited : UnEdited); + chrwav->setEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); softwav->setEditedState(pedited->wavelet.softwav ? Edited : UnEdited); level0noise->setEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); @@ -1591,7 +1607,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) void Wavelet::setEditProvider(EditDataProvider *provider) { ccshape->setEditProvider(provider); - tmshape->setEditProvider(provider); + blshape->setEditProvider(provider); opacityShapeRG->setEditProvider(provider); opacityShapeBY->setEditProvider(provider); opacityShape->setEditProvider(provider); @@ -1604,7 +1620,7 @@ void Wavelet::setEditProvider(EditDataProvider *provider) void Wavelet::autoOpenCurve() { ccshape->openIfNonlinear(); - tmshape->openIfNonlinear(); + blshape->openIfNonlinear(); //opacityShapeRG->openIfNonlinear(); //opacityShapeBY->openIfNonlinear(); } @@ -1615,8 +1631,10 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.enabled = getEnabled(); pp->wavelet.avoid = avoid->get_active(); pp->wavelet.showmask = showmask->get_active(); + pp->wavelet.oldsh = oldsh->get_active(); pp->wavelet.tmr = tmr->get_active(); pp->wavelet.sigma = sigma->getValue(); + pp->wavelet.offset = offset->getValue(); pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); @@ -1655,14 +1673,14 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.hllev = hllev->getValue (); pp->wavelet.bllev = bllev->getValue (); pp->wavelet.edgcont = edgcont->getValue (); - pp->wavelet.threswav = threswav->getValue(); + pp->wavelet.chrwav = chrwav->getValue(); pp->wavelet.softwav = softwav->getValue(); pp->wavelet.level0noise = level0noise->getValue (); pp->wavelet.level1noise = level1noise->getValue (); pp->wavelet.level2noise = level2noise->getValue (); pp->wavelet.level3noise = level3noise->getValue (); pp->wavelet.ccwcurve = ccshape->getCurve(); - pp->wavelet.tmcurve = tmshape->getCurve(); + pp->wavelet.blcurve = blshape->getCurve(); pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve(); pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve(); pp->wavelet.opacityCurveW = opacityShape->getCurve(); @@ -1687,7 +1705,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.expcontrast = expcontrast->getEnabled(); pp->wavelet.expchroma = expchroma->getEnabled(); pp->wavelet.expedge = expedge->getEnabled(); - pp->wavelet.exptm = exptm->getEnabled(); + pp->wavelet.expbl = expbl->getEnabled(); pp->wavelet.expresid = expresid->getEnabled(); pp->wavelet.expfinal = expfinal->getEnabled(); pp->wavelet.exptoning = exptoning->getEnabled(); @@ -1709,6 +1727,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.enabled = !get_inconsistent(); pedited->wavelet.avoid = !avoid->get_inconsistent(); pedited->wavelet.showmask = !showmask->get_inconsistent(); + pedited->wavelet.oldsh = !oldsh->get_inconsistent(); pedited->wavelet.tmr = !tmr->get_inconsistent(); pedited->wavelet.median = !median->get_inconsistent(); pedited->wavelet.medianlev = !medianlev->get_inconsistent(); @@ -1732,6 +1751,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.Dirmethod = Dirmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.edgthresh = edgthresh->getEditedState(); pedited->wavelet.sigma = sigma->getEditedState(); + pedited->wavelet.offset = offset->getEditedState(); pedited->wavelet.rescon = rescon->getEditedState(); pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState(); @@ -1762,9 +1782,9 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.skinprotect = skinprotect->getEditedState(); pedited->wavelet.hllev = hllev->getEditedState(); pedited->wavelet.ccwcurve = !ccshape->isUnChanged(); - pedited->wavelet.tmcurve = !tmshape->isUnChanged(); + pedited->wavelet.blcurve = !blshape->isUnChanged(); pedited->wavelet.edgcont = edgcont->getEditedState(); - pedited->wavelet.threswav = threswav->getEditedState(); + pedited->wavelet.chrwav = chrwav->getEditedState(); pedited->wavelet.softwav = softwav->getEditedState(); pedited->wavelet.level0noise = level0noise->getEditedState(); pedited->wavelet.level1noise = level1noise->getEditedState(); @@ -1796,7 +1816,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); pedited->wavelet.expedge = !expedge->get_inconsistent(); - pedited->wavelet.exptm = !exptm->get_inconsistent(); + pedited->wavelet.expbl = !expbl->get_inconsistent(); pedited->wavelet.expresid = !expresid->get_inconsistent(); pedited->wavelet.expfinal = !expfinal->get_inconsistent(); pedited->wavelet.exptoning = !exptoning->get_inconsistent(); @@ -1938,8 +1958,8 @@ void Wavelet::curveChanged(CurveEditor* ce) if (listener && getEnabled()) { if (ce == ccshape) { listener->panelChanged(EvWavCCCurve, M("HISTORY_CUSTOMCURVE")); - } else if (ce == tmshape) { - listener->panelChanged(EvWavtmshape, M("HISTORY_CUSTOMCURVE")); + } else if (ce == blshape) { + listener->panelChanged(EvWavblshape, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeRG) { listener->panelChanged(EvWavColor, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeBY) { @@ -1973,6 +1993,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit balance->setDefault(defParams->wavelet.balance); iter->setDefault(defParams->wavelet.iter); sigma->setDefault(defParams->wavelet.sigma); + offset->setDefault(defParams->wavelet.offset); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -2006,7 +2027,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit pastlev->setDefault (defParams->wavelet.pastlev); satlev->setDefault (defParams->wavelet.satlev); edgcont->setDefault (defParams->wavelet.edgcont); - threswav->setDefault(defParams->wavelet.threswav); + chrwav->setDefault(defParams->wavelet.chrwav); softwav->setDefault(defParams->wavelet.softwav); level0noise->setDefault (defParams->wavelet.level0noise); level1noise->setDefault (defParams->wavelet.level1noise); @@ -2037,6 +2058,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); sigma->setDefault(defParams->wavelet.sigma); + offset->setDefault(defParams->wavelet.offset); rescon->setDefault(defParams->wavelet.rescon); resconH->setDefault(defParams->wavelet.resconH); reschro->setDefault(defParams->wavelet.reschro); @@ -2071,7 +2093,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit pastlev->setDefaultEditedState(pedited->wavelet.pastlev ? Edited : UnEdited); satlev->setDefaultEditedState(pedited->wavelet.satlev ? Edited : UnEdited); edgcont->setDefaultEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); - threswav->setDefaultEditedState(pedited->wavelet.threswav ? Edited : UnEdited); + chrwav->setDefaultEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); softwav->setDefaultEditedState(pedited->wavelet.softwav ? Edited : UnEdited); strength->setDefaultEditedState(pedited->wavelet.strength ? Edited : UnEdited); balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited); @@ -2090,6 +2112,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit } } else { sigma->setDefaultEditedState(Irrelevant); + offset->setDefaultEditedState(Irrelevant); rescon->setDefaultEditedState(Irrelevant); resconH->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant); @@ -2122,7 +2145,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit hllev->setDefaultEditedState(Irrelevant); bllev->setDefaultEditedState(Irrelevant); edgcont->setDefaultEditedState(Irrelevant); - threswav->setDefaultEditedState(Irrelevant); + chrwav->setDefaultEditedState(Irrelevant); softwav->setDefaultEditedState(Irrelevant); level0noise->setDefaultEditedState(Irrelevant); level1noise->setDefaultEditedState(Irrelevant); @@ -2621,6 +2644,7 @@ void Wavelet::setBatchMode(bool batchMode) curveEditorRES->setBatchMode(batchMode); curveEditorGAM->setBatchMode(batchMode); sigma->showEditedCB(); + offset->showEditedCB(); rescon->showEditedCB(); resconH->showEditedCB(); reschro->showEditedCB(); @@ -2655,7 +2679,7 @@ void Wavelet::setBatchMode(bool batchMode) pastlev->showEditedCB(); satlev->showEditedCB(); edgcont->showEditedCB(); - threswav->showEditedCB(); + chrwav->showEditedCB(); softwav->showEditedCB(); strength->showEditedCB(); balance->showEditedCB(); @@ -2706,6 +2730,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavrescon, rescon->getTextValue()); } else if (a == sigma) { listener->panelChanged(EvWavsigma, sigma->getTextValue()); + } else if (a == offset) { + listener->panelChanged(EvWavoffset, offset->getTextValue()); } else if (a == resconH) { listener->panelChanged(EvWavresconH, resconH->getTextValue()); } else if (a == reschro) { @@ -2819,8 +2845,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavgreenlow, greenlow->getTextValue()); } else if (a == bluelow) { listener->panelChanged(EvWavbluelow, bluelow->getTextValue()); - } else if (a == threswav) { - listener->panelChanged(EvWavthreswav, threswav->getTextValue()); + } else if (a == chrwav) { + listener->panelChanged(EvWavchrwav, chrwav->getTextValue()); } else if (a == softwav) { listener->panelChanged(EvWavsoftwav, softwav->getTextValue()); } @@ -3194,6 +3220,38 @@ void Wavelet::showmaskToggled() } } +void Wavelet::oldshToggled() +{ + if (oldsh->get_active()) { + radius->hide(); + } else { + radius->show(); + } + + if (multiImage) { + if (oldsh->get_inconsistent()) { + oldsh->set_inconsistent(false); + oldshConn.block(true); + oldsh->set_active(false); + oldshConn.block(false); + } else if (lastoldsh) { + oldsh->set_inconsistent(true); + } + + lastoldsh = oldsh->get_active(); + } + + if (listener && (multiImage || getEnabled())) { + if (oldsh->get_inconsistent()) { + listener->panelChanged(EvWavoldsh, M("GENERAL_UNCHANGED")); + } else if (oldsh->get_active()) { + listener->panelChanged(EvWavoldsh, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvWavoldsh, M("GENERAL_DISABLED")); + } + } +} + void Wavelet::tmrToggled() { @@ -3344,7 +3402,7 @@ void Wavelet::foldAllButMe(GdkEventButton* event, MyExpander *expander) exptoning->set_expanded(exptoning == expander); expnoise->set_expanded(expnoise == expander); expedge->set_expanded(expedge == expander); - exptm->set_expanded(exptm == expander); + expbl->set_expanded(expbl == expander); expgamut->set_expanded(expgamut == expander); expresid->set_expanded(expresid == expander); expfinal->set_expanded(expfinal == expander); @@ -3367,8 +3425,8 @@ void Wavelet::enableToggled(MyExpander *expander) event = EvWavenanoise; } else if (expander == expedge) { event = EvWavenaedge; - } else if (expander == exptm) { - event = EvWavenatm; + } else if (expander == expbl) { + event = EvWavenabl; } else if (expander == expresid) { event = EvWavenares; } else if (expander == expfinal) { @@ -3431,7 +3489,7 @@ void Wavelet::writeOptions(std::vector &tpOpen) tpOpen.push_back(exptoning->get_expanded()); tpOpen.push_back(expnoise->get_expanded()); tpOpen.push_back(expedge->get_expanded()); - tpOpen.push_back(exptm->get_expanded()); + tpOpen.push_back(expbl->get_expanded()); tpOpen.push_back(expgamut->get_expanded()); tpOpen.push_back(expresid->get_expanded()); tpOpen.push_back(expfinal->get_expanded()); @@ -3447,7 +3505,7 @@ void Wavelet::updateToolState(const std::vector& tpOpen) exptoning->set_expanded(false); expnoise->set_expanded(false); expedge->set_expanded(false); - exptm->set_expanded(false); + expbl->set_expanded(false); expgamut->set_expanded(false); expresid->set_expanded(false); expfinal->set_expanded(false); @@ -3462,7 +3520,7 @@ void Wavelet::updateToolState(const std::vector& tpOpen) exptoning->set_expanded(tpOpen[3]); expnoise->set_expanded(tpOpen[4]); expedge->set_expanded(tpOpen[5]); - exptm->set_expanded(tpOpen[6]); + expbl->set_expanded(tpOpen[6]); expgamut->set_expanded(tpOpen[7]); expresid->set_expanded(tpOpen[8]); expfinal->set_expanded(tpOpen[9]); diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 356241fa0..15ad773fc 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -79,10 +79,12 @@ private: rtengine::ProcEvent EvWavscale; rtengine::ProcEvent EvWavradius; rtengine::ProcEvent EvWavsigma; - rtengine::ProcEvent EvWavenatm; - rtengine::ProcEvent EvWavthreswav; + rtengine::ProcEvent EvWavenabl; + rtengine::ProcEvent EvWavchrwav; + rtengine::ProcEvent EvWavoldsh; + rtengine::ProcEvent EvWavoffset; rtengine::ProcEvent EvWavsoftwav; - rtengine::ProcEvent EvWavtmshape; + rtengine::ProcEvent EvWavblshape; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -102,6 +104,7 @@ private: void TilesmethodChanged(); void avoidToggled(); void showmaskToggled (); + void oldshToggled (); void cbenabToggled(); void contrastMinusPressed(); void contrastPlusPressed(); @@ -163,7 +166,7 @@ private: DiagonalCurveEditor* clshape; FlatCurveEditor* ccshape; - FlatCurveEditor* tmshape; + FlatCurveEditor* blshape; Gtk::CheckButton* const median; Gtk::CheckButton* const medianlev; Gtk::CheckButton* const linkedg; @@ -172,11 +175,13 @@ private: Gtk::CheckButton* const avoid; Gtk::CheckButton* const tmr; Gtk::CheckButton* const showmask; + Gtk::CheckButton* const oldsh; Gtk::Button* const neutralchButton; Adjuster* correction[9]; Adjuster* correctionch[9]; Adjuster* const sigma; + Adjuster* const offset; Adjuster* const rescon; Adjuster* const resconH; Adjuster* const reschro; @@ -231,7 +236,7 @@ private: Adjuster* const mergeC; Adjuster* const softrad; Adjuster* const softradend; - Adjuster* const threswav; + Adjuster* const chrwav; Adjuster* const softwav; MyComboBoxText* const Lmethod; @@ -284,20 +289,20 @@ private: MyExpander* const expsettings; MyExpander* const exptoning; MyExpander* const expclari; - MyExpander* const exptm; + MyExpander* const expbl; Gtk::HBox* const neutrHBox; Gtk::HBox* const usharpHBox; sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enabletmConn, enableFinalConn, enableclariConn; sigc::connection enableNoiseConn, enableResidConn, enableToningConn; - sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn; + sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn, oldshConn; sigc::connection neutralPressedConn; sigc::connection contrastPlusPressedConn; sigc::connection contrastMinusPressedConn; sigc::connection neutralchPressedConn; - bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask; + bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask, lastoldsh; int nextnlevel; IdleRegister idle_register;