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;