From 31f9b44d06d5fc89ab87f68f850307dbae3325eb Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 10 May 2019 16:56:57 +0200 Subject: [PATCH] Save GUI for mask retinex - disabled --- rtengine/curves.cc | 144 ++++++++++++++++++++ rtengine/curves.h | 89 ++++++++++++ rtengine/improccoordinator.cc | 1 + rtengine/improccoordinator.h | 4 +- rtengine/procevents.h | 10 ++ rtengine/procparams.cc | 38 +++++- rtengine/procparams.h | 9 ++ rtengine/refreshmap.cc | 12 +- rtengine/rtengine.h | 2 +- rtgui/locallab.cc | 250 +++++++++++++++++++++++++++++++++- rtgui/locallab.h | 19 +++ rtgui/paramsedited.cc | 63 +++++++++ rtgui/paramsedited.h | 9 ++ rtgui/toolpanelcoord.cc | 6 +- 14 files changed, 647 insertions(+), 9 deletions(-) diff --git a/rtengine/curves.cc b/rtengine/curves.cc index aa54a307f..581d650ab 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1563,6 +1563,150 @@ void LocretigainCurverab::Set(const std::vector &curvePoints) } } +LocHHmaskretiCurve::LocHHmaskretiCurve() : sum(0.f) {}; + +void LocHHmaskretiCurve::Reset() +{ + lutLocHHmaskretiCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskretiCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskretiCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskretiCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskretiCurve[i] < 0.02f) { + lutLocHHmaskretiCurve[i] = 0.02f; + } + + sum += lutLocHHmaskretiCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + +void LocHHmaskretiCurve::Set(const std::vector &curvePoints, bool & lhmasretiutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lhmasretiutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocLLmaskretiCurve::LocLLmaskretiCurve() : sum(0.f) {}; + +void LocLLmaskretiCurve::Reset() +{ + lutLocLLmaskretiCurve.reset(); + sum = 0.f; +} + +void LocLLmaskretiCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmaskretiCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmaskretiCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmaskretiCurve[i] < 0.02f) { + lutLocLLmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmaskretiCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocLLmaskretiCurve::Set(const std::vector &curvePoints, bool & llmasretiutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + llmasretiutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocCCmaskretiCurve::LocCCmaskretiCurve() : sum(0.f) {}; + +void LocCCmaskretiCurve::Reset() +{ + lutLocCCmaskretiCurve.reset(); + sum = 0.f; +} + +void LocCCmaskretiCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmaskretiCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmaskretiCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmaskretiCurve[i] < 0.02f) { + lutLocCCmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmaskretiCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocCCmaskretiCurve::Set(const std::vector &curvePoints, bool & lcmasretiutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lcmasretiutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + + + + + + LocHHmaskcbCurve::LocHHmaskcbCurve() : sum(0.f) {}; void LocHHmaskcbCurve::Reset() diff --git a/rtengine/curves.h b/rtengine/curves.h index fda8adcd6..5b6282392 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -647,6 +647,95 @@ public: } }; +class LocHHmaskretiCurve +{ +private: + LUTf lutLocHHmaskretiCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskretiCurve() {}; + LocHHmaskretiCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lhmasretiutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskretiCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskretiCurve; + } +}; + + +class LocCCmaskretiCurve +{ +private: + LUTf lutLocCCmaskretiCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmaskretiCurve() {}; + LocCCmaskretiCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lcmasretiutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmaskretiCurve[index]; + } + operator bool (void) const + { + return lutLocCCmaskretiCurve; + } +}; + +class LocLLmaskretiCurve +{ +private: + LUTf lutLocLLmaskretiCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmaskretiCurve() {}; + LocLLmaskretiCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & llmasretiutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmaskretiCurve[index]; + } + operator bool (void) const + { + return lutLocLLmaskretiCurve; + } +}; + + + + + class LocHHmaskcbCurve { private: diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index cb63f025f..ba09dc2c7 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -204,6 +204,7 @@ ImProcCoordinator::ImProcCoordinator() : locallExpMask(0), locallSHMask(0), locallcbMask(0), + locallretiMask(0), avg(0), retistrsav(nullptr) diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 05795e7d5..28f7db4b3 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -279,6 +279,7 @@ protected: int locallExpMask; int locallSHMask; int locallcbMask; + int locallretiMask; float avg; public: @@ -348,12 +349,13 @@ public: updaterThreadStart.unlock(); } - void setLocallabMaskVisibility (int locallColorMask, int locallExpMask, int locallSHMask, int locallcbMask) override + void setLocallabMaskVisibility (int locallColorMask, int locallExpMask, int locallSHMask, int locallcbMask, int locallretiMask) override { this->locallColorMask = locallColorMask; this->locallExpMask = locallExpMask; this->locallSHMask = locallSHMask; this->locallcbMask = locallcbMask; + this->locallretiMask = locallretiMask; } void setProgressListener (ProgressListener* pl) override diff --git a/rtengine/procevents.h b/rtengine/procevents.h index f1fe9eaa5..d1537f208 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -705,6 +705,16 @@ enum ProcEventCode { EvLocallabSpotTransitgrad = 675, Evlocallabamount = 676, Evlocallabsatur = 677, + EvlocallabCCmaskretishape = 678, + EvlocallabLLmaskretishape = 679, + EvlocallabHHmaskretishape = 680, + EvLocallabEnaretiMask = 681, + Evlocallabblendmaskreti = 682, + Evlocallabradmaskreti = 683, + Evlocallabchromaskreti = 684, + Evlocallabgammaskreti = 685, + Evlocallabslomaskreti = 686, + EvlocallabshowmaskretiMethod = 687, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 87c15c763..d59f634bd 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2478,6 +2478,15 @@ LocallabParams::LocallabSpot::LocallabSpot() : localTgaincurve{(double)FCT_MinMaxCPoints, 0.0, 0.12, 0.35, 0.35, 0.70, 0.50, 0.35, 0.35, 1.00, 0.12, 0.35, 0.35}, inversret(false), softradiusret(0.0), + CCmaskreticurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35 }, + LLmaskreticurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, + HHmaskreticurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, + enaretiMask(false), + blendmaskreti(0), + radmaskreti(10.0), + chromaskreti(0.0), + gammaskreti(1.0), + slomaskreti(0.0), // Sharpening expsharp(false), sharcontrast(20), @@ -2677,6 +2686,15 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && localTgaincurve == other.localTgaincurve && inversret == other.inversret && softradiusret == other.softradiusret + && CCmaskreticurve == other.CCmaskreticurve + && LLmaskreticurve == other.LLmaskreticurve + && HHmaskreticurve == other.HHmaskreticurve + && enaretiMask == other.enaretiMask + && blendmaskreti == other.blendmaskreti + && radmaskreti == other.radmaskreti + && chromaskreti == other.chromaskreti + && gammaskreti == other.gammaskreti + && slomaskreti == other.slomaskreti // Sharpening && expsharp == other.expsharp && sharcontrast == other.sharcontrast @@ -3820,6 +3838,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sensitm, "Locallab", "Sensitm_" + std::to_string(i), spot.sensitm, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).softradiustm, "Locallab", "Softradiustm_" + std::to_string(i), spot.softradiustm, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).amount, "Locallab", "Amount_" + std::to_string(i), spot.amount, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).CCmaskreticurve, "Locallab", "CCmaskretiCurve_" + std::to_string(i), spot.CCmaskreticurve, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmaskreticurve, "Locallab", "LLmaskretiCurve_" + std::to_string(i), spot.LLmaskreticurve, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).HHmaskreticurve, "Locallab", "HHmaskretiCurve_" + std::to_string(i), spot.HHmaskreticurve, 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); @@ -3832,6 +3853,12 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).localTgaincurve, "Locallab", "TgainCurve_" + std::to_string(i), spot.localTgaincurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).inversret, "Locallab", "Inversret_" + std::to_string(i), spot.inversret, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).softradiusret, "Locallab", "Softradiusret_" + std::to_string(i), spot.softradiusret, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).enaretiMask, "Locallab", "EnaretiMask_" + std::to_string(i), spot.enaretiMask, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).blendmaskreti, "Locallab", "Blendmaskreti_" + std::to_string(i), spot.blendmaskreti, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).radmaskreti, "Locallab", "Radmaskreti_" + std::to_string(i), spot.radmaskreti, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromaskreti, "Locallab", "Chromaskreti_" + std::to_string(i), spot.chromaskreti, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskreti, "Locallab", "Gammaskreti_" + std::to_string(i), spot.gammaskreti, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskreti, "Locallab", "Slomaskreti_" + std::to_string(i), spot.slomaskreti, keyFile); // Sharpening saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expsharp, "Locallab", "Expsharp_" + std::to_string(i), spot.expsharp, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sharcontrast, "Locallab", "Sharcontrast_" + std::to_string(i), spot.sharcontrast, keyFile); @@ -5128,6 +5155,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "TgainCurve_" + std::to_string(i), pedited, spot.localTgaincurve, spotEdited.localTgaincurve); assignFromKeyfile(keyFile, "Locallab", "Inversret_" + std::to_string(i), pedited, spot.inversret, spotEdited.inversret); assignFromKeyfile(keyFile, "Locallab", "Softradiusret_" + std::to_string(i), pedited, spot.softradiusret, spotEdited.softradiusret); + assignFromKeyfile(keyFile, "Locallab", "CCmaskretiCurve_" + std::to_string(i), pedited, spot.CCmaskreticurve, spotEdited.CCmaskreticurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskretiCurve_" + std::to_string(i), pedited, spot.LLmaskreticurve, spotEdited.LLmaskreticurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskretiCurve_" + std::to_string(i), pedited, spot.HHmaskreticurve, spotEdited.HHmaskreticurve); + assignFromKeyfile(keyFile, "Locallab", "EnaretiMask_" + std::to_string(i), pedited, spot.enaretiMask, spotEdited.enaretiMask); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskreti_" + std::to_string(i), pedited, spot.blendmaskreti, spotEdited.blendmaskreti); + assignFromKeyfile(keyFile, "Locallab", "Radmaskreti_" + std::to_string(i), pedited, spot.radmaskreti, spotEdited.radmaskreti); + assignFromKeyfile(keyFile, "Locallab", "Chromaskreti_" + std::to_string(i), pedited, spot.chromaskreti, spotEdited.chromaskreti); + assignFromKeyfile(keyFile, "Locallab", "Gammaskreti_" + std::to_string(i), pedited, spot.gammaskreti, spotEdited.gammaskreti); + assignFromKeyfile(keyFile, "Locallab", "Slomaskreti_" + std::to_string(i), pedited, spot.slomaskreti, spotEdited.slomaskreti); // Sharpening assignFromKeyfile(keyFile, "Locallab", "Expsharp_" + std::to_string(i), pedited, spot.expsharp, spotEdited.expsharp); assignFromKeyfile(keyFile, "Locallab", "Sharcontrast_" + std::to_string(i), pedited, spot.sharcontrast, spotEdited.sharcontrast); @@ -5159,11 +5195,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Contresid_" + std::to_string(i), pedited, spot.contresid, spotEdited.contresid); assignFromKeyfile(keyFile, "Locallab", "Blurcbdl_" + std::to_string(i), pedited, spot.blurcbdl, spotEdited.blurcbdl); assignFromKeyfile(keyFile, "Locallab", "Softradiuscb_" + std::to_string(i), pedited, spot.softradiuscb, spotEdited.softradiuscb); - assignFromKeyfile(keyFile, "Locallab", "Blendmaskcb_" + std::to_string(i), pedited, spot.blendmaskcb, spotEdited.blendmaskcb); assignFromKeyfile(keyFile, "Locallab", "EnacbMask_" + std::to_string(i), pedited, spot.enacbMask, spotEdited.enacbMask); assignFromKeyfile(keyFile, "Locallab", "CCmaskcbCurve_" + std::to_string(i), pedited, spot.CCmaskcbcurve, spotEdited.CCmaskcbcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskcbCurve_" + std::to_string(i), pedited, spot.LLmaskcbcurve, spotEdited.LLmaskcbcurve); assignFromKeyfile(keyFile, "Locallab", "HHmaskcbCurve_" + std::to_string(i), pedited, spot.HHmaskcbcurve, spotEdited.HHmaskcbcurve); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskcb_" + std::to_string(i), pedited, spot.blendmaskcb, spotEdited.blendmaskcb); assignFromKeyfile(keyFile, "Locallab", "Radmaskcb_" + std::to_string(i), pedited, spot.radmaskcb, spotEdited.radmaskcb); assignFromKeyfile(keyFile, "Locallab", "Chromaskcb_" + std::to_string(i), pedited, spot.chromaskcb, spotEdited.chromaskcb); assignFromKeyfile(keyFile, "Locallab", "Gammaskcb_" + std::to_string(i), pedited, spot.gammaskcb, spotEdited.gammaskcb); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 79ed6b8e5..1190e7e85 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1079,6 +1079,15 @@ struct LocallabParams { std::vector localTgaincurve; bool inversret; double softradiusret; + std::vector CCmaskreticurve; + std::vector LLmaskreticurve; + std::vector HHmaskreticurve; + bool enaretiMask; + int blendmaskreti; + double radmaskreti; + double chromaskreti; + double gammaskreti; + double slomaskreti; // Sharpening bool expsharp; int sharcontrast; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index f81527cf0..cf875c882 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -704,7 +704,17 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabsoftradiustm LUMINANCECURVE, // EvLocallabSpotTransitgrad LUMINANCECURVE, // Evlocallabamount - LUMINANCECURVE // Evlocallabsatur + LUMINANCECURVE, // Evlocallabsatur + LUMINANCECURVE, //EvlocallabCCmaskretishape + LUMINANCECURVE, //EvlocallabLLmaskretishape + LUMINANCECURVE, //EvlocallabHHmaskretishape + LUMINANCECURVE, //EvLocallabEnaretiMask + LUMINANCECURVE, //Evlocallabblendmaskreti + LUMINANCECURVE, // Evlocallabradmaskreti + LUMINANCECURVE, //Evlocallabchromaskreti + LUMINANCECURVE, //Evlocallabgammaskreti + LUMINANCECURVE, //Evlocallabslomaskreti + LUMINANCECURVE //EvlocallabshowmaskretiMethod }; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index a2d745127..bfb50b1c6 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -499,7 +499,7 @@ public: virtual void updateUnLock() = 0; - virtual void setLocallabMaskVisibility(int locallColorMask, int locallExpMask, int locallSHMask, int locallcbMask) = 0; + virtual void setLocallabMaskVisibility(int locallColorMask, int locallExpMask, int locallSHMask, int locallcbMask, int locallretiMask) = 0; /** Creates and returns a Crop instance that acts as a window on the image * @param editDataProvider pointer to the EditDataProvider that communicates with the EditSubscriber diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 1b6288d67..428d7ab76 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -62,6 +62,7 @@ Locallab::Locallab(): expmaskexp(new MyExpander(false, M("TP_LOCALLAB_SHOW"))), expmasksh(new MyExpander(false, M("TP_LOCALLAB_SHOW"))), expmaskcb(new MyExpander(false, M("TP_LOCALLAB_SHOW"))), + expmaskreti(new MyExpander(false, M("TP_LOCALLAB_SHOW"))), // CurveEditorGroup widgets // Color & Light @@ -77,6 +78,7 @@ Locallab::Locallab(): curveEditorGG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL"))), // Retinex LocalcurveEditorgainT(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_TRANSMISSIONGAIN"))), + maskretiCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), //CBDL maskcbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), @@ -154,6 +156,11 @@ Locallab::Locallab(): dehaz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZ"), 0, 100, 1, 0))), sensih(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIH"), 0, 100, 1, 30))), softradiusret(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GUIDFILTER"), 0.0, 100.0, 0.1, 0.))), + blendmaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 10.))), + chromaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), // Sharpening sharcontrast(Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 20))), sharradius(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARRADIUS"), 0.4, 2.5, 0.01, 0.75))), @@ -214,6 +221,7 @@ Locallab::Locallab(): activlum(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIV")))), // Retinex inversret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), + enaretiMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), // Sharpening inverssha(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), //CBDL @@ -232,6 +240,7 @@ Locallab::Locallab(): blurMethod(Gtk::manage(new MyComboBoxText())), // Retinex retinexMethod(Gtk::manage(new MyComboBoxText())), + showmaskretiMethod(Gtk::manage(new MyComboBoxText())), //CBDL showmaskcbMethod(Gtk::manage(new MyComboBoxText())), @@ -816,6 +825,10 @@ Locallab::Locallab(): expreti->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expreti)); enableretiConn = expreti->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expreti)); + setExpandAlignProperties (expmaskreti, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + expmaskreti->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expmaskreti)); + expmaskreti->setLevel (2); + retinexMethod->append(M("TP_RETINEX_LOW")); retinexMethod->append(M("TP_RETINEX_UNIFORM")); retinexMethod->append(M("TP_RETINEX_HIGH")); @@ -851,6 +864,60 @@ Locallab::Locallab(): inversretConn = inversret->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::inversretChanged)); + maskretiCurveEditorG->setCurveListener(this); + + CCmaskretishape = static_cast(maskretiCurveEditorG->addCurve(CT_Flat, "C(C)", nullptr, false, false)); + CCmaskretishape->setIdentityValue(0.); + CCmaskretishape->setResetCurve(FlatCurveType(defSpot.CCmaskreticurve.at(0)), defSpot.CCmaskreticurve); + if(showtooltip) CCmaskretishape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + CCmaskretishape->setBottomBarColorProvider(this, 7); + + LLmaskretishape = static_cast(maskretiCurveEditorG->addCurve(CT_Flat, "L(L)", nullptr, false, false)); + LLmaskretishape->setIdentityValue(0.); + LLmaskretishape->setResetCurve(FlatCurveType(defSpot.LLmaskreticurve.at(0)), defSpot.LLmaskreticurve); + if(showtooltip) LLmaskretishape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskretishape->setBottomBarBgGradient(mllshape); + + HHmaskretishape = static_cast(maskretiCurveEditorG->addCurve(CT_Flat, "LC(H)", nullptr, false, true)); + HHmaskretishape->setIdentityValue(0.); + HHmaskretishape->setResetCurve(FlatCurveType(defSpot.HHmaskreticurve.at(0)), defSpot.HHmaskreticurve); + if(showtooltip) HHmaskretishape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskretishape->setCurveColorProvider(this, 6); + HHmaskretishape->setBottomBarColorProvider(this, 6); + + maskretiCurveEditorG->curveListComplete(); + enaretiMaskConn = enaretiMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::enaretiMaskChanged)); + + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskretiMethod->append(M("TP_LOCALLAB_PREVIEWSEL")); + + + showmaskretiMethod->set_active(0); + if(showtooltip) showmaskretiMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskretiMethodConn = showmaskretiMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallab::showmaskretiMethodChanged)); + + + + blendmaskreti->setAdjusterListener(this); + radmaskreti->setAdjusterListener(this); + chromaskreti->setAdjusterListener(this); + gammaskreti->setAdjusterListener(this); + slomaskreti->setAdjusterListener(this); + + ToolParamBlock* const maskretiBox = Gtk::manage(new ToolParamBlock()); + maskretiBox->pack_start(*showmaskretiMethod, Gtk::PACK_SHRINK, 4); + maskretiBox->pack_start(*enaretiMask, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*maskretiCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskretiBox->pack_start(*blendmaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*radmaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*chromaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*gammaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*slomaskreti, Gtk::PACK_SHRINK, 0); + expmaskreti->add(*maskretiBox); + ToolParamBlock* const retiBox = Gtk::manage(new ToolParamBlock()); retiBox->pack_start(*retinexMethod); retiBox->pack_start(*str); @@ -861,6 +928,7 @@ Locallab::Locallab(): retiBox->pack_start(*softradiusret); retiBox->pack_start(*sensih); retiBox->pack_start(*LocalcurveEditorgainT, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor +// retiBox->pack_start(*expmaskreti); retiBox->pack_start(*inversret); expreti->add(*retiBox); expreti->setLevel(2); @@ -1163,6 +1231,7 @@ void Locallab::foldAllButMe(GdkEventButton* event, MyExpander *expander) expmaskexp->set_expanded(expmaskexp == expander); expmasksh->set_expanded(expmasksh == expander); expmaskcb->set_expanded(expmaskcb == expander); + expmaskreti->set_expanded(expmaskreti == expander); } } @@ -1253,6 +1322,7 @@ void Locallab::writeOptions(std::vector &tpOpen) tpOpen.push_back(expmaskexp->get_expanded()); tpOpen.push_back(expmasksh->get_expanded()); tpOpen.push_back(expmaskcb->get_expanded()); + tpOpen.push_back(expmaskreti->get_expanded()); } @@ -1302,6 +1372,11 @@ void Locallab::refChanged(double huer, double lumar, double chromar) LLmaskcbshape->updateLocallabBackground(normLumar); HHmaskcbshape->updateLocallabBackground(normHuer); + // Update Retinex mask background + CCmaskretishape->updateLocallabBackground(normChromar); + LLmaskretishape->updateLocallabBackground(normLumar); + HHmaskretishape->updateLocallabBackground(normHuer); + return false; } ); @@ -1310,7 +1385,7 @@ void Locallab::refChanged(double huer, double lumar, double chromar) void Locallab::updateToolState(std::vector &tpOpen) { - if (tpOpen.size() >= 18) { + if (tpOpen.size() >= 19) { expsettings->setExpanded(tpOpen.at(0)); expcolor->set_expanded(tpOpen.at(1)); expexpose->set_expanded(tpOpen.at(2)); @@ -1328,6 +1403,7 @@ void Locallab::updateToolState(std::vector &tpOpen) expmaskexp->set_expanded(tpOpen.at(14)); expmasksh->set_expanded(tpOpen.at(15)); expmaskcb->set_expanded(tpOpen.at(16)); + expmaskreti->set_expanded(tpOpen.at(17)); } } @@ -2043,6 +2119,16 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).localTgaincurve = cTgainshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).inversret = inversret->get_active(); pp->locallab.spots.at(pp->locallab.selspot).softradiusret = softradiusret->getValue(); + + pp->locallab.spots.at(pp->locallab.selspot).LLmaskreticurve = LLmaskretishape->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).CCmaskreticurve = CCmaskretishape->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).HHmaskreticurve = HHmaskretishape->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).enaretiMask = enaretiMask->get_active(); + pp->locallab.spots.at(pp->locallab.selspot).blendmaskreti = blendmaskreti->getIntValue(); + pp->locallab.spots.at(pp->locallab.selspot).radmaskreti = radmaskreti->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).chromaskreti = chromaskreti->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).gammaskreti = gammaskreti->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).slomaskreti = slomaskreti->getValue(); // Sharpening pp->locallab.spots.at(pp->locallab.selspot).expsharp = expsharp->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).sharcontrast = sharcontrast->getIntValue(); @@ -2244,6 +2330,15 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).localTgaincurve = pe->locallab.spots.at(pp->locallab.selspot).localTgaincurve || !cTgainshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).inversret = pe->locallab.spots.at(pp->locallab.selspot).inversret || !inversret->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).softradiusret = pe->locallab.spots.at(pp->locallab.selspot).softradiusret || softradiusret->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).CCmaskreticurve = pe->locallab.spots.at(pp->locallab.selspot).CCmaskreticurve || !CCmaskretishape->isUnChanged(); + pe->locallab.spots.at(pp->locallab.selspot).LLmaskreticurve = pe->locallab.spots.at(pp->locallab.selspot).LLmaskreticurve || !LLmaskretishape->isUnChanged(); + pe->locallab.spots.at(pp->locallab.selspot).HHmaskreticurve = pe->locallab.spots.at(pp->locallab.selspot).HHmaskreticurve || !HHmaskretishape->isUnChanged(); + pe->locallab.spots.at(pp->locallab.selspot).enaretiMask = pe->locallab.spots.at(pp->locallab.selspot).enaretiMask || !enaretiMask->get_inconsistent(); + pe->locallab.spots.at(pp->locallab.selspot).blendmaskreti = pe->locallab.spots.at(pp->locallab.selspot).blendmaskreti || blendmaskreti->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).radmaskreti = pe->locallab.spots.at(pp->locallab.selspot).radmaskreti || radmaskreti->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).chromaskreti = pe->locallab.spots.at(pp->locallab.selspot).chromaskreti || chromaskreti->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).gammaskreti = pe->locallab.spots.at(pp->locallab.selspot).gammaskreti || gammaskreti->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).slomaskreti = pe->locallab.spots.at(pp->locallab.selspot).slomaskreti || slomaskreti->getEditedState(); // Sharpening pe->locallab.spots.at(pp->locallab.selspot).expsharp = pe->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).sharcontrast = pe->locallab.spots.at(pp->locallab.selspot).sharcontrast || sharcontrast->getEditedState(); @@ -2435,6 +2530,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).sensitm = pedited->locallab.spots.at(pp->locallab.selspot).sensitm || sensitm->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).softradiustm = pedited->locallab.spots.at(pp->locallab.selspot).softradiustm || softradiustm->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).amount = pedited->locallab.spots.at(pp->locallab.selspot).amount || amount->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).enaretiMask = pedited->locallab.spots.at(pp->locallab.selspot).enaretiMask || !enaretiMask->get_inconsistent(); // 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"); @@ -2447,6 +2543,15 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).localTgaincurve = pedited->locallab.spots.at(pp->locallab.selspot).localTgaincurve || !cTgainshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).inversret = pedited->locallab.spots.at(pp->locallab.selspot).inversret || !inversret->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).softradiusret = pedited->locallab.spots.at(pp->locallab.selspot).softradiusret || softradiusret->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).CCmaskreticurve = pedited->locallab.spots.at(pp->locallab.selspot).CCmaskreticurve || !CCmaskretishape->isUnChanged(); + pedited->locallab.spots.at(pp->locallab.selspot).LLmaskreticurve = pedited->locallab.spots.at(pp->locallab.selspot).LLmaskreticurve || !LLmaskretishape->isUnChanged(); + pedited->locallab.spots.at(pp->locallab.selspot).HHmaskreticurve = pedited->locallab.spots.at(pp->locallab.selspot).HHmaskreticurve || !HHmaskretishape->isUnChanged(); + pedited->locallab.spots.at(pp->locallab.selspot).enaretiMask = pedited->locallab.spots.at(pp->locallab.selspot).enaretiMask || !enaretiMask->get_inconsistent(); + pedited->locallab.spots.at(pp->locallab.selspot).blendmaskreti = pedited->locallab.spots.at(pp->locallab.selspot).blendmaskreti || blendmaskreti->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).radmaskreti = pedited->locallab.spots.at(pp->locallab.selspot).radmaskreti || radmaskreti->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).chromaskreti = pedited->locallab.spots.at(pp->locallab.selspot).chromaskreti || chromaskreti->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).gammaskreti = pedited->locallab.spots.at(pp->locallab.selspot).gammaskreti || gammaskreti->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).slomaskreti = pedited->locallab.spots.at(pp->locallab.selspot).slomaskreti || slomaskreti->getEditedState(); // Sharpening pedited->locallab.spots.at(pp->locallab.selspot).expsharp = pedited->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).sharcontrast = pedited->locallab.spots.at(pp->locallab.selspot).sharcontrast || sharcontrast->getEditedState(); @@ -2738,6 +2843,25 @@ void Locallab::curveChanged(CurveEditor* ce) listener->panelChanged(EvlocallabCTgainCurve, M("HISTORY_CUSTOMCURVE")); } } + + if (ce == CCmaskretishape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskretishape, M("HISTORY_CUSTOMCURVE")); + } + } + + if (ce == LLmaskretishape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskretishape, M("HISTORY_CUSTOMCURVE")); + } + } + + if (ce == HHmaskretishape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskretishape, M("HISTORY_CUSTOMCURVE")); + } + } + } } @@ -2795,6 +2919,7 @@ void Locallab::showmaskcolMethodChanged() showmaskexpMethod->set_active(0); showmaskSHMethod->set_active(0); showmaskcbMethod->set_active(0); + showmaskretiMethod->set_active(0); enableListener(); if (listener) { @@ -2811,6 +2936,7 @@ void Locallab::showmaskexpMethodChanged() showmaskcolMethod->set_active(0); showmaskcbMethod->set_active(0); showmaskSHMethod->set_active(0); + showmaskretiMethod->set_active(0); enableListener(); if (listener) { @@ -2827,6 +2953,7 @@ void Locallab::showmaskSHMethodChanged() showmaskcolMethod->set_active(0); showmaskexpMethod->set_active(0); showmaskcbMethod->set_active(0); + showmaskretiMethod->set_active(0); enableListener(); if (listener) { @@ -2843,6 +2970,7 @@ void Locallab::showmaskcbMethodChanged() showmaskcolMethod->set_active(0); showmaskSHMethod->set_active(0); showmaskexpMethod->set_active(0); + showmaskretiMethod->set_active(0); enableListener(); if (listener) { @@ -2850,6 +2978,23 @@ void Locallab::showmaskcbMethodChanged() } } +void Locallab::showmaskretiMethodChanged() +{ + // printf("showmaskSHMethodChanged\n"); + + // When one mask state is changed, other masks are deactivated + disableListener(); + showmaskcolMethod->set_active(0); + showmaskSHMethod->set_active(0); + showmaskexpMethod->set_active(0); + showmaskcbMethod->set_active(0); + enableListener(); + + if (listener) { + listener->panelChanged(EvlocallabshowmaskretiMethod, ""); + } +} + void Locallab::resetMaskVisibility() { // printf("resetMaskVisibility\n"); @@ -2859,6 +3004,7 @@ void Locallab::resetMaskVisibility() showmaskexpMethod->set_active(0); showmaskSHMethod->set_active(0); showmaskcbMethod->set_active(0); + showmaskretiMethod->set_active(0); enableListener(); } @@ -2869,6 +3015,7 @@ Locallab::llMaskVisibility* Locallab::getMaskVisibility() maskStruct->expMask = showmaskexpMethod->get_active_row_number(); maskStruct->SHMask = showmaskSHMethod->get_active_row_number(); maskStruct->cbMask = showmaskcbMethod->get_active_row_number(); + maskStruct->retiMask = showmaskretiMethod->get_active_row_number(); // printf("SHmask=%i \n", maskStruct->SHMask); // printf("cbmask=%i \n", maskStruct->cbMask); @@ -2947,6 +3094,31 @@ void Locallab::enaSHMaskChanged() } } +void Locallab::enaretiMaskChanged() +{ + // printf("enacbMaskChanged\n"); + + if (multiImage) { + if (enaretiMask->get_inconsistent()) { + enaretiMask->set_inconsistent(false); + enaretiMaskConn.block(true); + enaretiMask->set_active(false); + enaretiMaskConn.block(false); + } + } + + if (getEnabled() && expreti->getEnabled()) { + if (listener) { + if (enaretiMask->get_active()) { + listener->panelChanged(EvLocallabEnaretiMask, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvLocallabEnaretiMask, M("GENERAL_DISABLED")); + } + } + } +} + + void Locallab::enacbMaskChanged() { // printf("enacbMaskChanged\n"); @@ -3408,6 +3580,11 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe dehaz->setDefault((double)defSpot->dehaz); sensih->setDefault((double)defSpot->sensih); softradiusret->setDefault(defSpot->softradiusret); + blendmaskreti->setDefault((double)defSpot->blendmaskreti); + radmaskreti->setDefault(defSpot->radmaskreti); + chromaskreti->setDefault(defSpot->chromaskreti); + gammaskreti->setDefault(defSpot->gammaskreti); + slomaskreti->setDefault(defSpot->slomaskreti); // Sharpening sharcontrast->setDefault((double)defSpot->sharcontrast); sharradius->setDefault(defSpot->sharradius); @@ -3531,6 +3708,11 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe dehaz->setDefaultEditedState(Irrelevant); sensih->setDefaultEditedState(Irrelevant); softradiusret->setDefaultEditedState(Irrelevant); + blendmaskreti->setDefaultEditedState(Irrelevant); + radmaskreti->setDefaultEditedState(Irrelevant); + chromaskreti->setDefaultEditedState(Irrelevant); + gammaskreti->setDefaultEditedState(Irrelevant); + slomaskreti->setDefaultEditedState(Irrelevant); // Sharpening sharcontrast->setDefaultEditedState(Irrelevant); sharradius->setDefaultEditedState(Irrelevant); @@ -3658,6 +3840,11 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe dehaz->setDefaultEditedState(defSpotState->dehaz ? Edited : UnEdited); sensih->setDefaultEditedState(defSpotState->sensih ? Edited : UnEdited); softradiusret->setDefaultEditedState(defSpotState->softradiusret ? Edited : UnEdited); + blendmaskreti->setDefaultEditedState(defSpotState->blendmaskreti ? Edited : UnEdited); + radmaskreti->setDefaultEditedState(defSpotState->radmaskreti ? Edited : UnEdited); + chromaskreti->setDefaultEditedState(defSpotState->chromaskreti ? Edited : UnEdited); + gammaskreti->setDefaultEditedState(defSpotState->gammaskreti ? Edited : UnEdited); + slomaskreti->setDefaultEditedState(defSpotState->slomaskreti ? Edited : UnEdited); // Sharpening sharcontrast->setDefaultEditedState(defSpotState->sharcontrast ? Edited : UnEdited); sharradius->setDefaultEditedState(defSpotState->sharradius ? Edited : UnEdited); @@ -4177,6 +4364,36 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == blendmaskreti) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskreti, blendmaskreti->getTextValue()); + } + } + + if (a == radmaskreti) { + if (listener) { + listener->panelChanged(Evlocallabradmaskreti, radmaskreti->getTextValue()); + } + } + + if (a == chromaskreti) { + if (listener) { + listener->panelChanged(Evlocallabchromaskreti, chromaskreti->getTextValue()); + } + } + + if (a == gammaskreti) { + if (listener) { + listener->panelChanged(Evlocallabgammaskreti, gammaskreti->getTextValue()); + } + } + + if (a == slomaskreti) { + if (listener) { + listener->panelChanged(Evlocallabslomaskreti, slomaskreti->getTextValue()); + } + } + } // Sharpening @@ -4529,6 +4746,11 @@ void Locallab::setBatchMode(bool batchMode) dehaz->showEditedCB(); sensih->showEditedCB(); softradiusret->showEditedCB(); + blendmaskreti->showEditedCB(); + radmaskreti->showEditedCB(); + chromaskreti->showEditedCB(); + gammaskreti->showEditedCB(); + slomaskreti->showEditedCB(); // Sharpening sharradius->showEditedCB(); sharamount->showEditedCB(); @@ -4586,6 +4808,7 @@ void Locallab::setBatchMode(bool batchMode) showmaskexpMethod->hide(); showmaskSHMethod->hide(); showmaskcbMethod->hide(); + showmaskretiMethod->hide(); } std::vector Locallab::getCurvePoints(ThresholdSelector* tAdjuster) const @@ -4756,6 +4979,8 @@ void Locallab::enableListener() enableretiConn.block(false); retinexMethodConn.block(false); inversretConn.block(false); + enaretiMaskConn.block(false); + showmaskretiMethodConn.block(false); // Sharpening enablesharpConn.block(false); inversshaConn.block(false); @@ -4809,6 +5034,8 @@ void Locallab::disableListener() enableretiConn.block(true); retinexMethodConn.block(true); inversretConn.block(true); + enaretiMaskConn.block(true); + showmaskretiMethodConn.block(true); // Sharpening enablesharpConn.block(true); inversshaConn.block(true); @@ -4975,6 +5202,15 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con cTgainshape->setCurve(pp->locallab.spots.at(index).localTgaincurve); inversret->set_active(pp->locallab.spots.at(index).inversret); softradiusret->setValue(pp->locallab.spots.at(index).softradiusret); + CCmaskretishape->setCurve(pp->locallab.spots.at(index).CCmaskreticurve); + LLmaskretishape->setCurve(pp->locallab.spots.at(index).LLmaskreticurve); + HHmaskretishape->setCurve(pp->locallab.spots.at(index).HHmaskreticurve); + enaretiMask->set_active(pp->locallab.spots.at(index).enaretiMask); + blendmaskreti->setValue(pp->locallab.spots.at(index).blendmaskreti); + radmaskreti->setValue(pp->locallab.spots.at(index).radmaskreti); + chromaskreti->setValue(pp->locallab.spots.at(index).chromaskreti); + gammaskreti->setValue(pp->locallab.spots.at(index).gammaskreti); + slomaskreti->setValue(pp->locallab.spots.at(index).slomaskreti); // Sharpening expsharp->setEnabled(pp->locallab.spots.at(index).expsharp); @@ -5210,6 +5446,15 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con cTgainshape->setUnChanged(!spotState->localTgaincurve); inversret->set_inconsistent(multiImage && !spotState->inversret); softradiusret->setEditedState(spotState->softradiusret ? Edited : UnEdited); + CCmaskretishape->setUnChanged(!spotState->CCmaskreticurve); + LLmaskretishape->setUnChanged(!spotState->LLmaskreticurve); + HHmaskretishape->setUnChanged(!spotState->HHmaskreticurve); + enaretiMask->set_inconsistent(multiImage && !spotState->enaretiMask); + blendmaskreti->setEditedState(spotState->blendmaskreti ? Edited : UnEdited); + radmaskreti->setEditedState(spotState->radmaskreti ? Edited : UnEdited); + chromaskreti->setEditedState(spotState->chromaskreti ? Edited : UnEdited); + gammaskreti->setEditedState(spotState->gammaskreti ? Edited : UnEdited); + slomaskreti->setEditedState(spotState->slomaskreti ? Edited : UnEdited); // Sharpening expsharp->set_inconsistent(!spotState->expsharp); @@ -5395,10 +5640,11 @@ void Locallab::updateSpecificGUIState() if (multiImage && inversret->get_inconsistent()) { sensih->show(); softradiusret->show(); + showmaskretiMethod->show(); // Being able to change Color & Light mask visibility is useless in batch mode } else if (inversret->get_active()) { sensih->show(); softradiusret->show(); - } else { + showmaskretiMethod->hide(); sensih->show(); softradiusret->show(); } diff --git a/rtgui/locallab.h b/rtgui/locallab.h index dd80c5f2b..360b80cd8 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -64,6 +64,7 @@ private: MyExpander* const expmaskexp; MyExpander* const expmasksh; MyExpander* const expmaskcb; + MyExpander* const expmaskreti; sigc::connection enablecolorConn, enableexposeConn, enableshadhighConn, enablevibranceConn, enablesoftConn, enableblurConn, enabletonemapConn, enableretiConn, enablesharpConn, enablecontrastConn, enablecbdlConn, enabledenoiConn; // Curve widgets @@ -95,7 +96,11 @@ private: DiagonalCurveEditor* skinTonesCurve; // Retinex CurveEditorGroup* const LocalcurveEditorgainT; + CurveEditorGroup* const maskretiCurveEditorG; FlatCurveEditor* cTgainshape; + FlatCurveEditor* CCmaskretishape; + FlatCurveEditor* LLmaskretishape; + FlatCurveEditor* HHmaskretishape; //Cbdl CurveEditorGroup* const maskcbCurveEditorG; FlatCurveEditor* CCmaskcbshape; @@ -176,6 +181,13 @@ private: Adjuster* const dehaz; Adjuster* const sensih; Adjuster* const softradiusret; + + Adjuster* const blendmaskreti; + Adjuster* const radmaskreti; + Adjuster* const chromaskreti; + Adjuster* const gammaskreti; + Adjuster* const slomaskreti; + // Sharpening Adjuster* const sharcontrast; Adjuster* const sharradius; @@ -246,6 +258,8 @@ private: // Retinex Gtk::CheckButton* const inversret; sigc::connection inversretConn; + Gtk::CheckButton* const enaretiMask; + sigc::connection enaretiMaskConn; // Sharpening Gtk::CheckButton* const inverssha; sigc::connection inversshaConn; @@ -273,6 +287,8 @@ private: // Retinex MyComboBoxText* const retinexMethod; sigc::connection retinexMethodConn; + MyComboBoxText* const showmaskretiMethod; + sigc::connection showmaskretiMethodConn; //CBDL MyComboBoxText* const showmaskcbMethod; sigc::connection showmaskcbMethodConn; @@ -329,6 +345,7 @@ private: void activlumChanged(); // Retinex void inversretChanged(); + void enaretiMaskChanged(); // Sharpening void inversshaChanged(); //CBDL @@ -346,6 +363,7 @@ private: void blurMethodChanged(); // Retinex void retinexMethodChanged(); + void showmaskretiMethodChanged(); //CBDL void showmaskcbMethodChanged(); // Other widgets event functions @@ -383,6 +401,7 @@ public: int expMask; int SHMask; int cbMask; + int retiMask; }; void resetMaskVisibility(); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 5cbdeb88a..3408119e7 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1068,6 +1068,15 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).localTgaincurve = locallab.spots.at(j).localTgaincurve && pSpot.localTgaincurve == otherSpot.localTgaincurve; locallab.spots.at(j).inversret = locallab.spots.at(j).inversret && pSpot.inversret == otherSpot.inversret; locallab.spots.at(j).softradiusret = locallab.spots.at(j).softradiusret && pSpot.softradiusret == otherSpot.softradiusret; + locallab.spots.at(j).CCmaskreticurve = locallab.spots.at(j).CCmaskreticurve && pSpot.CCmaskreticurve == otherSpot.CCmaskreticurve; + locallab.spots.at(j).LLmaskreticurve = locallab.spots.at(j).LLmaskreticurve && pSpot.LLmaskreticurve == otherSpot.LLmaskreticurve; + locallab.spots.at(j).HHmaskreticurve = locallab.spots.at(j).HHmaskreticurve && pSpot.HHmaskreticurve == otherSpot.HHmaskreticurve; + locallab.spots.at(j).enaretiMask = locallab.spots.at(j).enaretiMask && pSpot.enaretiMask == otherSpot.enaretiMask; + locallab.spots.at(j).blendmaskreti = locallab.spots.at(j).blendmaskreti && pSpot.blendmaskreti == otherSpot.blendmaskreti; + locallab.spots.at(j).radmaskreti = locallab.spots.at(j).radmaskreti && pSpot.radmaskreti == otherSpot.radmaskreti; + locallab.spots.at(j).chromaskreti = locallab.spots.at(j).chromaskreti && pSpot.chromaskreti == otherSpot.chromaskreti; + locallab.spots.at(j).gammaskreti = locallab.spots.at(j).gammaskreti && pSpot.gammaskreti == otherSpot.gammaskreti; + locallab.spots.at(j).slomaskreti = locallab.spots.at(j).slomaskreti && pSpot.slomaskreti == otherSpot.slomaskreti; // Sharpening locallab.spots.at(j).expsharp = locallab.spots.at(j).expsharp && pSpot.expsharp == otherSpot.expsharp; locallab.spots.at(j).sharcontrast = locallab.spots.at(j).sharcontrast && pSpot.sharcontrast == otherSpot.sharcontrast; @@ -3084,6 +3093,42 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).inversret = mods.locallab.spots.at(i).inversret; } + if (locallab.spots.at(i).CCmaskreticurve) { + toEdit.locallab.spots.at(i).CCmaskreticurve = mods.locallab.spots.at(i).CCmaskreticurve; + } + + if (locallab.spots.at(i).LLmaskreticurve) { + toEdit.locallab.spots.at(i).LLmaskreticurve = mods.locallab.spots.at(i).LLmaskreticurve; + } + + if (locallab.spots.at(i).HHmaskreticurve) { + toEdit.locallab.spots.at(i).HHmaskreticurve = mods.locallab.spots.at(i).HHmaskreticurve; + } + + if (locallab.spots.at(i).enaretiMask) { + toEdit.locallab.spots.at(i).enaretiMask = mods.locallab.spots.at(i).enaretiMask; + } + + if (locallab.spots.at(i).blendmaskreti) { + toEdit.locallab.spots.at(i).blendmaskreti = mods.locallab.spots.at(i).blendmaskreti; + } + + if (locallab.spots.at(i).radmaskreti) { + toEdit.locallab.spots.at(i).radmaskreti = mods.locallab.spots.at(i).radmaskreti; + } + + if (locallab.spots.at(i).chromaskreti) { + toEdit.locallab.spots.at(i).chromaskreti = mods.locallab.spots.at(i).chromaskreti; + } + + if (locallab.spots.at(i).gammaskreti) { + toEdit.locallab.spots.at(i).gammaskreti = mods.locallab.spots.at(i).gammaskreti; + } + + if (locallab.spots.at(i).slomaskreti) { + toEdit.locallab.spots.at(i).slomaskreti = mods.locallab.spots.at(i).slomaskreti; + } + // Sharpening if (locallab.spots.at(i).expsharp) { toEdit.locallab.spots.at(i).expsharp = mods.locallab.spots.at(i).expsharp; @@ -4356,6 +4401,15 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : localTgaincurve(v), inversret(v), softradiusret(v), + CCmaskreticurve(v), + LLmaskreticurve(v), + HHmaskreticurve(v), + enaretiMask(v), + blendmaskreti(v), + radmaskreti(v), + chromaskreti(v), + gammaskreti(v), + slomaskreti(v), // Sharpening expsharp(v), sharcontrast(v), @@ -4552,6 +4606,15 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) localTgaincurve = v; inversret = v; softradiusret = v; + CCmaskreticurve = v; + LLmaskreticurve = v; + HHmaskreticurve = v; + enaretiMask = v; + blendmaskreti = v; + radmaskreti = v; + chromaskreti = v; + gammaskreti = v; + slomaskreti = v; // Sharpening expsharp = v; sharcontrast = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index de59da427..9195e6456 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -495,6 +495,15 @@ public: bool localTgaincurve; bool inversret; bool softradiusret; + bool CCmaskreticurve; + bool LLmaskreticurve; + bool HHmaskreticurve; + bool enaretiMask; + bool blendmaskreti; + bool radmaskreti; + bool chromaskreti; + bool gammaskreti; + bool slomaskreti; // Sharpening bool expsharp; bool sharcontrast; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 5111b9283..5dce7b025 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -466,9 +466,9 @@ void ToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const } // Manage Locallab mask visibility - if (event == rtengine::EvlocallabshowmaskcolMethod || event == rtengine::EvlocallabshowmaskexpMethod || event == rtengine::EvlocallabshowmaskSHMethod || event == rtengine::EvlocallabshowmaskcbMethod) { + if (event == rtengine::EvlocallabshowmaskcolMethod || event == rtengine::EvlocallabshowmaskexpMethod || event == rtengine::EvlocallabshowmaskSHMethod || event == rtengine::EvlocallabshowmaskcbMethod || event == rtengine::EvlocallabshowmaskretiMethod ) { Locallab::llMaskVisibility* maskStruc = locallab->getMaskVisibility(); - ipc->setLocallabMaskVisibility(maskStruc->colorMask, maskStruc->expMask, maskStruc->SHMask, maskStruc->cbMask); + ipc->setLocallabMaskVisibility(maskStruc->colorMask, maskStruc->expMask, maskStruc->SHMask, maskStruc->cbMask, maskStruc->retiMask); } ipc->endUpdateParams(changeFlags); // starts the IPC processing @@ -576,7 +576,7 @@ void ToolPanelCoordinator::profileChange( // Reset Locallab mask visibility when a picture is loaded if (event == rtengine::EvPhotoLoaded) { locallab->resetMaskVisibility(); - ipc->setLocallabMaskVisibility(0, 0, 0, 0); + ipc->setLocallabMaskVisibility(0, 0, 0, 0, 0); } // start the IPC processing