diff --git a/rtdata/languages/default b/rtdata/languages/default index bdc3fc8a0..da4d5c804 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -767,11 +767,11 @@ HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -HISTORY_MSG_PDSHARPEN_RANGE;CS - Range HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter @@ -2033,12 +2033,12 @@ TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Edge tolerance TP_SHARPENING_HALOCONTROL;Halo control TP_SHARPENING_HCAMOUNT;Amount +TP_SHARPENING_ITERCHECK;Auto limit iterations TP_SHARPENING_LABEL;Sharpening TP_SHARPENING_METHOD;Method TP_SHARPENING_ONLYEDGES;Sharpen only edges TP_SHARPENING_RADIUS;Radius TP_SHARPENING_RADIUS_BOOST;Corner radius boost -TP_SHARPENING_RANGE;Range TP_SHARPENING_RLD;RL Deconvolution TP_SHARPENING_RLD_AMOUNT;Amount TP_SHARPENING_RLD_DAMPING;Damping diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 82e8abb20..60f83a652 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -497,7 +497,30 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f); } -void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal) +bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int border) +{ + bool stopped = false; + for (int ii = border; !stopped && ii < fullTileSize - border; ++ii) { +#ifdef __SSE2__ + for (int jj = border; jj < fullTileSize - border; jj += 4) { + if (_mm_movemask_ps((vfloat)vmaskf_lt(vmul2f(LVFU(tmpIThr[ii][jj])), LVFU(iterCheck[ii - border][jj - border])))) { + stopped = true; + break; + } + } +#else + for (int jj = border; jj < fullTileSize - border; ++jj) { + if (tmpIThr[ii][jj] * xxx < luminance[i + ii - border][j + jj - border] * clipmask[i + ii - border][j + jj - border]) { + stopped = true; + break; + } + } +#endif + } + return stopped; +} + +void CaptureDeconvSharpening (float ** clipmask, float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, bool checkIterStop, rtengine::ProgressListener* plistener, double startVal, double endVal) { BENCHFUN const bool is5x5 = (sigma <= 0.84 && sigmaCornerOffset == 0.0); @@ -513,7 +536,7 @@ BENCHFUN compute7x7kernel(sigma, kernel7); } - constexpr int tileSize = 194; + constexpr int tileSize = 32; constexpr int border = 5; constexpr int fullTileSize = tileSize + 2 * border; const float cornerRadius = std::min(1.15f, sigma + sigmaCornerOffset); @@ -522,6 +545,7 @@ BENCHFUN double progress = startVal; const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); + #ifdef _OPENMP #pragma omp parallel #endif @@ -530,9 +554,10 @@ BENCHFUN array2D tmpIThr(fullTileSize, fullTileSize); array2D tmpThr(fullTileSize, fullTileSize); array2D lumThr(fullTileSize, fullTileSize); + array2D iterCheck(tileSize, tileSize); initTile(tmpThr, fullTileSize); #ifdef _OPENMP - #pragma omp for schedule(dynamic,2) collapse(2) + #pragma omp for schedule(dynamic,16) collapse(2) #endif for (int i = border; i < H - border; i+= tileSize) { for(int j = border; j < W - border; j+= tileSize) { @@ -541,6 +566,11 @@ BENCHFUN // fill tiles if (endOfRow || endOfCol) { // special handling for small tiles at end of row or column + for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { + for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { + iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj]; + } + } for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize : j; l < fullTileSize; ++l, ++jj) { tmpIThr[k][l] = oldLuminance[ii - border][jj - border]; @@ -548,6 +578,11 @@ BENCHFUN } } } else { + for (int ii = 0; ii < tileSize; ++ii) { + for (int jj = 0; jj < tileSize; ++jj) { + iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj]; + } + } for (int ii = i; ii < i + fullTileSize; ++ii) { for (int jj = j; jj < j + fullTileSize; ++jj) { tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border]; @@ -555,17 +590,24 @@ BENCHFUN } } } + bool stopped = false; if (is3x3) { - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 3x3 gaussian blur and divide luminance by result of gaussian blur gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel3); gauss3x3mult(tmpThr, tmpIThr, fullTileSize, kernel3); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } else if (is5x5) { - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 5x5 gaussian blur and divide luminance by result of gaussian blur gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel5); gauss5x5mult(tmpThr, tmpIThr, fullTileSize, kernel5); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } else { if (sigmaCornerOffset != 0.0) { @@ -574,17 +616,23 @@ BENCHFUN if (sigmaTile >= 0.4f) { float lkernel7[7][7]; compute7x7kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); gauss7x7mult(tmpThr, tmpIThr, fullTileSize, lkernel7); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } } else { - for (int k = 0; k < iterations; ++k) { + for (int k = 0; k < iterations && !stopped; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel7); gauss7x7mult(tmpThr, tmpIThr, fullTileSize, kernel7); + if (checkIterStop) { + stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + } } } } @@ -646,7 +694,7 @@ BENCHFUN const array2D& blueVals = blueCache ? *blueCache : blue; array2D clipMask(W, H); - const float clipLimit = sharpeningParams.deconvrange / 100.f; + constexpr float clipLimit = 0.95f; constexpr float maxSigma = 1.15f; if (getSensorType() == ST_BAYER) { @@ -765,7 +813,7 @@ BENCHFUN } conrastThreshold = contrast * 100.f; - CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, plistener, 0.2, 0.9); + CaptureDeconvSharpening(clipMask, YNew, YOld, blend, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, sharpeningParams.deconvitercheck, plistener, 0.2, 0.9); if (plistener) { plistener->setProgress(0.9); } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9714b97e5..9483c6a02 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1162,7 +1162,7 @@ CaptureSharpeningParams::CaptureSharpeningParams() : deconvradius(0.75), deconvradiusOffset(0.0), deconviter(20), - deconvrange(95) + deconvitercheck(true) { } @@ -1174,7 +1174,7 @@ bool CaptureSharpeningParams::operator ==(const CaptureSharpeningParams& other) && autoContrast == other.autoContrast && autoRadius == other.autoRadius && deconvradius == other.deconvradius - && deconvrange == other.deconvrange + && deconvitercheck == other.deconvitercheck && deconvradiusOffset == other.deconvradiusOffset && deconviter == other.deconviter; } @@ -3385,7 +3385,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.deconvitercheck, "PostDemosaicSharpening", "DeconvIterCheck", pdsharpening.deconvitercheck, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.deconviter, "PostDemosaicSharpening", "DeconvIterations", pdsharpening.deconviter, keyFile); // Post resize sharpening @@ -4475,7 +4475,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", "DeconvIterCheck", pedited, pdsharpening.deconvitercheck, pedited->pdsharpening.deconvitercheck); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "DeconvIterations", pedited, pdsharpening.deconviter, pedited->pdsharpening.deconviter); } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index b32f66e4f..01c54ffc5 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -551,7 +551,7 @@ struct CaptureSharpeningParams { double deconvradius; double deconvradiusOffset; int deconviter; - int deconvrange; + bool deconvitercheck; CaptureSharpeningParams(); diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index b1fd2bfed..05150517f 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -140,7 +140,6 @@ enum { ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, ADDSET_SOFTLIGHT_STRENGTH, ADDSET_DEHAZE_STRENGTH, - ADDSET_SHARP_RANGE, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 8aed3e96f..2824a285c 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -157,7 +157,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, false); + pdSharpening->setAdjusterBehavior (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 f31adedde..82132008a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -172,7 +172,7 @@ void ParamsEdited::set(bool v) pdsharpening.deconvradius = v; pdsharpening.deconvradiusOffset = v; pdsharpening.deconviter = v; - pdsharpening.deconvrange = v; + pdsharpening.deconvitercheck = v; prsharpening.enabled = v; prsharpening.contrast = v; prsharpening.radius = v; @@ -759,7 +759,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; + pdsharpening.deconvitercheck = pdsharpening.deconvitercheck && p.pdsharpening.deconvitercheck == other.pdsharpening.deconvitercheck; 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; @@ -1754,8 +1754,8 @@ 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 (pdsharpening.deconvitercheck) { + toEdit.pdsharpening.deconvitercheck = mods.pdsharpening.deconvitercheck; } if (prsharpening.enabled) { @@ -3307,5 +3307,5 @@ bool FilmNegativeParamsEdited::isUnchanged() const bool CaptureSharpeningParamsEdited::isUnchanged() const { - return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter && deconvrange; + return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter && deconvitercheck; } \ No newline at end of file diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1a708329a..01a3e4efe 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -218,7 +218,7 @@ struct CaptureSharpeningParamsEdited { bool deconvradius; bool deconvradiusOffset; bool deconviter; - bool deconvrange; + bool deconvitercheck; bool isUnchanged() const; }; diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 02fe56033..4f5416c82 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -38,7 +38,7 @@ PdSharpening::PdSharpening() : { auto m = ProcEventMapper::getInstance(); EvPdShrContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CONTRAST"); - EvPdShrRange = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_RANGE"); + EvPdShrCheckIter = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_CHECKITER"); 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"); @@ -55,14 +55,6 @@ 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()); @@ -71,22 +63,25 @@ PdSharpening::PdSharpening() : dradius->setAutoValue(true); dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_BOOST"), -0.5, 0.5, 0.01, 0.0)); diter = Gtk::manage(new Adjuster(M("TP_SHARPENING_RLD_ITERATIONS"), 1, 100, 1, 20)); + itercheck = Gtk::manage(new CheckBox(M("TP_SHARPENING_ITERCHECK"), multiImage)); + itercheck->setCheckBoxListener(this); + rld->pack_start(*dradius); rld->pack_start(*dradiusOffset); rld->pack_start(*diter); + rld->pack_start(*itercheck); dradius->show(); dradiusOffset->show(); diter->show(); + itercheck->show(); rld->show(); pack_start(*rld); 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); @@ -110,7 +105,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); + itercheck->setEdited(pedited->pdsharpening.deconvitercheck); set_inconsistent(multiImage && !pedited->pdsharpening.enabled); } @@ -123,7 +118,8 @@ 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); + itercheck->setValue(pp->pdsharpening.deconvitercheck); + lastAutoContrast = pp->pdsharpening.autoContrast; lastAutoRadius = pp->pdsharpening.autoRadius; @@ -140,7 +136,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(); + pp->pdsharpening.deconvitercheck = itercheck->getLastActive(); if (pedited) { pedited->pdsharpening.contrast = contrast->getEditedState(); @@ -149,7 +145,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.deconvitercheck = !itercheck->get_inconsistent(); pedited->pdsharpening.enabled = !get_inconsistent(); } } @@ -161,20 +157,24 @@ 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); + } +} + +void PdSharpening::checkBoxToggled (CheckBox* c, CheckValue newval) +{ + if (listener) { + listener->panelChanged (EvPdShrCheckIter, itercheck->getLastActive() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); } } @@ -198,8 +198,6 @@ 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); } } } @@ -226,17 +224,15 @@ void PdSharpening::setBatchMode(bool batchMode) dradius->showEditedCB(); dradiusOffset->showEditedCB(); diter->showEditedCB(); - range->showEditedCB(); } -void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd) +void PdSharpening::setAdjusterBehavior(bool contrastadd, bool radiusadd, bool iteradd) { contrast->setAddMode(contrastadd); dradius->setAddMode(radiusadd); dradiusOffset->setAddMode(radiusadd); diter->setAddMode(iteradd); - range->setAddMode(rangeadd); } void PdSharpening::trimValues(rtengine::procparams::ProcParams* pp) @@ -246,7 +242,6 @@ 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 b22e26fab..7d971eaee 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -19,22 +19,29 @@ #pragma once #include "adjuster.h" +#include "checkbox.h" #include "toolpanel.h" -class PdSharpening final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoContrastListener, public rtengine::AutoRadiusListener +class PdSharpening final : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel, + public rtengine::AutoContrastListener, + public rtengine::AutoRadiusListener, + public CheckBoxListener { protected: Adjuster* contrast; - Adjuster* range; Adjuster* dradius; Adjuster* dradiusOffset; Adjuster* diter; + CheckBox* itercheck; bool lastAutoContrast; bool lastAutoRadius; rtengine::ProcEvent EvPdShrContrast; - rtengine::ProcEvent EvPdShrRange; + rtengine::ProcEvent EvPdShrCheckIter; rtengine::ProcEvent EvPdShrDRadius; rtengine::ProcEvent EvPdShrDRadiusOffset; rtengine::ProcEvent EvPdShrDIterations; @@ -59,6 +66,7 @@ public: void autoContrastChanged (double autoContrast) override; void autoRadiusChanged (double autoRadius) override; - void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradd, bool rangeadd); + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool iteradd); void trimValues (rtengine::procparams::ProcParams* pp) override; + void checkBoxToggled(CheckBox* c, CheckValue newval) override; };