diff --git a/rtdata/languages/default b/rtdata/languages/default
index aeb5664e8..ca1d0ac76 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -658,6 +658,7 @@ HISTORY_MSG_425;Retinex - Log base
HISTORY_MSG_426;Retinex - Hue equalizer
HISTORY_MSG_427;Retinex - Iterations
HISTORY_MSG_428;Retinex - T. Gradient
+HISTORY_MSG_429;Retinex - S. Gradient
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOTS;Snapshots
@@ -1660,6 +1661,8 @@ TP_RETINEX_ITER;Iterations (Tone-mapping)
TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator\nHigh values increase the processing time
TP_RETINEX_GRAD;Transmission gradient
TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical\nIf > 0 Variance and Threshold are reduce when iteration increases and conversely
+TP_RETINEX_GRADS;Strength gradient
+TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical\nIf > 0 Strength is reduce when iteration increases and conversely
TP_RETINEX_LABEL;Retinex
TP_RETINEX_LABSPACE;L*a*b*
TP_RETINEX_LOW;Low
diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc
index 1f6602b62..b07af2e14 100644
--- a/rtengine/ipretinex.cc
+++ b/rtengine/ipretinex.cc
@@ -223,6 +223,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e
int nei = (int) 2.8f * deh.neigh; //def = 220
float vart = (float)deh.vart / 100.f;//variance
float gradvart = (float)deh.grad;
+ float gradstr = (float)deh.grads;
float strength = (float) deh.str / 100.f; // Blend with original L channel data
float limD = (float) deh.limd;
limD = pow(limD, 1.7f);//about 2500 enough
@@ -274,6 +275,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e
moderetinex = 3;
}
for(int it=1; itretinex.grad) {
- keyFile.set_integer ("Retinex", "Grad", retinex.iter);
+ keyFile.set_integer ("Retinex", "Grad", retinex.grad);
+ }
+
+ if (!pedited || pedited->retinex.grads) {
+ keyFile.set_integer ("Retinex", "Grads", retinex.grads);
}
if (!pedited || pedited->retinex.gam) {
@@ -3877,6 +3882,14 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited)
}
}
+ if (keyFile.has_key ("Retinex", "Grads")) {
+ retinex.grads = keyFile.get_integer ("Retinex", "Grads");
+
+ if (pedited) {
+ pedited->retinex.grads = true;
+ }
+ }
+
if (keyFile.has_key ("Retinex", "Gam")) {
retinex.gam = keyFile.get_double ("Retinex", "Gam");
@@ -7350,6 +7363,7 @@ bool ProcParams::operator== (const ProcParams& other)
&& retinex.scal == other.retinex.scal
&& retinex.iter == other.retinex.iter
&& retinex.grad == other.retinex.grad
+ && retinex.grads == other.retinex.grads
&& retinex.gam == other.retinex.gam
&& retinex.slope == other.retinex.slope
&& retinex.neigh == other.retinex.neigh
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 1226d1584..2b8b7ada6 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -277,6 +277,7 @@ public:
int scal;
int iter;
int grad;
+ int grads;
double gam;
double slope;
int neigh;
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 88338f06c..30373a35e 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -455,7 +455,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
// DEMOSAIC, // EvLgrbl
DEMOSAIC, // EvRetinexlhcurve
RETINEX, // EvLiter
- RETINEX // EvLgrad
+ RETINEX, // EvLgrad
+ RETINEX // EvLgrads
};
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index 600a68af4..2efed572e 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -60,6 +60,7 @@ void ParamsEdited::set (bool v)
retinex.scal = v;
retinex.iter = v;
retinex.grad = v;
+ retinex.grads = v;
retinex.gam = v;
retinex.slope = v;
retinex.neigh = v;
@@ -539,6 +540,7 @@ void ParamsEdited::initFrom (const std::vector
retinex.scal = retinex.scal && p.retinex.scal == other.retinex.scal;
retinex.iter = retinex.iter && p.retinex.iter == other.retinex.iter;
retinex.grad = retinex.grad && p.retinex.grad == other.retinex.grad;
+ retinex.grads = retinex.grads && p.retinex.grads == other.retinex.grads;
retinex.gam = retinex.gam && p.retinex.gam == other.retinex.gam;
retinex.slope = retinex.slope && p.retinex.slope == other.retinex.slope;
retinex.neigh = retinex.neigh && p.retinex.neigh == other.retinex.neigh;
@@ -1098,6 +1100,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.retinex.grad = mods.retinex.grad;
}
+ if (retinex.grads) {
+ toEdit.retinex.grads = mods.retinex.grads;
+ }
+
// if (retinex.scal) {
// toEdit.retinex.scal = dontforceSet && options.baBehav[ADDSET_RETI_SCAL] ? toEdit.retinex.scal + mods.retinex.scal : mods.retinex.scal;
// }
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index ed1f07aec..f174c8d52 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -63,6 +63,7 @@ public:
bool scal;
bool iter;
bool grad;
+ bool grads;
bool gam;
bool slope;
bool neigh;
diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc
index 0578c3e57..0bd5c28ae 100644
--- a/rtgui/retinex.cc
+++ b/rtgui/retinex.cc
@@ -147,6 +147,7 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"),
scal = Gtk::manage (new Adjuster (M("TP_RETINEX_SCALES"), -1, 5., 1., 3.));
iter = Gtk::manage (new Adjuster (M("TP_RETINEX_ITER"), 1, 5., 1., 1.));
grad = Gtk::manage (new Adjuster (M("TP_RETINEX_GRAD"), -2., 2., 1., 1.));
+ grads = Gtk::manage (new Adjuster (M("TP_RETINEX_GRADS"), -2., 2., 1., 1.));
gain = Gtk::manage (new Adjuster (M("TP_RETINEX_GAIN"), 20, 200, 1, 50));
offs = Gtk::manage (new Adjuster (M("TP_RETINEX_OFFSET"), -10000, 10000, 1, 0));
// vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 125));
@@ -157,6 +158,7 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"),
scal->set_tooltip_markup (M("TP_RETINEX_SCALES_TOOLTIP"));
iter->set_tooltip_markup (M("TP_RETINEX_ITER_TOOLTIP"));
grad->set_tooltip_markup (M("TP_RETINEX_GRAD_TOOLTIP"));
+ grads->set_tooltip_markup (M("TP_RETINEX_GRADS_TOOLTIP"));
// vart->set_tooltip_markup (M("TP_RETINEX_VARIANCE_TOOLTIP"));
limd->set_tooltip_markup (M("TP_RETINEX_THRESHOLD_TOOLTIP"));
baselog->set_tooltip_markup (M("TP_RETINEX_BASELOG_TOOLTIP"));
@@ -224,6 +226,9 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"),
settingsVBox->pack_start (*grad);
grad->show ();
+ settingsVBox->pack_start (*grads);
+ grads->show ();
+
settingsVBox->pack_start (*gain);
gain->show ();
@@ -289,6 +294,12 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"),
grad->delay = 200;
}
+ grads->setAdjusterListener (this);
+
+ if (grads->delay < 200) {
+ grads->delay = 200;
+ }
+
gam->setAdjusterListener (this);
if (gam->delay < 500) {
@@ -378,6 +389,7 @@ void Retinex::neutral_pressed ()
scal->resetValue(false);
iter->resetValue(false);
grad->resetValue(false);
+ grads->resetValue(false);
vart->resetValue(false);
limd->resetValue(false);
highl->resetValue(false);
@@ -503,6 +515,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited)
scal->setEditedState (pedited->retinex.scal ? Edited : UnEdited);
iter->setEditedState (pedited->retinex.iter ? Edited : UnEdited);
grad->setEditedState (pedited->retinex.grad ? Edited : UnEdited);
+ grads->setEditedState (pedited->retinex.grads ? Edited : UnEdited);
neigh->setEditedState (pedited->retinex.neigh ? Edited : UnEdited);
gam->setEditedState (pedited->retinex.gam ? Edited : UnEdited);
slope->setEditedState (pedited->retinex.slope ? Edited : UnEdited);
@@ -543,6 +556,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited)
scal->setValue (pp->retinex.scal);
iter->setValue (pp->retinex.iter);
grad->setValue (pp->retinex.grad);
+ grads->setValue (pp->retinex.grads);
vart->setValue (pp->retinex.vart);
limd->setValue (pp->retinex.limd);
gam->setValue (pp->retinex.gam);
@@ -553,10 +567,12 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited)
if(pp->retinex.iter == 1) {
grad->set_sensitive(false);
scal->set_sensitive(false);
+ grads->set_sensitive(false);
}
else {
grad->set_sensitive(true);
scal->set_sensitive(true);
+ grads->set_sensitive(true);
}
setEnabled (pp->retinex.enabled);
@@ -627,6 +643,7 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited)
pp->retinex.scal = (int)scal->getValue ();
pp->retinex.iter = (int) iter->getValue ();
pp->retinex.grad = (int) grad->getValue ();
+ pp->retinex.grads = (int) grads->getValue ();
pp->retinex.gam = gam->getValue ();
pp->retinex.slope = slope->getValue ();
pp->retinex.neigh = neigh->getValue ();
@@ -654,6 +671,7 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited)
pedited->retinex.scal = scal->getEditedState ();
pedited->retinex.iter = iter->getEditedState ();
pedited->retinex.grad = grad->getEditedState ();
+ pedited->retinex.grads = grads->getEditedState ();
pedited->retinex.gam = gam->getEditedState ();
pedited->retinex.slope = slope->getEditedState ();
pedited->retinex.neigh = neigh->getEditedState ();
@@ -811,6 +829,7 @@ void Retinex::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi
scal->setDefault (defParams->retinex.scal);
iter->setDefault (defParams->retinex.iter);
grad->setDefault (defParams->retinex.grad);
+ grads->setDefault (defParams->retinex.grads);
vart->setDefault (defParams->retinex.vart);
limd->setDefault (defParams->retinex.limd);
highl->setDefault (defParams->retinex.highl);
@@ -827,6 +846,7 @@ void Retinex::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi
scal->setDefaultEditedState (pedited->retinex.scal ? Edited : UnEdited);
iter->setDefaultEditedState (pedited->retinex.iter ? Edited : UnEdited);
grad->setDefaultEditedState (pedited->retinex.grad ? Edited : UnEdited);
+ grads->setDefaultEditedState (pedited->retinex.grads ? Edited : UnEdited);
vart->setDefaultEditedState (pedited->retinex.vart ? Edited : UnEdited);
limd->setDefaultEditedState (pedited->retinex.limd ? Edited : UnEdited);
highl->setDefaultEditedState (pedited->retinex.highl ? Edited : UnEdited);
@@ -848,6 +868,7 @@ void Retinex::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi
scal->setDefaultEditedState (Irrelevant);
iter->setDefaultEditedState (Irrelevant);
grad->setDefaultEditedState (Irrelevant);
+ grads->setDefaultEditedState (Irrelevant);
gam->setDefaultEditedState (Irrelevant);
slope->setDefaultEditedState (Irrelevant);
}
@@ -875,10 +896,12 @@ void Retinex::adjusterChanged (Adjuster* a, double newval)
if(iter->getTextValue() > "1") {
scal->set_sensitive(true);
grad->set_sensitive(true);
+ grads->set_sensitive(true);
}
else {
scal->set_sensitive(false);
grad->set_sensitive(false);
+ grads->set_sensitive(false);
}
@@ -892,6 +915,8 @@ void Retinex::adjusterChanged (Adjuster* a, double newval)
listener->panelChanged (EvLiter, iter->getTextValue());
} else if (a == grad) {
listener->panelChanged (EvLgrad, grad->getTextValue());
+ } else if (a == grads) {
+ listener->panelChanged (EvLgrads, grads->getTextValue());
} else if (a == gain) {
listener->panelChanged (EvLgain, gain->getTextValue());
} else if (a == offs) {
@@ -962,6 +987,7 @@ void Retinex::trimValues (rtengine::procparams::ProcParams* pp)
scal->trimValue(pp->retinex.scal);
iter->trimValue(pp->retinex.iter);
grad->trimValue(pp->retinex.grad);
+ grads->trimValue(pp->retinex.grads);
neigh->trimValue(pp->retinex.neigh);
gain->trimValue(pp->retinex.gain);
offs->trimValue(pp->retinex.offs);
@@ -1037,6 +1063,7 @@ void Retinex::setBatchMode (bool batchMode)
scal->showEditedCB ();
iter->showEditedCB ();
grad->showEditedCB ();
+ grads->showEditedCB ();
gam->showEditedCB ();
slope->showEditedCB ();
vart->showEditedCB ();
diff --git a/rtgui/retinex.h b/rtgui/retinex.h
index 499b0ef0f..e014bed5d 100644
--- a/rtgui/retinex.h
+++ b/rtgui/retinex.h
@@ -25,6 +25,7 @@ protected:
Adjuster* str;
Adjuster* scal;
Adjuster* grad;
+ Adjuster* grads;
Adjuster* iter;
Adjuster* neigh;
Adjuster* gain;