diff --git a/rtdata/languages/default b/rtdata/languages/default index 52251097a..fff23ff8d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1012,6 +1012,7 @@ HISTORY_MSG_771;Local - Exp Mask contrast curve 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_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 7c140237c..e17693389 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -891,11 +891,13 @@ void Crop::update(int todo) bool localmaskSHutili = parent->localmaskSHutili; bool localmasktmutili = parent->localmasktmutili; bool localmaskretiutili = parent->localmaskretiutili; + bool localmaskcbutili = parent->localmaskcbutili; 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 hltonecurveloc2(65536, 0); //65536 LUTf shtonecurveloc2(65536, 0); LUTf tonecurveloc2(65536, 0); @@ -1005,6 +1007,8 @@ void Crop::update(int todo) CurveFactory::curvemaskLocal(localmasktmutili, params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve2, sca); localmaskretiutili = false; CurveFactory::curvemaskLocal(localmaskretiutili, params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve2, sca); + localmaskcbutili = false; + CurveFactory::curvemaskLocal(localmaskcbutili, params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve2, sca); double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1048,6 +1052,7 @@ void Crop::update(int todo) lmaskSHlocalcurve2, localmaskSHutili, lmasktmlocalcurve2, localmasktmutili, lmaskretilocalcurve2, localmaskretiutili, + lmaskcblocalcurve2, localmaskcbutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1070,6 +1075,7 @@ void Crop::update(int todo) lmaskSHlocalcurve2, localmaskSHutili, lmasktmlocalcurve2, localmasktmutili, lmaskretilocalcurve2, localmaskretiutili, + lmaskcblocalcurve2, localmaskcbutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1090,6 +1096,7 @@ void Crop::update(int todo) lmaskSHlocalcurve2.clear(); lmasktmlocalcurve2.clear(); lmaskretilocalcurve2.clear(); + lmaskcblocalcurve2.clear(); hltonecurveloc2.clear(); shtonecurveloc2.clear(); tonecurveloc2.clear(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index dc9532bf4..01d7e0976 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -176,6 +176,7 @@ ImProcCoordinator::ImProcCoordinator() : lmaskSHlocalcurve(65536, 0), lmasktmlocalcurve(65536, 0), lmaskretilocalcurve(65536, 0), + lmaskcblocalcurve(65536, 0), locallutili(false), localcutili(false), localexutili(false), @@ -187,6 +188,7 @@ ImProcCoordinator::ImProcCoordinator() : localmaskSHutili(false), localmasktmutili(false), localmaskretiutili(false), + localmaskcbutili(false), lcmasexputili(false), lhmasexputili(false), llmasexputili(false), @@ -932,6 +934,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) localmaskSHutili = false; localmasktmutili = false; localmaskretiutili = false; + localmaskcbutili = false; lcmasSHutili = false; lhmasSHutili = false; llmasSHutili = false; @@ -984,6 +987,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) CurveFactory::curvemaskLocal(localmaskSHutili, params->locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, sca); 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); double ecomp = params->locallab.spots.at(sp).expcomp; double black = params->locallab.spots.at(sp).black; double hlcompr = params->locallab.spots.at(sp).hlcompr; @@ -1042,6 +1046,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmaskSHlocalcurve, localmaskSHutili, lmasktmlocalcurve, localmasktmutili, lmaskretilocalcurve, localmaskretiutili, + lmaskcblocalcurve, localmaskcbutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1063,6 +1068,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmaskSHlocalcurve, localmaskSHutili, lmasktmlocalcurve, localmasktmutili, lmaskretilocalcurve, localmaskretiutili, + lmaskcblocalcurve, localmaskcbutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1090,6 +1096,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmaskSHlocalcurve.clear(); lmasktmlocalcurve.clear(); lmaskretilocalcurve.clear(); + lmaskcblocalcurve.clear(); hltonecurveloc.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c3775a35a..70ea40fe9 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -238,6 +238,7 @@ protected: LUTf lmaskSHlocalcurve; LUTf lmasktmlocalcurve; LUTf lmaskretilocalcurve; + LUTf lmaskcblocalcurve; // LUTu lhist16loc; LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; @@ -278,6 +279,7 @@ protected: bool localmaskSHutili; bool localmasktmutili; bool localmaskretiutili; + bool localmaskcbutili; bool lcmasexputili; bool lhmasexputili; bool llmasexputili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index be240792b..9b3a7e970 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -230,6 +230,7 @@ public: LUTf & lmaskSHlocalcurve, bool & localmaskSHutili, LUTf & lmasktmlocalcurve, bool & localmasktmutili, LUTf & lmaskretilocalcurve, bool & localmaskretiutili, + LUTf & lmaskcblocalcurve, bool & localmaskcbutili, 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, @@ -242,6 +243,7 @@ public: double & huerefblur, double &chromarefblur, double & lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); + void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk); void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); void InverseBlurNoise_Local(LabImage * originalmask, float **bufchro, const struct local_params& lp, const float hueref, const float chromaref, const float lumaref, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy, int sk); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index b638fd7e4..6f37bdb4b 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -6717,6 +6717,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o LUTf & lmaskSHlocalcurve, bool & localmaskSHutili, LUTf & lmasktmlocalcurve, bool & localmasktmutili, LUTf & lmaskretilocalcurve, bool & localmaskretiutili, + LUTf & lmaskcblocalcurve, bool & localmaskcbutili, 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, @@ -7542,11 +7543,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacb; float lap = params->locallab.spots.at(sp).lapmaskcb; float pde = params->locallab.spots.at(sp).laplac; - LUTf dummy; - bool uti; 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, dummy, uti); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskcblocalcurve, localmaskcbutili); if (lp.showmaskcbmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 0408c88cc..07d019d6b 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -801,6 +801,7 @@ enum ProcEventCode { EvlocallabLmaskSHshape = 771, EvlocallabLmasktmshape = 772, EvlocallabLmaskretishape = 773, + EvlocallabLmaskcbshape = 774, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 355a841e5..97408cbf9 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2673,6 +2673,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : gammaskcb(1.0), slomaskcb(0.0), lapmaskcb(0.0), + Lmaskcbcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, // Denoise expdenoi(false), noiselumf(0.), @@ -2969,6 +2970,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && gammaskcb == other.gammaskcb && slomaskcb == other.slomaskcb && lapmaskcb == other.lapmaskcb + && Lmaskcbcurve == other.Lmaskcbcurve // Denoise && expdenoi == other.expdenoi && noiselumf == other.noiselumf @@ -4237,6 +4239,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskcb, "Locallab", "Gammaskcb_" + std::to_string(i), spot.gammaskcb, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskcb, "Locallab", "Slomaskcb_" + std::to_string(i), spot.slomaskcb, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmaskcb, "Locallab", "Lapmaskcb_" + std::to_string(i), spot.lapmaskcb, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).Lmaskcbcurve, "Locallab", "LmaskcbCurve_" + std::to_string(i), spot.Lmaskcbcurve, keyFile); // Denoise saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expdenoi, "Locallab", "Expdenoi_" + std::to_string(i), spot.expdenoi, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).noiselumf, "Locallab", "noiselumf_" + std::to_string(i), spot.noiselumf, keyFile); @@ -5637,6 +5640,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Gammaskcb_" + std::to_string(i), pedited, spot.gammaskcb, spotEdited.gammaskcb); assignFromKeyfile(keyFile, "Locallab", "Slomaskcb_" + std::to_string(i), pedited, spot.slomaskcb, spotEdited.slomaskcb); assignFromKeyfile(keyFile, "Locallab", "Lapmaskcb_" + std::to_string(i), pedited, spot.lapmaskcb, spotEdited.lapmaskcb); + assignFromKeyfile(keyFile, "Locallab", "LmaskcbCurve_" + std::to_string(i), pedited, spot.Lmaskcbcurve, spotEdited.Lmaskcbcurve); // Denoise assignFromKeyfile(keyFile, "Locallab", "Expdenoi_" + std::to_string(i), pedited, spot.expdenoi, spotEdited.expdenoi); assignFromKeyfile(keyFile, "Locallab", "noiselumf_" + std::to_string(i), pedited, spot.noiselumf, spotEdited.noiselumf); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index ba34fe6b9..15563ae49 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1222,6 +1222,7 @@ struct LocallabParams { double gammaskcb; double slomaskcb; double lapmaskcb; + std::vector Lmaskcbcurve; // Denoise bool expdenoi; double noiselumf; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index a26c5d6d9..ed916f7c0 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -800,7 +800,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabLmaskexpshape LUMINANCECURVE, //EvlocallabLmaskSHshape LUMINANCECURVE, //EvlocallabLmasktmshape - LUMINANCECURVE //EvlocallabLmaskretishape + LUMINANCECURVE, //EvlocallabLmaskretishape + LUMINANCECURVE //EvlocallabLmaskcbshape }; namespace rtengine diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 51e5febca..9a711a8a9 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1129,6 +1129,7 @@ private: LUTf lmaskSHlocalcurve(65536, 0); LUTf lmasktmlocalcurve(65536, 0); LUTf lmaskretilocalcurve(65536, 0); + LUTf lmaskcblocalcurve(65536, 0); // int maxspot = 1; float** shbuffer = nullptr; @@ -1156,6 +1157,7 @@ private: bool localmaskSHutili = false; bool localmasktmutili = false; bool localmaskretiutili = false; + bool localmaskcbutili = false; bool lcmasexputili = false; bool lhmasexputili = false; bool llmasexputili = false; @@ -1209,6 +1211,7 @@ private: CurveFactory::curvemaskLocal(localmaskSHutili, params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, 1); 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); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; @@ -1248,6 +1251,7 @@ private: lmaskSHlocalcurve, localmaskSHutili, lmasktmlocalcurve, localmasktmutili, lmaskretilocalcurve, localmaskretiutili, + lmaskcblocalcurve, localmaskcbutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1270,6 +1274,7 @@ private: lmaskSHlocalcurve.clear(); lmasktmlocalcurve.clear(); lmaskretilocalcurve.clear(); + lmaskcblocalcurve.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); lightCurveloc.clear(); diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 7c30e471e..727a8be62 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -181,6 +181,7 @@ Locallab::Locallab(): //CBDL maskcbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + mask2cbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), // Adjuster widgets // Color & Light @@ -1963,6 +1964,22 @@ Locallab::Locallab(): maskcbCurveEditorG->curveListComplete(); + mask2cbCurveEditorG->setCurveListener(this); + Lmaskcbshape = static_cast(mask2cbCurveEditorG->addCurve(CT_Diagonal, "L(L)")); + Lmaskcbshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskcbcurve.at(0)), defSpot.Lmaskcbcurve); + + if (showtooltip) { + Lmaskcbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + } + + std::vector mLmaskcbshape; + mLmaskcbshape.push_back(GradientMilestone(0., 0., 0., 0.)); + mLmaskcbshape.push_back(GradientMilestone(1., 1., 1., 1.)); + Lmaskcbshape->setBottomBarBgGradient(mLmaskcbshape); + Lmaskcbshape->setLeftBarBgGradient(mLmaskcbshape); + mask2cbCurveEditorG->curveListComplete(); + + if (showtooltip) { radmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); lapmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); @@ -1994,6 +2011,7 @@ Locallab::Locallab(): maskcbBox->pack_start(*chromaskcb, Gtk::PACK_SHRINK, 0); maskcbBox->pack_start(*gammaskcb, Gtk::PACK_SHRINK, 0); maskcbBox->pack_start(*slomaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*mask2cbCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor expmaskcb->add(*maskcbBox, false); Gtk::HSeparator *separator = Gtk::manage(new Gtk::HSeparator()); @@ -2316,6 +2334,7 @@ Locallab::~Locallab() delete maskretiCurveEditorG; delete mask2retiCurveEditorG; delete maskcbCurveEditorG; + delete mask2cbCurveEditorG; } void Locallab::foldAllButMe(GdkEventButton* event, MyExpander *expander) { @@ -3501,6 +3520,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).gammaskcb = gammaskcb->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskcb = slomaskcb->getValue(); pp->locallab.spots.at(pp->locallab.selspot).lapmaskcb = lapmaskcb->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).Lmaskcbcurve = Lmaskcbshape->getCurve(); // Denoise pp->locallab.spots.at(pp->locallab.selspot).expdenoi = expdenoi->getEnabled(); @@ -3790,6 +3810,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).gammaskcb = pe->locallab.spots.at(pp->locallab.selspot).gammaskcb || gammaskcb->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskcb = pe->locallab.spots.at(pp->locallab.selspot).slomaskcb || slomaskcb->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).lapmaskcb = pe->locallab.spots.at(pp->locallab.selspot).lapmaskcb || lapmaskcb->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).Lmaskcbcurve = pe->locallab.spots.at(pp->locallab.selspot).Lmaskcbcurve || !Lmaskcbshape->isUnChanged(); // Denoise pe->locallab.spots.at(pp->locallab.selspot).expdenoi = pe->locallab.spots.at(pp->locallab.selspot).expdenoi || !expdenoi->get_inconsistent(); @@ -4082,6 +4103,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).gammaskcb = pedited->locallab.spots.at(pp->locallab.selspot).gammaskcb || gammaskcb->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskcb = pedited->locallab.spots.at(pp->locallab.selspot).slomaskcb || slomaskcb->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcb = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcb || lapmaskcb->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcbcurve = pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcbcurve || !Lmaskcbshape->isUnChanged(); // Denoise pedited->locallab.spots.at(pp->locallab.selspot).expdenoi = pedited->locallab.spots.at(pp->locallab.selspot).expdenoi || !expdenoi->get_inconsistent(); @@ -4334,6 +4356,13 @@ void Locallab::curveChanged(CurveEditor* ce) listener->panelChanged(EvlocallabHHmaskcbshape, M("HISTORY_CUSTOMCURVE")); } } + + if (ce == Lmaskcbshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskcbshape, M("HISTORY_CUSTOMCURVE")); + } + } + } // Vibrance @@ -8254,6 +8283,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con CCmaskcbshape->setCurve(pp->locallab.spots.at(index).CCmaskcbcurve); LLmaskcbshape->setCurve(pp->locallab.spots.at(index).LLmaskcbcurve); HHmaskcbshape->setCurve(pp->locallab.spots.at(index).HHmaskcbcurve); + Lmaskcbshape->setCurve(pp->locallab.spots.at(index).Lmaskcbcurve); // Denoise expdenoi->setEnabled(pp->locallab.spots.at(index).expdenoi); @@ -8596,6 +8626,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con CCmaskcbshape->setUnChanged(!spotState->CCmaskcbcurve); LLmaskcbshape->setUnChanged(!spotState->LLmaskcbcurve); HHmaskcbshape->setUnChanged(!spotState->HHmaskcbcurve); + Lmaskcbshape->setUnChanged(!spotState->Lmaskcbcurve); // Denoise expdenoi->set_inconsistent(!spotState->expdenoi); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 50cff22ee..69321f959 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -131,6 +131,8 @@ private: //Cbdl CurveEditorGroup* const maskcbCurveEditorG; + CurveEditorGroup* const mask2cbCurveEditorG; + DiagonalCurveEditor* Lmaskcbshape; FlatCurveEditor* CCmaskcbshape; FlatCurveEditor* LLmaskcbshape; FlatCurveEditor* HHmaskcbshape; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 50a5d366f..3f28a2b55 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1217,6 +1217,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).CCmaskcbcurve = locallab.spots.at(j).CCmaskcbcurve && pSpot.CCmaskcbcurve == otherSpot.CCmaskcbcurve; locallab.spots.at(j).LLmaskcbcurve = locallab.spots.at(j).LLmaskcbcurve && pSpot.LLmaskcbcurve == otherSpot.LLmaskcbcurve; locallab.spots.at(j).HHmaskcbcurve = locallab.spots.at(j).HHmaskcbcurve && pSpot.HHmaskcbcurve == otherSpot.HHmaskcbcurve; + locallab.spots.at(j).Lmaskcbcurve = locallab.spots.at(j).Lmaskcbcurve && pSpot.Lmaskcbcurve == otherSpot.Lmaskcbcurve; // Denoise locallab.spots.at(j).expdenoi = locallab.spots.at(j).expdenoi && pSpot.expdenoi == otherSpot.expdenoi; locallab.spots.at(j).noiselumf = locallab.spots.at(j).noiselumf && pSpot.noiselumf == otherSpot.noiselumf; @@ -3717,6 +3718,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).softradiuscb = mods.locallab.spots.at(i).softradiuscb; } + if (locallab.spots.at(i).Lmaskcbcurve) { + toEdit.locallab.spots.at(i).Lmaskcbcurve = mods.locallab.spots.at(i).Lmaskcbcurve; + } + // Denoise if (locallab.spots.at(i).expdenoi) { toEdit.locallab.spots.at(i).expdenoi = mods.locallab.spots.at(i).expdenoi; @@ -5006,6 +5011,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : CCmaskcbcurve(v), LLmaskcbcurve(v), HHmaskcbcurve(v), + Lmaskcbcurve(v), // Denoise expdenoi(v), noiselumf(v), @@ -5294,6 +5300,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) CCmaskcbcurve = v; LLmaskcbcurve = v; HHmaskcbcurve = v; + Lmaskcbcurve = v; // Denoise expdenoi = v; noiselumf = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 6b551a34f..2c6a70fe0 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -632,6 +632,7 @@ public: bool CCmaskcbcurve; bool LLmaskcbcurve; bool HHmaskcbcurve; + bool Lmaskcbcurve; // Denoise bool expdenoi;