diff --git a/rtdata/languages/default b/rtdata/languages/default index fff23ff8d..f2c31a1c8 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1013,6 +1013,7 @@ HISTORY_MSG_772;Local - SH Mask contrast curve HISTORY_MSG_773;Local - TM Mask contrast curve HISTORY_MSG_774;Local - Reti Mask contrast curve HISTORY_MSG_775;Local - CBDL Mask contrast curve +HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve 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/dcrop.cc b/rtengine/dcrop.cc index e17693389..bad345669 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -892,12 +892,14 @@ void Crop::update(int todo) bool localmasktmutili = parent->localmasktmutili; bool localmaskretiutili = parent->localmaskretiutili; bool localmaskcbutili = parent->localmaskcbutili; + bool localmaskblutili = parent->localmaskblutili; LUTf lmasklocalcurve2(65536, 0); LUTf lmaskexplocalcurve2(65536, 0); LUTf lmaskSHlocalcurve2(65536, 0); LUTf lmasktmlocalcurve2(65536, 0); LUTf lmaskretilocalcurve2(65536, 0); LUTf lmaskcblocalcurve2(65536, 0); + LUTf lmaskbllocalcurve2(65536, 0); LUTf hltonecurveloc2(65536, 0); //65536 LUTf shtonecurveloc2(65536, 0); LUTf tonecurveloc2(65536, 0); @@ -1009,6 +1011,8 @@ void Crop::update(int todo) CurveFactory::curvemaskLocal(localmaskretiutili, params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve2, sca); localmaskcbutili = false; CurveFactory::curvemaskLocal(localmaskcbutili, params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve2, sca); + localmaskblutili = false; + CurveFactory::curvemaskLocal(localmaskblutili, params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve2, sca); double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1053,6 +1057,7 @@ void Crop::update(int todo) lmasktmlocalcurve2, localmasktmutili, lmaskretilocalcurve2, localmaskretiutili, lmaskcblocalcurve2, localmaskcbutili, + lmaskbllocalcurve2, localmaskblutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1076,6 +1081,7 @@ void Crop::update(int todo) lmasktmlocalcurve2, localmasktmutili, lmaskretilocalcurve2, localmaskretiutili, lmaskcblocalcurve2, localmaskcbutili, + lmaskbllocalcurve2, localmaskblutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1097,6 +1103,7 @@ void Crop::update(int todo) lmasktmlocalcurve2.clear(); lmaskretilocalcurve2.clear(); lmaskcblocalcurve2.clear(); + lmaskbllocalcurve2.clear(); hltonecurveloc2.clear(); shtonecurveloc2.clear(); tonecurveloc2.clear(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 01d7e0976..ce0eca227 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -177,6 +177,7 @@ ImProcCoordinator::ImProcCoordinator() : lmasktmlocalcurve(65536, 0), lmaskretilocalcurve(65536, 0), lmaskcblocalcurve(65536, 0), + lmaskbllocalcurve(65536, 0), locallutili(false), localcutili(false), localexutili(false), @@ -189,6 +190,7 @@ ImProcCoordinator::ImProcCoordinator() : localmasktmutili(false), localmaskretiutili(false), localmaskcbutili(false), + localmaskblutili(false), lcmasexputili(false), lhmasexputili(false), llmasexputili(false), @@ -935,6 +937,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) localmasktmutili = false; localmaskretiutili = false; localmaskcbutili = false; + localmaskblutili = false; lcmasSHutili = false; lhmasSHutili = false; llmasSHutili = false; @@ -988,6 +991,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) CurveFactory::curvemaskLocal(localmasktmutili, params->locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, sca); CurveFactory::curvemaskLocal(localmaskretiutili, params->locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, sca); CurveFactory::curvemaskLocal(localmaskcbutili, params->locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, sca); + CurveFactory::curvemaskLocal(localmaskblutili, params->locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, sca); double ecomp = params->locallab.spots.at(sp).expcomp; double black = params->locallab.spots.at(sp).black; double hlcompr = params->locallab.spots.at(sp).hlcompr; @@ -1047,6 +1051,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmasktmlocalcurve, localmasktmutili, lmaskretilocalcurve, localmaskretiutili, lmaskcblocalcurve, localmaskcbutili, + lmaskbllocalcurve, localmaskblutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1069,6 +1074,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmasktmlocalcurve, localmasktmutili, lmaskretilocalcurve, localmaskretiutili, lmaskcblocalcurve, localmaskcbutili, + lmaskbllocalcurve, localmaskblutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1097,6 +1103,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmasktmlocalcurve.clear(); lmaskretilocalcurve.clear(); lmaskcblocalcurve.clear(); + lmaskbllocalcurve.clear(); hltonecurveloc.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 70ea40fe9..031742103 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -239,6 +239,7 @@ protected: LUTf lmasktmlocalcurve; LUTf lmaskretilocalcurve; LUTf lmaskcblocalcurve; + LUTf lmaskbllocalcurve; // LUTu lhist16loc; LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; @@ -280,6 +281,7 @@ protected: bool localmasktmutili; bool localmaskretiutili; bool localmaskcbutili; + bool localmaskblutili; bool lcmasexputili; bool lhmasexputili; bool llmasexputili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 9b3a7e970..954df4b90 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -231,6 +231,7 @@ public: LUTf & lmasktmlocalcurve, bool & localmasktmutili, LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LUTf & lmaskcblocalcurve, bool & localmaskcbutili, + LUTf & lmaskbllocalcurve, bool & localmaskblutili, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocCCmaskCurve & locccmasexpCurve, bool &lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool &llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili, const LocCCmaskCurve & locccmasSHCurve, bool &lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool &llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 6f37bdb4b..7c1dd3639 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -6718,6 +6718,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o LUTf & lmasktmlocalcurve, bool & localmasktmutili, LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LUTf & lmaskcblocalcurve, bool & localmaskcbutili, + LUTf & lmaskbllocalcurve, bool & localmaskblutili, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocCCmaskCurve & locccmasexpCurve, bool & lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool & llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili, const LocCCmaskCurve & locccmasSHCurve, bool & lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool & llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili, @@ -6973,6 +6974,17 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } + if (lmaskbllocalcurve && localmaskblutili) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + bufmaskblurbl->L[ir][jr] = 0.5f * lmaskbllocalcurve[2.f * bufmaskblurbl->L[ir][jr]]; + } + } + float lap = params->locallab.spots.at(sp).lapmaskbl; bool pde = params->locallab.spots.at(sp).laplac; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 07d019d6b..d11376131 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -802,6 +802,7 @@ enum ProcEventCode { EvlocallabLmasktmshape = 772, EvlocallabLmaskretishape = 773, EvlocallabLmaskcbshape = 774, + EvlocallabLmaskblshape = 775, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 97408cbf9..5e4457b2f 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2567,6 +2567,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : gammaskbl(1.0), slomaskbl(0.0), lapmaskbl(0.0), + Lmaskblcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, // Tone Mapping exptonemap(false), stren(0.5), @@ -2855,6 +2856,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && gammaskbl == other.gammaskbl && slomaskbl == other.slomaskbl && lapmaskbl == other.lapmaskbl + && Lmaskblcurve == other.Lmaskblcurve // Tone Mapping && exptonemap == other.exptonemap && stren == other.stren @@ -4129,6 +4131,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskbl, "Locallab", "Gammaskbl_" + std::to_string(i), spot.gammaskbl, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskbl, "Locallab", "Slomaskbl_" + std::to_string(i), spot.slomaskbl, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmaskbl, "Locallab", "Lapmaskbl_" + std::to_string(i), spot.lapmaskbl, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).Lmaskblcurve, "Locallab", "LmaskblCurve_" + std::to_string(i), spot.Lmaskblcurve, keyFile); // Tone Mapping saveToKeyfile(!pedited || pedited->locallab.spots.at(i).exptonemap, "Locallab", "Exptonemap_" + std::to_string(i), spot.exptonemap, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).stren, "Locallab", "Stren_" + std::to_string(i), spot.stren, keyFile); @@ -5530,6 +5533,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Gammaskbl_" + std::to_string(i), pedited, spot.gammaskbl, spotEdited.gammaskbl); assignFromKeyfile(keyFile, "Locallab", "Slomaskbl_" + std::to_string(i), pedited, spot.slomaskbl, spotEdited.slomaskbl); assignFromKeyfile(keyFile, "Locallab", "Lapmaskbl_" + std::to_string(i), pedited, spot.lapmaskbl, spotEdited.lapmaskbl); + assignFromKeyfile(keyFile, "Locallab", "LmaskblCurve_" + std::to_string(i), pedited, spot.Lmaskblcurve, spotEdited.Lmaskblcurve); // Tone Mapping assignFromKeyfile(keyFile, "Locallab", "Exptonemap_" + std::to_string(i), pedited, spot.exptonemap, spotEdited.exptonemap); assignFromKeyfile(keyFile, "Locallab", "Stren_" + std::to_string(i), pedited, spot.stren, spotEdited.stren); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 15563ae49..973773f66 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1116,6 +1116,7 @@ struct LocallabParams { double gammaskbl; double slomaskbl; double lapmaskbl; + std::vector Lmaskblcurve; // Tone Mapping bool exptonemap; double stren; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index ed916f7c0..dcb9bf4a3 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -801,7 +801,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabLmaskSHshape LUMINANCECURVE, //EvlocallabLmasktmshape LUMINANCECURVE, //EvlocallabLmaskretishape - LUMINANCECURVE //EvlocallabLmaskcbshape + LUMINANCECURVE, //EvlocallabLmaskcbshape + LUMINANCECURVE //EvlocallabLmaskblshape }; namespace rtengine diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 9a711a8a9..6e18cb522 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1130,6 +1130,7 @@ private: LUTf lmasktmlocalcurve(65536, 0); LUTf lmaskretilocalcurve(65536, 0); LUTf lmaskcblocalcurve(65536, 0); + LUTf lmaskbllocalcurve(65536, 0); // int maxspot = 1; float** shbuffer = nullptr; @@ -1158,6 +1159,7 @@ private: bool localmasktmutili = false; bool localmaskretiutili = false; bool localmaskcbutili = false; + bool localmaskblutili = false; bool lcmasexputili = false; bool lhmasexputili = false; bool llmasexputili = false; @@ -1212,6 +1214,7 @@ private: CurveFactory::curvemaskLocal(localmasktmutili, params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, 1); CurveFactory::curvemaskLocal(localmaskretiutili, params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, 1); CurveFactory::curvemaskLocal(localmaskcbutili, params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, 1); + CurveFactory::curvemaskLocal(localmaskblutili, params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, 1); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; @@ -1252,6 +1255,7 @@ private: lmasktmlocalcurve, localmasktmutili, lmaskretilocalcurve, localmaskretiutili, lmaskcblocalcurve, localmaskcbutili, + lmaskbllocalcurve, localmaskblutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1275,6 +1279,7 @@ private: lmasktmlocalcurve.clear(); lmaskretilocalcurve.clear(); lmaskcblocalcurve.clear(); + lmaskbllocalcurve.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); lightCurveloc.clear(); diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 727a8be62..487de19f4 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -167,6 +167,7 @@ Locallab::Locallab(): curveEditorGG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL"))), //Blur maskblCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + mask2blCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), //TM masktmCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), @@ -2123,6 +2124,24 @@ Locallab::Locallab(): HHmaskblshape->setBottomBarColorProvider(this, 6); maskblCurveEditorG->curveListComplete(); + + mask2blCurveEditorG->setCurveListener(this); + Lmaskblshape = static_cast(mask2blCurveEditorG->addCurve(CT_Diagonal, "L(L)")); + Lmaskblshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskblcurve.at(0)), defSpot.Lmaskblcurve); + + if (showtooltip) { + Lmaskblshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + } + + std::vector mLmaskblshape; + mLmaskblshape.push_back(GradientMilestone(0., 0., 0., 0.)); + mLmaskblshape.push_back(GradientMilestone(1., 1., 1., 1.)); + Lmaskblshape->setBottomBarBgGradient(mLmaskblshape); + Lmaskblshape->setLeftBarBgGradient(mLmaskblshape); + mask2blCurveEditorG->curveListComplete(); + + + enablMaskConn = enablMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enablMaskChanged)); showmaskblMethod->append(M("TP_LOCALLAB_SHOWMNONE")); @@ -2188,6 +2207,7 @@ Locallab::Locallab(): maskblBox->pack_start(*chromaskbl, Gtk::PACK_SHRINK, 0); maskblBox->pack_start(*gammaskbl, Gtk::PACK_SHRINK, 0); maskblBox->pack_start(*slomaskbl, Gtk::PACK_SHRINK, 0); + maskblBox->pack_start(*mask2blCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor expmaskbl->add(*maskblBox, false); panel->pack_start(*expmaskbl); @@ -2331,6 +2351,7 @@ Locallab::~Locallab() delete LocalcurveEditorwav; delete masktmCurveEditorG; delete maskblCurveEditorG; + delete mask2blCurveEditorG; delete maskretiCurveEditorG; delete mask2retiCurveEditorG; delete maskcbCurveEditorG; @@ -3393,6 +3414,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).slomaskbl = slomaskbl->getValue(); pp->locallab.spots.at(pp->locallab.selspot).lapmaskbl = lapmaskbl->getValue(); pp->locallab.spots.at(pp->locallab.selspot).fftwbl = fftwbl->get_active(); + pp->locallab.spots.at(pp->locallab.selspot).Lmaskblcurve = Lmaskblshape->getCurve(); // Tone Mapping pp->locallab.spots.at(pp->locallab.selspot).exptonemap = exptonemap->getEnabled(); @@ -3698,6 +3720,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).slomaskbl = pe->locallab.spots.at(pp->locallab.selspot).slomaskbl || slomaskbl->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).lapmaskbl = pe->locallab.spots.at(pp->locallab.selspot).lapmaskbl || lapmaskbl->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).fftwbl = pe->locallab.spots.at(pp->locallab.selspot).fftwbl || !fftwbl->get_inconsistent(); + pe->locallab.spots.at(pp->locallab.selspot).Lmaskblcurve = pe->locallab.spots.at(pp->locallab.selspot).Lmaskblcurve || !Lmaskblshape->isUnChanged(); // Tone Mapping pe->locallab.spots.at(pp->locallab.selspot).exptonemap = pe->locallab.spots.at(pp->locallab.selspot).activlum || !exptonemap->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).stren = pe->locallab.spots.at(pp->locallab.selspot).stren || stren->getEditedState(); @@ -3990,6 +4013,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).slomaskbl = pedited->locallab.spots.at(pp->locallab.selspot).slomaskbl || slomaskbl->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).lapmaskbl = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskbl || lapmaskbl->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).fftwbl = pedited->locallab.spots.at(pp->locallab.selspot).fftwbl || !fftwbl->get_inconsistent(); + pedited->locallab.spots.at(pp->locallab.selspot).Lmaskblcurve = pedited->locallab.spots.at(pp->locallab.selspot).Lmaskblcurve || !Lmaskblshape->isUnChanged(); // Tone Mapping pedited->locallab.spots.at(pp->locallab.selspot).exptonemap = pedited->locallab.spots.at(pp->locallab.selspot).exptonemap || !exptonemap->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).stren = pedited->locallab.spots.at(pp->locallab.selspot).stren || stren->getEditedState(); @@ -4395,6 +4419,12 @@ void Locallab::curveChanged(CurveEditor* ce) } } + if (ce == Lmaskblshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskblshape, M("HISTORY_CUSTOMCURVE")); + } + } + } // TM @@ -8154,6 +8184,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con slomaskbl->setValue(pp->locallab.spots.at(index).slomaskbl); lapmaskbl->setValue(pp->locallab.spots.at(index).lapmaskbl); fftwbl->set_active(pp->locallab.spots.at(index).fftwbl); + Lmaskblshape->setCurve(pp->locallab.spots.at(index).Lmaskblcurve); // Tone Mapping exptonemap->setEnabled(pp->locallab.spots.at(index).exptonemap); @@ -8504,6 +8535,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con slomaskbl->setEditedState(spotState->slomaskbl ? Edited : UnEdited); lapmaskbl->setEditedState(spotState->lapmaskbl ? Edited : UnEdited); fftwbl->set_inconsistent(multiImage && !spotState->fftwbl); + Lmaskblshape->setUnChanged(!spotState->Lmaskblcurve); // Tone Mapping exptonemap->set_inconsistent(!spotState->exptonemap); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 69321f959..856a8de20 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -104,6 +104,8 @@ private: DiagonalCurveEditor* skinTonesCurve; //Blur and noise CurveEditorGroup* const maskblCurveEditorG; + CurveEditorGroup* const mask2blCurveEditorG; + DiagonalCurveEditor* Lmaskblshape; FlatCurveEditor* CCmaskblshape; FlatCurveEditor* LLmaskblshape; FlatCurveEditor* HHmaskblshape; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 3f28a2b55..d6f8d737a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1107,6 +1107,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).slomaskbl = locallab.spots.at(j).slomaskbl && pSpot.slomaskbl == otherSpot.slomaskbl; locallab.spots.at(j).lapmaskbl = locallab.spots.at(j).lapmaskbl && pSpot.lapmaskbl == otherSpot.lapmaskbl; locallab.spots.at(j).fftwbl = locallab.spots.at(j).fftwbl && pSpot.fftwbl == otherSpot.fftwbl; + locallab.spots.at(j).Lmaskblcurve = locallab.spots.at(j).Lmaskblcurve && pSpot.Lmaskblcurve == otherSpot.Lmaskblcurve; // Tone Mapping locallab.spots.at(j).exptonemap = locallab.spots.at(j).exptonemap && pSpot.exptonemap == otherSpot.exptonemap; locallab.spots.at(j).stren = locallab.spots.at(j).stren && pSpot.stren == otherSpot.stren; @@ -3307,6 +3308,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).lapmaskbl = mods.locallab.spots.at(i).lapmaskbl; } + if (locallab.spots.at(i).Lmaskblcurve) { + toEdit.locallab.spots.at(i).Lmaskblcurve = mods.locallab.spots.at(i).Lmaskblcurve; + } + // Tone Mapping if (locallab.spots.at(i).exptonemap) { toEdit.locallab.spots.at(i).exptonemap = mods.locallab.spots.at(i).exptonemap; @@ -4905,6 +4910,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : gammaskbl(v), slomaskbl(v), lapmaskbl(v), + Lmaskblcurve(v), // Tone Mapping exptonemap(v), stren(v), @@ -5190,6 +5196,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) gammaskbl = v; slomaskbl = v; lapmaskbl = v; + Lmaskblcurve = v; // Tone Mapping exptonemap = v; stren = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 2c6a70fe0..c849da583 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -526,6 +526,7 @@ public: bool gammaskbl; bool slomaskbl; bool lapmaskbl; + bool Lmaskblcurve; // Tone Mapping bool exptonemap; bool stren;