diff --git a/rtdata/languages/default b/rtdata/languages/default index f576937c5..c77da3fbf 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1092,6 +1092,7 @@ HISTORY_MSG_852;Local - Target Gray HISTORY_MSG_853;Local - Detail HISTORY_MSG_854;Local - Scope encoding log HISTORY_MSG_855;Local - Entire image +HISTORY_MSG_856;Local - Base log HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2169,6 +2170,7 @@ TP_LOCALLAB_AUTOGRAY;Automatic TP_LOCALLAB_AVOID;Avoid color shift TP_LOCALLAB_BALAN;Balance deltaE ab-L TP_LOCALLAB_BALANEXP;PDE balance +TP_LOCALLAB_BASELOG;Logarithm base TP_LOCALLAB_BILATERAL;Bilateral filter TP_LOCALLAB_BLACK_EV;Black Ev TP_LOCALLAB_BLENDMASKCOL;Blend diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 8b2b9a319..9b1bffec8 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -410,6 +410,7 @@ struct local_params { int sensilog; bool Autogray; bool autocompute; + float baselog; }; @@ -880,6 +881,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.sensilog = locallab.spots.at(sp).sensilog; lp.Autogray = locallab.spots.at(sp).Autogray; lp.autocompute = locallab.spots.at(sp).autocompute; + lp.baselog = (float) locallab.spots.at(sp).baselog; lp.deltaem = locallab.spots.at(sp).deltae; lp.scalereti = scaleret; @@ -1262,14 +1264,16 @@ float find_gray(float source_gray, float target_gray) // https://github.com/ampas/aces-dev // (as seen on pixls.us) void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, float scale, bool multiThread) -{ - //small adaptations to local adjustements J.Desmis 12 2019 +{ /* J.Desmis 12 2019 + small adaptations to local adjustements + replace log2 by log(lp.baselog) allows diferentiation between low and high lights + */ BENCHFUN const float gray = lp.sourcegray / 100.f; const float shadows_range = lp.blackev; const float dynamic_range = lp.whiteev - lp.blackev; const float noise = pow_F(2.f, -16.f); - const float log2 = xlogf(2.f); + const float log2 = xlogf(lp.baselog); const float b = lp.targetgray > 1 && lp.targetgray < 100 && dynamic_range > 0 ? find_gray(std::abs(lp.blackev) / dynamic_range, lp.targetgray / 100.f) : 0.f; const float linbase = max(b, 0.f); TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 1bbec24bd..49eea0099 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -881,6 +881,7 @@ enum ProcEventCode { Evlocallabdetail = 852, Evlocallabsensilog = 853, Evlocallabfullimage = 854, + Evlocallabbaselog = 855, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 7c84daa7c..2e57b4929 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2778,7 +2778,8 @@ LocallabParams::LocallabSpot::LocallabSpot() : blackEv(-5.0), whiteEv(10.0), detail(1), - sensilog(50) + sensilog(50), + baselog(2.) { } @@ -3169,7 +3170,8 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && blackEv == other.blackEv && whiteEv == other.whiteEv && detail == other.detail - && sensilog == other.sensilog; + && sensilog == other.sensilog + && baselog == other.baselog; } @@ -4528,6 +4530,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).whiteEv, "Locallab", "WhiteEv_" + std::to_string(i), spot.whiteEv, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).detail, "Locallab", "Detail_" + std::to_string(i), spot.detail, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sensilog, "Locallab", "Sensilog_" + std::to_string(i), spot.sensilog, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).baselog, "Locallab", "Baselog_" + std::to_string(i), spot.baselog, keyFile); } } @@ -6051,6 +6054,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "WhiteEv_" + std::to_string(i), pedited, spot.whiteEv, spotEdited.whiteEv); assignFromKeyfile(keyFile, "Locallab", "Detail_" + std::to_string(i), pedited, spot.detail, spotEdited.detail); assignFromKeyfile(keyFile, "Locallab", "Sensilog_" + std::to_string(i), pedited, spot.sensilog, spotEdited.sensilog); + assignFromKeyfile(keyFile, "Locallab", "Baselog_" + std::to_string(i), pedited, spot.baselog, spotEdited.baselog); locallab.spots.at(i) = spot; diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 28f54cd9d..cf6efacae 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1323,6 +1323,7 @@ struct LocallabParams { double whiteEv; int detail; int sensilog; + double baselog; LocallabSpot(); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d5e347bae..702816312 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -884,7 +884,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabtargetGray LUMINANCECURVE, //Evlocallabdetail LUMINANCECURVE, //Evlocallabsensilog - AUTOEXP //Evlocallabfullimage + AUTOEXP, //Evlocallabfullimage + LUMINANCECURVE //Evlocallabbaselog }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index cc651a0b3..68218a4c1 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -604,6 +604,7 @@ blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5. whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0.0, 32.0, 0.1, 10.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0, 5, 1, 1))), sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSILOG"), 0, 100, 1, 50))), +baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), // ButtonCheck widgets // Color & Light @@ -3448,6 +3449,7 @@ pe(nullptr) targetGray->setAdjusterListener(this); detail->setAdjusterListener(this); sensilog->setAdjusterListener(this); + baselog->setAdjusterListener(this); whiteEv->setLogScale(16, 0); blackEv->setLogScale(2, -8); @@ -3474,6 +3476,7 @@ pe(nullptr) logBox->pack_start(*logFrame); logBox->pack_start(*targetGray); logBox->pack_start(*detail); + logBox->pack_start(*baselog); logBox->pack_start(*sensilog); @@ -5051,6 +5054,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).targetGray = targetGray->getValue(); pp->locallab.spots.at(pp->locallab.selspot).detail = detail->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).sensilog = sensilog->getIntValue(); + pp->locallab.spots.at(pp->locallab.selspot).baselog = baselog->getValue(); } @@ -5430,6 +5434,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).targetGray = pe->locallab.spots.at(pp->locallab.selspot).targetGray || targetGray->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).detail = pe->locallab.spots.at(pp->locallab.selspot).detail || detail->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).sensilog = pe->locallab.spots.at(pp->locallab.selspot).sensilog || sensilog->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).baselog = pe->locallab.spots.at(pp->locallab.selspot).baselog || baselog->getEditedState(); } } @@ -5810,6 +5815,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).targetGray = pedited->locallab.spots.at(pp->locallab.selspot).targetGray || targetGray->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).detail = pedited->locallab.spots.at(pp->locallab.selspot).detail || detail->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).sensilog = pedited->locallab.spots.at(pp->locallab.selspot).sensilog || sensilog->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).baselog = pedited->locallab.spots.at(pp->locallab.selspot).baselog || baselog->getEditedState(); } } @@ -8253,6 +8259,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c targetGray->setDefault((double)defSpot->targetGray); detail->setDefault((double)defSpot->detail); sensilog->setDefault((double)defSpot->sensilog); + baselog->setDefault((double)defSpot->baselog); // Set default edited states for adjusters and threshold adjusters if (!pedited) { @@ -8482,6 +8489,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c targetGray->setDefaultEditedState(Irrelevant); detail->setDefaultEditedState(Irrelevant); sensilog->setDefaultEditedState(Irrelevant); + baselog->setDefaultEditedState(Irrelevant); } else { const LocallabParamsEdited::LocallabSpotEdited* defSpotState = new LocallabParamsEdited::LocallabSpotEdited(true); @@ -8717,6 +8725,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c targetGray->setDefaultEditedState(defSpotState->targetGray ? Edited : UnEdited); detail->setDefaultEditedState(defSpotState->detail ? Edited : UnEdited); sensilog->setDefaultEditedState(defSpotState->sensilog ? Edited : UnEdited); + baselog->setDefaultEditedState(defSpotState->baselog ? Edited : UnEdited); } } @@ -10074,6 +10083,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == baselog) { + if (listener) { + listener->panelChanged(Evlocallabbaselog, baselog->getTextValue()); + } + } + } } @@ -10330,6 +10345,7 @@ void Locallab::setBatchMode(bool batchMode) targetGray->showEditedCB(); detail->showEditedCB(); sensilog->showEditedCB(); + baselog->showEditedCB(); // Set batch mode for comboBoxText @@ -11440,6 +11456,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con targetGray->setValue(pp->locallab.spots.at(index).targetGray); detail->setValue(pp->locallab.spots.at(index).detail); sensilog->setValue(pp->locallab.spots.at(index).sensilog); + baselog->setValue(pp->locallab.spots.at(index).baselog); if (pedited) { if (index < (int)pedited->locallab.spots.size()) { @@ -11881,6 +11898,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con targetGray->setEditedState(spotState->targetGray ? Edited : UnEdited); detail->setEditedState(spotState->detail ? Edited : UnEdited); sensilog->setEditedState(spotState->sensilog ? Edited : UnEdited); + baselog->setEditedState(spotState->baselog ? Edited : UnEdited); } } diff --git a/rtgui/locallab.h b/rtgui/locallab.h index dba2a6092..799eeafa6 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -388,6 +388,7 @@ private: Adjuster* const whiteEv; Adjuster* const detail; Adjuster* const sensilog; + Adjuster* const baselog; // ButtonCheck widgets // Color & Light diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 85655dc6b..23b4d76e5 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1320,6 +1320,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).whiteEv = locallab.spots.at(j).whiteEv && pSpot.whiteEv == otherSpot.whiteEv; locallab.spots.at(j).detail = locallab.spots.at(j).detail && pSpot.detail == otherSpot.detail; locallab.spots.at(j).sensilog = locallab.spots.at(j).sensilog && pSpot.sensilog == otherSpot.sensilog; + locallab.spots.at(j).baselog = locallab.spots.at(j).baselog && pSpot.baselog == otherSpot.baselog; } } @@ -4191,6 +4192,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).sensilog = mods.locallab.spots.at(i).sensilog; } + if (locallab.spots.at(i).baselog) { + toEdit.locallab.spots.at(i).baselog = mods.locallab.spots.at(i).baselog; + } + // if (locallab.spots.at(i).autogray) { // toEdit.locallab.spots.at(i).autogray = mods.locallab.spots.at(i).autogray; // } @@ -5535,7 +5540,8 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : blackEv(v), whiteEv(v), detail(v), - sensilog(v) + sensilog(v), + baselog(v) { } @@ -5912,6 +5918,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) whiteEv = v; detail = v; sensilog = v; + baselog = v; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 7268dc233..9b227f3f7 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -750,6 +750,7 @@ public: bool whiteEv; bool detail; bool sensilog; + bool baselog; LocallabSpotEdited(bool v);