From 6e0ea3df3feb75376846a6eba7b510ea6c5d37a7 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 29 Jun 2019 08:23:29 +0200 Subject: [PATCH] Correction to FFTW localcontrast optimize - first try Retinex FFTW --- rtengine/improcfun.h | 2 +- rtengine/iplocallab.cc | 18 +++++++++++------- rtengine/ipretinex.cc | 17 +++++++++++++++-- rtengine/procevents.h | 1 + rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 ++- rtgui/locallab.cc | 33 +++++++++++++++++++++++++++++++++ rtgui/locallab.h | 3 +++ rtgui/paramsedited.cc | 7 +++++++ rtgui/paramsedited.h | 1 + 11 files changed, 79 insertions(+), 11 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 5da444e75..3f7a9e455 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -304,7 +304,7 @@ public: void fftw_convol_blur2(float **input2, float **output2, int bfw, int bfh, float radius, int fftkern); void fftw_tile_blur(int GW, int GH, int tilssize , int max_numblox_W, int min_numblox_W, float **tmp1, int numThreads, double radius); - void MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, float** luminance, float** templ, const float* const *originalLuminance, const int width, const int height, const procparams::LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, + void MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, float** luminance, float** templ, const float* const *originalLuminance, const int width, const int height, const procparams::LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, const LocCCmaskretiCurve & locccmasretiCurve, bool &lcmasretiutili, const LocLLmaskretiCurve & locllmasretiCurve, bool &llmasretiutili, const LocHHmaskretiCurve & lochhmasretiCurve, bool & lhmasretiutili, int llretiMask, LabImage * transformed, bool retiMasktmap, bool retiMask); void calc_ref(int sp, LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &chromarefblur, double &lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, float &avg); void copy_ref(LabImage* spotbuffer, LabImage* original, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp, double &huerefspot, double &chromarefspot, double &lumarefspot); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 51e1e2433..008669b97 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -242,6 +242,7 @@ struct local_params { bool invshar; bool actsp; bool ftwlc; + bool ftwreti; float str; int qualmet; int qualcurvemet; @@ -586,6 +587,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall bool inversesh = locallab.spots.at(sp).inverssh; bool equiltm = locallab.spots.at(sp).equiltm; bool fftwlc = locallab.spots.at(sp).fftwlc; + bool fftwreti = locallab.spots.at(sp).fftwreti; bool equilret = locallab.spots.at(sp).equilret; bool inverserad = false; // Provision @@ -767,6 +769,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.shtonalhs = shtonals; lp.senshs = local_sensihs; lp.ftwlc = fftwlc; + lp.ftwreti = fftwreti; } static void calcTransitionrect(const float lox, const float loy, const float ach, const local_params& lp, int &zone, float &localFactor) @@ -6570,10 +6573,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } if (bfw > 0 && bfh > 0) { - array2D buflight(bfwr, bfhr); - JaggedArray bufchro(bfwr, bfhr); - std::unique_ptr bufgb(new LabImage(bfwr, bfhr)); - std::unique_ptr tmp1(new LabImage(bfwr, bfhr)); + array2D buflight(bfw, bfh); + JaggedArray bufchro(bfw, bfh); + std::unique_ptr bufgb(new LabImage(bfw, bfh)); + std::unique_ptr tmp1(new LabImage(bfw, bfh)); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -6853,7 +6856,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax; - ImProcFunctions::MSRLocal(sp, 1, bufreti, bufmask, buforig, buforigmas, orig, tmpl->L, orig1, Wd, Hd, params->locallab, sk, locRETgainCcurve, 0, 4, 0.8f, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + bool fftw = lp.ftwreti; + ImProcFunctions::MSRLocal(sp, fftw, 1, bufreti, bufmask, buforig, buforigmas, orig, tmpl->L, orig1, Wd, Hd, params->locallab, sk, locRETgainCcurve, 0, 4, 0.8f, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, llretiMask, transformed, lp.enaretiMasktmap, lp.enaretiMask); @@ -6975,9 +6979,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o 0.6, min(1.0, 0.6 + satreal / 250.0), 1, 1 }); - + bool fftw = false; if(params->locallab.spots.at(sp).chrrt > 40.f){ //second step active Retinex Chroma - ImProcFunctions::MSRLocal(sp, 0, bufreti, bufmask, buforig, buforigmas, orig, tmpl->L, orig1, Wd, Hd, params->locallab, sk, locRETgainCcurve, 1, 4, 0.8f, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + ImProcFunctions::MSRLocal(sp, fftw, 0, bufreti, bufmask, buforig, buforigmas, orig, tmpl->L, orig1, Wd, Hd, params->locallab, sk, locRETgainCcurve, 1, 4, 0.8f, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, llretiMask, transformed, lp.enaretiMasktmap, lp.enaretiMask); } if (!lp.invret && call <= 3) { diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 3341eba74..1d34aa13d 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -848,7 +848,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } } -void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, float** luminance, float** templ, const float* const *originalLuminance, const int width, const int height, const LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, +void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, float** luminance, float** templ, const float* const *originalLuminance, const int width, const int height, const LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, const LocCCmaskretiCurve & locccmasretiCurve, bool &lcmasretiutili, const LocLLmaskretiCurve & locllmasretiCurve, bool &llmasretiutili, const LocHHmaskretiCurve & lochhmasretiCurve, bool & lhmasretiutili, int llretiMask, LabImage * transformed, bool retiMasktmap, bool retiMask) { BENCHFUN @@ -961,9 +961,10 @@ void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * b } float *buffer = new float[W_L * H_L]; - + float mulradiusfftw = 20.f; for (int scale = scal - 1; scale >= 0; scale--) { printf("retscale=%f scale=%i \n", RetinexScales[scale], scale); + if(!fftw) { #ifdef _OPENMP #pragma omp parallel //disabled with FFTW #endif @@ -982,7 +983,19 @@ void ImProcFunctions::MSRLocal(int sp, int lum, LabImage * bufreti, LabImage * b gaussianBlur(out, out, W_L, H_L, sqrtf(SQR(RetinexScales[scale]) - SQR(RetinexScales[scale + 1])), buffer); } } + } else { + if (scale == scal - 1) + { + ImProcFunctions::fftw_convol_blur2(src, out, W_L, H_L, mulradiusfftw * RetinexScales[scale], 0); + } else // reuse result of last iteration + { + // out was modified in last iteration => restore it + + ImProcFunctions::fftw_convol_blur2(out, out, W_L, H_L,sqrtf(SQR(mulradiusfftw * RetinexScales[scale]) - SQR(mulradiusfftw * RetinexScales[scale + 1])), 0); + } + + } if (scale == 1) { //equalize last scale with darkness and lightness if (dar != 1.f || lig != 1.f) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index a7693b5f7..02b430bc3 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -725,6 +725,7 @@ enum ProcEventCode { Evlocallabequilret = 695, Evlocallabequiltm = 696, Evlocallabfftwlc = 697, + Evlocallabfftwreti = 698, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index bd53fdd81..6ce1f2881 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2496,6 +2496,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : darkness(1.0), lightnessreti(1.0), limd(8.0), + fftwreti(false), // Sharpening expsharp(false), sharcontrast(20), @@ -2714,6 +2715,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && darkness == other.darkness && lightnessreti == other.lightnessreti && limd == other.limd + && fftwreti == other.fftwreti // Sharpening && expsharp == other.expsharp && sharcontrast == other.sharcontrast @@ -3889,6 +3891,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).darkness, "Locallab", "Darkness_" + std::to_string(i), spot.darkness, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lightnessreti, "Locallab", "Lightnessreti_" + std::to_string(i), spot.lightnessreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).limd, "Locallab", "Limd_" + std::to_string(i), spot.limd, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fftwreti, "Locallab", "Fftwreti_" + std::to_string(i), spot.fftwreti, keyFile); // Sharpening saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expsharp, "Locallab", "Expsharp_" + std::to_string(i), spot.expsharp, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sharcontrast, "Locallab", "Sharcontrast_" + std::to_string(i), spot.sharcontrast, keyFile); @@ -5204,6 +5207,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Darkness_" + std::to_string(i), pedited, spot.darkness, spotEdited.darkness); assignFromKeyfile(keyFile, "Locallab", "Lightnessreti_" + std::to_string(i), pedited, spot.lightnessreti, spotEdited.lightnessreti); assignFromKeyfile(keyFile, "Locallab", "Limd_" + std::to_string(i), pedited, spot.limd, spotEdited.limd); + assignFromKeyfile(keyFile, "Locallab", "Fftwreti_" + std::to_string(i), pedited, spot.fftwreti, spotEdited.fftwreti); // Sharpening assignFromKeyfile(keyFile, "Locallab", "Expsharp_" + std::to_string(i), pedited, spot.expsharp, spotEdited.expsharp); assignFromKeyfile(keyFile, "Locallab", "Sharcontrast_" + std::to_string(i), pedited, spot.sharcontrast, spotEdited.sharcontrast); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index b8b855c78..22d19df0f 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1097,6 +1097,7 @@ struct LocallabParams { double darkness; double lightnessreti; double limd; + bool fftwreti; // Sharpening bool expsharp; int sharcontrast; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d6bbf9d16..4b7f9cc74 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -724,7 +724,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabsoftMethod LUMINANCECURVE, // Evlocallabequilret LUMINANCECURVE, // Evlocallabequiltm - LUMINANCECURVE // Evlocallabfftwlc + LUMINANCECURVE, // Evlocallabfftwlc + LUMINANCECURVE // Evlocallabfftwreti }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 13147b6c8..a7ca9c6ae 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -231,6 +231,7 @@ Locallab::Locallab(): inversret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), enaretiMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), enaretiMasktmap(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TM_MASK")))), + fftwreti(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTW")))), // Sharpening inverssha(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), // Local contrast @@ -848,6 +849,7 @@ Locallab::Locallab(): expreti->setLabel(retiTitleHBox); expreti->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expreti)); enableretiConn = expreti->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expreti)); + fftwretiConn = fftwreti->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::fftwretiChanged)); setExpandAlignProperties (expmaskreti, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); expmaskreti->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expmaskreti)); @@ -951,6 +953,7 @@ Locallab::Locallab(): ToolParamBlock* const retiBox = Gtk::manage(new ToolParamBlock()); retiBox->pack_start(*retinexMethod); + retiBox->pack_start(*fftwreti); retiBox->pack_start(*equilret); retiBox->pack_start(*str); retiBox->pack_start(*chrrt); @@ -2187,6 +2190,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).darkness = darkness->getValue(); pp->locallab.spots.at(pp->locallab.selspot).lightnessreti = lightnessreti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).limd = limd->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).fftwreti = fftwreti->get_active(); // Sharpening pp->locallab.spots.at(pp->locallab.selspot).expsharp = expsharp->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).sharcontrast = sharcontrast->getIntValue(); @@ -2407,6 +2411,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).darkness = pe->locallab.spots.at(pp->locallab.selspot).darkness || darkness->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).lightnessreti = pe->locallab.spots.at(pp->locallab.selspot).lightnessreti || lightnessreti->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).limd = pe->locallab.spots.at(pp->locallab.selspot).limd || limd->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).fftwreti = pe->locallab.spots.at(pp->locallab.selspot).fftwreti || !fftwreti->get_inconsistent(); // Sharpening pe->locallab.spots.at(pp->locallab.selspot).expsharp = pe->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).sharcontrast = pe->locallab.spots.at(pp->locallab.selspot).sharcontrast || sharcontrast->getEditedState(); @@ -2631,6 +2636,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).darkness = pedited->locallab.spots.at(pp->locallab.selspot).darkness || darkness->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).lightnessreti = pedited->locallab.spots.at(pp->locallab.selspot).lightnessreti || lightnessreti->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).limd = pedited->locallab.spots.at(pp->locallab.selspot).limd || limd->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).fftwreti = pedited->locallab.spots.at(pp->locallab.selspot).fftwreti || !fftwreti->get_inconsistent(); // Sharpening pedited->locallab.spots.at(pp->locallab.selspot).expsharp = pedited->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).sharcontrast = pedited->locallab.spots.at(pp->locallab.selspot).sharcontrast || sharcontrast->getEditedState(); @@ -3508,6 +3514,29 @@ void Locallab::fftwlcChanged() } } +void Locallab::fftwretiChanged() +{ + // printf("fftwlcChanged\n"); + + if (multiImage) { + if (fftwreti->get_inconsistent()) { + fftwreti->set_inconsistent(false); + fftwretiConn.block(true); + fftwreti->set_active(false); + fftwretiConn.block(false); + } + } + + if (getEnabled() && expreti->getEnabled()) { + if (listener) { + if (fftwreti->get_active()) { + listener->panelChanged(Evlocallabfftwreti, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabfftwreti, M("GENERAL_DISABLED")); + } + } + } +} void Locallab::inversshaChanged() { @@ -5242,6 +5271,7 @@ void Locallab::enableListener() enaretiMaskConn.block(false); enaretiMasktmapConn.block(false); showmaskretiMethodConn.block(false); + fftwretiConn.block(false); // Sharpening enablesharpConn.block(false); inversshaConn.block(false); @@ -5302,6 +5332,7 @@ void Locallab::disableListener() enaretiMaskConn.block(true); enaretiMasktmapConn.block(true); showmaskretiMethodConn.block(true); + fftwretiConn.block(true); // Sharpening enablesharpConn.block(true); inversshaConn.block(true); @@ -5502,6 +5533,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con darkness->setValue(pp->locallab.spots.at(index).darkness); lightnessreti->setValue(pp->locallab.spots.at(index).lightnessreti); limd->setValue(pp->locallab.spots.at(index).limd); + fftwreti->set_active(pp->locallab.spots.at(index).fftwreti); // Sharpening expsharp->setEnabled(pp->locallab.spots.at(index).expsharp); @@ -5758,6 +5790,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con darkness->setEditedState(spotState->darkness ? Edited : UnEdited); lightnessreti->setEditedState(spotState->lightnessreti ? Edited : UnEdited); limd->setEditedState(spotState->limd ? Edited : UnEdited); + fftwreti->set_inconsistent(multiImage && !spotState->fftwreti); // Sharpening expsharp->set_inconsistent(!spotState->expsharp); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 071fa274b..27be06260 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -272,6 +272,8 @@ private: sigc::connection enaretiMaskConn; Gtk::CheckButton* const enaretiMasktmap; sigc::connection enaretiMasktmapConn; + Gtk::CheckButton* const fftwreti; + sigc::connection fftwretiConn; // Sharpening Gtk::CheckButton* const inverssha; sigc::connection inversshaConn; @@ -369,6 +371,7 @@ private: void inversretChanged(); void enaretiMaskChanged(); void enaretiMasktmapChanged(); + void fftwretiChanged(); // Sharpening void inversshaChanged(); // local contrast diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index bea8df75a..87c59be02 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1086,6 +1086,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).darkness = locallab.spots.at(j).darkness && pSpot.darkness == otherSpot.darkness; locallab.spots.at(j).lightnessreti = locallab.spots.at(j).lightnessreti && pSpot.lightnessreti == otherSpot.lightnessreti; locallab.spots.at(j).limd = locallab.spots.at(j).limd && pSpot.limd == otherSpot.limd; + locallab.spots.at(j).fftwreti = locallab.spots.at(j).fftwreti && pSpot.fftwreti == otherSpot.fftwreti; // Sharpening locallab.spots.at(j).expsharp = locallab.spots.at(j).expsharp && pSpot.expsharp == otherSpot.expsharp; locallab.spots.at(j).sharcontrast = locallab.spots.at(j).sharcontrast && pSpot.sharcontrast == otherSpot.sharcontrast; @@ -3175,6 +3176,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).limd = mods.locallab.spots.at(i).limd; } + if (locallab.spots.at(i).fftwreti) { + toEdit.locallab.spots.at(i).fftwreti = mods.locallab.spots.at(i).fftwreti; + } + // Sharpening if (locallab.spots.at(i).expsharp) { toEdit.locallab.spots.at(i).expsharp = mods.locallab.spots.at(i).expsharp; @@ -4469,6 +4474,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : darkness(v), lightnessreti(v), limd(v), + fftwreti(v), // Sharpening expsharp(v), sharcontrast(v), @@ -4684,6 +4690,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) darkness = v; lightnessreti = v; limd = v; + fftwreti = v; // Sharpening expsharp = v; sharcontrast = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 483dce085..ede1e3dd1 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -513,6 +513,7 @@ public: bool darkness; bool lightnessreti; bool limd; + bool fftwreti; // Sharpening bool expsharp; bool sharcontrast;