diff --git a/rtdata/languages/default b/rtdata/languages/default index 50506d04c..5341ec44a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1115,6 +1115,7 @@ HISTORY_MSG_876;Local - LC mask radius 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_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2210,7 +2211,7 @@ TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 TP_LOCALLAB_BLURCOL;Radius Mask Blur TP_LOCALLAB_BLURDE;Blur Shape detection -TP_LOCALLAB_BLURLC;Luminance Residual Image Only +TP_LOCALLAB_BLURLC;Luminance Only TP_LOCALLAB_BLURLEVELFRA;Blur Levels TP_LOCALLAB_BLURRESIDFRA;Blur Residual TP_LOCALLAB_BUTTON_ADD;Add @@ -2226,6 +2227,7 @@ TP_LOCALLAB_CHROMA;Chrominance TP_LOCALLAB_CHROMACBDL;Chroma TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie TP_LOCALLAB_CHROMALEV;Chroma levels +TP_LOCALLAB_CHROMABLU;Chroma levels TP_LOCALLAB_CHROMASKCOL;Chroma mask TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma TP_LOCALLAB_CHRRT;Chroma diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 9b0b32563..c53272c4e 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 sigm, 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 f7e3393be..06b6fac29 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -4078,7 +4078,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); + 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); } @@ -6938,7 +6938,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 sigm, 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); @@ -6946,9 +6946,11 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f if (wdspot->memoryAllocationFailed) { return; } - wavelet_decomposition *wdspota; - wavelet_decomposition *wdspotb; - if(chromalev != 1.f) { + + wavelet_decomposition *wdspota = nullptr; + wavelet_decomposition *wdspotb = nullptr; + + if (chromalev != 1.f || chromablu != 1.f) { wdspota = new wavelet_decomposition(tmpa[0], bfw, bfh, level_br, 1, sk, numThreads, 6); //first decomposition for compress dynamic range positive values and other process @@ -7088,11 +7090,12 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f float **wav_b = nullptr; float **wav_L = wdspot->level_coeffs(level); - if(chromalev != 1.f) { - wav_a = wdspota->level_coeffs(level); - wav_b = wdspotb->level_coeffs(level); + + if (chromalev != 1.f) { + wav_a = wdspota->level_coeffs(level); + wav_b = wdspotb->level_coeffs(level); } - + float rap = mean[level] - 2.f * sigm * sigma[level]; if (rap > 0.f) { @@ -7158,7 +7161,8 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f float alpha = max((1024.f + 15.f * (float) cpMul * beta) / 1024.f, 0.02f) ; wav_L[dir][i] *= alpha; - if(chromalev != 1.f) { + + if (chromalev != 1.f) { wav_a[dir][i] *= alpha * chromalev; wav_b[dir][i] *= alpha * chromalev; } @@ -7188,6 +7192,8 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f int leve = maxlvl; float ****templevel = nullptr; + float ****templevela = nullptr; + float ****templevelb = nullptr; if (wavcurvelev || wavcurvecomp) { fatParams.enabled = wavcurvecomp; @@ -7207,19 +7213,53 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f } } + if (chromablu != 1.f) { + templevela = new float***[dir]; + templevelb = new float***[dir]; + + //allocate memory for 3 DIR n levels, H_L, W_L + for (int d = 0; d < dir; d++) { + templevela[d] = new float**[leve]; + templevelb[d] = new float**[leve]; + + for (int k = 0; k < leve; k++) { + templevela[d][k] = new float*[H_L]; + templevelb[d][k] = new float*[H_L]; + + for (int i = 0; i < H_L; i++) { + templevela[d][k][i] = new float[W_L]; + templevelb[d][k][i] = new float[W_L]; + } + } + } + + } + //fill array templevel with wavelet value level dir for (int dir = 1; dir < 4; dir++) { for (int level = level_bl; level < maxlvl; ++level) { int W_L = wdspot->level_W(level); int H_L = wdspot->level_H(level); + float **wav_a = nullptr; + float **wav_b = nullptr; float **wav_L = wdspot->level_coeffs(level); // float **wav_LN = wdspotneg->level_coeffs(level); + if (chromablu != 1.f) { + wav_a = wdspota->level_coeffs(level); + wav_b = wdspotb->level_coeffs(level); + } for (int y = 0; y < H_L; y++) { for (int x = 0; x < W_L; x++) { float val = wav_L[dir][y * W_L + x]; + if (chromablu != 1.f) { + float vala = wav_a[dir][y * W_L + x]; + float valb = wav_b[dir][y * W_L + x]; + templevela[dir - 1][level][y][x] = vala; + templevelb[dir - 1][level][y][x] = valb; + } // if (val >= 0.f) { templevel[dir - 1][level][y][x] = val; // } else { @@ -7269,6 +7309,13 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f #pragma omp parallel { gaussianBlur(templevel[dir - 1][level], templevel[dir - 1][level], W_L, H_L, radlevblur * klev); + + if (chromablu != 1.f && !blurlc) { + gaussianBlur(templevela[dir - 1][level], templevela[dir - 1][level], W_L, H_L, radlevblur * klev * chromablu); + gaussianBlur(templevelb[dir - 1][level], templevelb[dir - 1][level], W_L, H_L, radlevblur * klev * chromablu); + + } + } } } @@ -7281,10 +7328,22 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f int W_L = wdspot->level_W(level); int H_L = wdspot->level_H(level); float **wav_L = wdspot->level_coeffs(level); + float **wav_a = nullptr; + float **wav_b = nullptr; + // float **wav_LN = wdspotneg->level_coeffs(level); + if (chromablu != 1.f) { + wav_a = wdspota->level_coeffs(level); + wav_b = wdspotb->level_coeffs(level); + } for (int y = 0; y < H_L; y++) { for (int x = 0; x < W_L; x++) { wav_L[dir][y * W_L + x] = templevel[dir - 1][level][y][x]; + if (chromablu != 1.f) { + wav_a[dir][y * W_L + x] = templevela[dir - 1][level][y][x]; + wav_b[dir][y * W_L + x] = templevelb[dir - 1][level][y][x]; + } + } } } @@ -7313,6 +7372,34 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f delete [] templevel; + + + if (chromablu != 1.f) { + for (int i = 0; i < dir; i++) { + for (int j = 0; j < leve; j++) { + for (int l = 0; l < H_L; l++) { + delete [] templevela[i][j][l]; + delete [] templevelb[i][j][l]; + } + } + } + + for (int i = 0; i < dir; i++) { + for (int j = 0; j < leve; j++) { + delete [] templevela[i][j]; + delete [] templevelb[i][j]; + } + } + + for (int i = 0; i < dir; i++) { + delete [] templevela[i]; + delete [] templevelb[i]; + } + + delete [] templevela; + delete [] templevelb; + + } } } @@ -7388,12 +7475,14 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f //reconstruct all and compress dynamic range positive wdspot->reconstruct(tmp[0], 1.f); - if(chromalev != 1.f) { + + if (chromalev != 1.f || chromablu != 1.f) { wdspota->reconstruct(tmpa[0], 1.f); wdspotb->reconstruct(tmpb[0], 1.f); delete wdspota; delete wdspotb; } + delete wdspot; //compress dynamic range negative in case of - seems no need @@ -9502,7 +9591,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); + 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); } int shado = params->locallab.spots.at(sp).shadmaskbl; @@ -11431,8 +11520,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o 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); + 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); const float satur = params->locallab.spots.at(sp).residchro; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 092fc2892..fab7c6b3a 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -905,6 +905,7 @@ enum ProcEventCode { Evlocallabchromasklc = 876, EvlocallabLmasklcshape = 877, Evlocallabchromalev = 878, + Evlocallabchromablu = 879, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4966c4294..91ca115e6 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2728,6 +2728,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : residchro(0.0), sigma(1.0), chromalev(1.0), + chromablu(1.0), fatdet(40.0), fatanch(50.0), fatres(0.0), @@ -3134,6 +3135,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && residchro == other.residchro && sigma == other.sigma && chromalev == other.chromalev + && chromablu == other.chromablu && fatdet == other.fatdet && fatanch == other.fatanch && fatres == other.fatres @@ -4519,6 +4521,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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).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); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatanch, "Locallab", "Fatanch_" + std::to_string(i), spot.fatanch, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatres, "Locallab", "Fatres_" + std::to_string(i), spot.fatres, keyFile); @@ -6055,6 +6058,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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", "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); assignFromKeyfile(keyFile, "Locallab", "Fatanch_" + std::to_string(i), pedited, spot.fatanch, spotEdited.fatanch); assignFromKeyfile(keyFile, "Locallab", "Fatres_" + std::to_string(i), pedited, spot.fatres, spotEdited.fatres); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 2ec92b873..d19bbfa53 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1271,6 +1271,7 @@ struct LocallabParams { double residchro; double sigma; double chromalev; + double chromablu; double fatdet; double fatanch; double fatres; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 9275302c4..ae35bf279 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -908,7 +908,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabradmasklc LUMINANCECURVE, //Evlocallabchromasklc LUMINANCECURVE, //EvlocallabLmasklcshape - LUMINANCECURVE //Evlocallabchromalev + LUMINANCECURVE, //Evlocallabchromalev + LUMINANCECURVE //Evlocallabchromablu }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 047b2e7fb..48ca18bfd 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -576,6 +576,7 @@ 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.))), 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.))), fatanch(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 1., 100., 1., 50., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), fatres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATRES"), 0., 100., 1., 0.))), @@ -2899,6 +2900,7 @@ pe(nullptr) residchro->setAdjusterListener(this); sigma->setAdjusterListener(this); chromalev->setAdjusterListener(this); + chromablu->setAdjusterListener(this); fatdet->setAdjusterListener(this); fatanch->setAdjusterListener(this); fatres->setAdjusterListener(this); @@ -2930,6 +2932,7 @@ pe(nullptr) blurlevelFrame->set_label_align(0.025, 0.5); ToolParamBlock* const blurlevcontBox = Gtk::manage(new ToolParamBlock()); blurlevcontBox->pack_start(*levelblur); + blurlevcontBox->pack_start(*chromablu); blurlevcontBox->pack_start(*LocalcurveEditorwavlev, Gtk::PACK_SHRINK, 4); blurlevcontBox->pack_start(*separatorblu); blurlevcontBox->pack_start(*residblur); @@ -5253,6 +5256,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).chromalev = chromalev->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).chromablu = chromablu->getValue(); pp->locallab.spots.at(pp->locallab.selspot).fatdet = fatdet->getValue(); pp->locallab.spots.at(pp->locallab.selspot).fatanch = fatanch->getValue(); pp->locallab.spots.at(pp->locallab.selspot).fatres = fatres->getValue(); @@ -5662,6 +5666,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).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(); pe->locallab.spots.at(pp->locallab.selspot).fatanch = pe->locallab.spots.at(pp->locallab.selspot).fatanch || fatanch->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).fatres = pe->locallab.spots.at(pp->locallab.selspot).fatres || fatres->getEditedState(); @@ -6070,6 +6075,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).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(); pedited->locallab.spots.at(pp->locallab.selspot).fatanch = pedited->locallab.spots.at(pp->locallab.selspot).fatanch || fatanch->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).fatres = pedited->locallab.spots.at(pp->locallab.selspot).fatres || fatres->getEditedState(); @@ -6647,6 +6653,7 @@ void Locallab::localcontMethodChanged() residchro->hide(); sigma->hide(); chromalev->hide(); + chromablu->hide(); fatdet->hide(); fatanch->hide(); fatres->hide(); @@ -6674,6 +6681,7 @@ void Locallab::localcontMethodChanged() residchro->show(); sigma->show(); chromalev->show(); + chromablu->show(); fatdet->show(); fatanch->show(); fatres->show(); @@ -8748,6 +8756,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residchro->setDefault(defSpot->residchro); sigma->setDefault(defSpot->sigma); chromalev->setDefault(defSpot->chromalev); + chromablu->setDefault(defSpot->chromablu); fatdet->setDefault(defSpot->fatdet); fatanch->setDefault(defSpot->fatanch); fatres->setDefault(defSpot->fatres); @@ -8988,6 +8997,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residchro->setDefaultEditedState(Irrelevant); sigma->setDefaultEditedState(Irrelevant); chromalev->setDefaultEditedState(Irrelevant); + chromablu->setDefaultEditedState(Irrelevant); fatdet->setDefaultEditedState(Irrelevant); fatanch->setDefaultEditedState(Irrelevant); fatres->setDefaultEditedState(Irrelevant); @@ -9233,6 +9243,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residchro->setDefaultEditedState(defSpotState->residchro ? Edited : UnEdited); sigma->setDefaultEditedState(defSpotState->sigma ? Edited : UnEdited); chromalev->setDefaultEditedState(defSpotState->chromalev ? Edited : UnEdited); + chromablu->setDefaultEditedState(defSpotState->chromablu ? Edited : UnEdited); fatdet->setDefaultEditedState(defSpotState->fatdet ? Edited : UnEdited); fatanch->setDefaultEditedState(defSpotState->fatanch ? Edited : UnEdited); fatres->setDefaultEditedState(defSpotState->fatres ? Edited : UnEdited); @@ -10416,6 +10427,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == chromablu) { + if (listener) { + listener->panelChanged(Evlocallabchromablu, chromablu->getTextValue()); + } + } + if (a == fatdet) { if (listener) { listener->panelChanged(Evlocallabfatdet, fatdet->getTextValue()); @@ -10926,6 +10943,7 @@ void Locallab::setBatchMode(bool batchMode) residchro->showEditedCB(); sigma->showEditedCB(); chromalev->showEditedCB(); + chromablu->showEditedCB(); fatdet->showEditedCB(); fatanch->showEditedCB(); fatres->showEditedCB(); @@ -11989,6 +12007,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con residchro->setValue(pp->locallab.spots.at(index).residchro); sigma->setValue(pp->locallab.spots.at(index).sigma); chromalev->setValue(pp->locallab.spots.at(index).chromalev); + chromablu->setValue(pp->locallab.spots.at(index).chromablu); fatdet->setValue(pp->locallab.spots.at(index).fatdet); fatanch->setValue(pp->locallab.spots.at(index).fatanch); fatres->setValue(pp->locallab.spots.at(index).fatres); @@ -12502,6 +12521,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con residchro->setEditedState(spotState->residchro ? Edited : UnEdited); sigma->setEditedState(spotState->sigma ? Edited : UnEdited); chromalev->setEditedState(spotState->chromalev ? Edited : UnEdited); + chromablu->setEditedState(spotState->chromablu ? Edited : UnEdited); fatdet->setEditedState(spotState->fatdet ? Edited : UnEdited); fatanch->setEditedState(spotState->fatanch ? Edited : UnEdited); fatres->setEditedState(spotState->fatres ? Edited : UnEdited); @@ -13026,6 +13046,7 @@ void Locallab::updateSpecificGUIState() residchro->hide(); sigma->hide(); chromalev->hide(); + chromablu->hide(); fatdet->hide(); fatanch->hide(); fatres->hide(); @@ -13052,6 +13073,7 @@ void Locallab::updateSpecificGUIState() levelblur->show(); sigma->show(); chromalev->show(); + chromablu->show(); fatdet->show(); fatanch->show(); fatres->show(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 4ea28118a..87375f510 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -371,6 +371,7 @@ private: Adjuster* const residchro; Adjuster* const sigma; Adjuster* const chromalev; + Adjuster* const chromablu; Adjuster* const fatdet; Adjuster* const fatanch; Adjuster* const fatres; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 7295fdd82..d1baa9ed1 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1264,6 +1264,7 @@ void ParamsEdited::initFrom(const std::vector& 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).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; locallab.spots.at(j).fatanch = locallab.spots.at(j).fatanch && pSpot.fatanch == otherSpot.fatanch; locallab.spots.at(j).fatres = locallab.spots.at(j).fatres && pSpot.fatres == otherSpot.fatres; @@ -4031,6 +4032,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).chromalev = mods.locallab.spots.at(i).chromalev; } + if (locallab.spots.at(i).chromablu) { + toEdit.locallab.spots.at(i).chromablu = mods.locallab.spots.at(i).chromablu; + } + if (locallab.spots.at(i).fatdet) { toEdit.locallab.spots.at(i).fatdet = mods.locallab.spots.at(i).fatdet; } @@ -5603,6 +5608,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : residchro(v), sigma(v), chromalev(v), + chromablu(v), fatdet(v), fatanch(v), fatres(v), @@ -5999,6 +6005,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) residchro = v; sigma = v; chromalev = v; + chromablu = v; fatdet = v; fatanch = v; fatres = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index b7542040a..a1e784011 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -697,6 +697,7 @@ public: bool residchro; bool sigma; bool chromalev; + bool chromablu; bool fatdet; bool fatanch; bool fatres;