diff --git a/rtdata/languages/default b/rtdata/languages/default index ef4903ed2..60fe106e7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1102,7 +1102,7 @@ HISTORY_MSG_862;Local - Contrast Sigma luminance HISTORY_MSG_863;Local - Contrast Merge Original HISTORY_MSG_864;Local - Contrast Detail HISTORY_MSG_865;Local - Contrast Anchor -HISTORY_MSG_866;Local - Contrast Curve compression +HISTORY_MSG_867;Local - Contrast Amount residual HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2196,7 +2196,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 only +TP_LOCALLAB_BLURLC;Luminance Residual Image Only TP_LOCALLAB_BLURLEVELFRA;Blur Levels TP_LOCALLAB_BLURRESIDFRA;Blur Residual TP_LOCALLAB_BUTTON_ADD;Add @@ -2296,6 +2296,7 @@ TP_LOCALLAB_FATDETAIL;Detail TP_LOCALLAB_FATFRA;Dynamic Range Compression TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm.\nAnchor allows selection according to the images over or under exposed.\nUseful to increase Luminance for a Second spot near the current and using mask TP_LOCALLAB_FATLEVEL;Detail levels +TP_LOCALLAB_FATRES;Amount Residual Image TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\n.. TP_LOCALLAB_FEATVALUE;Feather gradient @@ -2455,7 +2456,7 @@ TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3 TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot TP_LOCALLAB_RESID;Residual Image -TP_LOCALLAB_RESIDBLUR;Blur +TP_LOCALLAB_RESIDBLUR;Blur Residual Image TP_LOCALLAB_RESIDCHRO;Residual image Chroma TP_LOCALLAB_RESIDCONT;Residual image Contrast TP_LOCALLAB_RETI;Dehaze - Retinex Strong local contrast diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index e4d1571b9..4ee3ba8ed 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -314,7 +314,7 @@ public: static void strcurv_data(std::string retistr, int *s_datc, int &siz); void blendstruc(int bfw, int bfh, LabImage* bufcolorig, float radius, float stru, array2D & blend2, int sk, bool multiThread); - void wavcontrast4(float ** tmp, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, const LocwavCurve & locwavCurve, bool & locwavutili, + void wavcontrast4(float ** tmp, float contrast, float fatres, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, 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, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index b7fb3f580..d00cd42f6 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -3999,7 +3999,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, contrast, 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); + wavcontrast4(bufmaskblurcol->L, 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); } @@ -6736,7 +6736,7 @@ void ImProcFunctions::fftw_tile_blur(int GW, int GH, int tilssize, int max_numbl fftwf_destroy_plan(plan_backward_blox[1]); fftwf_cleanup(); } -void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, +void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float fatres, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, 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, @@ -6753,6 +6753,39 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, int H_L = wdspot->level_H(0); float *wav_L0 = wdspot->coeff0; + FattalToneMappingParams fatParams; + fatParams.threshold = fatdet; + fatParams.anchor = fatanch; + + if (fatres > 0.f) { + fatParams.enabled = true; + fatParams.amount = fatres; + array2D bufl(W_L, H_L); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + bufl[y][x] = wav_L0[y * W_L + x]; + } + } + + ToneMapFattal02(nullptr, fatParams, 3, true, bufl, W_L, H_L); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + wav_L0[y * W_L + x] = bufl[y][x]; + } + } + + } + + if (radblur > 0.f) { array2D bufl(W_L, H_L); #ifdef _OPENMP @@ -6933,11 +6966,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, float ****templevel = nullptr; if (wavcurvelev || wavcurvecomp) { - FattalToneMappingParams fatParams; fatParams.enabled = wavcurvecomp; - fatParams.threshold = fatdet; - fatParams.amount = 50; - fatParams.anchor = fatanch; templevel = new float***[dir]; @@ -6972,6 +7001,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, //Compress dynamic range if (wavcurvecomp) { + printf("Dynamic Range levels\n"); for (int dir = 1; dir < 4; dir++) { for (int level = level_bl; level < maxlvl; ++level) { int W_L = wdspot->level_W(level); @@ -6992,7 +7022,9 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, //blur level and dir - if (wavcurvelev) { + if (wavcurvelev && radlevblur > 0.f) { + printf("Blur levels\n"); + for (int dir = 1; dir < 4; dir++) { for (int level = level_bl; level < maxlvl; ++level) { int W_L = wdspot->level_W(level); @@ -9121,7 +9153,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, contrast, 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); + wavcontrast4(bufmaskblurbl->L, 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); } int shado = params->locallab.spots.at(sp).shadmaskbl; @@ -10954,8 +10986,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float sigma = params->locallab.spots.at(sp).sigma; 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; - wavcontrast4(tmp1->L, contrast, 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); + wavcontrast4(tmp1->L, 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); const float satur = params->locallab.spots.at(sp).residchro; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 184d40ff3..ecbeb38af 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -892,6 +892,7 @@ enum ProcEventCode { Evlocallabfatdet = 863, Evlocallabfatanch = 864, EvlocallabwavCurvecomp = 865, + Evlocallabfatres = 866, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 5267509fb..4ac20a406 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2728,6 +2728,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : sigma(1.0), fatdet(40.0), fatanch(50.0), + fatres(0.0), clarilres(0.0), claricres(0.0), clarisoft(1.0), @@ -3121,6 +3122,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && sigma == other.sigma && fatdet == other.fatdet && fatanch == other.fatanch + && fatres == other.fatres && clarilres == other.clarilres && claricres == other.claricres && clarisoft == other.clarisoft @@ -4494,6 +4496,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sigma, "Locallab", "Sigma_" + std::to_string(i), spot.sigma, 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); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).clarilres, "Locallab", "ClariLres_" + std::to_string(i), spot.clarilres, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).claricres, "Locallab", "ClariCres_" + std::to_string(i), spot.claricres, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).clarisoft, "Locallab", "Clarisoft_" + std::to_string(i), spot.clarisoft, keyFile); @@ -6016,6 +6019,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Sigma_" + std::to_string(i), pedited, spot.sigma, spotEdited.sigma); 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); assignFromKeyfile(keyFile, "Locallab", "ClariLres_" + std::to_string(i), pedited, spot.clarilres, spotEdited.clarilres); assignFromKeyfile(keyFile, "Locallab", "ClariCres_" + std::to_string(i), pedited, spot.claricres, spotEdited.claricres); assignFromKeyfile(keyFile, "Locallab", "Clarisoft_" + std::to_string(i), pedited, spot.clarisoft, spotEdited.clarisoft); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 2c91d8d7a..3da6846d7 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1271,6 +1271,7 @@ struct LocallabParams { double sigma; double fatdet; double fatanch; + double fatres; double clarilres; double claricres; double clarisoft; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d9b89ab1c..d459f1c2e 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -895,7 +895,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallaboriglc LUMINANCECURVE, // Evlocallabfatdet LUMINANCECURVE, // Evlocallabfatanch - LUMINANCECURVE //EvlocallabwavCurvecomp + LUMINANCECURVE, //EvlocallabwavCurvecomp + LUMINANCECURVE //Evlocallabfatres }; namespace rtengine diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 144a28245..3703d78de 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1098,7 +1098,6 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingPa constexpr float min_luminance = 1.f; TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); -printf("OK 1\n"); #ifdef _OPENMP #pragma omp parallel for if(multiThread) #endif @@ -1112,7 +1111,6 @@ printf("OK 1\n"); } } } -printf("OK 2\n"); float oldMedian; const float percentile = float(LIM(fatParams.anchor, 1, 100)) / 100.f; @@ -1152,10 +1150,8 @@ printf("OK 2\n"); } rescale_nearest(Yr, L, multiThread); -printf("OK 3\n"); tmo_fattal02(w2, h2, L, L, alpha, beta, noise, detail_level, multiThread); -printf("OK 4\n"); const float hr = float(h2) / float(h); const float wr = float(w2) / float(w); @@ -1189,7 +1185,6 @@ printf("OK 4\n"); } } } -printf("OK 5\n"); } diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index e46eea105..e673d852a 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -563,6 +563,7 @@ 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.))), 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.))), multiplier( [this]() -> std::array { @@ -742,7 +743,6 @@ retitoolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETITOOLFRA")))), residFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RESID")))), clariFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), blurlevelFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_BLURLEVELFRA")))), -blurresidFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_BLURRESIDFRA")))), contFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTFRA")))), compFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COMPFRA")))), grainFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRAINFRA")))), @@ -2871,6 +2871,7 @@ pe(nullptr) sigma->setAdjusterListener(this); fatdet->setAdjusterListener(this); fatanch->setAdjusterListener(this); + fatres->setAdjusterListener(this); clarilres->setAdjusterListener(this); clarisoft->setLogScale(10, -10); clarisoft->setAdjusterListener(this); @@ -2883,24 +2884,23 @@ pe(nullptr) clariFrame->set_label_align(0.025, 0.5); ToolParamBlock* const clariBox = Gtk::manage(new ToolParamBlock()); clariBox->pack_start(*clarilres); - - clariBox->pack_start(*claricres); - - clariBox->pack_start(*clarisoft); + clariBox->pack_start(*claricres); + clariBox->pack_start(*clarisoft); clariBox->pack_start(*origlc); clariFrame->add(*clariBox); - blurresidFrame->set_label_align(0.025, 0.5); - ToolParamBlock* const blurcontraBox = Gtk::manage(new ToolParamBlock()); - blurcontraBox->pack_start(*residblur); - blurcontraBox->pack_start(*blurlc); - blurresidFrame->add(*blurcontraBox); + + Gtk::HSeparator* const separatorblu = Gtk::manage(new Gtk::HSeparator()); blurlevelFrame->set_label_align(0.025, 0.5); ToolParamBlock* const blurlevcontBox = Gtk::manage(new ToolParamBlock()); blurlevcontBox->pack_start(*levelblur); blurlevcontBox->pack_start(*LocalcurveEditorwavlev, Gtk::PACK_SHRINK, 4); + blurlevcontBox->pack_start(*separatorblu); + blurlevcontBox->pack_start(*residblur); + blurlevcontBox->pack_start(*blurlc); + blurlevelFrame->add(*blurlevcontBox); contFrame->set_label_align(0.025, 0.5); @@ -2909,11 +2909,15 @@ pe(nullptr) contlevBox->pack_start(*LocalcurveEditorwavcon, Gtk::PACK_SHRINK, 4); contFrame->add(*contlevBox); + Gtk::HSeparator* const separatorcomp = Gtk::manage(new Gtk::HSeparator()); + compFrame->set_label_align(0.025, 0.5); ToolParamBlock* const compBox = Gtk::manage(new ToolParamBlock()); compBox->pack_start(*fatdet); compBox->pack_start(*fatanch); compBox->pack_start(*LocalcurveEditorwavcomp, Gtk::PACK_SHRINK, 4); + compBox->pack_start(*separatorcomp); + compBox->pack_start(*fatres); compFrame->add(*compBox); setExpandAlignProperties(expcontrastpyr, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); @@ -2923,7 +2927,6 @@ pe(nullptr) blurcontBox->pack_start(*clariFrame); blurcontBox->pack_start(*contFrame); blurcontBox->pack_start(*compFrame); - blurcontBox->pack_start(*blurresidFrame); blurcontBox->pack_start(*blurlevelFrame); expcontrastpyr->add(*blurcontBox, false); @@ -5092,6 +5095,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).sigma = sigma->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(); pp->locallab.spots.at(pp->locallab.selspot).clarilres = clarilres->getValue(); pp->locallab.spots.at(pp->locallab.selspot).claricres = claricres->getValue(); pp->locallab.spots.at(pp->locallab.selspot).clarisoft = clarisoft->getValue(); @@ -5488,6 +5492,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).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(); pe->locallab.spots.at(pp->locallab.selspot).clarilres = pe->locallab.spots.at(pp->locallab.selspot).clarilres || clarilres->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).claricres = pe->locallab.spots.at(pp->locallab.selspot).claricres || claricres->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).clarisoft = pe->locallab.spots.at(pp->locallab.selspot).clarisoft || clarisoft->getEditedState(); @@ -5881,6 +5886,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).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(); pedited->locallab.spots.at(pp->locallab.selspot).clarilres = pedited->locallab.spots.at(pp->locallab.selspot).clarilres || clarilres->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).claricres = pedited->locallab.spots.at(pp->locallab.selspot).claricres || claricres->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).clarisoft = pedited->locallab.spots.at(pp->locallab.selspot).clarisoft || clarisoft->getEditedState(); @@ -6405,6 +6411,7 @@ void Locallab::localcontMethodChanged() sigma->hide(); fatdet->hide(); fatanch->hide(); + fatres->hide(); clarilres->hide(); claricres->hide(); clarisoft->hide(); @@ -6430,6 +6437,7 @@ void Locallab::localcontMethodChanged() sigma->show(); fatdet->show(); fatanch->show(); + fatres->show(); clarilres->show(); claricres->show(); clarisoft->show(); @@ -8438,6 +8446,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c sigma->setDefault(defSpot->sigma); fatdet->setDefault(defSpot->fatdet); fatanch->setDefault(defSpot->fatanch); + fatres->setDefault(defSpot->fatres); clarilres->setDefault(defSpot->clarilres); claricres->setDefault(defSpot->claricres); clarisoft->setDefault(defSpot->clarisoft); @@ -8673,6 +8682,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c sigma->setDefaultEditedState(Irrelevant); fatdet->setDefaultEditedState(Irrelevant); fatanch->setDefaultEditedState(Irrelevant); + fatres->setDefaultEditedState(Irrelevant); clarilres->setDefaultEditedState(Irrelevant); claricres->setDefaultEditedState(Irrelevant); clarisoft->setDefaultEditedState(Irrelevant); @@ -8913,6 +8923,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c sigma->setDefaultEditedState(defSpotState->sigma ? Edited : UnEdited); fatdet->setDefaultEditedState(defSpotState->fatdet ? Edited : UnEdited); fatanch->setDefaultEditedState(defSpotState->fatanch ? Edited : UnEdited); + fatres->setDefaultEditedState(defSpotState->fatres ? Edited : UnEdited); clarilres->setDefaultEditedState(defSpotState->clarilres ? Edited : UnEdited); claricres->setDefaultEditedState(defSpotState->claricres ? Edited : UnEdited); clarisoft->setDefaultEditedState(defSpotState->clarisoft ? Edited : UnEdited); @@ -10096,6 +10107,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == fatres) { + if (listener) { + listener->panelChanged(Evlocallabfatres, fatres->getTextValue()); + } + } + if (a == clarilres) { if (listener) { listener->panelChanged(Evlocallabclarilres, clarilres->getTextValue()); @@ -10570,6 +10587,7 @@ void Locallab::setBatchMode(bool batchMode) sigma->showEditedCB(); fatdet->showEditedCB(); fatanch->showEditedCB(); + fatres->showEditedCB(); clarilres->showEditedCB(); claricres->showEditedCB(); clarisoft->showEditedCB(); @@ -11623,6 +11641,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con sigma->setValue(pp->locallab.spots.at(index).sigma); fatdet->setValue(pp->locallab.spots.at(index).fatdet); fatanch->setValue(pp->locallab.spots.at(index).fatanch); + fatres->setValue(pp->locallab.spots.at(index).fatres); clarilres->setValue(pp->locallab.spots.at(index).clarilres); claricres->setValue(pp->locallab.spots.at(index).claricres); clarisoft->setValue(pp->locallab.spots.at(index).clarisoft); @@ -12123,6 +12142,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con sigma->setEditedState(spotState->sigma ? Edited : UnEdited); fatdet->setEditedState(spotState->fatdet ? Edited : UnEdited); fatanch->setEditedState(spotState->fatanch ? Edited : UnEdited); + fatres->setEditedState(spotState->fatres ? Edited : UnEdited); clarilres->setEditedState(spotState->clarilres ? Edited : UnEdited); claricres->setEditedState(spotState->claricres ? Edited : UnEdited); clarisoft->setEditedState(spotState->clarisoft ? Edited : UnEdited); @@ -12635,6 +12655,7 @@ void Locallab::updateSpecificGUIState() sigma->hide(); fatdet->hide(); fatanch->hide(); + fatres->hide(); clarilres->hide(); claricres->hide(); clarisoft->hide(); @@ -12659,6 +12680,7 @@ void Locallab::updateSpecificGUIState() sigma->show(); fatdet->show(); fatanch->show(); + fatres->show(); residchro->show(); clarilres->show(); claricres->show(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 71c1bdd37..9a59c779e 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -362,6 +362,7 @@ private: Adjuster* const sigma; Adjuster* const fatdet; Adjuster* const fatanch; + Adjuster* const fatres; // Contrast by detail levels const std::array multiplier; Adjuster* const chromacbdl; @@ -581,7 +582,6 @@ private: Gtk::Frame* const residFrame; Gtk::Frame* const clariFrame; Gtk::Frame* const blurlevelFrame; - Gtk::Frame* const blurresidFrame; Gtk::Frame* const contFrame; Gtk::Frame* const compFrame; Gtk::Frame* const grainFrame; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 4cc967c5d..f7ebe4c65 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1264,6 +1264,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).sigma = locallab.spots.at(j).sigma && pSpot.sigma == otherSpot.sigma; 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; locallab.spots.at(j).clarilres = locallab.spots.at(j).clarilres && pSpot.clarilres == otherSpot.clarilres; locallab.spots.at(j).claricres = locallab.spots.at(j).claricres && pSpot.claricres == otherSpot.claricres; locallab.spots.at(j).clarisoft = locallab.spots.at(j).clarisoft && pSpot.clarisoft == otherSpot.clarisoft; @@ -4017,6 +4018,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).fatanch = mods.locallab.spots.at(i).fatanch; } + if (locallab.spots.at(i).fatres) { + toEdit.locallab.spots.at(i).fatres = mods.locallab.spots.at(i).fatres; + } + if (locallab.spots.at(i).clarilres) { toEdit.locallab.spots.at(i).clarilres = mods.locallab.spots.at(i).clarilres; } @@ -5540,6 +5545,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : sigma(v), fatdet(v), fatanch(v), + fatres(v), clarilres(v), claricres(v), clarisoft(v), @@ -5923,6 +5929,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) sigma = v; fatdet = v; fatanch = v; + fatres = v; clarilres = v; claricres = v; clarisoft = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 3c3d38202..7cc426aee 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -697,6 +697,7 @@ public: bool sigma; bool fatdet; bool fatanch; + bool fatres; bool clarilres; bool claricres; bool clarisoft;