diff --git a/rtdata/languages/default b/rtdata/languages/default index 7d2f07998..910d4e506 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1026,6 +1026,8 @@ HISTORY_MSG_785;Local - Mask Scope DeltaE HISTORY_MSG_786;Local - SH method HISTORY_MSG_787;Local - Equalizer multiplier HISTORY_MSG_788;Local - Equalizer detail +HISTORY_MSG_789;Local - SH mask amount +HISTORY_MSG_790;Local - SH mask anchor HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2325,7 +2327,7 @@ TP_LOCALLAB_SETTINGS;Settings TP_LOCALLAB_ENABLE_MASK;Enable mask TP_LOCALLAB_SHOWCB;2+ - Mask and modifications TP_LOCALLAB_SHOWT;3 - Mask and modifications -TP_LOCALLAB_SHOWS;4+ - Mask and modifications +TP_LOCALLAB_SHOWS;4+* - Mask and modifications TP_LOCALLAB_SHOWR;5 - Mask and modifications TP_LOCALLAB_SHOWE;6+ - Mask and modifications TP_LOCALLAB_SHOWC;7+* - Mask and modifications @@ -2355,6 +2357,7 @@ TP_LOCALLAB_LOCCONT;Unsharp Mask TP_LOCALLAB_WAV;Levels local contrast TP_LOCALLAB_WAVMASK;Mask Levels local contrast TP_LOCALLAB_LEVELWAV;Wavelets Levels +TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask TP_LOCALLAB_CSTHRESHOLD;Wavelets Levels TP_LOCALLAB_RESIDCONT;Residual image Contrast TP_LOCALLAB_RESIDCHRO;Residual image Chroma diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 0278912e6..f336ed65c 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -191,7 +191,7 @@ public: const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, - bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, int shado, + bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, int shado, float amountcd, float anchorcd, LUTf & lmasklocalcurve, bool & localmaskutili, const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, bool delt, const float hueref, const float chromaref, const float lumaref, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 290b7aea0..1ac17593a 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -3137,7 +3137,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, - bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, int shado, + bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, int shado, float amountcd, float anchorcd, LUTf & lmasklocalcurve, bool & localmaskutili, const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, bool delt, const float hueref, const float chromaref, const float lumaref, @@ -3284,7 +3284,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } if (shado > 0) { - ImProcFunctions::shadowsHighlights(bufmaskblurcol, true, 1, 0, shado, 40, sk, 0, 30); + ImProcFunctions::shadowsHighlights(bufmaskblurcol, true, 1, 0, shado, 40, sk, 0, 60); } int wavelet_level = level_br; @@ -3320,6 +3320,22 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } + + if(amountcd > 1.f) {//dynamic range compression for Mask + FattalToneMappingParams fatParams; + fatParams.enabled = true; + fatParams.threshold = 100.f; + fatParams.amount = amountcd; + fatParams.anchor = anchorcd; + int nlev = 1; + Imagefloat *tmpImagefat = nullptr; + tmpImagefat = new Imagefloat(bfw, bfh); + lab2rgb(*bufmaskblurcol, *tmpImagefat, params->icm.workingProfile); + ToneMapFattal02(tmpImagefat, fatParams, nlev); + rgb2lab(*tmpImagefat, *bufmaskblurcol, params->icm.workingProfile); + delete tmpImagefat; + } + if (delt) { float *rdE[bfh] ALIGNED16; float *rdEBuffer = new float[bfh * bfw]; @@ -8224,10 +8240,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); bool lmasutilicolwav = false; - + float amountcd = 0.f; + float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, inv, lp, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 1, 1, 5, 5, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco ); @@ -8515,10 +8532,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); int shado = 0; + float amountcd = 0.f; + float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco ); @@ -8552,10 +8571,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); int shado = 0; + float amountcd = 0.f; + float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco ); @@ -8738,10 +8759,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); int shado = 0; + float amountcd = params->locallab.spots.at(sp).fatamountSH; + float anchorcd = params->locallab.spots.at(sp).fatanchorSH; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigSH.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco ); @@ -8893,10 +8916,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); int shado = 0; + float amountcd = params->locallab.spots.at(sp).fatamountSH; + float anchorcd = params->locallab.spots.at(sp).fatanchorSH; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco ); @@ -10902,10 +10927,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco ); @@ -11183,10 +11210,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco ); @@ -11439,10 +11468,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco @@ -11660,10 +11691,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 14a3c77ce..ff0a6cea5 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -815,6 +815,8 @@ enum ProcEventCode { EvlocallabshMethod = 785, EvlocallabEqualizersh = 786, EvlocallabdetailSH = 787, + EvlocallabfatamountSH = 788, + EvlocallabfatanchorSH = 789, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 574cca2b4..bbc8c4ae7 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2533,6 +2533,8 @@ LocallabParams::LocallabSpot::LocallabSpot() : lapmaskSH(0.0), detailSH(0), LmaskSHcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, + fatamountSH(1.0), + fatanchorSH(50.0), // Vibrance expvibrance(false), saturated(0), @@ -2843,6 +2845,8 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && lapmaskSH == other.lapmaskSH && detailSH == other.detailSH && LmaskSHcurve == other.LmaskSHcurve + && fatamountSH == other.fatamountSH + && fatanchorSH == other.fatanchorSH // Vibrance && expvibrance == other.expvibrance && saturated == other.saturated @@ -4132,6 +4136,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo for (int j = 0; j < 5; j++) { saveToKeyfile(!pedited || pedited->locallab.spots.at(i).multsh[j], "Locallab", "Multsh" + std::to_string(j) + "_" + std::to_string(i), spot.multsh[j], keyFile); } + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatamountSH, "Locallab", "FatamountSH_" + std::to_string(i), spot.fatamountSH, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatanchorSH, "Locallab", "FatanchorSH_" + std::to_string(i), spot.fatanchorSH, keyFile); // Vibrance saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expvibrance, "Locallab", "Expvibrance_" + std::to_string(i), spot.expvibrance, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).saturated, "Locallab", "Saturated_" + std::to_string(i), spot.saturated, keyFile); @@ -5547,6 +5553,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) for (int j = 0; j < 5; j ++) { assignFromKeyfile(keyFile, "Locallab", "Multsh" + std::to_string(j) + "_" + std::to_string(i), pedited, spot.multsh[j], spotEdited.multsh[j]); } + assignFromKeyfile(keyFile, "Locallab", "FatamountSH_" + std::to_string(i), pedited, spot.fatamountSH, spotEdited.fatamountSH); + assignFromKeyfile(keyFile, "Locallab", "FatanchorSH_" + std::to_string(i), pedited, spot.fatanchorSH, spotEdited.fatanchorSH); // Vibrance assignFromKeyfile(keyFile, "Locallab", "Expvibrance_" + std::to_string(i), pedited, spot.expvibrance, spotEdited.expvibrance); assignFromKeyfile(keyFile, "Locallab", "Saturated_" + std::to_string(i), pedited, spot.saturated, spotEdited.saturated); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index e73775097..a03728f6c 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1081,6 +1081,8 @@ struct LocallabParams { double lapmaskSH; int detailSH; std::vector LmaskSHcurve; + double fatamountSH; + double fatanchorSH; // Vibrance bool expvibrance; int saturated; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index e6997c033..d793f4062 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -814,7 +814,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvLocallabSpotscopemask LUMINANCECURVE, //EvlocallabshMethod LUMINANCECURVE, //EvlocallabEqualizersh - LUMINANCECURVE // EvlocallabdetailSH + LUMINANCECURVE, // EvlocallabdetailSH + LUMINANCECURVE, //EvlocallabfatamountSH + LUMINANCECURVE //EvlocallabfatanchorSH }; namespace rtengine diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index ab37016c9..72069b45d 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -245,6 +245,8 @@ Locallab::Locallab(): slomaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), lapmaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), detailSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILSH"), -5, 5, 1, 0))), + fatamountSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATAMOUNT"), 1., 100., 1., 1.))), + fatanchorSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 1., 100., 1., 50., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), // Vibrance saturated(Gtk::manage(new Adjuster(M("TP_VIBRANCE_SATURATED"), -100., 100., 1., 0.))), pastels(Gtk::manage(new Adjuster(M("TP_VIBRANCE_PASTELS"), -100., 100., 1., 0.))), @@ -444,6 +446,7 @@ Locallab::Locallab(): gridFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRID")))), pdeFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PDEFRA")))), fatFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATFRA")))), + fatSHFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATSHFRA")))), dehaFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DEHAFRA")))), retiFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETIFRA")))), retitoolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETITOOLFRA")))), @@ -1094,6 +1097,8 @@ Locallab::Locallab(): slomaskSH->setAdjusterListener(this); lapmaskSH->setAdjusterListener(this); detailSH->setAdjusterListener(this); + fatamountSH->setAdjusterListener(this); + fatanchorSH->setAdjusterListener(this); if (showtooltip) { radmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); @@ -1197,6 +1202,17 @@ Locallab::Locallab(): shadhighBox->pack_start(*blurSHde); shadhighBox->pack_start(*inverssh); + fatSHFrame->set_label_align(0.025, 0.5); + +// if (showtooltip) { +// fatSHFrame->set_tooltip_text(M("TP_LOCALLAB_FATSHFRAME_TOOLTIP")); +// } + + + ToolParamBlock* const fatSHBox = Gtk::manage(new ToolParamBlock()); + fatSHBox->pack_start(*fatamountSH); + fatSHBox->pack_start(*fatanchorSH); + fatSHFrame->add(*fatSHBox); ToolParamBlock* const maskSHBox = Gtk::manage(new ToolParamBlock()); maskSHBox->pack_start(*showmaskSHMethod, Gtk::PACK_SHRINK, 4); @@ -1210,9 +1226,11 @@ Locallab::Locallab(): maskSHBox->pack_start(*gammaskSH, Gtk::PACK_SHRINK, 0); maskSHBox->pack_start(*slomaskSH, Gtk::PACK_SHRINK, 0); maskSHBox->pack_start(*mask2SHCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskSHBox->pack_start(*fatSHFrame); expmasksh->add(*maskSHBox, false); shadhighBox->pack_start(*expmasksh); + expshadhigh->add(*shadhighBox, false); expshadhigh->setLevel(2); @@ -3452,6 +3470,8 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).lapmaskSH = lapmaskSH->getValue(); pp->locallab.spots.at(pp->locallab.selspot).detailSH = detailSH->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).LmaskSHcurve = LmaskSHshape->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).fatamountSH = fatamountSH->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).fatanchorSH = fatanchorSH->getValue(); if (shMethod->get_active_row_number() == 0) { pp->locallab.spots.at(pp->locallab.selspot).shMethod = "std"; @@ -3813,6 +3833,8 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) for (int i = 0; i < 5; i++) { pe->locallab.spots.at(pp->locallab.selspot).multsh[i] = pe->locallab.spots.at(pp->locallab.selspot).multsh[i] || multipliersh[i]->getEditedState(); } + pe->locallab.spots.at(pp->locallab.selspot).fatamountSH = pe->locallab.spots.at(pp->locallab.selspot).fatamountSH || fatamountSH->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).fatanchorSH = pe->locallab.spots.at(pp->locallab.selspot).fatanchorSH || fatanchorSH->getEditedState(); // Vibrance pe->locallab.spots.at(pp->locallab.selspot).expvibrance = pe->locallab.spots.at(pp->locallab.selspot).expvibrance || !expvibrance->get_inconsistent(); @@ -4122,6 +4144,8 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) for (int i = 0; i < 5; i++) { pedited->locallab.spots.at(pp->locallab.selspot).multsh[i] = pedited->locallab.spots.at(pp->locallab.selspot).multsh[i] || multipliersh[i]->getEditedState(); } + pedited->locallab.spots.at(pp->locallab.selspot).fatamountSH = pedited->locallab.spots.at(pp->locallab.selspot).fatamountSH || fatamountSH->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).fatanchorSH = pedited->locallab.spots.at(pp->locallab.selspot).fatanchorSH || fatanchorSH->getEditedState(); // Vibrance pedited->locallab.spots.at(pp->locallab.selspot).expvibrance = pedited->locallab.spots.at(pp->locallab.selspot).expvibrance || !expvibrance->get_inconsistent(); @@ -6126,6 +6150,8 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe for (int i = 0; i < 5; i++) { multipliersh[i]->setDefault(defSpot->multsh[i]); } + fatamountSH->setDefault(defSpot->fatamountSH); + fatanchorSH->setDefault(defSpot->fatanchorSH); // Vibrance saturated->setDefault((double)defSpot->saturated); @@ -6313,6 +6339,8 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe for (int i = 0; i < 5; i++) { multipliersh[i]->setDefaultEditedState(Irrelevant); } + fatamountSH->setDefaultEditedState(Irrelevant); + fatanchorSH->setDefaultEditedState(Irrelevant); // Vibrance saturated->setDefaultEditedState(Irrelevant); @@ -6504,6 +6532,8 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe for (int i = 0; i < 5; i++) { multipliersh[i]->setDefaultEditedState(defSpotState->multsh[i] ? Edited : UnEdited); } + fatamountSH->setDefaultEditedState(defSpotState->fatamountSH ? Edited : UnEdited); + fatanchorSH->setDefaultEditedState(defSpotState->fatanchorSH ? Edited : UnEdited); // Vibrance saturated->setDefaultEditedState(defSpotState->saturated ? Edited : UnEdited); @@ -7055,6 +7085,20 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == fatamountSH) { + if (listener) { + listener->panelChanged(EvlocallabfatamountSH, fatamountSH->getTextValue()); + } + } + + + if (a == fatanchorSH) { + if (listener) { + listener->panelChanged(EvlocallabfatanchorSH, fatanchorSH->getTextValue()); + } + } + + } // Vibrance @@ -7831,6 +7875,8 @@ void Locallab::setBatchMode(bool batchMode) for (int i = 0; i < 5; i++) { multipliersh[i]->showEditedCB(); } + fatamountSH->showEditedCB(); + fatanchorSH->showEditedCB(); // Vibrance saturated->showEditedCB(); @@ -8429,6 +8475,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con for (int i = 0; i < 5; i++) { multipliersh[i]->setValue(pp->locallab.spots.at(index).multsh[i]); } + fatamountSH->setValue(pp->locallab.spots.at(index).fatamountSH); + fatanchorSH->setValue(pp->locallab.spots.at(index).fatanchorSH); // Vibrance expvibrance->setEnabled(pp->locallab.spots.at(index).expvibrance); @@ -8814,6 +8862,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con for (int i = 0; i < 5; i++) { multipliersh[i]->setEditedState(spotState->multsh[i] ? Edited : UnEdited); } + fatamountSH->setEditedState(spotState->fatamountSH ? Edited : UnEdited); + fatanchorSH->setEditedState(spotState->fatanchorSH ? Edited : UnEdited); // Vibrance expvibrance->set_inconsistent(!spotState->expvibrance); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 87b8936e8..0cb5be6de 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -203,6 +203,8 @@ private: Adjuster* const slomaskSH; Adjuster* const lapmaskSH; Adjuster* const detailSH; + Adjuster* const fatamountSH; + Adjuster* const fatanchorSH; // Vibrance Adjuster* const saturated; Adjuster* const pastels; @@ -452,6 +454,7 @@ private: Gtk::Frame* gridFrame; Gtk::Frame* pdeFrame; Gtk::Frame* fatFrame; + Gtk::Frame* fatSHFrame; Gtk::Frame* dehaFrame; Gtk::Frame* retiFrame; Gtk::Frame* retitoolFrame; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 00a49cdaf..a0c0b4f83 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1076,6 +1076,8 @@ void ParamsEdited::initFrom(const std::vector& for (int k = 0; k < 5; k++) { locallab.spots.at(j).multsh[k] = locallab.spots.at(j).multsh[k] && pSpot.multsh[k] == otherSpot.multsh[k]; } + locallab.spots.at(j).fatamountSH = locallab.spots.at(j).fatamountSH && pSpot.fatamountSH == otherSpot.fatamountSH; + locallab.spots.at(j).fatanchorSH = locallab.spots.at(j).fatanchorSH && pSpot.fatanchorSH == otherSpot.fatanchorSH; // Vibrance locallab.spots.at(j).expvibrance = locallab.spots.at(j).expvibrance && pSpot.expvibrance == otherSpot.expvibrance; locallab.spots.at(j).saturated = locallab.spots.at(j).saturated && pSpot.saturated == otherSpot.saturated; @@ -3197,6 +3199,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng } } + if (locallab.spots.at(i).fatamountSH) { + toEdit.locallab.spots.at(i).fatamountSH = mods.locallab.spots.at(i).fatamountSH; + } + + if (locallab.spots.at(i).fatanchorSH) { + toEdit.locallab.spots.at(i).fatanchorSH = mods.locallab.spots.at(i).fatanchorSH; + } + // Vibrance if (locallab.spots.at(i).expvibrance) { toEdit.locallab.spots.at(i).expvibrance = mods.locallab.spots.at(i).expvibrance; @@ -4940,6 +4950,8 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : lapmaskSH(v), detailSH(v), LmaskSHcurve(v), + fatamountSH(v), + fatanchorSH(v), // Vibrance expvibrance(v), saturated(v), @@ -5240,6 +5252,8 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) lapmaskSH = v; detailSH = v; LmaskSHcurve = v; + fatamountSH = v; + fatanchorSH = v; // Vibrance expvibrance = v; saturated = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 5ac7aef4a..f9bb38d44 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -492,6 +492,8 @@ public: bool lapmaskSH; bool detailSH; bool LmaskSHcurve; + bool fatamountSH; + bool fatanchorSH; // Vibrance bool expvibrance; bool saturated;