diff --git a/rtdata/languages/default b/rtdata/languages/default index 037c17c0a..cdb7a4b74 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1009,6 +1009,7 @@ HISTORY_MSG_768;Local - Grain Strength HISTORY_MSG_769;Local - Grain Scale HISTORY_MSG_770;Local - Color Mask contrast curve HISTORY_MSG_771;Local - Exp Mask contrast curve +HISTORY_MSG_772;Local - SH 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 36d953941..7f2bbea60 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -888,8 +888,10 @@ void Crop::update(int todo) LUTf exlocalcurve2(65536, 0); bool localmaskutili = parent->localmaskutili; bool localmaskexputili = parent->localmaskexputili; + bool localmaskSHutili = parent->localmaskSHutili; LUTf lmasklocalcurve2(65536, 0); LUTf lmaskexplocalcurve2(65536, 0); + LUTf lmaskSHlocalcurve2(65536, 0); LUTf hltonecurveloc2(65536, 0); //65536 LUTf shtonecurveloc2(65536, 0); LUTf tonecurveloc2(65536, 0); @@ -993,6 +995,8 @@ void Crop::update(int todo) CurveFactory::curvemaskLocal(localmaskutili, params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve2, sca); localmaskexputili = false; CurveFactory::curvemaskLocal(localmaskexputili, params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve2, sca); + localmaskSHutili = false; + CurveFactory::curvemaskLocal(localmaskSHutili, params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve2, sca); double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1033,6 +1037,7 @@ void Crop::update(int todo) lllocalcurve2,locallutili, loclhCurve, lochhCurve, lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, + lmaskSHlocalcurve2, localmaskSHutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1052,6 +1057,7 @@ void Crop::update(int todo) lllocalcurve2,locallutili, loclhCurve, lochhCurve, lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, + lmaskSHlocalcurve2, localmaskSHutili, 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 +1075,7 @@ void Crop::update(int todo) exlocalcurve2.clear(); lmasklocalcurve2.clear(); lmaskexplocalcurve2.clear(); + lmaskSHlocalcurve2.clear(); hltonecurveloc2.clear(); shtonecurveloc2.clear(); tonecurveloc2.clear(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 21adbc8d7..9c55e199c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -173,6 +173,7 @@ ImProcCoordinator::ImProcCoordinator() : lightCurveloc(32770, 0), lmasklocalcurve(65536, 0), lmaskexplocalcurve(65536, 0), + lmaskSHlocalcurve(65536, 0), locallutili(false), localcutili(false), localexutili(false), @@ -181,6 +182,7 @@ ImProcCoordinator::ImProcCoordinator() : lcmasutili(false), localmaskutili(false), localmaskexputili(false), + localmaskSHutili(false), lcmasexputili(false), lhmasexputili(false), llmasexputili(false), @@ -922,7 +924,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lcmasexputili = false; lhmasexputili = false; llmasexputili = false; - localmaskutili = false; + localmaskexputili = false; + localmaskSHutili = false; lcmasSHutili = false; lhmasSHutili = false; llmasSHutili = false; @@ -972,6 +975,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) CurveFactory::curveexLocal(localexutili, params->locallab.spots.at(sp).excurve, exlocalcurve, sca); CurveFactory::curvemaskLocal(localmaskutili, params->locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, sca); CurveFactory::curvemaskLocal(localmaskexputili, params->locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, sca); + CurveFactory::curvemaskLocal(localmaskSHutili, params->locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, 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; @@ -1027,6 +1031,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, + lmaskSHlocalcurve, localmaskSHutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1045,6 +1050,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, + lmaskSHlocalcurve, localmaskSHutili, 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 +1075,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) exlocalcurve.clear(); lmasklocalcurve.clear(); lmaskexplocalcurve.clear(); + lmaskSHlocalcurve.clear(); hltonecurveloc.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 3ebb38619..4d6fb3e9c 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -235,6 +235,7 @@ protected: LUTf lightCurveloc; LUTf lmasklocalcurve; LUTf lmaskexplocalcurve; + LUTf lmaskSHlocalcurve; // LUTu lhist16loc; LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; @@ -272,6 +273,7 @@ protected: bool lcmasutili; bool localmaskutili; bool localmaskexputili; + bool localmaskSHutili; bool lcmasexputili; bool lhmasexputili; bool llmasexputili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index c3419b525..25d07ca20 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -217,6 +217,7 @@ public: void Lab_Local(int call, int sp, float** shbuffer, LabImage* original, LabImage* transformed, LabImage* reserved, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve & locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, LUTf & lllocalcurve, bool & locallutili, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, LUTf & lmasklocalcurve, bool & localmaskutili, LUTf & lmaskexplocalcurve, bool & localmaskexputili, + LUTf & lmaskSHlocalcurve, bool & localmaskSHutili, 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 8f7187213..f192f6f8e 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -6714,6 +6714,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const LocretigainCurve & locRETgainCcurve, const LocretitransCurve & locRETtransCcurve, LUTf & lllocalcurve, bool & locallutili, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, LUTf & lmasklocalcurve, bool & localmaskutili, LUTf & lmaskexplocalcurve, bool & localmaskexputili, + LUTf & lmaskSHlocalcurve, bool & localmaskSHutili, 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, @@ -8010,12 +8011,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; float pde = params->locallab.spots.at(sp).laplac; - LUTf dummy; - bool uti; 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, dummy, uti); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili); if (lp.showmaskSHmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); @@ -8107,12 +8106,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; float pde = params->locallab.spots.at(sp).laplac; - LUTf dummy; - bool uti; 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, dummy, uti); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili); if (lp.showmaskSHmetinv == 1) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index f67cf37bb..7a69ad68b 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -798,6 +798,7 @@ enum ProcEventCode { Evlocallabscalegr = 768, EvlocallabLmaskshape = 769, EvlocallabLmaskexpshape = 770, + EvlocallabLmaskSHshape = 771, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f4270a9f4..a3d944592 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2524,6 +2524,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : gammaskSH(1.0), slomaskSH(0.0), lapmaskSH(0.0), + LmaskSHcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, // Vibrance expvibrance(false), saturated(0), @@ -2808,6 +2809,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && gammaskSH == other.gammaskSH && slomaskSH == other.slomaskSH && lapmaskSH == other.lapmaskSH + && LmaskSHcurve == other.LmaskSHcurve // Vibrance && expvibrance == other.expvibrance && saturated == other.saturated @@ -4078,6 +4080,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LmaskSHcurve, "Locallab", "LmaskSHCurve_" + std::to_string(i), spot.LmaskSHcurve, 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); @@ -5463,6 +5466,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + assignFromKeyfile(keyFile, "Locallab", "LmaskSHCurve_" + std::to_string(i), pedited, spot.LmaskSHcurve, spotEdited.LmaskSHcurve); // 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 8aac36da1..a9d684950 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1073,6 +1073,7 @@ struct LocallabParams { double gammaskSH; double slomaskSH; double lapmaskSH; + std::vector LmaskSHcurve; // Vibrance bool expvibrance; int saturated; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 323a76224..84b8d2378 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -797,7 +797,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabstrengr LUMINANCECURVE, //Evlocallabscalegr LUMINANCECURVE, //EvlocallabLmaskshape - LUMINANCECURVE //EvlocallabLmaskexpshape + LUMINANCECURVE, //EvlocallabLmaskexpshape + LUMINANCECURVE //EvlocallabLmaskSHshape }; namespace rtengine diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index ff50b8939..d206925c1 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1126,6 +1126,7 @@ private: LUTf exlocalcurve(65536, 0); LUTf lmasklocalcurve(65536, 0); LUTf lmaskexplocalcurve(65536, 0); + LUTf lmaskSHlocalcurve(65536, 0); // int maxspot = 1; float** shbuffer = nullptr; @@ -1150,6 +1151,7 @@ private: bool lcmasutili = false; bool localmaskutili = false; bool localmaskexputili = false; + bool localmaskSHutili = false; bool lcmasexputili = false; bool lhmasexputili = false; bool llmasexputili = false; @@ -1200,6 +1202,7 @@ private: CurveFactory::curveexLocal(localexutili, params.locallab.spots.at(sp).excurve, exlocalcurve, 1); CurveFactory::curvemaskLocal(localmaskutili, params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, 1); CurveFactory::curvemaskLocal(localmaskexputili, params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, 1); + CurveFactory::curvemaskLocal(localmaskSHutili, params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, 1); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; @@ -1236,6 +1239,7 @@ private: ipf.Lab_Local(2, sp, (float**)shbuffer, labView, labView, reservView, 0, 0, fw, fh, 1, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, + lmaskSHlocalcurve, localmaskSHutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1255,6 +1259,7 @@ private: hltonecurveloc.clear(); lmasklocalcurve.clear(); lmaskexplocalcurve.clear(); + lmaskSHlocalcurve.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); lightCurveloc.clear(); diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 146849feb..d36c37a2b 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -162,6 +162,7 @@ Locallab::Locallab(): mask2expCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), //Shadows Highlight maskSHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + mask2SHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), // Vibranceretinex curveEditorGG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL"))), //Blur @@ -1099,6 +1100,21 @@ Locallab::Locallab(): maskSHCurveEditorG->curveListComplete(); + mask2SHCurveEditorG->setCurveListener(this); + LmaskSHshape = static_cast(mask2SHCurveEditorG->addCurve(CT_Diagonal, "L(L)")); + LmaskSHshape->setResetCurve(DiagonalCurveType(defSpot.LmaskSHcurve.at(0)), defSpot.LmaskSHcurve); + + if (showtooltip) { + LmaskSHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + } + + std::vector mLmaskSHshape; + mLmaskSHshape.push_back(GradientMilestone(0., 0., 0., 0.)); + mLmaskSHshape.push_back(GradientMilestone(1., 1., 1., 1.)); + LmaskSHshape->setBottomBarBgGradient(mLmaskSHshape); + LmaskSHshape->setLeftBarBgGradient(mLmaskSHshape); + mask2SHCurveEditorG->curveListComplete(); + ToolParamBlock* const shadhighBox = Gtk::manage(new ToolParamBlock()); shadhighBox->pack_start(*highlights); shadhighBox->pack_start(*h_tonalwidth); @@ -1121,6 +1137,7 @@ Locallab::Locallab(): maskSHBox->pack_start(*chromaskSH, Gtk::PACK_SHRINK, 0); 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 expmasksh->add(*maskSHBox, false); shadhighBox->pack_start(*expmasksh); @@ -2249,6 +2266,7 @@ Locallab::~Locallab() delete maskCurveEditorG; delete mask2CurveEditorG; delete mask2expCurveEditorG; + delete mask2SHCurveEditorG; delete curveEditorG; delete maskexpCurveEditorG; delete maskSHCurveEditorG; @@ -3246,6 +3264,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) 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(); + pp->locallab.spots.at(pp->locallab.selspot).LmaskSHcurve = LmaskSHshape->getCurve(); // Vibrance pp->locallab.spots.at(pp->locallab.selspot).expvibrance = expvibrance->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).saturated = saturated->getIntValue(); @@ -3576,6 +3595,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) 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(); + pe->locallab.spots.at(pp->locallab.selspot).LmaskSHcurve = pe->locallab.spots.at(pp->locallab.selspot).LmaskSHcurve || !LmaskSHshape->isUnChanged(); // 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(); @@ -3864,6 +3884,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) 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(); + pedited->locallab.spots.at(pp->locallab.selspot).LmaskSHcurve = pedited->locallab.spots.at(pp->locallab.selspot).LmaskSHcurve || !LmaskSHshape->isUnChanged(); // 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(); @@ -4240,6 +4261,13 @@ void Locallab::curveChanged(CurveEditor* ce) listener->panelChanged(EvlocallabHHmaskSHshape, M("HISTORY_CUSTOMCURVE")); } } + + if (ce == LmaskSHshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskSHshape, M("HISTORY_CUSTOMCURVE")); + } + } + } //CBDL @@ -7966,6 +7994,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con gammaskSH->setValue(pp->locallab.spots.at(index).gammaskSH); slomaskSH->setValue(pp->locallab.spots.at(index).slomaskSH); lapmaskSH->setValue(pp->locallab.spots.at(index).lapmaskSH); + LmaskSHshape->setCurve(pp->locallab.spots.at(index).LmaskSHcurve); // Vibrance expvibrance->setEnabled(pp->locallab.spots.at(index).expvibrance); @@ -8328,6 +8357,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con gammaskSH->setEditedState(spotState->gammaskSH ? Edited : UnEdited); slomaskSH->setEditedState(spotState->slomaskSH ? Edited : UnEdited); lapmaskSH->setEditedState(spotState->lapmaskSH ? Edited : UnEdited); + LmaskSHshape->setUnChanged(!spotState->LmaskSHcurve); // Vibrance expvibrance->set_inconsistent(!spotState->expvibrance); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 5ca26b247..ff2d0de10 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -94,6 +94,8 @@ private: FlatCurveEditor* HHmaskexpshape; //Shadows Highlight CurveEditorGroup* const maskSHCurveEditorG; + CurveEditorGroup* const mask2SHCurveEditorG; + DiagonalCurveEditor* LmaskSHshape; FlatCurveEditor* CCmaskSHshape; FlatCurveEditor* LLmaskSHshape; FlatCurveEditor* HHmaskSHshape; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index ac3e8f03a..8b3f26ca4 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1065,6 +1065,7 @@ void ParamsEdited::initFrom(const std::vector& 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; + locallab.spots.at(j).LmaskSHcurve = locallab.spots.at(j).LmaskSHcurve && pSpot.LmaskSHcurve == otherSpot.LmaskSHcurve; // 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; @@ -3140,6 +3141,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).lapmaskSH = mods.locallab.spots.at(i).lapmaskSH; } + if (locallab.spots.at(i).LmaskSHcurve) { + toEdit.locallab.spots.at(i).LmaskSHcurve = mods.locallab.spots.at(i).LmaskSHcurve; + } + // Vibrance if (locallab.spots.at(i).expvibrance) { toEdit.locallab.spots.at(i).expvibrance = mods.locallab.spots.at(i).expvibrance; @@ -4842,6 +4847,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : gammaskSH(v), slomaskSH(v), lapmaskSH(v), + LmaskSHcurve(v), // Vibrance expvibrance(v), saturated(v), @@ -5123,6 +5129,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) gammaskSH = v; slomaskSH = v; lapmaskSH = v; + LmaskSHcurve = v; // Vibrance expvibrance = v; saturated = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index c7eed9677..6c9db21c5 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -483,6 +483,7 @@ public: bool gammaskSH; bool slomaskSH; bool lapmaskSH; + bool LmaskSHcurve; // Vibrance bool expvibrance; bool saturated;