diff --git a/rtdata/languages/default b/rtdata/languages/default index 366e3b569..3097f1870 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -994,6 +994,7 @@ HISTORY_MSG_753;Local - Reti Transmission map 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_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2089,6 +2090,7 @@ TP_LOCALLAB_CHROMA;Chrominance TP_LOCALLAB_CHROMASKCOL;Chroma mask TP_LOCALLAB_GAMMASKCOL;Gamma mask TP_LOCALLAB_SLOMASKCOL;Slope mask +TP_LOCALLAB_LAPMASKCOL;Laplacian threshold mask TP_LOCALLAB_CHRRT;Chroma TP_LOCALLAB_CIRCRADIUS;Spot size TP_LOCALLAB_COFR;Color & Light - Small defects : red eyes, dust diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 6b2c7ae47..aa41b516d 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2447,9 +2447,89 @@ static void showmask(const local_params& lp, int xstart, int ystart, int cx, int } } +static float *discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t) +{ + BENCHFUN + + size_t i, j; + float *ptr_out; + float diff = 0.f; + /* pointers to the current and neighbour values */ + 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(); + } + + /* pointers to the data and neighbour values */ + /* + * y-1 + * x-1 ptr x+1 + * y+1 + * <---------------------nx-------> + */ + 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; + + /* row differences */ + 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; + } + } + + /* column differences */ + 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 maskcalccol(bool invmask, int bfw, int bfh, int xstart, int ystart, int sk, int cx, int cy, LabImage* bufcolorig, LabImage* bufmaskblurcol, LabImage* originalmaskcol, LabImage* original, /*LabImage * transformed, */int inv, const struct local_params & lp, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, bool multiThread, - bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float gamma, float slope, float blendm) + bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm) { array2D ble(bfw, bfh); array2D guid(bfw, bfh); @@ -2458,7 +2538,12 @@ void maskcalccol(bool invmask, int bfw, int bfh, int xstart, int ystart, int sk, // meanfab = 5000.f; float kinv = 1.f; float kneg = 1.f; - if(invmask) {kinv = 0.f; kneg = -1.f;} + + if (invmask) { + kinv = 0.f; + kneg = -1.f; + } + if (deltaE || modmask || enaMask || showmaske) { #ifdef _OPENMP @@ -2560,6 +2645,7 @@ void maskcalccol(bool invmask, int bfw, int bfh, int xstart, int ystart, int sk, LUTf lutTonemaskexp(65536); calcGammaLut(gamma, slope, lutTonemaskexp); + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -2569,6 +2655,37 @@ void maskcalccol(bool invmask, int bfw, int bfh, int xstart, int ystart, int sk, bufmaskblurcol->L[ir][jr] = lutTonemaskexp[LIM01(ble[ir][jr]) * 65536.f]; } } + + + if (lap > 0.f) { + float *datain = new float[bfh * bfw]; + float *data_tmp = new float[bfh * bfw]; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + datain[y * bfw + x] = bufmaskblurcol->L[y][x]; + } + } + + (void) discrete_laplacian_threshold(data_tmp, datain, bfw, bfh, 200.f * lap); +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufmaskblurcol->L[y][x] = data_tmp[y * bfw + x]; + } + } + + delete [] datain; + delete [] data_tmp; + + } } const float radiusb = 1.f / sk; @@ -4476,86 +4593,6 @@ static float *rex_poisson_dct(float * data, size_t nx, size_t ny, double m) } - -static float *discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t) -{ - BENCHFUN - - size_t i, j; - float *ptr_out; - float diff = 0.f; - /* pointers to the current and neighbour values */ - 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(); - } - - /* pointers to the data and neighbour values */ - /* - * y-1 - * x-1 ptr x+1 - * y+1 - * <---------------------nx-------> - */ - 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; - - /* row differences */ - 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; - } - } - - /* column differences */ - 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 ImProcFunctions::retinex_pde(float * datain, float * dataout, int bfw, int bfh, float thresh, float multy, float * dE, int show) { /* @@ -7279,7 +7316,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacb; maskcalccol(false, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, inv, lp, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); if (lp.showmaskcbmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); @@ -7544,11 +7581,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float gamma = lp.gammatm; float slope = lp.slomatm; float blendm = lp.blendmatm; + float lap = params->locallab.spots.at(sp).lapmasktm; if (!params->locallab.spots.at(sp).enatmMaskaft) { maskcalccol(false, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm); if (lp.showmasktmmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); @@ -7570,7 +7608,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o //calculate new values for original, originalmasktm, bufmaskorigtm...in function of tmp1 maskcalccol(false, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm); if (lp.showmasktmmet == 3) {//dispaly mask showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); @@ -7725,7 +7763,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaSH; maskcalccol(false, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigSH.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); if (lp.showmaskSHmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); @@ -7818,7 +7856,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); if (lp.showmaskSHmetinv == 1) { @@ -9891,10 +9929,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float gamma = lp.gammaexp; float slope = lp.slomaexp; float blendm = lp.blendmaexp; - // bool invmask = params->locallab.spots.at(sp).enaExpMaskaft; + // bool invmask = params->locallab.spots.at(sp).enaExpMaskaft; maskcalccol(false, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); if (lp.showmaskexpmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); @@ -10154,11 +10192,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float gamma = lp.gammaexp; float slope = lp.slomaexp; float blendm = lp.blendmaexp; - // bool invmask = params->locallab.spots.at(sp).enaExpMaskaft; + // bool invmask = params->locallab.spots.at(sp).enaExpMaskaft; maskcalccol(false, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); if (lp.showmaskexpmetinv == 1) { showmask(lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); @@ -10395,7 +10433,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacol; maskcalccol(false, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); if (lp.showmaskcolmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); @@ -10596,7 +10634,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, gamma, slope, blendm); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, 0.f, gamma, slope, blendm); if (lp.showmaskcolmetinv == 1) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 3847e7949..4760fb155 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -783,6 +783,7 @@ enum ProcEventCode { Evlocallabcliptm = 753, EvLocallabEnatmMaskaft = 754, EvLocallabEnaExpMaskaft = 755, + Evlocallablapmasktm = 756, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index c529034e5..c47dc1506 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2573,10 +2573,11 @@ LocallabParams::LocallabSpot::LocallabSpot() : enatmMask(false), enatmMaskaft(false), blendmasktm(0), - radmasktm(10.0), + radmasktm(0.0), chromasktm(0.0), gammasktm(1.0), slomasktm(0.0), + lapmasktm(0.0), // Retinex expreti(false), retinexMethod("high"), @@ -2846,6 +2847,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chromasktm == other.chromasktm && gammasktm == other.gammasktm && slomasktm == other.slomasktm + && lapmasktm == other.lapmasktm // Retinex && expreti == other.expreti && retinexMethod == other.retinexMethod @@ -4101,6 +4103,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromasktm, "Locallab", "Chromasktm_" + std::to_string(i), spot.chromasktm, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammasktm, "Locallab", "Gammasktm_" + std::to_string(i), spot.gammasktm, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomasktm, "Locallab", "Slomasktm_" + std::to_string(i), spot.slomasktm, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmasktm, "Locallab", "Lapmasktm_" + std::to_string(i), spot.lapmasktm, keyFile); // Retinex saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expreti, "Locallab", "Expreti_" + std::to_string(i), spot.expreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).retinexMethod, "Locallab", "retinexMethod_" + std::to_string(i), spot.retinexMethod, keyFile); @@ -5483,6 +5486,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Chromasktm_" + std::to_string(i), pedited, spot.chromasktm, spotEdited.chromasktm); assignFromKeyfile(keyFile, "Locallab", "Gammasktm_" + std::to_string(i), pedited, spot.gammasktm, spotEdited.gammasktm); assignFromKeyfile(keyFile, "Locallab", "Slomasktm_" + std::to_string(i), pedited, spot.slomasktm, spotEdited.slomasktm); + assignFromKeyfile(keyFile, "Locallab", "Lapmasktm_" + std::to_string(i), pedited, spot.lapmasktm, spotEdited.lapmasktm); // Retinex assignFromKeyfile(keyFile, "Locallab", "Expreti_" + std::to_string(i), pedited, spot.expreti, spotEdited.expreti); assignFromKeyfile(keyFile, "Locallab", "retinexMethod_" + std::to_string(i), pedited, spot.retinexMethod, spotEdited.retinexMethod); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 9771be5a2..fe0e88890 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1126,6 +1126,7 @@ struct LocallabParams { double chromasktm; double gammasktm; double slomasktm; + double lapmasktm; // Retinex bool expreti; Glib::ustring retinexMethod; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 513095fee..de09ac515 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -782,7 +782,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabCTtransCurve LUMINANCECURVE, //Evlocallabcliptm LUMINANCECURVE, //Evlocallabenatmmaskaft - LUMINANCECURVE //EvlocallabenaExpmaskaft + LUMINANCECURVE, //EvlocallabenaExpmaskaft + LUMINANCECURVE //Evlocallablapmasktm }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 9fdca4b82..7b64bb6c8 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -261,10 +261,11 @@ Locallab::Locallab(): amount(Gtk::manage(new Adjuster(M("TP_LOCALLAB_AMOUNT"), 50., 100.0, 0.5, 95.))), satur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATUR"), -100., 100., 0.1, 0.))),//by default satur = 0 ==> use Mantiuk value blendmasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), - radmasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 10.))), + radmasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), chromasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), gammasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), slomasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + lapmasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), // Retinex str(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STR"), 0., 100., 0.1, 0.2))), chrrt(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHRRT"), 0.0, 100.0, 0.1, 0.0))), @@ -1270,6 +1271,7 @@ Locallab::Locallab(): chromasktm->setAdjusterListener(this); gammasktm->setAdjusterListener(this); slomasktm->setAdjusterListener(this); + lapmasktm->setAdjusterListener(this); ToolParamBlock* const masktmBox = Gtk::manage(new ToolParamBlock()); masktmBox->pack_start(*showmasktmMethod, Gtk::PACK_SHRINK, 4); @@ -1277,6 +1279,7 @@ Locallab::Locallab(): masktmBox->pack_start(*enatmMaskaft, Gtk::PACK_SHRINK, 0); masktmBox->pack_start(*masktmCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor masktmBox->pack_start(*blendmasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*lapmasktm, Gtk::PACK_SHRINK, 0); masktmBox->pack_start(*radmasktm, Gtk::PACK_SHRINK, 0); masktmBox->pack_start(*chromasktm, Gtk::PACK_SHRINK, 0); masktmBox->pack_start(*gammasktm, Gtk::PACK_SHRINK, 0); @@ -3173,6 +3176,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chromasktm = chromasktm->getValue(); pp->locallab.spots.at(pp->locallab.selspot).gammasktm = gammasktm->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomasktm = slomasktm->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).lapmasktm = lapmasktm->getValue(); // Retinex pp->locallab.spots.at(pp->locallab.selspot).expreti = expreti->getEnabled(); @@ -3458,6 +3462,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chromasktm = pe->locallab.spots.at(pp->locallab.selspot).chromasktm || chromasktm->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).gammasktm = pe->locallab.spots.at(pp->locallab.selspot).gammasktm || gammasktm->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomasktm = pe->locallab.spots.at(pp->locallab.selspot).slomasktm || slomasktm->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).lapmasktm = pe->locallab.spots.at(pp->locallab.selspot).lapmasktm || lapmasktm->getEditedState(); // Retinex pe->locallab.spots.at(pp->locallab.selspot).expreti = pe->locallab.spots.at(pp->locallab.selspot).expreti || !expreti->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).retinexMethod = pe->locallab.spots.at(pp->locallab.selspot).retinexMethod || retinexMethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -3733,6 +3738,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chromasktm = pedited->locallab.spots.at(pp->locallab.selspot).chromasktm || chromasktm->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).gammasktm = pedited->locallab.spots.at(pp->locallab.selspot).gammasktm || gammasktm->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomasktm = pedited->locallab.spots.at(pp->locallab.selspot).slomasktm || slomasktm->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).lapmasktm = pedited->locallab.spots.at(pp->locallab.selspot).lapmasktm || lapmasktm->getEditedState(); // Retinex pedited->locallab.spots.at(pp->locallab.selspot).expreti = pedited->locallab.spots.at(pp->locallab.selspot).expreti || !expreti->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).retinexMethod = pedited->locallab.spots.at(pp->locallab.selspot).retinexMethod || retinexMethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -5546,6 +5552,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromasktm->setDefault(defSpot->chromasktm); gammasktm->setDefault(defSpot->gammasktm); slomasktm->setDefault(defSpot->slomasktm); + lapmasktm->setDefault(defSpot->lapmasktm); // Retinex str->setDefault(defSpot->str); chrrt->setDefault(defSpot->chrrt); @@ -5711,6 +5718,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromasktm->setDefaultEditedState(Irrelevant); gammasktm->setDefaultEditedState(Irrelevant); slomasktm->setDefaultEditedState(Irrelevant); + lapmasktm->setDefaultEditedState(Irrelevant); // Retinex str->setDefaultEditedState(Irrelevant); chrrt->setDefaultEditedState(Irrelevant); @@ -5880,6 +5888,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromasktm->setDefaultEditedState(defSpotState->chromasktm ? Edited : UnEdited); gammasktm->setDefaultEditedState(defSpotState->gammasktm ? Edited : UnEdited); slomasktm->setDefaultEditedState(defSpotState->slomasktm ? Edited : UnEdited); + lapmasktm->setDefaultEditedState(defSpotState->lapmasktm ? Edited : UnEdited); // Retinex str->setDefaultEditedState(defSpotState->str ? Edited : UnEdited); chrrt->setDefaultEditedState(defSpotState->chrrt ? Edited : UnEdited); @@ -6531,6 +6540,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == lapmasktm) { + if (listener) { + listener->panelChanged(Evlocallablapmasktm, lapmasktm->getTextValue()); + } + } + } @@ -7071,6 +7086,7 @@ void Locallab::setBatchMode(bool batchMode) chromasktm->showEditedCB(); gammasktm->showEditedCB(); slomasktm->showEditedCB(); + lapmasktm->showEditedCB(); // Retinex str->showEditedCB(); chrrt->showEditedCB(); @@ -7684,6 +7700,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromasktm->setValue(pp->locallab.spots.at(index).chromasktm); gammasktm->setValue(pp->locallab.spots.at(index).gammasktm); slomasktm->setValue(pp->locallab.spots.at(index).slomasktm); + lapmasktm->setValue(pp->locallab.spots.at(index).lapmasktm); CCmasktmshape->setCurve(pp->locallab.spots.at(index).CCmasktmcurve); LLmasktmshape->setCurve(pp->locallab.spots.at(index).LLmasktmcurve); HHmasktmshape->setCurve(pp->locallab.spots.at(index).HHmasktmcurve); @@ -8018,6 +8035,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromasktm->setEditedState(spotState->chromasktm ? Edited : UnEdited); gammasktm->setEditedState(spotState->gammasktm ? Edited : UnEdited); slomasktm->setEditedState(spotState->slomasktm ? Edited : UnEdited); + lapmasktm->setEditedState(spotState->lapmasktm ? Edited : UnEdited); // Retinex expreti->set_inconsistent(!spotState->expreti); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index f10e1635c..6f233bc84 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -214,6 +214,7 @@ private: Adjuster* const chromasktm; Adjuster* const gammasktm; Adjuster* const slomasktm; + Adjuster* const lapmasktm; // Retinex Adjuster* const str; Adjuster* const chrrt; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 75379c635..322f41ab5 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1118,6 +1118,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chromasktm = locallab.spots.at(j).chromasktm && pSpot.chromasktm == otherSpot.chromasktm; locallab.spots.at(j).gammasktm = locallab.spots.at(j).gammasktm && pSpot.gammasktm == otherSpot.gammasktm; locallab.spots.at(j).slomasktm = locallab.spots.at(j).slomasktm && pSpot.slomasktm == otherSpot.slomasktm; + locallab.spots.at(j).lapmasktm = locallab.spots.at(j).lapmasktm && pSpot.lapmasktm == otherSpot.lapmasktm; // Retinex locallab.spots.at(j).expreti = locallab.spots.at(j).expreti && pSpot.expreti == otherSpot.expreti; locallab.spots.at(j).retinexMethod = locallab.spots.at(j).retinexMethod && pSpot.retinexMethod == otherSpot.retinexMethod; @@ -3326,6 +3327,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).slomasktm = mods.locallab.spots.at(i).slomasktm; } + if (locallab.spots.at(i).lapmasktm) { + toEdit.locallab.spots.at(i).lapmasktm = mods.locallab.spots.at(i).lapmasktm; + } + // Retinex if (locallab.spots.at(i).expreti) { toEdit.locallab.spots.at(i).expreti = mods.locallab.spots.at(i).expreti; @@ -4821,6 +4826,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chromasktm(v), gammasktm(v), slomasktm(v), + lapmasktm(v), // Retinex expreti(v), retinexMethod(v), @@ -5087,6 +5093,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chromasktm = v; gammasktm = v; slomasktm = v; + lapmasktm = v; // Retinex expreti = v; retinexMethod = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 34877c8f2..f4f8950b1 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -536,6 +536,7 @@ public: bool chromasktm; bool gammasktm; bool slomasktm; + bool lapmasktm; // Retinex bool expreti; bool retinexMethod;