diff --git a/rtdata/languages/default b/rtdata/languages/default index 76a273deb..73a30f2fc 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -998,6 +998,7 @@ HISTORY_MSG_757;Local - Exp Laplacian mask HISTORY_MSG_758;Local - Reti Laplacian mask HISTORY_MSG_759;Local - Exp Laplacian mask HISTORY_MSG_760;Local - Color Laplacian mask +HISTORY_MSG_761;Local - SH Laplacian mask HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 326475951..a50b1429b 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -7773,9 +7773,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float gamma = lp.gammaSH; float slope = lp.slomaSH; float blendm = lp.blendmaSH; + float lap = params->locallab.spots.at(sp).lapmaskSH; + maskcalccol(false, 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, 0.f, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm); if (lp.showmaskSHmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); @@ -7865,10 +7867,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float gamma = lp.gammaSH; float slope = lp.slomaSH; float blendm = lp.blendmaSH; + float lap = params->locallab.spots.at(sp).lapmaskSH; maskcalccol(false, 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, 0.f, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm); if (lp.showmaskSHmetinv == 1) { @@ -9942,8 +9945,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float slope = lp.slomaexp; float blendm = lp.blendmaexp; float lap = params->locallab.spots.at(sp).lapmaskexp; - - // bool invmask = params->locallab.spots.at(sp).enaExpMaskaft; + maskcalccol(false, 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); @@ -10647,7 +10649,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float gamma = lp.gammacol; float slope = lp.slomacol; float blendm = lp.blendmacol; - float lap = params->locallab.spots.at(sp).lapmaskexp; + float lap = params->locallab.spots.at(sp).lapmaskcol; maskcalccol(false, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 8d4ee02c7..bb2147dd1 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -787,6 +787,7 @@ enum ProcEventCode { Evlocallablapmaskreti = 757, Evlocallablapmaskexp = 758, Evlocallablapmaskcol = 759, + EvlocallablapmaskSH = 760, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index aeeacbc55..2775c9be7 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2514,12 +2514,13 @@ LocallabParams::LocallabSpot::LocallabSpot() : LLmaskSHcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, HHmaskSHcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, blendmaskSH(0), - radmaskSH(10.0), + radmaskSH(0.0), blurSHde(5), inverssh(false), chromaskSH(0.0), gammaskSH(1.0), slomaskSH(0.0), + lapmaskSH(0.0), // Vibrance expvibrance(false), saturated(0), @@ -2793,6 +2794,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chromaskSH == other.chromaskSH && gammaskSH == other.gammaskSH && slomaskSH == other.slomaskSH + && lapmaskSH == other.lapmaskSH // Vibrance && expvibrance == other.expvibrance && saturated == other.saturated @@ -4052,6 +4054,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromaskSH, "Locallab", "ChromaskSH_" + std::to_string(i), spot.chromaskSH, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskSH, "Locallab", "GammaskSH_" + std::to_string(i), spot.gammaskSH, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskSH, "Locallab", "SlomaskSH_" + std::to_string(i), spot.slomaskSH, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmaskSH, "Locallab", "LapmaskSH_" + std::to_string(i), spot.lapmaskSH, 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); @@ -5426,6 +5429,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "ChromaskSH_" + std::to_string(i), pedited, spot.chromaskSH, spotEdited.chromaskSH); assignFromKeyfile(keyFile, "Locallab", "GammaskSH_" + std::to_string(i), pedited, spot.gammaskSH, spotEdited.gammaskSH); assignFromKeyfile(keyFile, "Locallab", "SlomaskSH_" + std::to_string(i), pedited, spot.slomaskSH, spotEdited.slomaskSH); + assignFromKeyfile(keyFile, "Locallab", "LapmaskSH_" + std::to_string(i), pedited, spot.lapmaskSH, spotEdited.lapmaskSH); // 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 c520d69d5..e47ee1a5c 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1069,6 +1069,7 @@ struct LocallabParams { double chromaskSH; double gammaskSH; double slomaskSH; + double lapmaskSH; // Vibrance bool expvibrance; int saturated; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index be50fdbbd..ad4d4f68e 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -786,7 +786,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallablapmasktm LUMINANCECURVE, //Evlocallablapmaskreti LUMINANCECURVE, //Evlocallablapmaskexp - LUMINANCECURVE //Evlocallablapmaskcol + LUMINANCECURVE, //Evlocallablapmaskcol + LUMINANCECURVE //EvlocallablapmaskSH }; namespace rtengine diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 494eed46e..066d3df40 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -227,11 +227,12 @@ Locallab::Locallab(): sh_radius(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_RADIUS"), 0, 100, 1, 40))), sensihs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 15))), blendmaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), - radmaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 10.))), + radmaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), blurSHde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), chromaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), 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.))), // 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.))), @@ -963,6 +964,12 @@ Locallab::Locallab(): chromaskSH->setAdjusterListener(this); gammaskSH->setAdjusterListener(this); slomaskSH->setAdjusterListener(this); + lapmaskSH->setAdjusterListener(this); + + if (showtooltip) { + radmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + } enaSHMaskConn = enaSHMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enaSHMaskChanged)); inversshConn = inverssh->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::inversshChanged)); @@ -1047,6 +1054,7 @@ Locallab::Locallab(): maskSHBox->pack_start(*maskSHCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor maskSHBox->pack_start(*blendmaskSH, Gtk::PACK_SHRINK, 0); maskSHBox->pack_start(*radmaskSH, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*lapmaskSH, Gtk::PACK_SHRINK, 0); maskSHBox->pack_start(*chromaskSH, Gtk::PACK_SHRINK, 0); maskSHBox->pack_start(*gammaskSH, Gtk::PACK_SHRINK, 0); maskSHBox->pack_start(*slomaskSH, Gtk::PACK_SHRINK, 0); @@ -3113,6 +3121,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chromaskSH = chromaskSH->getValue(); pp->locallab.spots.at(pp->locallab.selspot).gammaskSH = gammaskSH->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskSH = slomaskSH->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).lapmaskSH = lapmaskSH->getValue(); // Vibrance pp->locallab.spots.at(pp->locallab.selspot).expvibrance = expvibrance->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).saturated = saturated->getIntValue(); @@ -3432,6 +3441,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chromaskSH = pe->locallab.spots.at(pp->locallab.selspot).chromaskSH || chromaskSH->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).gammaskSH = pe->locallab.spots.at(pp->locallab.selspot).gammaskSH || gammaskSH->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskSH = pe->locallab.spots.at(pp->locallab.selspot).slomaskSH || slomaskSH->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).lapmaskSH = pe->locallab.spots.at(pp->locallab.selspot).lapmaskSH || lapmaskSH->getEditedState(); // Vibrance pe->locallab.spots.at(pp->locallab.selspot).expvibrance = pe->locallab.spots.at(pp->locallab.selspot).expvibrance || !expvibrance->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).saturated = pe->locallab.spots.at(pp->locallab.selspot).saturated || saturated->getEditedState(); @@ -3709,6 +3719,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chromaskSH = pedited->locallab.spots.at(pp->locallab.selspot).chromaskSH || chromaskSH->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).gammaskSH = pedited->locallab.spots.at(pp->locallab.selspot).gammaskSH || gammaskSH->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskSH = pedited->locallab.spots.at(pp->locallab.selspot).slomaskSH || slomaskSH->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).lapmaskSH = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskSH || lapmaskSH->getEditedState(); // Vibrance pedited->locallab.spots.at(pp->locallab.selspot).expvibrance = pedited->locallab.spots.at(pp->locallab.selspot).expvibrance || !expvibrance->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).saturated = pedited->locallab.spots.at(pp->locallab.selspot).saturated || saturated->getEditedState(); @@ -5551,6 +5562,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskSH->setDefault(defSpot->chromaskSH); gammaskSH->setDefault(defSpot->gammaskSH); slomaskSH->setDefault(defSpot->slomaskSH); + lapmaskSH->setDefault(defSpot->lapmaskSH); // Vibrance saturated->setDefault((double)defSpot->saturated); pastels->setDefault((double)defSpot->pastels); @@ -5720,6 +5732,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskSH->setDefaultEditedState(Irrelevant); gammaskSH->setDefaultEditedState(Irrelevant); slomaskSH->setDefaultEditedState(Irrelevant); + lapmaskSH->setDefaultEditedState(Irrelevant); // Vibrance saturated->setDefaultEditedState(Irrelevant); pastels->setDefaultEditedState(Irrelevant); @@ -5893,6 +5906,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskSH->setDefaultEditedState(defSpotState->chromaskSH ? Edited : UnEdited); gammaskSH->setDefaultEditedState(defSpotState->gammaskSH ? Edited : UnEdited); slomaskSH->setDefaultEditedState(defSpotState->slomaskSH ? Edited : UnEdited); + lapmaskSH->setDefaultEditedState(defSpotState->lapmaskSH ? Edited : UnEdited); // Vibrance saturated->setDefaultEditedState(defSpotState->saturated ? Edited : UnEdited); pastels->setDefaultEditedState(defSpotState->pastels ? Edited : UnEdited); @@ -6386,6 +6400,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == lapmaskSH) { + if (listener) { + listener->panelChanged(EvlocallablapmaskSH, lapmaskSH->getTextValue()); + } + } + } // Vibrance @@ -7111,6 +7131,7 @@ void Locallab::setBatchMode(bool batchMode) chromaskSH->showEditedCB(); gammaskSH->showEditedCB(); slomaskSH->showEditedCB(); + lapmaskSH->showEditedCB(); // Vibrance saturated->showEditedCB(); pastels->showEditedCB(); @@ -7676,6 +7697,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskSH->setValue(pp->locallab.spots.at(index).chromaskSH); gammaskSH->setValue(pp->locallab.spots.at(index).gammaskSH); slomaskSH->setValue(pp->locallab.spots.at(index).slomaskSH); + lapmaskSH->setValue(pp->locallab.spots.at(index).lapmaskSH); // Vibrance expvibrance->setEnabled(pp->locallab.spots.at(index).expvibrance); @@ -8027,6 +8049,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskSH->setEditedState(spotState->chromaskSH ? Edited : UnEdited); gammaskSH->setEditedState(spotState->gammaskSH ? Edited : UnEdited); slomaskSH->setEditedState(spotState->slomaskSH ? Edited : UnEdited); + lapmaskSH->setEditedState(spotState->lapmaskSH ? Edited : UnEdited); // Vibrance expvibrance->set_inconsistent(!spotState->expvibrance); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index e705f9bc4..fe6d8ad56 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -181,6 +181,7 @@ private: Adjuster* const chromaskSH; Adjuster* const gammaskSH; Adjuster* const slomaskSH; + Adjuster* const lapmaskSH; // Vibrance Adjuster* const saturated; Adjuster* const pastels; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 4172f7691..c7794bdc0 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1061,6 +1061,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chromaskSH = locallab.spots.at(j).chromaskSH && pSpot.chromaskSH == otherSpot.chromaskSH; locallab.spots.at(j).gammaskSH = locallab.spots.at(j).gammaskSH && pSpot.gammaskSH == otherSpot.gammaskSH; locallab.spots.at(j).slomaskSH = locallab.spots.at(j).slomaskSH && pSpot.slomaskSH == otherSpot.slomaskSH; + locallab.spots.at(j).lapmaskSH = locallab.spots.at(j).lapmaskSH && pSpot.lapmaskSH == otherSpot.lapmaskSH; // 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; @@ -3114,6 +3115,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).slomaskSH = mods.locallab.spots.at(i).slomaskSH; } + if (locallab.spots.at(i).lapmaskSH) { + toEdit.locallab.spots.at(i).lapmaskSH = mods.locallab.spots.at(i).lapmaskSH; + } + // Vibrance if (locallab.spots.at(i).expvibrance) { toEdit.locallab.spots.at(i).expvibrance = mods.locallab.spots.at(i).expvibrance; @@ -4784,6 +4789,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chromaskSH(v), gammaskSH(v), slomaskSH(v), + lapmaskSH(v), // Vibrance expvibrance(v), saturated(v), @@ -5054,6 +5060,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chromaskSH = v; gammaskSH = v; slomaskSH = v; + lapmaskSH = v; // Vibrance expvibrance = v; saturated = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 9f3c18a2e..deb626ee1 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -479,6 +479,7 @@ public: bool chromaskSH; bool gammaskSH; bool slomaskSH; + bool lapmaskSH; // Vibrance bool expvibrance; bool saturated;