diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index b1e1657b4..82e8abb20 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -646,7 +646,7 @@ BENCHFUN const array2D& blueVals = blueCache ? *blueCache : blue; array2D clipMask(W, H); - constexpr float clipLimit = 0.95f; + const float clipLimit = sharpeningParams.deconvrange / 100.f; constexpr float maxSigma = 1.15f; if (getSensorType() == ST_BAYER) { diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index cb1cbb02a..00302ef59 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1161,7 +1161,8 @@ CaptureSharpeningParams::CaptureSharpeningParams() : contrast(10.0), deconvradius(0.75), deconvradiusOffset(0.0), - deconviter(20) + deconviter(20), + deconvrange(95) { } @@ -1173,6 +1174,7 @@ bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) && autoContrast == other.autoContrast && autoRadius == other.autoRadius && deconvradius == other.deconvradius + && deconvrange == other.deconvrange && deconvradiusOffset == other.deconvradiusOffset && deconviter == other.deconviter; } @@ -4405,6 +4407,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->pdsharpening.autoRadius, "PostDemosaicSharpening", "AutoRadius", pdsharpening.autoRadius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradius, "PostDemosaicSharpening", "DeconvRadius", pdsharpening.deconvradius, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconvradiusOffset, "PostDemosaicSharpening", "DeconvRadiusOffset", pdsharpening.deconvradiusOffset, keyFile); + saveToKeyfile(!pedited || pedited->pdsharpening.deconvrange, "PostDemosaicSharpening", "DeconvRange", pdsharpening.deconvrange, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); // Post resize sharpening @@ -5892,6 +5895,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "PostDemosaicSharpening", "AutoRadius", pedited, pdsharpening.autoRadius, pedited->pdsharpening.autoRadius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadius", pedited, pdsharpening.deconvradius, pedited->pdsharpening.deconvradius); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRadiusOffset", pedited, pdsharpening.deconvradiusOffset, pedited->pdsharpening.deconvradiusOffset); + assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvRange", pedited, pdsharpening.deconvrange, pedited->pdsharpening.deconvrange); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterations", pedited, pdsharpening.deconviter, pedited->pdsharpening.deconviter); } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0e4bf97c4..5e7afd15d 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -570,6 +570,7 @@ struct CaptureSharpeningParams { double deconvradius; double deconvradiusOffset; int deconviter; + int deconvrange; CaptureSharpeningParams(); diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 46cf19ed5..b1fd2bfed 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -140,7 +140,7 @@ enum { ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, ADDSET_SOFTLIGHT_STRENGTH, ADDSET_DEHAZE_STRENGTH, - ADDSET_SHARP_GAMMA, + ADDSET_SHARP_RANGE, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index a09fa0e14..0ede8a4af 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -159,7 +159,7 @@ void BatchToolPanelCoordinator::initSession () cacorrection->setAdjusterBehavior (false); sharpening->setAdjusterBehavior (false, false, false, false, false, false, false); prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false); - pdSharpening->setAdjusterBehavior (false, false, false); + pdSharpening->setAdjusterBehavior (false, false, false, false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false, false); epd->setAdjusterBehavior (false, false, false, false, false); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 36247549b..f5961f07f 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -172,6 +172,7 @@ void ParamsEdited::set(bool v) pdsharpening.deconvradius = v; pdsharpening.deconvradiusOffset = v; pdsharpening.deconviter = v; + pdsharpening.deconvrange = v; prsharpening.enabled = v; prsharpening.contrast = v; prsharpening.radius = v; @@ -772,6 +773,7 @@ void ParamsEdited::initFrom(const std::vector& pdsharpening.deconvradius = pdsharpening.deconvradius && p.pdsharpening.deconvradius == other.pdsharpening.deconvradius; pdsharpening.deconvradiusOffset = pdsharpening.deconvradiusOffset && p.pdsharpening.deconvradiusOffset == other.pdsharpening.deconvradiusOffset; pdsharpening.deconviter = pdsharpening.deconviter && p.pdsharpening.deconviter == other.pdsharpening.deconviter; + pdsharpening.deconvrange = pdsharpening.deconvrange && p.pdsharpening.deconvrange == other.pdsharpening.deconvrange; prsharpening.enabled = prsharpening.enabled && p.prsharpening.enabled == other.prsharpening.enabled; prsharpening.contrast = prsharpening.contrast && p.prsharpening.contrast == other.prsharpening.contrast; prsharpening.radius = prsharpening.radius && p.prsharpening.radius == other.prsharpening.radius; @@ -2105,6 +2107,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.pdsharpening.deconviter = dontforceSet && options.baBehav[ADDSET_SHARP_ITER] ? toEdit.pdsharpening.deconviter + mods.pdsharpening.deconviter : mods.pdsharpening.deconviter; } + if (pdsharpening.deconvrange) { + toEdit.pdsharpening.deconvrange = dontforceSet && options.baBehav[ADDSET_SHARP_RANGE] ? toEdit.pdsharpening.deconvrange + mods.pdsharpening.deconvrange : mods.pdsharpening.deconvrange; + } + if (prsharpening.enabled) { toEdit.prsharpening.enabled = mods.prsharpening.enabled; } @@ -5552,5 +5558,5 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) bool CaptureSharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter; + return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter && deconvrange; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 0579e5ce0..59aa7766e 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -218,6 +218,7 @@ struct CaptureSharpeningParamsEdited { bool deconvradius; bool deconvradiusOffset; bool deconviter; + bool deconvrange; bool isUnchanged() const; }; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index ad982b82e..02fe56033 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -24,6 +24,7 @@ #include "eventmapper.h" #include "options.h" +#include "rtimage.h" #include "../rtengine/procparams.h" @@ -37,6 +38,7 @@ PdSharpening::PdSharpening() : { auto m = ProcEventMapper::getInstance(); EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); + EvPdShrRange = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RANGE"); EvPdShrDRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS"); EvPdShrDRadiusOffset = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RADIUS_BOOST"); EvPdShrDIterations = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_ITERATIONS"); @@ -53,6 +55,14 @@ PdSharpening::PdSharpening() : pack_start(*contrast); contrast->show(); + Gtk::Image *al = Gtk::manage(new RTImage("circle-black-small.png")); + Gtk::Image *ar = Gtk::manage(new RTImage("circle-white-small.png")); + range = Gtk::manage(new Adjuster(M("TP_SHARPENING_RANGE"), 0, 100, 1, 95, al, ar)); + range->setAdjusterListener(this); + + pack_start(*range); + range->show(); + pack_start(*hb); Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); @@ -73,8 +83,10 @@ PdSharpening::PdSharpening() : dradius->setAdjusterListener(this); dradiusOffset->setAdjusterListener(this); diter->setAdjusterListener(this); + range->setAdjusterListener(this); contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); + range->delay = std::max(range->delay, options.adjusterMaxDelay); dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); dradiusOffset->delay = std::max(dradiusOffset->delay, options.adjusterMaxDelay); diter->delay = std::max(diter->delay, options.adjusterMaxDelay); @@ -98,6 +110,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) dradius->setEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); + range->setEditedState(pedited->pdsharpening.deconvrange ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->pdsharpening.enabled); } @@ -110,6 +123,7 @@ void PdSharpening::read(const ProcParams* pp, const ParamsEdited* pedited) dradius->setAutoValue(pp->pdsharpening.autoRadius); dradiusOffset->setValue(pp->pdsharpening.deconvradiusOffset); diter->setValue(pp->pdsharpening.deconviter); + range->setValue(pp->pdsharpening.deconvrange); lastAutoContrast = pp->pdsharpening.autoContrast; lastAutoRadius = pp->pdsharpening.autoRadius; @@ -126,6 +140,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pp->pdsharpening.autoRadius = dradius->getAutoValue(); pp->pdsharpening.deconvradiusOffset = dradiusOffset->getValue(); pp->pdsharpening.deconviter =(int)diter->getValue(); + pp->pdsharpening.deconvrange =(int)range->getValue(); if (pedited) { pedited->pdsharpening.contrast = contrast->getEditedState(); @@ -134,6 +149,7 @@ void PdSharpening::write(ProcParams* pp, ParamsEdited* pedited) pedited->pdsharpening.autoRadius = !dradius->getAutoInconsistent(); pedited->pdsharpening.deconvradiusOffset = dradiusOffset->getEditedState(); pedited->pdsharpening.deconviter = diter->getEditedState(); + pedited->pdsharpening.deconvrange = range->getEditedState(); pedited->pdsharpening.enabled = !get_inconsistent(); } } @@ -145,17 +161,20 @@ void PdSharpening::setDefaults(const ProcParams* defParams, const ParamsEdited* dradius->setDefault(defParams->pdsharpening.deconvradius); dradiusOffset->setDefault(defParams->pdsharpening.deconvradiusOffset); diter->setDefault(defParams->pdsharpening.deconviter); + range->setDefault(defParams->pdsharpening.deconvrange); if (pedited) { contrast->setDefaultEditedState(pedited->pdsharpening.contrast ? Edited : UnEdited); dradius->setDefaultEditedState(pedited->pdsharpening.deconvradius ? Edited : UnEdited); dradiusOffset->setDefaultEditedState(pedited->pdsharpening.deconvradiusOffset ? Edited : UnEdited); diter->setDefaultEditedState(pedited->pdsharpening.deconviter ? Edited : UnEdited); + range->setDefaultEditedState(pedited->pdsharpening.deconvrange ? Edited : UnEdited); } else { contrast->setDefaultEditedState(Irrelevant); dradius->setDefaultEditedState(Irrelevant); dradiusOffset->setDefaultEditedState(Irrelevant); diter->setDefaultEditedState(Irrelevant); + range->setDefaultEditedState(Irrelevant); } } @@ -179,6 +198,8 @@ void PdSharpening::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvPdShrDRadiusOffset, costr); } else if (a == diter) { listener->panelChanged(EvPdShrDIterations, costr); + } else if (a == range) { + listener->panelChanged(EvPdShrRange, costr); } } } @@ -205,15 +226,17 @@ void PdSharpening::setBatchMode(bool batchMode) dradius->showEditedCB(); dradiusOffset->showEditedCB(); diter->showEditedCB(); + range->showEditedCB(); } -void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd) +void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd) { contrast->setAddMode(contrastadd); dradius->setAddMode(radiusadd); dradiusOffset->setAddMode(radiusadd); diter->setAddMode(iteradd); + range->setAddMode(rangeadd); } void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) @@ -223,6 +246,7 @@ void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) dradius->trimValue(pp->pdsharpening.deconvradius); dradiusOffset->trimValue(pp->pdsharpening.deconvradiusOffset); diter->trimValue(pp->pdsharpening.deconviter); + range->trimValue(pp->pdsharpening.deconvrange); } void PdSharpening::autoContrastChanged(double autoContrast) diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index 61d80503f..b22e26fab 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -26,6 +26,7 @@ class PdSharpening final : public ToolParamBlock, public AdjusterListener, publi protected: Adjuster* contrast; + Adjuster* range; Adjuster* dradius; Adjuster* dradiusOffset; Adjuster* diter; @@ -33,6 +34,7 @@ protected: bool lastAutoContrast; bool lastAutoRadius; rtengine::ProcEvent EvPdShrContrast; + rtengine::ProcEvent EvPdShrRange; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdShrDRadiusOffset; rtengine::ProcEvent EvPdShrDIterations; @@ -57,6 +59,6 @@ public: void autoContrastChanged (double autoContrast) override; void autoRadiusChanged (double autoRadius) override; - void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradds); + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd); void trimValues (rtengine::procparams::ProcParams* pp) override; };