From 38b53ca9b64442ed5d3cc8633de14a835e13a9cf Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 6 Oct 2019 14:30:39 +0200 Subject: [PATCH] add Laplacian threshold to mask Retinex --- rtdata/languages/default | 2 + rtengine/improcfun.h | 2 +- rtengine/ipretinex.cc | 96 +++++++++++++++++++++++++++++++++++++++- rtengine/procevents.h | 1 + rtengine/procparams.cc | 6 ++- rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 4 +- rtgui/locallab.cc | 26 +++++++++++ rtgui/locallab.h | 1 + rtgui/paramsedited.cc | 7 +++ rtgui/paramsedited.h | 1 + 11 files changed, 141 insertions(+), 6 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 3097f1870..86ea33f39 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -995,6 +995,7 @@ HISTORY_MSG_754;Local - Reti Clip HISTORY_MSG_755;Local - TM use tm mask HISTORY_MSG_756;Local - Exp use algo exposure mask HISTORY_MSG_757;Local - Exp Laplacian mask +HISTORY_MSG_758;Local - Reti Laplacian mask HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2219,6 +2220,7 @@ TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but incr TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Transmission Map instead of Original datas TP_LOCALLAB_SOFTRETI;Reduce artifact deltaE TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map +TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold simultaneously TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain TP_LOCALLAB_TRANSMISSIONMAP;Transmission map TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index c0a59d746..400b747bd 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -194,7 +194,7 @@ public: void fftw_convol_blur2(float **input2, float **output2, int bfw, int bfh, float radius, int fftkern, int algo); 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 maskforretinex(int sp, int before, float ** luminance, float ** out, int W_L, int H_L, int skip, const LocCCmaskCurve & locccmasretiCurve, bool &lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool &llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool & lhmasretiutili, int llretiMask, bool retiMasktmap, bool retiMask, - float rad, float gamm, float slop, float chro, float blend, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread); + float rad, float lap, float gamm, float slop, float chro, float blend, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread); void MSRLocal(int sp, bool fftw, int lum, float** reducDE, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, float** luminance, float** templ, const float* const *originalLuminance, const int width, const int height, int bfwr, int bfhr, const procparams::LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, 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 LocCCmaskCurve & locccmasretiCurve, bool &lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool &llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool & lhmasretiutili, int llretiMask, LabImage * transformed, bool retiMasktmap, bool retiMask); diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 45aaea585..a411f1999 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -95,6 +95,68 @@ void calcGammaLut(double gamma, double ts, LUTf &gammaLut) } } +static float *discrete_laplacian_threshold_reti(float * data_out, const float * data_in, size_t nx, size_t ny, float t) +{//same as in iplocallab.cc + BENCHFUN + + size_t i, j; + float *ptr_out; + float diff = 0.f; + const float *ptr_in, *ptr_in_xm1, *ptr_in_xp1, *ptr_in_ym1, *ptr_in_yp1; + + if (NULL == data_in || NULL == data_out) { + fprintf(stderr, "a pointer is NULL and should not be so\n"); + abort(); + } + ptr_in = data_in; + ptr_in_xm1 = data_in - 1; + ptr_in_xp1 = data_in + 1; + ptr_in_ym1 = data_in - nx; + ptr_in_yp1 = data_in + nx; + ptr_out = data_out; + + for (j = 0; j < ny; j++) { + for (i = 0; i < nx; i++) { + *ptr_out = 0.f; + + if (0 < i) { + diff = *ptr_in - *ptr_in_xm1; + + if (fabs(diff) > t) { + *ptr_out += diff; + } + } + if (nx - 1 > i) { + diff = *ptr_in - *ptr_in_xp1; + + if (fabs(diff) > t) { + *ptr_out += diff; + } + } + if (0 < j) { + diff = *ptr_in - *ptr_in_ym1; + + if (fabs(diff) > t) { + *ptr_out += diff; + } + } + if (ny - 1 > j) { + diff = *ptr_in - *ptr_in_yp1; + + if (fabs(diff) > t) { + *ptr_out += diff; + } + } + ptr_in++; + ptr_in_xm1++; + ptr_in_xp1++; + ptr_in_ym1++; + ptr_in_yp1++; + ptr_out++; + } + } + return data_out; +} void retinex_scales(float* scales, int nscales, int mode, int s, float high) { @@ -852,7 +914,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e void ImProcFunctions::maskforretinex(int sp, int before, float ** luminance, float ** out, int W_L, int H_L, int skip, const LocCCmaskCurve & locccmasretiCurve, bool &lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool &llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool & lhmasretiutili, int llretiMask, bool retiMasktmap, bool retiMask, - float rad, float gamm, float slop, float chro, float blend, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread) + float rad, float lap, float gamm, float slop, float chro, float blend, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread) { array2D loctemp(W_L, H_L); array2D ble(W_L, H_L); @@ -953,6 +1015,35 @@ void ImProcFunctions::maskforretinex(int sp, int before, float ** luminance, flo bufmaskblurreti->L[ir][jr] = lutTonemaskreti[L_]; } + if (lap > 0.f) { + float *datain = new float[H_L * W_L]; + float *data_tmp = new float[H_L * W_L]; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + datain[y * W_L + x] = bufmaskblurreti->L[y][x]; + } + } + + (void) discrete_laplacian_threshold_reti(data_tmp, datain, W_L, H_L, 200.f * lap); +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + bufmaskblurreti->L[y][x] = data_tmp[y * W_L + x]; + } + } + + delete [] datain; + delete [] data_tmp; + + } //blend #ifdef _OPENMP @@ -1572,11 +1663,12 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, float** reducDE, LabI float gamm = loc.spots.at(sp).gammaskreti; float blend = loc.spots.at(sp).blendmaskreti; float chro = loc.spots.at(sp).chromaskreti; + float lap = loc.spots.at(sp).lapmaskreti; if (lum == 1 && (llretiMask == 3 || llretiMask == 0 || llretiMask == 2 || llretiMask == 4)) { //only mask with luminance on last scale int before = 1; maskforretinex(sp, before, luminance, nullptr, W_L, H_L, skip, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, llretiMask, retiMasktmap, retiMask, - rad, gamm, slop, chro, blend , bufreti, bufmask, buforig, buforigmas, multiThread); + rad, lap, gamm, slop, chro, blend , bufreti, bufmask, buforig, buforigmas, multiThread); } //mask does not interfered with datas displayed diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 4760fb155..4f4c1ed33 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -784,6 +784,7 @@ enum ProcEventCode { EvLocallabEnatmMaskaft = 754, EvLocallabEnaExpMaskaft = 755, Evlocallablapmasktm = 756, + Evlocallablapmaskreti = 757, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index c47dc1506..09fa02646 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2602,10 +2602,11 @@ LocallabParams::LocallabSpot::LocallabSpot() : enaretiMask(false), enaretiMasktmap(true), blendmaskreti(0), - radmaskreti(10.0), + radmaskreti(0.0), chromaskreti(0.0), gammaskreti(1.0), slomaskreti(0.0), + lapmaskreti(0.0), scalereti(2.0), darkness(2.0), lightnessreti(1.0), @@ -2876,6 +2877,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chromaskreti == other.chromaskreti && gammaskreti == other.gammaskreti && slomaskreti == other.slomaskreti + && lapmaskreti == other.lapmaskreti && scalereti == other.scalereti && darkness == other.darkness && lightnessreti == other.lightnessreti @@ -4132,6 +4134,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromaskreti, "Locallab", "Chromaskreti_" + std::to_string(i), spot.chromaskreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskreti, "Locallab", "Gammaskreti_" + std::to_string(i), spot.gammaskreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskreti, "Locallab", "Slomaskreti_" + std::to_string(i), spot.slomaskreti, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmaskreti, "Locallab", "Lapmaskreti_" + std::to_string(i), spot.lapmaskreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).scalereti, "Locallab", "Scalereti_" + std::to_string(i), spot.scalereti, keyFile); 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); @@ -5515,6 +5518,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Chromaskreti_" + std::to_string(i), pedited, spot.chromaskreti, spotEdited.chromaskreti); assignFromKeyfile(keyFile, "Locallab", "Gammaskreti_" + std::to_string(i), pedited, spot.gammaskreti, spotEdited.gammaskreti); assignFromKeyfile(keyFile, "Locallab", "Slomaskreti_" + std::to_string(i), pedited, spot.slomaskreti, spotEdited.slomaskreti); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskreti_" + std::to_string(i), pedited, spot.lapmaskreti, spotEdited.lapmaskreti); assignFromKeyfile(keyFile, "Locallab", "Scalereti_" + std::to_string(i), pedited, spot.scalereti, spotEdited.scalereti); 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); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index fe0e88890..14ab83e70 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1155,6 +1155,7 @@ struct LocallabParams { double chromaskreti; double gammaskreti; double slomaskreti; + double lapmaskreti; double scalereti; double darkness; double lightnessreti; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index de09ac515..d602c32ec 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -783,10 +783,10 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabcliptm LUMINANCECURVE, //Evlocallabenatmmaskaft LUMINANCECURVE, //EvlocallabenaExpmaskaft - LUMINANCECURVE //Evlocallablapmasktm + LUMINANCECURVE, //Evlocallablapmasktm + LUMINANCECURVE //Evlocallablapmaskreti }; - namespace rtengine { diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 7b64bb6c8..c0cf789ec 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -281,6 +281,7 @@ Locallab::Locallab(): chromaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), slomaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + lapmaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), scalereti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALERETI"), 1.0, 10.0, 1., 2.))), darkness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DARKRETI"), 0.01, 6.0, 0.01, 2.0))), lightnessreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTRETI"), 0.01, 4.0, 0.01, 1.))), @@ -1264,6 +1265,10 @@ Locallab::Locallab(): showmasktmMethodConn = showmasktmMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallab::showmasktmMethodChanged)); + if (showtooltip) { + radmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + } blendmasktm->setAdjusterListener(this); @@ -1480,6 +1485,10 @@ Locallab::Locallab(): showmaskretiMethodConn = showmaskretiMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallab::showmaskretiMethodChanged)); + if (showtooltip) { + radmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + } blendmaskreti->setAdjusterListener(this); @@ -1487,6 +1496,7 @@ Locallab::Locallab(): chromaskreti->setAdjusterListener(this); gammaskreti->setAdjusterListener(this); slomaskreti->setAdjusterListener(this); + lapmaskreti->setAdjusterListener(this); scalereti->setAdjusterListener(this); darkness->setAdjusterListener(this); lightnessreti->setAdjusterListener(this); @@ -1499,6 +1509,7 @@ Locallab::Locallab(): maskretiBox->pack_start(*maskretiCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor maskretiBox->pack_start(*blendmaskreti, Gtk::PACK_SHRINK, 0); maskretiBox->pack_start(*radmaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*lapmaskreti, Gtk::PACK_SHRINK, 0); maskretiBox->pack_start(*chromaskreti, Gtk::PACK_SHRINK, 0); maskretiBox->pack_start(*gammaskreti, Gtk::PACK_SHRINK, 0); maskretiBox->pack_start(*slomaskreti, Gtk::PACK_SHRINK, 0); @@ -3213,6 +3224,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chromaskreti = chromaskreti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).gammaskreti = gammaskreti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskreti = slomaskreti->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).lapmaskreti = lapmaskreti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).scalereti = scalereti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).darkness = darkness->getValue(); pp->locallab.spots.at(pp->locallab.selspot).lightnessreti = lightnessreti->getValue(); @@ -3491,6 +3503,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chromaskreti = pe->locallab.spots.at(pp->locallab.selspot).chromaskreti || chromaskreti->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).gammaskreti = pe->locallab.spots.at(pp->locallab.selspot).gammaskreti || gammaskreti->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskreti = pe->locallab.spots.at(pp->locallab.selspot).slomaskreti || slomaskreti->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).lapmaskreti = pe->locallab.spots.at(pp->locallab.selspot).lapmaskreti || lapmaskreti->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).scalereti = pe->locallab.spots.at(pp->locallab.selspot).scalereti || scalereti->getEditedState(); 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(); @@ -3767,6 +3780,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chromaskreti = pedited->locallab.spots.at(pp->locallab.selspot).chromaskreti || chromaskreti->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).gammaskreti = pedited->locallab.spots.at(pp->locallab.selspot).gammaskreti || gammaskreti->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskreti = pedited->locallab.spots.at(pp->locallab.selspot).slomaskreti || slomaskreti->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).lapmaskreti = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskreti || lapmaskreti->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).scalereti = pedited->locallab.spots.at(pp->locallab.selspot).scalereti || scalereti->getEditedState(); 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(); @@ -5568,6 +5582,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskreti->setDefault(defSpot->chromaskreti); gammaskreti->setDefault(defSpot->gammaskreti); slomaskreti->setDefault(defSpot->slomaskreti); + lapmaskreti->setDefault(defSpot->lapmaskreti); scalereti->setDefault(defSpot->scalereti); darkness->setDefault(defSpot->darkness); lightnessreti->setDefault(defSpot->lightnessreti); @@ -5734,6 +5749,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskreti->setDefaultEditedState(Irrelevant); gammaskreti->setDefaultEditedState(Irrelevant); slomaskreti->setDefaultEditedState(Irrelevant); + lapmaskreti->setDefaultEditedState(Irrelevant); scalereti->setDefaultEditedState(Irrelevant); darkness->setDefaultEditedState(Irrelevant); lightnessreti->setDefaultEditedState(Irrelevant); @@ -5904,6 +5920,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskreti->setDefaultEditedState(defSpotState->chromaskreti ? Edited : UnEdited); gammaskreti->setDefaultEditedState(defSpotState->gammaskreti ? Edited : UnEdited); slomaskreti->setDefaultEditedState(defSpotState->slomaskreti ? Edited : UnEdited); + lapmaskreti->setDefaultEditedState(defSpotState->lapmaskreti ? Edited : UnEdited); scalereti->setDefaultEditedState(defSpotState->scalereti ? Edited : UnEdited); darkness->setDefaultEditedState(defSpotState->darkness ? Edited : UnEdited); lightnessreti->setDefaultEditedState(defSpotState->lightnessreti ? Edited : UnEdited); @@ -6641,6 +6658,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == lapmaskreti) { + if (listener) { + listener->panelChanged(Evlocallablapmaskreti, lapmaskreti->getTextValue()); + } + } + if (a == scalereti) { if (scalereti->getValue() == 1) { LocalcurveEditorgainT->hide(); @@ -7102,6 +7125,7 @@ void Locallab::setBatchMode(bool batchMode) chromaskreti->showEditedCB(); gammaskreti->showEditedCB(); slomaskreti->showEditedCB(); + lapmaskreti->showEditedCB(); scalereti->showEditedCB(); darkness->showEditedCB(); lightnessreti->showEditedCB(); @@ -7741,6 +7765,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskreti->setValue(pp->locallab.spots.at(index).chromaskreti); gammaskreti->setValue(pp->locallab.spots.at(index).gammaskreti); slomaskreti->setValue(pp->locallab.spots.at(index).slomaskreti); + lapmaskreti->setValue(pp->locallab.spots.at(index).lapmaskreti); scalereti->setValue(pp->locallab.spots.at(index).scalereti); darkness->setValue(pp->locallab.spots.at(index).darkness); lightnessreti->setValue(pp->locallab.spots.at(index).lightnessreti); @@ -8069,6 +8094,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskreti->setEditedState(spotState->chromaskreti ? Edited : UnEdited); gammaskreti->setEditedState(spotState->gammaskreti ? Edited : UnEdited); slomaskreti->setEditedState(spotState->slomaskreti ? Edited : UnEdited); + lapmaskreti->setEditedState(spotState->lapmaskreti ? Edited : UnEdited); scalereti->setEditedState(spotState->scalereti ? Edited : UnEdited); darkness->setEditedState(spotState->darkness ? Edited : UnEdited); lightnessreti->setEditedState(spotState->lightnessreti ? Edited : UnEdited); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 6f233bc84..6e4647a41 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -231,6 +231,7 @@ private: Adjuster* const chromaskreti; Adjuster* const gammaskreti; Adjuster* const slomaskreti; + Adjuster* const lapmaskreti; Adjuster* const scalereti; Adjuster* const darkness; Adjuster* const lightnessreti; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 322f41ab5..8e3f4dd1e 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1147,6 +1147,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chromaskreti = locallab.spots.at(j).chromaskreti && pSpot.chromaskreti == otherSpot.chromaskreti; locallab.spots.at(j).gammaskreti = locallab.spots.at(j).gammaskreti && pSpot.gammaskreti == otherSpot.gammaskreti; locallab.spots.at(j).slomaskreti = locallab.spots.at(j).slomaskreti && pSpot.slomaskreti == otherSpot.slomaskreti; + locallab.spots.at(j).lapmaskreti = locallab.spots.at(j).lapmaskreti && pSpot.lapmaskreti == otherSpot.lapmaskreti; locallab.spots.at(j).scalereti = locallab.spots.at(j).scalereti && pSpot.scalereti == otherSpot.scalereti; 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; @@ -3440,6 +3441,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).slomaskreti = mods.locallab.spots.at(i).slomaskreti; } + if (locallab.spots.at(i).lapmaskreti) { + toEdit.locallab.spots.at(i).lapmaskreti = mods.locallab.spots.at(i).lapmaskreti; + } + if (locallab.spots.at(i).scalereti) { toEdit.locallab.spots.at(i).scalereti = mods.locallab.spots.at(i).scalereti; } @@ -4855,6 +4860,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chromaskreti(v), gammaskreti(v), slomaskreti(v), + lapmaskreti(v), scalereti(v), darkness(v), lightnessreti(v), @@ -5122,6 +5128,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chromaskreti = v; gammaskreti = v; slomaskreti = v; + lapmaskreti = v; scalereti = v; darkness = v; lightnessreti = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f4f8950b1..fffd5b5e7 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -565,6 +565,7 @@ public: bool chromaskreti; bool gammaskreti; bool slomaskreti; + bool lapmaskreti; bool scalereti; bool darkness; bool lightnessreti;