diff --git a/rtdata/languages/default b/rtdata/languages/default index 5341ec44a..85f7babc3 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1116,6 +1116,7 @@ HISTORY_MSG_877;Local - LC mask chroma HISTORY_MSG_878;Local - LC mask curve contrast HISTORY_MSG_879;Local - LC Chroma levels HISTORY_MSG_880;Local - LC Chroma blur levels +HISTORY_MSG_881;Local - Contrast Offset Luminance HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2453,6 +2454,7 @@ TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) TP_LOCALLAB_NOISEMETH;Denoise TP_LOCALLAB_NONENOISE;None TP_LOCALLAB_OFFS;Offset +TP_LOCALLAB_OFFSETWAV;Offset TP_LOCALLAB_OPACOL;Opacity TP_LOCALLAB_ORIGLC;Merge only with original image TP_LOCALLAB_PASTELS2;Vibrance diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index c53272c4e..66011f486 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -321,7 +321,7 @@ public: const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, - float sigm, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc); + float sigm, float offs,int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc); void transit_shapedetect2(int call, int senstype, const LabImage * bufexporig, const LabImage * bufexpfin, LabImage * originalmask, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 929410ab6..fa1e066db 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -52,7 +52,7 @@ #include "guidedfilter.h" #define TS 64 // Tile size -#define offset 25 // shift between tiles +#define offset1 25 // shift between tiles #define fTS ((TS/2+1)) // second dimension of Fourier tiles #define blkrad 1 // radius of block averaging #define offset2 25 // shift between tiles @@ -4079,7 +4079,7 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int bool wavcurvecon = false; bool loccompwavutili = false; bool wavcurvecomp = false; - wavcontrast4(bufmaskblurcol->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, bfw, bfh, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false); + wavcontrast4(bufmaskblurcol->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, bfw, bfh, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false); } @@ -6939,7 +6939,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, - float sigm, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc) + float sigm, float offs, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc) { wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, level_br, 1, sk, numThreads, 6); @@ -7096,8 +7096,8 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f wav_a = wdspota->level_coeffs(level); wav_b = wdspotb->level_coeffs(level); } - - float rap = mean[level] - 2.f * sigm * sigma[level]; + //offset + float rap = offs * mean[level] - 2.f * sigm * sigma[level]; if (rap > 0.f) { mea[0] = rap; @@ -7105,7 +7105,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f mea[0] = mean[level] / 6.f; } - rap = mean[level] - sigm * sigma[level]; + rap = offs * mean[level] - sigm * sigma[level]; if (rap > 0.f) { mea[1] = rap; @@ -7113,13 +7113,13 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f mea[1] = mean[level] / 2.f; } - mea[2] = mean[level]; // 50% data - mea[3] = mean[level] + sigm * sigma[level] / 2.f; - mea[4] = mean[level] + sigm * sigma[level]; //66% - mea[5] = mean[level] + sigm * 1.2f * sigma[level]; - mea[6] = mean[level] + sigm * 1.5f * sigma[level]; // - mea[7] = mean[level] + sigm * 2.f * sigma[level]; //95% - mea[8] = mean[level] + sigm * 2.5f * sigma[level]; //99% + mea[2] = offs * mean[level]; // 50% data + mea[3] = offs * mean[level] + sigm * sigma[level] / 2.f; + mea[4] = offs * mean[level] + sigm * sigma[level]; //66% + mea[5] = offs * mean[level] + sigm * 1.2f * sigma[level]; + mea[6] = offs * mean[level] + sigm * 1.5f * sigma[level]; // + mea[7] = offs * mean[level] + sigm * 2.f * sigma[level]; //95% + mea[8] = offs * mean[level] + sigm * 2.5f * sigma[level]; //99% if (locconwavCurve && locconwavutili) { @@ -7608,8 +7608,8 @@ void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_nu - const int numblox_W = ceil((static_cast(GW)) / (offset)) + 2 * blkrad; - const int numblox_H = ceil((static_cast(GH)) / (offset)) + 2 * blkrad; + const int numblox_W = ceil((static_cast(GW)) / (offset1)) + 2 * blkrad; + const int numblox_H = ceil((static_cast(GH)) / (offset1)) + 2 * blkrad; //residual between input and denoised L channel @@ -7635,15 +7635,15 @@ void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_nu #endif float *Lblox = LbloxArray[subThread]; float *fLblox = fLbloxArray[subThread]; - float pBuf[GW + TS + 2 * blkrad * offset] ALIGNED16; + float pBuf[GW + TS + 2 * blkrad * offset1] ALIGNED16; #ifdef _OPENMP #pragma omp for #endif for (int vblk = 0; vblk < numblox_H; ++vblk) { - int top = (vblk - blkrad) * offset; - float * datarow = pBuf + blkrad * offset; + int top = (vblk - blkrad) * offset1; + float * datarow = pBuf + blkrad * offset1; for (int i = 0; i < TS; ++i) { int row = top + i; @@ -7659,17 +7659,17 @@ void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_nu datarow[j] = ((*Lin)[rr][j] - tmp1[rr][j]); } - for (int j = -blkrad * offset; j < 0; ++j) { + for (int j = -blkrad * offset1; j < 0; ++j) { datarow[j] = datarow[MIN(-j, GW - 1)]; } - for (int j = GW; j < GW + TS + blkrad * offset; ++j) { + for (int j = GW; j < GW + TS + blkrad * offset1; ++j) { datarow[j] = datarow[MAX(0, 2 * GW - 2 - j)]; }//now we have a padded data row //now fill this row of the blocks with Lab high pass data for (int hblk = 0; hblk < numblox_W; ++hblk) { - int left = (hblk - blkrad) * offset; + int left = (hblk - blkrad) * offset1; int indx = (hblk) * TS; //index of block in malloc if (top + i >= 0 && top + i < GH) { @@ -7738,7 +7738,7 @@ void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_nu fftwf_execute_r2r(plan_backward_blox[1], fLblox, Lblox); //for DCT } - int topproc = (vblk - blkrad) * offset; + int topproc = (vblk - blkrad) * offset1; //add row of blocks to output image tile ImProcFunctions::RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, GH, GW, topproc); @@ -7870,9 +7870,9 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f int GW = transformed->W; int GH = transformed->H; - int max_numblox_W = ceil((static_cast(GW)) / (offset)) + 2 * blkrad; + int max_numblox_W = ceil((static_cast(GW)) / (offset1)) + 2 * blkrad; // calculate min size of numblox_W. - int min_numblox_W = ceil((static_cast(GW)) / (offset)) + 2 * blkrad; + int min_numblox_W = ceil((static_cast(GW)) / (offset1)) + 2 * blkrad; for (int ir = 0; ir < GH; ir++) @@ -8416,9 +8416,9 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f array2D *Ain = nullptr; array2D *Bin = nullptr; - int max_numblox_W = ceil((static_cast(bfw)) / (offset)) + 2 * blkrad; + int max_numblox_W = ceil((static_cast(bfw)) / (offset1)) + 2 * blkrad; // calculate min size of numblox_W. - int min_numblox_W = ceil((static_cast(bfw)) / (offset)) + 2 * blkrad; + int min_numblox_W = ceil((static_cast(bfw)) / (offset1)) + 2 * blkrad; // these are needed only for creation of the plans and will be freed before entering the parallel loop @@ -9559,7 +9559,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool wavcurvecon = false; bool loccompwavutili = false; bool wavcurvecomp = false; - wavcontrast4(bufmaskblurbl->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, GW, GH, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false); + wavcontrast4(bufmaskblurbl->L, nullptr, nullptr, contrast, 0.f, 0.f, 0.f, GW, GH, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, dummy, loccompwavutili, wavcurvecomp, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false); } int shado = params->locallab.spots.at(sp).shadmaskbl; @@ -11484,13 +11484,14 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const bool blurlc = params->locallab.spots.at(sp).blurlc; const float radlevblur = (params->locallab.spots.at(sp).levelblur) / sk; const float sigma = params->locallab.spots.at(sp).sigma; + const float offs = params->locallab.spots.at(sp).offset; const float fatdet = params->locallab.spots.at(sp).fatdet; const float fatanch = params->locallab.spots.at(sp).fatanch; const float fatres = params->locallab.spots.at(sp).fatres; const float chrol = params->locallab.spots.at(sp).chromalev; const float chrobl = params->locallab.spots.at(sp).chromablu; - wavcontrast4(tmp1->L, tmp1->a, tmp1->b, contrast, fatres, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, sigma, maxlvl, fatdet, fatanch, chrol, chrobl, blurlc); + wavcontrast4(tmp1->L, tmp1->a, tmp1->b, contrast, fatres, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, sigma, offs, maxlvl, fatdet, fatanch, chrol, chrobl, blurlc); const float satur = params->locallab.spots.at(sp).residchro; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index fab7c6b3a..b33caca0c 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -906,6 +906,7 @@ enum ProcEventCode { EvlocallabLmasklcshape = 877, Evlocallabchromalev = 878, Evlocallabchromablu = 879, + Evlocallaboffset = 880, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 91ca115e6..fcbeeb829 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2727,6 +2727,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : levelblur(0.0), residchro(0.0), sigma(1.0), + offset(1.0), chromalev(1.0), chromablu(1.0), fatdet(40.0), @@ -3134,6 +3135,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && levelblur == other.levelblur && residchro == other.residchro && sigma == other.sigma + && offset == other.offset && chromalev == other.chromalev && chromablu == other.chromablu && fatdet == other.fatdet @@ -4520,6 +4522,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).levelblur, "Locallab", "Levelblur_" + std::to_string(i), spot.levelblur, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).residchro, "Locallab", "Residchro_" + std::to_string(i), spot.residchro, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sigma, "Locallab", "Sigma_" + std::to_string(i), spot.sigma, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).offset, "Locallab", "Offset_" + std::to_string(i), spot.offset, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromalev, "Locallab", "Chromalev_" + std::to_string(i), spot.chromalev, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromablu, "Locallab", "Chromablu_" + std::to_string(i), spot.chromablu, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatdet, "Locallab", "Fatdet_" + std::to_string(i), spot.fatdet, keyFile); @@ -6057,6 +6060,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Levelblur_" + std::to_string(i), pedited, spot.levelblur, spotEdited.levelblur); assignFromKeyfile(keyFile, "Locallab", "Residchro_" + std::to_string(i), pedited, spot.residchro, spotEdited.residchro); assignFromKeyfile(keyFile, "Locallab", "Sigma_" + std::to_string(i), pedited, spot.sigma, spotEdited.sigma); + assignFromKeyfile(keyFile, "Locallab", "Offset_" + std::to_string(i), pedited, spot.offset, spotEdited.offset); assignFromKeyfile(keyFile, "Locallab", "Chromalev_" + std::to_string(i), pedited, spot.chromalev, spotEdited.chromalev); assignFromKeyfile(keyFile, "Locallab", "Chromablu_" + std::to_string(i), pedited, spot.chromablu, spotEdited.chromablu); assignFromKeyfile(keyFile, "Locallab", "Fatdet_" + std::to_string(i), pedited, spot.fatdet, spotEdited.fatdet); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index d19bbfa53..4d83a67f4 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1270,6 +1270,7 @@ struct LocallabParams { double levelblur; double residchro; double sigma; + double offset; double chromalev; double chromablu; double fatdet; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index ae35bf279..492f6b7cb 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -909,7 +909,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabchromasklc LUMINANCECURVE, //EvlocallabLmasklcshape LUMINANCECURVE, //Evlocallabchromalev - LUMINANCECURVE //Evlocallabchromablu + LUMINANCECURVE, //Evlocallabchromablu + LUMINANCECURVE //Evlocallaboffset }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 48ca18bfd..d0363f91f 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -575,6 +575,7 @@ claricres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARICRES"), -20., 100., 0.5, sensilc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIS"), 0, 100, 1, 19))), residchro(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCHRO"), -100, 100, 1, 0))), sigma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), +offset(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFSETWAV"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), chromalev(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMALEV"), 0.01, 2., 0.01, 1.))), chromablu(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMABLU"), 0.01, 2., 0.01, 1.))), fatdet(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATDETAIL"), -100., 300., 1., 0.))), @@ -2899,6 +2900,7 @@ pe(nullptr) levelblur->setAdjusterListener(this); residchro->setAdjusterListener(this); sigma->setAdjusterListener(this); + offset->setAdjusterListener(this); chromalev->setAdjusterListener(this); chromablu->setAdjusterListener(this); fatdet->setAdjusterListener(this); @@ -2943,6 +2945,7 @@ pe(nullptr) contFrame->set_label_align(0.025, 0.5); ToolParamBlock* const contlevBox = Gtk::manage(new ToolParamBlock()); contlevBox->pack_start(*sigma); + contlevBox->pack_start(*offset); contlevBox->pack_start(*chromalev); contlevBox->pack_start(*LocalcurveEditorwavcon, Gtk::PACK_SHRINK, 4); contFrame->add(*contlevBox); @@ -5255,6 +5258,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).levelblur = levelblur->getValue(); pp->locallab.spots.at(pp->locallab.selspot).residchro = residchro->getValue(); pp->locallab.spots.at(pp->locallab.selspot).sigma = sigma->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).offset = offset->getValue(); pp->locallab.spots.at(pp->locallab.selspot).chromalev = chromalev->getValue(); pp->locallab.spots.at(pp->locallab.selspot).chromablu = chromablu->getValue(); pp->locallab.spots.at(pp->locallab.selspot).fatdet = fatdet->getValue(); @@ -5665,6 +5669,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).levelblur = pe->locallab.spots.at(pp->locallab.selspot).levelblur || levelblur->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).residchro = pe->locallab.spots.at(pp->locallab.selspot).residchro || residchro->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).sigma = pe->locallab.spots.at(pp->locallab.selspot).sigma || sigma->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).offset = pe->locallab.spots.at(pp->locallab.selspot).offset || offset->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).chromalev = pe->locallab.spots.at(pp->locallab.selspot).chromalev || chromalev->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).chromablu = pe->locallab.spots.at(pp->locallab.selspot).chromablu || chromablu->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).fatdet = pe->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState(); @@ -6074,6 +6079,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).levelblur = pedited->locallab.spots.at(pp->locallab.selspot).levelblur || levelblur->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).residchro = pedited->locallab.spots.at(pp->locallab.selspot).residchro || residchro->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).sigma = pedited->locallab.spots.at(pp->locallab.selspot).sigma || sigma->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).offset = pedited->locallab.spots.at(pp->locallab.selspot).offset || offset->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).chromalev = pedited->locallab.spots.at(pp->locallab.selspot).chromalev || chromalev->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).chromablu = pedited->locallab.spots.at(pp->locallab.selspot).chromablu || chromablu->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).fatdet = pedited->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState(); @@ -6652,6 +6658,7 @@ void Locallab::localcontMethodChanged() levelblur->hide(); residchro->hide(); sigma->hide(); + offset->hide(); chromalev->hide(); chromablu->hide(); fatdet->hide(); @@ -6680,6 +6687,7 @@ void Locallab::localcontMethodChanged() levelblur->show(); residchro->show(); sigma->show(); + offset->show(); chromalev->show(); chromablu->show(); fatdet->show(); @@ -8755,6 +8763,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c levelblur->setDefault(defSpot->levelblur); residchro->setDefault(defSpot->residchro); sigma->setDefault(defSpot->sigma); + offset->setDefault(defSpot->offset); chromalev->setDefault(defSpot->chromalev); chromablu->setDefault(defSpot->chromablu); fatdet->setDefault(defSpot->fatdet); @@ -8996,6 +9005,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c levelblur->setDefaultEditedState(Irrelevant); residchro->setDefaultEditedState(Irrelevant); sigma->setDefaultEditedState(Irrelevant); + offset->setDefaultEditedState(Irrelevant); chromalev->setDefaultEditedState(Irrelevant); chromablu->setDefaultEditedState(Irrelevant); fatdet->setDefaultEditedState(Irrelevant); @@ -9242,6 +9252,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c levelblur->setDefaultEditedState(defSpotState->levelblur ? Edited : UnEdited); residchro->setDefaultEditedState(defSpotState->residchro ? Edited : UnEdited); sigma->setDefaultEditedState(defSpotState->sigma ? Edited : UnEdited); + offset->setDefaultEditedState(defSpotState->offset ? Edited : UnEdited); chromalev->setDefaultEditedState(defSpotState->chromalev ? Edited : UnEdited); chromablu->setDefaultEditedState(defSpotState->chromablu ? Edited : UnEdited); fatdet->setDefaultEditedState(defSpotState->fatdet ? Edited : UnEdited); @@ -10421,6 +10432,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == offset) { + if (listener) { + listener->panelChanged(Evlocallaboffset, offset->getTextValue()); + } + } + if (a == chromalev) { if (listener) { listener->panelChanged(Evlocallabchromalev, chromalev->getTextValue()); @@ -10942,6 +10959,7 @@ void Locallab::setBatchMode(bool batchMode) levelblur->showEditedCB(); residchro->showEditedCB(); sigma->showEditedCB(); + offset->showEditedCB(); chromalev->showEditedCB(); chromablu->showEditedCB(); fatdet->showEditedCB(); @@ -12006,6 +12024,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con levelblur->setValue(pp->locallab.spots.at(index).levelblur); residchro->setValue(pp->locallab.spots.at(index).residchro); sigma->setValue(pp->locallab.spots.at(index).sigma); + offset->setValue(pp->locallab.spots.at(index).offset); chromalev->setValue(pp->locallab.spots.at(index).chromalev); chromablu->setValue(pp->locallab.spots.at(index).chromablu); fatdet->setValue(pp->locallab.spots.at(index).fatdet); @@ -12520,6 +12539,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con levelblur->setEditedState(spotState->levelblur ? Edited : UnEdited); residchro->setEditedState(spotState->residchro ? Edited : UnEdited); sigma->setEditedState(spotState->sigma ? Edited : UnEdited); + offset->setEditedState(spotState->offset ? Edited : UnEdited); chromalev->setEditedState(spotState->chromalev ? Edited : UnEdited); chromablu->setEditedState(spotState->chromablu ? Edited : UnEdited); fatdet->setEditedState(spotState->fatdet ? Edited : UnEdited); @@ -13045,6 +13065,7 @@ void Locallab::updateSpecificGUIState() levelblur->hide(); residchro->hide(); sigma->hide(); + offset->hide(); chromalev->hide(); chromablu->hide(); fatdet->hide(); @@ -13072,6 +13093,7 @@ void Locallab::updateSpecificGUIState() residblur->show(); levelblur->show(); sigma->show(); + offset->show(); chromalev->show(); chromablu->show(); fatdet->show(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 87375f510..ebf21e21b 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -370,6 +370,7 @@ private: Adjuster* const sensilc; Adjuster* const residchro; Adjuster* const sigma; + Adjuster* const offset; Adjuster* const chromalev; Adjuster* const chromablu; Adjuster* const fatdet; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index d1baa9ed1..7fdf80238 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1263,6 +1263,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).levelblur = locallab.spots.at(j).levelblur && pSpot.levelblur == otherSpot.levelblur; locallab.spots.at(j).residchro = locallab.spots.at(j).residchro && pSpot.residchro == otherSpot.residchro; locallab.spots.at(j).sigma = locallab.spots.at(j).sigma && pSpot.sigma == otherSpot.sigma; + locallab.spots.at(j).offset = locallab.spots.at(j).offset && pSpot.offset == otherSpot.offset; locallab.spots.at(j).chromalev = locallab.spots.at(j).chromalev && pSpot.chromalev == otherSpot.chromalev; locallab.spots.at(j).chromablu = locallab.spots.at(j).chromablu && pSpot.chromablu == otherSpot.chromablu; locallab.spots.at(j).fatdet = locallab.spots.at(j).fatdet && pSpot.fatdet == otherSpot.fatdet; @@ -4028,6 +4029,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).sigma = mods.locallab.spots.at(i).sigma; } + if (locallab.spots.at(i).offset) { + toEdit.locallab.spots.at(i).offset = mods.locallab.spots.at(i).offset; + } + if (locallab.spots.at(i).chromalev) { toEdit.locallab.spots.at(i).chromalev = mods.locallab.spots.at(i).chromalev; } @@ -5607,6 +5612,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : levelblur(v), residchro(v), sigma(v), + offset(v), chromalev(v), chromablu(v), fatdet(v), @@ -6004,6 +6010,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) levelblur = v; residchro = v; sigma = v; + offset = v; chromalev = v; chromablu = v; fatdet = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index a1e784011..b0247e587 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -696,6 +696,7 @@ public: bool levelblur; bool residchro; bool sigma; + bool offset; bool chromalev; bool chromablu; bool fatdet;