diff --git a/rtdata/languages/default b/rtdata/languages/default index 68c9b0a8d..3b7e026f0 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1244,7 +1244,7 @@ HISTORY_MSG_996;Local - Color recovery threshold HISTORY_MSG_997;Local - Color threshold mask low HISTORY_MSG_998;Local - Color threshold mask high HISTORY_MSG_999;Local - Color decay -HISTORY_MSG_1000;Local - Denoise gray +HISTORY_MSG_1000;Local - Denoise luminance gray HISTORY_MSG_1001;Local - Log recovery threshold HISTORY_MSG_1002;Local - Log threshold mask low HISTORY_MSG_1003;Local - Log threshold mask high @@ -1265,6 +1265,7 @@ HISTORY_MSG_1017;Local - lc recovery threshold HISTORY_MSG_1018;Local - lc threshold mask low HISTORY_MSG_1019;Local - lc threshold mask high HISTORY_MSG_1020;Local - lc decay +HISTORY_MSG_1021;Local - Denoise chrominance gray HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURWAV;Blur luminance @@ -2800,7 +2801,7 @@ TP_LOCALLAB_MASKDDECAY;Decay strength TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions TP_LOCALLAB_MASKH;Hue curve TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n if the mask is very dark - below the threshold 'dark' - denoise will be increased if reinforce > 1.\n if the mask is clear - above the threshold 'light' - denoise will be progressively cancelled.\n between the two, denoise will be maintained at the settings without mask. -TP_LOCALLAB_MASKDE_TOOLTIP;Used to direct the Denoise based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the ‘dark’ threshold, then the Denoise will be applied progressively.\n if the mask is above the ‘light’ threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you act on the slider "Gray area denoise". +TP_LOCALLAB_MASKDE_TOOLTIP;Used to direct the Denoise based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the ‘dark’ threshold, then the Denoise will be applied progressively.\n if the mask is above the ‘light’ threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you act on the sliders "Gray area luminance denoise" or "Gray area chrominance denoise". TP_LOCALLAB_MASKGF_TOOLTIP;Used to direct the Guided Filter based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the ‘dark’ threshold, then the GF will be applied progressively.\n if the mask is above the ‘light’ threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The ‘dark’ and ‘light’ areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The ‘dark’ and ‘light’ areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied @@ -2830,7 +2831,9 @@ TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which Shadows Highligts TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which Vibrance and Warm Cool will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’.\n Use a ‘lockable color picker’ on the mask to see which areas will be affected. Be carefull in 'settings' to Background color mask = 0 TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which Local contrast and Wavelet will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’.\n Use a ‘lockable color picker’ on the mask to see which areas will be affected. Be carefull in 'settings' to Background color mask = 0 -TP_LOCALLAB_MASKLCTHRMID;Gray area denoise +TP_LOCALLAB_MASKLCTHRMID;Gray area luminance denoise +TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chrominance denoise + TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) TP_LOCALLAB_MASKRECOTHRES;Recovery threshold diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index cfb56afb9..e9032ae22 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -585,6 +585,7 @@ struct local_params { float recothrd; float lowthrd; float midthrd; + float midthrdch; float higthrd; float decayd; float recothrc; @@ -1077,6 +1078,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float local_recothrd = (float)locallab.spots.at(sp).recothresd; float local_lowthrd = (float)locallab.spots.at(sp).lowthresd; float local_midthrd = (float)locallab.spots.at(sp).midthresd; + float local_midthrdch = (float)locallab.spots.at(sp).midthresdch; float local_higthrd = (float)locallab.spots.at(sp).higthresd; float local_decayd = (float)locallab.spots.at(sp).decayd; float local_recothrc = (float)locallab.spots.at(sp).recothresc; @@ -1460,6 +1462,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.higthr = local_higthr; lp.recothrd = local_recothrd; lp.midthrd = local_midthrd; + lp.midthrdch = local_midthrdch; lp.lowthrd = local_lowthrd; lp.higthrd = local_higthrd; lp.decayd = local_decayd; @@ -9524,10 +9527,13 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl } array2D masklum; + array2D masklumch; masklum(GW, GH); + masklumch(GW, GH); for (int ir = 0; ir < GH; ir++) for (int jr = 0; jr < GW; jr++) { masklum[ir][jr] = 1.f; + masklumch[ir][jr] = 1.f; } float hig = lp.higthrd; @@ -9537,6 +9543,7 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl float lowc; calcdif(low, lowc); float mid = 0.01f * lp.midthrd; + float midch = 0.01f * lp.midthrdch; if(higc < lowc) { higc = lowc + 0.01f; @@ -9556,22 +9563,29 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl const float lmr = lM / 327.68f; if (lM < 327.68f * lowc) { masklum[ir][jr] = alow * lmr + blow; + masklumch[ir][jr] = alow * lmr + blow; } else if (lM < 327.68f * higc) { masklum[ir][jr] = (1.f - mid); + masklumch[ir][jr] = (1.f - midch); } else { masklum[ir][jr] = ahigh * lmr + bhigh; + masklumch[ir][jr] = ahigh * lmr + bhigh; } float k = masklum[ir][jr]; + float kch = masklumch[ir][jr]; if(lp.invmaskd == true) { - masklum[ir][jr] = 1 - pow(k, lp.decayd); + masklum[ir][jr] = 1.f - pow(k, lp.decayd); + masklumch[ir][jr] = 1.f - pow(kch, lp.decayd); } else { masklum[ir][jr] = pow(k, lp.decayd); + masklumch[ir][jr] = pow(kch, lp.decayd); } } for (int i = 0; i < 3; ++i) { boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, GW, GH, false); + boxblur(static_cast(masklumch), static_cast(masklumch), 10 / sk, GW, GH, false); } #ifdef _OPENMP #pragma omp parallel for if (multiThread) @@ -9579,12 +9593,12 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl for (int i = 0; i < GH; ++i) { for (int j = 0; j < GW; ++j) { tmp1.L[i][j] = (tmp3.L[i][j] - tmp1.L[i][j]) * LIM01(masklum[i][j]) + tmp1.L[i][j]; - tmp1.a[i][j] = (tmp3.a[i][j] - tmp1.a[i][j]) * LIM01(masklum[i][j]) + tmp1.a[i][j]; - tmp1.b[i][j] = (tmp3.b[i][j] - tmp1.b[i][j]) * LIM01(masklum[i][j]) + tmp1.b[i][j]; + tmp1.a[i][j] = (tmp3.a[i][j] - tmp1.a[i][j]) * LIM01(masklumch[i][j]) + tmp1.a[i][j]; + tmp1.b[i][j] = (tmp3.b[i][j] - tmp1.b[i][j]) * LIM01(masklumch[i][j]) + tmp1.b[i][j]; } } masklum.free(); - + masklumch.free(); } DeNoise_Local(call, lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk); @@ -10212,10 +10226,13 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl } array2D masklum; + array2D masklumch; masklum(bfw, bfh); + masklumch(bfw, bfh); for (int ir = 0; ir < bfh; ir++){ for (int jr = 0; jr < bfw; jr++) { masklum[ir][jr] = 1.f; + masklumch[ir][jr] = 1.f; } } @@ -10226,6 +10243,7 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl float lowc; calcdif(low, lowc); float mid = 0.01f * lp.midthrd; + float midch = 0.01f * lp.midthrdch; if(higc < lowc) { higc = lowc + 0.01f; @@ -10247,22 +10265,29 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl const float lmr = lM / 327.68f; if (lM < 327.68f * lowc) { masklum[y-ystart][x-xstart] = alow * lmr + blow; + masklumch[y-ystart][x-xstart] = alow * lmr + blow; } else if (lM < 327.68f * higc) { masklum[y-ystart][x-xstart] = 1.f - mid; + masklumch[y-ystart][x-xstart] = 1.f - midch; } else { masklum[y-ystart][x-xstart] = ahigh * lmr + bhigh; + masklumch[y-ystart][x-xstart] = ahigh * lmr + bhigh; } float k = masklum[y-ystart][x-xstart]; + float kch = masklumch[y-ystart][x-xstart]; if(lp.invmaskd == true) { - masklum[y-ystart][x-xstart] = 1 - pow(k, lp.decayd); + masklum[y-ystart][x-xstart] = 1.f - pow(k, lp.decayd); + masklumch[y-ystart][x-xstart] = 1.f - pow(kch, lp.decayd); } else { masklum[y-ystart][x-xstart] = pow(k, lp.decayd); + masklumch[y-ystart][x-xstart] = pow(kch, lp.decayd); } } } for (int i = 0; i < 3; ++i) { boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, bfw, bfh, false); + boxblur(static_cast(masklumch), static_cast(masklumch), 10 / sk, bfw, bfh, false); } #ifdef _OPENMP @@ -10271,12 +10296,13 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl for (int y = 0; y < bfh; y++) { for (int x = 0; x < bfw; x++) { bufwv.L[y][x] = (tmp3.L[y][x] - bufwv.L[y][x]) * LIM01(masklum[y][x]) + bufwv.L[y][x]; - bufwv.a[y][x] = (tmp3.a[y][x] - bufwv.a[y][x]) * LIM01(masklum[y][x]) + bufwv.a[y][x]; - bufwv.b[y][x] = (tmp3.b[y][x] - bufwv.b[y][x]) * LIM01(masklum[y][x]) + bufwv.b[y][x]; + bufwv.a[y][x] = (tmp3.a[y][x] - bufwv.a[y][x]) * LIM01(masklumch[y][x]) + bufwv.a[y][x]; + bufwv.b[y][x] = (tmp3.b[y][x] - bufwv.b[y][x]) * LIM01(masklumch[y][x]) + bufwv.b[y][x]; } } masklum.free(); + masklumch.free(); } DeNoise_Local2(lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 5d30e8cb4..65a9d5b81 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -1043,6 +1043,7 @@ enum ProcEventCode { Evlocallablowthresw = 1017, Evlocallabhigthresw = 1018, Evlocallabdecayw = 1019, + Evlocallabmidthresdch = 1020, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 476c79318..4dd2c1d85 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3320,6 +3320,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : recothresd(1.), lowthresd(12.), midthresd(0.), + midthresdch(0.), higthresd(85.), decayd(2.), isogr(400), @@ -4398,6 +4399,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && recothresd == other.recothresd && lowthresd == other.lowthresd && midthresd == other.midthresd + && midthresdch == other.midthresdch && higthresd == other.higthresd && decayd == other.decayd && isogr == other.isogr @@ -6018,6 +6020,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->recothresd, "Locallab", "Recothresd_" + index_str, spot.recothresd, keyFile); saveToKeyfile(!pedited || spot_edited->lowthresd, "Locallab", "Lowthresd_" + index_str, spot.lowthresd, keyFile); saveToKeyfile(!pedited || spot_edited->midthresd, "Locallab", "Midthresd_" + index_str, spot.midthresd, keyFile); + saveToKeyfile(!pedited || spot_edited->midthresdch, "Locallab", "Midthresdch_" + index_str, spot.midthresdch, keyFile); saveToKeyfile(!pedited || spot_edited->higthresd, "Locallab", "Higthresd_" + index_str, spot.higthresd, keyFile); saveToKeyfile(!pedited || spot_edited->decayd, "Locallab", "Decayd_" + index_str, spot.decayd, keyFile); saveToKeyfile(!pedited || spot_edited->isogr, "Locallab", "Isogr_" + index_str, spot.isogr, keyFile); @@ -7854,6 +7857,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Recothresd_" + index_str, pedited, spot.recothresd, spotEdited.recothresd); assignFromKeyfile(keyFile, "Locallab", "Lowthresd_" + index_str, pedited, spot.lowthresd, spotEdited.lowthresd); assignFromKeyfile(keyFile, "Locallab", "Midthresd_" + index_str, pedited, spot.midthresd, spotEdited.midthresd); + assignFromKeyfile(keyFile, "Locallab", "Midthresdch_" + index_str, pedited, spot.midthresdch, spotEdited.midthresdch); assignFromKeyfile(keyFile, "Locallab", "Higthresd_" + index_str, pedited, spot.higthresd, spotEdited.higthresd); assignFromKeyfile(keyFile, "Locallab", "Decayd_" + index_str, pedited, spot.decayd, spotEdited.decayd); assignFromKeyfile(keyFile, "Locallab", "Isogr_" + index_str, pedited, spot.isogr, spotEdited.isogr); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index dd394de7d..bc9d212e9 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1227,6 +1227,7 @@ struct LocallabParams { double recothresd; double lowthresd; double midthresd; + double midthresdch; double higthresd; double decayd; int isogr; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 75dff967f..9b3fd2365 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -1046,7 +1046,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabrecothrew LUMINANCECURVE, // Evlocallablowthresw LUMINANCECURVE, // Evlocallabhigthresw - LUMINANCECURVE // Evlocallabdecayw + LUMINANCECURVE, // Evlocallabdecayw + LUMINANCECURVE // Evlocallabmidthresdch }; diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 5db535ae2..244438e4b 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -6253,6 +6253,7 @@ LocallabBlur::LocallabBlur(): recothresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), lowthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), midthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRMID"), 0., 100., 0.5, 0.))), + midthresdch(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRMIDCH"), 0., 100., 0.5, 0.))), higthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), decayd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), invmaskd(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVMASK")))), @@ -6423,6 +6424,7 @@ LocallabBlur::LocallabBlur(): recothresd->setAdjusterListener(this); lowthresd->setAdjusterListener(this); midthresd->setAdjusterListener(this); + midthresdch->setAdjusterListener(this); higthresd->setAdjusterListener(this); decayd->setAdjusterListener(this); @@ -6581,6 +6583,7 @@ LocallabBlur::LocallabBlur(): wavBox3->pack_start(*recothresd); wavBox3->pack_start(*lowthresd); wavBox3->pack_start(*midthresd); + wavBox3->pack_start(*midthresdch); wavBox3->pack_start(*higthresd); wavBox3->pack_start(*decayd); wavBox3->pack_start(*invmaskd); @@ -6800,6 +6803,7 @@ void LocallabBlur::neutral_pressed () recothresd->setValue(defSpot.recothresd); lowthresd->setValue(defSpot.lowthresd); midthresd->setValue(defSpot.midthresd); + midthresdch->setValue(defSpot.midthresdch); higthresd->setValue(defSpot.higthresd); decayd->setValue(defSpot.decayd); recothres->setValue(defSpot.recothres); @@ -6920,6 +6924,7 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params recothresd->setValue((double)spot.recothresd); lowthresd->setValue((double)spot.lowthresd); midthresd->setValue((double)spot.midthresd); + midthresdch->setValue((double)spot.midthresdch); higthresd->setValue((double)spot.higthresd); decayd->setValue((double)spot.decayd); @@ -7057,6 +7062,7 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped spot.recothresd = recothresd->getValue(); spot.lowthresd = lowthresd->getValue(); spot.midthresd = midthresd->getValue(); + spot.midthresdch = midthresdch->getValue(); spot.higthresd = higthresd->getValue(); spot.decayd = decayd->getValue(); @@ -7157,6 +7163,7 @@ void LocallabBlur::setDefaults(const rtengine::procparams::ProcParams* defParams recothresd->setDefault((double)defSpot.recothresd); lowthresd->setDefault((double)defSpot.lowthresd); midthresd->setDefault((double)defSpot.midthresd); + midthresdch->setDefault((double)defSpot.midthresdch); higthresd->setDefault((double)defSpot.higthresd); decayd->setDefault((double)defSpot.decayd); noiselumf0->setDefault(defSpot.noiselumf0); @@ -7303,6 +7310,13 @@ void LocallabBlur::adjusterChanged(Adjuster* a, double newval) } } + if (a == midthresdch) { + if (listener) { + listener->panelChanged(Evlocallabmidthresdch, + midthresdch->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + if (a == higthresd) { if (listener) { listener->panelChanged(Evlocallabhigthresd, @@ -7657,6 +7671,7 @@ void LocallabBlur::convertParamToSimple() recothresd->setValue(defSpot.recothresd); lowthresd->setValue(defSpot.lowthresd); midthresd->setValue(defSpot.midthresd); + midthresdch->setValue(defSpot.midthresdch); higthresd->setValue(defSpot.higthresd); decayd->setValue(defSpot.decayd); recothres->setValue(defSpot.recothres); diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index bd8f7f665..9d17c2eec 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -726,6 +726,7 @@ private: Adjuster* const recothresd; Adjuster* const lowthresd; Adjuster* const midthresd; + Adjuster* const midthresdch; Adjuster* const higthresd; Adjuster* const decayd; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index a117ca1f5..102d6b499 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1298,6 +1298,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).recothresd = locallab.spots.at(j).recothresd && pSpot.recothresd == otherSpot.recothresd; locallab.spots.at(j).lowthresd = locallab.spots.at(j).lowthresd && pSpot.lowthresd == otherSpot.lowthresd; locallab.spots.at(j).midthresd = locallab.spots.at(j).midthresd && pSpot.midthresd == otherSpot.midthresd; + locallab.spots.at(j).midthresdch = locallab.spots.at(j).midthresdch && pSpot.midthresdch == otherSpot.midthresdch; locallab.spots.at(j).higthresd = locallab.spots.at(j).higthresd && pSpot.higthresd == otherSpot.higthresd; locallab.spots.at(j).decayd = locallab.spots.at(j).decayd && pSpot.decayd == otherSpot.decayd; locallab.spots.at(j).isogr = locallab.spots.at(j).isogr && pSpot.isogr == otherSpot.isogr; @@ -4146,6 +4147,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).midthresd = mods.locallab.spots.at(i).midthresd; } + if (locallab.spots.at(i).midthresdch) { + toEdit.locallab.spots.at(i).midthresdch = mods.locallab.spots.at(i).midthresdch; + } + if (locallab.spots.at(i).higthresd) { toEdit.locallab.spots.at(i).higthresd = mods.locallab.spots.at(i).higthresd; } @@ -6772,6 +6777,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : recothresd(v), lowthresd(v), midthresd(v), + midthresdch(v), higthresd(v), decayd(v), isogr(v), @@ -7325,6 +7331,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) recothresd = v; lowthresd = v; midthresd = v; + midthresdch = v; higthresd = v; decayd = v; isogr = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 04fa30f45..b56fea35b 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -635,6 +635,7 @@ public: bool recothresd; bool lowthresd; bool midthresd; + bool midthresdch; bool higthresd; bool decayd; bool isogr;