From 94bd0a7d609b9a56da9a7c10a7e3d62a84c6540f Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 15 Oct 2019 14:03:21 +0200 Subject: [PATCH] Add contrast curve to mask 3 ToneMapping --- rtdata/languages/default | 1 + rtengine/dcrop.cc | 7 +++++++ rtengine/improccoordinator.cc | 7 +++++++ rtengine/improccoordinator.h | 2 ++ rtengine/improcfun.h | 1 + rtengine/iplocallab.cc | 9 +++------ rtengine/procevents.h | 1 + rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 ++- rtengine/simpleprocess.cc | 4 ++++ rtgui/locallab.cc | 35 ++++++++++++++++++++++++++++++++++- rtgui/locallab.h | 2 ++ rtgui/paramsedited.cc | 7 +++++++ rtgui/paramsedited.h | 1 + 15 files changed, 77 insertions(+), 8 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index cdb7a4b74..3e8c35910 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1010,6 +1010,7 @@ 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_773;Local - TM 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 7f2bbea60..c8a97c703 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -889,9 +889,11 @@ void Crop::update(int todo) bool localmaskutili = parent->localmaskutili; bool localmaskexputili = parent->localmaskexputili; bool localmaskSHutili = parent->localmaskSHutili; + bool localmasktmutili = parent->localmasktmutili; LUTf lmasklocalcurve2(65536, 0); LUTf lmaskexplocalcurve2(65536, 0); LUTf lmaskSHlocalcurve2(65536, 0); + LUTf lmasktmlocalcurve2(65536, 0); LUTf hltonecurveloc2(65536, 0); //65536 LUTf shtonecurveloc2(65536, 0); LUTf tonecurveloc2(65536, 0); @@ -997,6 +999,8 @@ void Crop::update(int todo) CurveFactory::curvemaskLocal(localmaskexputili, params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve2, sca); localmaskSHutili = false; CurveFactory::curvemaskLocal(localmaskSHutili, params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve2, sca); + localmasktmutili = false; + CurveFactory::curvemaskLocal(localmasktmutili, params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve2, sca); double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1038,6 +1042,7 @@ void Crop::update(int todo) lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, lmaskSHlocalcurve2, localmaskSHutili, + lmasktmlocalcurve2, localmasktmutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1058,6 +1063,7 @@ void Crop::update(int todo) lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, lmaskSHlocalcurve2, localmaskSHutili, + lmasktmlocalcurve2, localmasktmutili, 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 +1082,7 @@ void Crop::update(int todo) lmasklocalcurve2.clear(); lmaskexplocalcurve2.clear(); lmaskSHlocalcurve2.clear(); + lmasktmlocalcurve2.clear(); hltonecurveloc2.clear(); shtonecurveloc2.clear(); tonecurveloc2.clear(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 9c55e199c..34325d686 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -174,6 +174,7 @@ ImProcCoordinator::ImProcCoordinator() : lmasklocalcurve(65536, 0), lmaskexplocalcurve(65536, 0), lmaskSHlocalcurve(65536, 0), + lmasktmlocalcurve(65536, 0), locallutili(false), localcutili(false), localexutili(false), @@ -183,6 +184,7 @@ ImProcCoordinator::ImProcCoordinator() : localmaskutili(false), localmaskexputili(false), localmaskSHutili(false), + localmasktmutili(false), lcmasexputili(false), lhmasexputili(false), llmasexputili(false), @@ -926,6 +928,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) llmasexputili = false; localmaskexputili = false; localmaskSHutili = false; + localmasktmutili = false; lcmasSHutili = false; lhmasSHutili = false; llmasSHutili = false; @@ -976,6 +979,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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); + CurveFactory::curvemaskLocal(localmasktmutili, params->locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, 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; @@ -1032,6 +1036,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, lmaskSHlocalcurve, localmaskSHutili, + lmasktmlocalcurve, localmasktmutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, @@ -1051,6 +1056,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, lmaskSHlocalcurve, localmaskSHutili, + lmasktmlocalcurve, localmasktmutili, 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 +1082,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lmasklocalcurve.clear(); lmaskexplocalcurve.clear(); lmaskSHlocalcurve.clear(); + lmasktmlocalcurve.clear(); hltonecurveloc.clear(); shtonecurveloc.clear(); tonecurveloc.clear(); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 4d6fb3e9c..e4dad1c5c 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -236,6 +236,7 @@ protected: LUTf lmasklocalcurve; LUTf lmaskexplocalcurve; LUTf lmaskSHlocalcurve; + LUTf lmasktmlocalcurve; // LUTu lhist16loc; LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; @@ -274,6 +275,7 @@ protected: bool localmaskutili; bool localmaskexputili; bool localmaskSHutili; + bool localmasktmutili; bool lcmasexputili; bool lhmasexputili; bool llmasexputili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 25d07ca20..f31bb4fe5 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -218,6 +218,7 @@ public: LUTf & lmasklocalcurve, bool & localmaskutili, LUTf & lmaskexplocalcurve, bool & localmaskexputili, LUTf & lmaskSHlocalcurve, bool & localmaskSHutili, + LUTf & lmasktmlocalcurve, bool & localmasktmutili, 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 f192f6f8e..840fc5ebf 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -6715,6 +6715,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o LUTf & lmasklocalcurve, bool & localmaskutili, LUTf & lmaskexplocalcurve, bool & localmaskexputili, LUTf & lmaskSHlocalcurve, bool & localmaskSHutili, + LUTf & lmasktmlocalcurve, bool & localmasktmutili, 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, @@ -7817,12 +7818,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; if (!params->locallab.spots.at(sp).enatmMaskaft) { - LUTf dummy; - bool uti; 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, dummy, uti); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili); if (lp.showmasktmmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); @@ -7842,12 +7841,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (enatmMasktmap) { //calculate new values for original, originalmasktm, bufmaskorigtm...in function of tmp1 - LUTf dummy; - bool uti; 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, dummy, uti); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili); if (lp.showmasktmmet == 3) {//dispaly mask showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 7a69ad68b..18667b3cc 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -799,6 +799,7 @@ enum ProcEventCode { EvlocallabLmaskshape = 769, EvlocallabLmaskexpshape = 770, EvlocallabLmaskSHshape = 771, + EvlocallabLmasktmshape = 772, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index a3d944592..4cd1d5a6e 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2590,6 +2590,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : gammasktm(1.0), slomasktm(0.0), lapmasktm(0.0), + Lmasktmcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, // Retinex expreti(false), retinexMethod("high"), @@ -2875,6 +2876,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && gammasktm == other.gammasktm && slomasktm == other.slomasktm && lapmasktm == other.lapmasktm + && Lmasktmcurve == other.Lmasktmcurve // Retinex && expreti == other.expreti && retinexMethod == other.retinexMethod @@ -4146,6 +4148,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammasktm, "Locallab", "Gammasktm_" + std::to_string(i), spot.gammasktm, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomasktm, "Locallab", "Slomasktm_" + std::to_string(i), spot.slomasktm, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmasktm, "Locallab", "Lapmasktm_" + std::to_string(i), spot.lapmasktm, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).Lmasktmcurve, "Locallab", "LmasktmCurve_" + std::to_string(i), spot.Lmasktmcurve, keyFile); // Retinex saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expreti, "Locallab", "Expreti_" + std::to_string(i), spot.expreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).retinexMethod, "Locallab", "retinexMethod_" + std::to_string(i), spot.retinexMethod, keyFile); @@ -5544,6 +5547,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Gammasktm_" + std::to_string(i), pedited, spot.gammasktm, spotEdited.gammasktm); assignFromKeyfile(keyFile, "Locallab", "Slomasktm_" + std::to_string(i), pedited, spot.slomasktm, spotEdited.slomasktm); assignFromKeyfile(keyFile, "Locallab", "Lapmasktm_" + std::to_string(i), pedited, spot.lapmasktm, spotEdited.lapmasktm); + assignFromKeyfile(keyFile, "Locallab", "LmasktmCurve_" + std::to_string(i), pedited, spot.Lmasktmcurve, spotEdited.Lmasktmcurve); // Retinex assignFromKeyfile(keyFile, "Locallab", "Expreti_" + std::to_string(i), pedited, spot.expreti, spotEdited.expreti); assignFromKeyfile(keyFile, "Locallab", "retinexMethod_" + std::to_string(i), pedited, spot.retinexMethod, spotEdited.retinexMethod); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index a9d684950..7a61c0398 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1139,6 +1139,7 @@ struct LocallabParams { double gammasktm; double slomasktm; double lapmasktm; + std::vector Lmasktmcurve; // Retinex bool expreti; Glib::ustring retinexMethod; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 84b8d2378..e5ed046da 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -798,7 +798,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabscalegr LUMINANCECURVE, //EvlocallabLmaskshape LUMINANCECURVE, //EvlocallabLmaskexpshape - LUMINANCECURVE //EvlocallabLmaskSHshape + LUMINANCECURVE, //EvlocallabLmaskSHshape + LUMINANCECURVE //EvlocallabLmasktmshape }; namespace rtengine diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index d206925c1..3b22c0b01 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1127,6 +1127,7 @@ private: LUTf lmasklocalcurve(65536, 0); LUTf lmaskexplocalcurve(65536, 0); LUTf lmaskSHlocalcurve(65536, 0); + LUTf lmasktmlocalcurve(65536, 0); // int maxspot = 1; float** shbuffer = nullptr; @@ -1152,6 +1153,7 @@ private: bool localmaskutili = false; bool localmaskexputili = false; bool localmaskSHutili = false; + bool localmasktmutili = false; bool lcmasexputili = false; bool lhmasexputili = false; bool llmasexputili = false; @@ -1203,6 +1205,7 @@ private: 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); + CurveFactory::curvemaskLocal(localmasktmutili, params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, 1); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; @@ -1240,6 +1243,7 @@ private: lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, lmaskSHlocalcurve, localmaskSHutili, + lmasktmlocalcurve, localmasktmutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index d36c37a2b..729fd4a87 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -163,13 +163,14 @@ Locallab::Locallab(): //Shadows Highlight maskSHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), mask2SHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), - // Vibranceretinex + // Vibrance curveEditorGG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL"))), //Blur maskblCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), //TM masktmCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + mask2tmCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), // Retinex LocalcurveEditortransT(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_TRANSMISSIONMAP"))), LocalcurveEditorgainT(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_TRANSMISSIONGAIN"))), @@ -1350,6 +1351,25 @@ Locallab::Locallab(): HHmasktmshape->setBottomBarColorProvider(this, 6); masktmCurveEditorG->curveListComplete(); + + mask2tmCurveEditorG->setCurveListener(this); + Lmasktmshape = static_cast(mask2tmCurveEditorG->addCurve(CT_Diagonal, "L(L)")); + Lmasktmshape->setResetCurve(DiagonalCurveType(defSpot.Lmasktmcurve.at(0)), defSpot.Lmasktmcurve); + + if (showtooltip) { + Lmasktmshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + } + + std::vector mLmasktmshape; + mLmasktmshape.push_back(GradientMilestone(0., 0., 0., 0.)); + mLmasktmshape.push_back(GradientMilestone(1., 1., 1., 1.)); + Lmasktmshape->setBottomBarBgGradient(mLmasktmshape); + Lmasktmshape->setLeftBarBgGradient(mLmasktmshape); + mask2tmCurveEditorG->curveListComplete(); + + + + enatmMaskConn = enatmMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enatmMaskChanged)); enatmMaskaftConn = enatmMaskaft->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enatmMaskaftChanged)); @@ -1393,6 +1413,7 @@ Locallab::Locallab(): masktmBox->pack_start(*chromasktm, Gtk::PACK_SHRINK, 0); masktmBox->pack_start(*gammasktm, Gtk::PACK_SHRINK, 0); masktmBox->pack_start(*slomasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*mask2tmCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor expmasktm->add(*masktmBox, false); @@ -2267,6 +2288,7 @@ Locallab::~Locallab() delete mask2CurveEditorG; delete mask2expCurveEditorG; delete mask2SHCurveEditorG; + delete mask2tmCurveEditorG; delete curveEditorG; delete maskexpCurveEditorG; delete maskSHCurveEditorG; @@ -3360,6 +3382,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).gammasktm = gammasktm->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomasktm = slomasktm->getValue(); pp->locallab.spots.at(pp->locallab.selspot).lapmasktm = lapmasktm->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).Lmasktmcurve = Lmasktmshape->getCurve(); // Retinex pp->locallab.spots.at(pp->locallab.selspot).expreti = expreti->getEnabled(); @@ -3661,6 +3684,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).gammasktm = pe->locallab.spots.at(pp->locallab.selspot).gammasktm || gammasktm->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomasktm = pe->locallab.spots.at(pp->locallab.selspot).slomasktm || slomasktm->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).lapmasktm = pe->locallab.spots.at(pp->locallab.selspot).lapmasktm || lapmasktm->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).Lmasktmcurve = pe->locallab.spots.at(pp->locallab.selspot).Lmasktmcurve || !Lmasktmshape->isUnChanged(); // Retinex pe->locallab.spots.at(pp->locallab.selspot).expreti = pe->locallab.spots.at(pp->locallab.selspot).expreti || !expreti->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).retinexMethod = pe->locallab.spots.at(pp->locallab.selspot).retinexMethod || retinexMethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -3952,6 +3976,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).gammasktm = pedited->locallab.spots.at(pp->locallab.selspot).gammasktm || gammasktm->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomasktm = pedited->locallab.spots.at(pp->locallab.selspot).slomasktm || slomasktm->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).lapmasktm = pedited->locallab.spots.at(pp->locallab.selspot).lapmasktm || lapmasktm->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).Lmasktmcurve = pedited->locallab.spots.at(pp->locallab.selspot).Lmasktmcurve || !Lmasktmshape->isUnChanged(); // Retinex pedited->locallab.spots.at(pp->locallab.selspot).expreti = pedited->locallab.spots.at(pp->locallab.selspot).expreti || !expreti->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).retinexMethod = pedited->locallab.spots.at(pp->locallab.selspot).retinexMethod || retinexMethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -4345,6 +4370,12 @@ void Locallab::curveChanged(CurveEditor* ce) } } + if (ce == Lmasktmshape) { + if (listener) { + listener->panelChanged(EvlocallabLmasktmshape, M("HISTORY_CUSTOMCURVE")); + } + } + } // Retinex @@ -8093,6 +8124,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con CCmasktmshape->setCurve(pp->locallab.spots.at(index).CCmasktmcurve); LLmasktmshape->setCurve(pp->locallab.spots.at(index).LLmasktmcurve); HHmasktmshape->setCurve(pp->locallab.spots.at(index).HHmasktmcurve); + Lmasktmshape->setCurve(pp->locallab.spots.at(index).Lmasktmcurve); // Retinex expreti->setEnabled(pp->locallab.spots.at(index).expreti); @@ -8440,6 +8472,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con gammasktm->setEditedState(spotState->gammasktm ? Edited : UnEdited); slomasktm->setEditedState(spotState->slomasktm ? Edited : UnEdited); lapmasktm->setEditedState(spotState->lapmasktm ? Edited : UnEdited); + Lmasktmshape->setUnChanged(!spotState->Lmasktmcurve); // Retinex expreti->set_inconsistent(!spotState->expreti); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index ff2d0de10..f84d27774 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -109,6 +109,8 @@ private: FlatCurveEditor* HHmaskblshape; // TM CurveEditorGroup* const masktmCurveEditorG; + CurveEditorGroup* const mask2tmCurveEditorG; + DiagonalCurveEditor* Lmasktmshape; FlatCurveEditor* CCmasktmshape; FlatCurveEditor* LLmasktmshape; FlatCurveEditor* HHmasktmshape; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 8b3f26ca4..087c095fc 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1130,6 +1130,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).gammasktm = locallab.spots.at(j).gammasktm && pSpot.gammasktm == otherSpot.gammasktm; locallab.spots.at(j).slomasktm = locallab.spots.at(j).slomasktm && pSpot.slomasktm == otherSpot.slomasktm; locallab.spots.at(j).lapmasktm = locallab.spots.at(j).lapmasktm && pSpot.lapmasktm == otherSpot.lapmasktm; + locallab.spots.at(j).Lmasktmcurve = locallab.spots.at(j).Lmasktmcurve && pSpot.Lmasktmcurve == otherSpot.Lmasktmcurve; // Retinex locallab.spots.at(j).expreti = locallab.spots.at(j).expreti && pSpot.expreti == otherSpot.expreti; locallab.spots.at(j).retinexMethod = locallab.spots.at(j).retinexMethod && pSpot.retinexMethod == otherSpot.retinexMethod; @@ -3393,6 +3394,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).lapmasktm = mods.locallab.spots.at(i).lapmasktm; } + if (locallab.spots.at(i).Lmasktmcurve) { + toEdit.locallab.spots.at(i).Lmasktmcurve = mods.locallab.spots.at(i).Lmasktmcurve; + } + // Retinex if (locallab.spots.at(i).expreti) { toEdit.locallab.spots.at(i).expreti = mods.locallab.spots.at(i).expreti; @@ -4913,6 +4918,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : gammasktm(v), slomasktm(v), lapmasktm(v), + Lmasktmcurve(v), // Retinex expreti(v), retinexMethod(v), @@ -5195,6 +5201,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) gammasktm = v; slomasktm = v; lapmasktm = v; + Lmasktmcurve = v; // Retinex expreti = v; retinexMethod = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 6c9db21c5..e8b64bcd8 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -549,6 +549,7 @@ public: bool gammasktm; bool slomasktm; bool lapmasktm; + bool Lmasktmcurve; // Retinex bool expreti; bool retinexMethod;