diff --git a/rtdata/languages/default b/rtdata/languages/default index 4b91668cc..d2c57707e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1239,6 +1239,11 @@ HISTORY_MSG_991;Local - Denoise threshold mask low HISTORY_MSG_992;Local - Denoise threshold mask high HISTORY_MSG_993;Local - Denoise Inverse algo HISTORY_MSG_994;Local - GF Inverse algo +HISTORY_MSG_995;Local - Denoise decay +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_BLSHAPE;Blur by level HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURWAV;Blur luminance @@ -2776,16 +2781,17 @@ 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. 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_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Light-tone limit above which Color and Light will be restored progressively to their original values prior to being modified by the Color and Light settings .\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘structure mask’, ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’, ‘Local contrast wavelet’.\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_MASKHIGTHRESD_TOOLTIP;Light-tone limit above which denoise will be progressively applied.\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘structure mask’, ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’, ‘Local contrast wavelet’.\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_MASKHIGTHRES_TOOLTIP;Light-tone limit above which 'Guided Filter' will be progressively applied.\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘structure mask’, ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’, ‘Local contrast wavelet’.\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_MASKHIGTHRES_TOOLTIP;Light limit above which the GuidedFilter will be applied progressively.\n You can used some tools in 'mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n You can use 'lockable color picker' on mask to see what areas will be take into account. Be carefull in 'settings' to Background color mask = 0 -TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;Light limit above which the denoise will be applied progressively.\n You can used some tools in 'mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n You can use 'lockable color picker' on mask to see what areas will be take into account. Be carefull in 'settings' to Background color mask = 0 TP_LOCALLAB_MASKLCTHR;Light area luminance threshold TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold TP_LOCALLAB_MASKLNOISELOW;Reinforce denoise in dark and light areas TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;Dark-tone limit below which 'Guided Filter' will be progressively applied.\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘structure mask’, ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’, ‘Local contrast wavelet’.\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_MASKLOWTHRESD_TOOLTIP;Dark-tone limit below which denoise will be progressively applied.\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘structure mask’, ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’, ‘Local contrast wavelet’.\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_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which Color and Light will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in ‘Mask and modifications’ to change the gray levels: ‘structure mask’, ‘Smooth radius’, ‘Gamma and slope’, ‘Contrast curve’, ‘Local contrast wavelet’.\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_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 f19deeeca..79cb1b938 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -586,6 +586,10 @@ struct local_params { float lowthrd; float higthrd; float decayd; + float recothrc; + float lowthrc; + float higthrc; + float decayc; int noiselequal; float noisechrodetail; float bilat; @@ -1041,6 +1045,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float local_lowthrd = (float)locallab.spots.at(sp).lowthresd; 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; + float local_lowthrc = (float)locallab.spots.at(sp).lowthresc; + float local_higthrc = (float)locallab.spots.at(sp).higthresc; + float local_decayc = (float)locallab.spots.at(sp).decayc; float local_noisecf = ((float)locallab.spots.at(sp).noisechrof) / 10.f; float local_noisecc = ((float)locallab.spots.at(sp).noisechroc) / 10.f; @@ -1395,6 +1403,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.lowthrd = local_lowthrd; lp.higthrd = local_higthrd; lp.decayd = local_decayd; + lp.recothrc = local_recothrc; + lp.lowthrc = local_lowthrc; + lp.higthrc = local_higthrc; + lp.decayc = local_decayc; lp.noiselequal = local_noiselequal; lp.noisechrodetail = local_noisechrodetail; lp.noiselc = local_noiselc; @@ -15345,6 +15357,82 @@ void ImProcFunctions::Lab_Local( if (lp.softradiuscol > 0.f) { softproc(bufcolorig.get(), bufcolfin.get(), lp.softradiuscol, bfh, bfw, 0.001, 0.00001, 0.5f, sk, multiThread, 1); } + //mask recovery + + if(lp.enaColorMask && lp.recothrc != 1.f) { + LabImage tmp3(bfw, bfh); + + for (int y = 0; y < bfh; y++){ + for (int x = 0; x < bfw; x++) { + tmp3.L[y][x] = original->L[y + ystart][x + xstart]; + tmp3.a[y][x] = original->a[y + ystart][x + xstart]; + tmp3.b[y][x] = original->b[y + ystart][x + xstart]; + } + } + array2D masklum; + masklum(bfw, bfh); + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + masklum[ir][jr] = 1.f; + } + + float hig = lp.higthrc; + float higc; + calcdif(hig, higc); + float low = lp.lowthrc; + float lowc; + calcdif(low, lowc); + + if(higc < lowc) { + higc = lowc + 0.01f; + } + float th = (lp.recothrc - 1.f); + float ahigh = th / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + + float alow = th / lowc; + float blow = 1.f - th; + bool invmaskc = false; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + const float lM = bufmaskblurcol->L[ir][jr]; + const float lmr = lM / 327.68f; + if (lM < 327.68f * lowc) { + masklum[ir][jr] = alow * lmr + blow; + } else if (lM < 327.68f * higc) { + + } else { + masklum[ir][jr] = ahigh * lmr + bhigh; + } + float k = masklum[ir][jr]; + if(invmaskc == false) { + masklum[ir][jr] = 1 - pow(k, lp.decayc); + } else { + masklum[ir][jr] = pow(k, lp.decayc); + } + + } + + for (int i = 0; i < 3; ++i) { + boxblur(masklum, masklum, 10 / sk, bfw, bfh, false); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + bufcolfin->L[i][j] = (tmp3.L[i][j] - bufcolfin->L[i][j]) * LIM01(masklum[i][j]) + bufcolfin->L[i][j]; + bufcolfin->a[i][j] = (tmp3.a[i][j] - bufcolfin->a[i][j]) * LIM01(masklum[i][j]) + bufcolfin->a[i][j]; + bufcolfin->b[i][j] = (tmp3.b[i][j] - bufcolfin->b[i][j]) * LIM01(masklum[i][j]) + bufcolfin->b[i][j]; + } + } + masklum.free(); + + } float meansob = 0.f; transit_shapedetect2(call, 0, bufcolorig.get(), bufcolfin.get(), originalmaskcol.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 8ae9e1e4e..efe7d5b33 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -1018,6 +1018,10 @@ enum ProcEventCode { Evlocallabinvmaskd = 992, Evlocallabinvmask = 993, Evlocallabdecayd = 994, + Evlocallabrecothresc = 995, + Evlocallablowthresc = 996, + Evlocallabhigthresc = 997, + Evlocallabdecayc = 998, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9037484ef..a53f2eb69 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3026,6 +3026,10 @@ LocallabParams::LocallabSpot::LocallabSpot() : 0.35 }, csthresholdcol(0, 0, 6, 5, false), + recothresc(1.), + lowthresc(12.), + higthresc(85.), + decayc(2.), // Exposure visiexpose(false), expexpose(false), @@ -4222,6 +4226,10 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && Lmaskcurve == other.Lmaskcurve && LLmaskcolcurvewav == other.LLmaskcolcurvewav && csthresholdcol == other.csthresholdcol + && recothresc == other.recothresc + && lowthresc == other.lowthresc + && higthresc == other.higthresc + && decayc == other.decayc // Exposure && visiexpose == other.visiexpose && expexpose == other.expexpose @@ -5817,6 +5825,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->Lmaskcurve, "Locallab", "LmaskCurve_" + index_str, spot.Lmaskcurve, keyFile); saveToKeyfile(!pedited || spot_edited->LLmaskcolcurvewav, "Locallab", "LLmaskcolCurvewav_" + index_str, spot.LLmaskcolcurvewav, keyFile); saveToKeyfile(!pedited || spot_edited->csthresholdcol, "Locallab", "CSThresholdcol_" + index_str, spot.csthresholdcol.toVector(), keyFile); + saveToKeyfile(!pedited || spot_edited->recothresc, "Locallab", "Recothresc_" + index_str, spot.recothresc, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthresc, "Locallab", "Lowthresc_" + index_str, spot.lowthresc, keyFile); + saveToKeyfile(!pedited || spot_edited->higthresc, "Locallab", "Higthresc_" + index_str, spot.higthresc, keyFile); + saveToKeyfile(!pedited || spot_edited->decayc, "Locallab", "Decayc_" + index_str, spot.decayc, keyFile); } // Exposure if ((!pedited || spot_edited->visiexpose) && spot.visiexpose) { @@ -7600,6 +7612,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) spotEdited.csthresholdcol = true; } + assignFromKeyfile(keyFile, "Locallab", "Recothresc_" + index_str, pedited, spot.recothresc, spotEdited.recothresc); + assignFromKeyfile(keyFile, "Locallab", "Lowthresc_" + index_str, pedited, spot.lowthresc, spotEdited.lowthresc); + assignFromKeyfile(keyFile, "Locallab", "Higthresc_" + index_str, pedited, spot.higthresc, spotEdited.higthresc); + assignFromKeyfile(keyFile, "Locallab", "Decayc_" + index_str, pedited, spot.decayc, spotEdited.decayc); // Exposure spot.visiexpose = assignFromKeyfile(keyFile, "Locallab", "Expexpose_" + index_str, pedited, spot.expexpose, spotEdited.expexpose); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7a7f7f8d5..451467b1a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1084,6 +1084,10 @@ struct LocallabParams { std::vector Lmaskcurve; std::vector LLmaskcolcurvewav; Threshold csthresholdcol; + double recothresc; + double lowthresc; + double higthresc; + double decayc; // Exposure bool visiexpose; bool expexpose; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d6079456f..1705f8d6f 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -1021,7 +1021,11 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabhigthresd LUMINANCECURVE, // Evlocallabinvmaskd LUMINANCECURVE, // Evlocallabinvmask - LUMINANCECURVE // Evlocallabdecayd + LUMINANCECURVE, // Evlocallabdecayd + LUMINANCECURVE, // Evlocallabrecothresc + LUMINANCECURVE, // Evlocallablowthresc + LUMINANCECURVE, // Evlocallabhigthresc + LUMINANCECURVE // Evlocallabdecayc }; diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 217096cac..71e293c96 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -424,6 +424,13 @@ LocallabColor::LocallabColor(): structcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL1"), 0, 100, 1, 0))), blurcolde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), softradiuscol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), + exprecov(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + lowthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decayc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), invers(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), expgradcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), strcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRLUM"), -4., 4., 0.05, 0.))), @@ -531,6 +538,11 @@ LocallabColor::LocallabColor(): softradiuscol->setLogScale(10, 0); softradiuscol->setAdjusterListener(this); + recothresc->setAdjusterListener(this); + lowthresc->setAdjusterListener(this); + higthresc->setAdjusterListener(this); + decayc->setAdjusterListener(this); + setExpandAlignProperties(exprecov, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); inversConn = invers->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::inversChanged)); invers->set_tooltip_text(M("TP_LOCALLAB_INVERS_TOOLTIP")); @@ -788,6 +800,18 @@ LocallabColor::LocallabColor(): pack_start(*blurcolde); pack_start(*softradiuscol); pack_start(*invers); + ToolParamBlock* const colBox3 = Gtk::manage(new ToolParamBlock()); + colBox3->pack_start(*maskusablec, Gtk::PACK_SHRINK, 0); + colBox3->pack_start(*maskunusablec, Gtk::PACK_SHRINK, 0); + colBox3->pack_start(*recothresc); + colBox3->pack_start(*lowthresc); + colBox3->pack_start(*higthresc); + colBox3->pack_start(*decayc); + // colBox3->pack_start(*invmaskc); + exprecov->add(*colBox3, false); + pack_start(*exprecov, false, false); + + ToolParamBlock* const gradcolBox = Gtk::manage(new ToolParamBlock()); gradcolBox->pack_start(*strcol); gradcolBox->pack_start(*strcolab); @@ -923,6 +947,7 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) strengthgrid->set_tooltip_text(M("TP_LOCALLAB_STRENGRID_TOOLTIP")); blurcolde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP")); softradiuscol->set_tooltip_text(M("TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP")); + exprecov->set_tooltip_markup(M("TP_LOCALLAB_MASKRECOL_TOOLTIP")); expgradcol->set_tooltip_text(M("TP_LOCALLAB_EXPGRADCOL_TOOLTIP")); rgbCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_RGBCURVE_TOOLTIP")); sensi->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); @@ -963,6 +988,9 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) blurcol->set_tooltip_text(M("TP_LOCALLAB_BLURRMASK_TOOLTIP")); lapmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); csThresholdcol->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); + decayc->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthresc->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP")); + higthresc->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP")); } else { lumFrame->set_tooltip_text(""); lightness->set_tooltip_text(""); @@ -970,6 +998,7 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) strengthgrid->set_tooltip_text(""); blurcolde->set_tooltip_text(""); softradiuscol->set_tooltip_text(""); + exprecov->set_tooltip_markup(""); expgradcol->set_tooltip_text(""); rgbCurveEditorG->set_tooltip_text(""); sensi->set_tooltip_text(""); @@ -1010,11 +1039,15 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) mask2CurveEditorGwav->set_tooltip_text(""); LLmaskcolshapewav->setTooltip(""); csThresholdcol->set_tooltip_text(""); + decayc->set_tooltip_text(""); + lowthresc->set_tooltip_text(""); + higthresc->set_tooltip_text(""); } } void LocallabColor::setDefaultExpanderVisibility() { + exprecov->set_expanded(false); expgradcol->set_expanded(false); expcurvcol->set_expanded(false); expmaskcol1->set_expanded(false); @@ -1142,6 +1175,11 @@ void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const Param merMethod->set_active(3); } + recothresc->setValue((double)spot.recothresc); + lowthresc->setValue((double)spot.lowthresc); + higthresc->setValue((double)spot.higthresc); + decayc->setValue((double)spot.decayc); + if (spot.mergecolMethod == "one") { mergecolMethod->set_active(0); } else if (spot.mergecolMethod == "two") { @@ -1275,6 +1313,11 @@ void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe spot.strcolh = strcolh->getValue(); spot.angcol = angcol->getValue(); + spot.recothresc = recothresc->getValue(); + spot.lowthresc = lowthresc->getValue(); + spot.higthresc = higthresc->getValue(); + spot.decayc = decayc->getValue(); + if (qualitycurveMethod->get_active_row_number() == 0) { spot.qualitycurveMethod = "none"; } else if (qualitycurveMethod->get_active_row_number() == 1) { @@ -1438,6 +1481,11 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam slomaskcol->setDefault(defSpot.slomaskcol); shadmaskcol->setDefault((double)defSpot.shadmaskcol); csThresholdcol->setDefault(defSpot.csthresholdcol); + recothresc->setDefault((double)defSpot.recothresc); + lowthresc->setDefault((double)defSpot.lowthresc); + higthresc->setDefault((double)defSpot.higthresc); + decayc->setDefault((double)defSpot.decayc); + } // Note: No need to manage pedited as batch mode is deactivated for Locallab @@ -1502,6 +1550,36 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval) } } + if (a == recothresc) { + + if (listener) { + listener->panelChanged(Evlocallabrecothresc, + recothresc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + + if (a == lowthresc) { + if (listener) { + listener->panelChanged(Evlocallablowthresc, + lowthresc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + + if (a == higthresc) { + if (listener) { + listener->panelChanged(Evlocallabhigthresc, + higthresc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + + if (a == decayc) { + if (listener) { + listener->panelChanged(Evlocallabdecayc, + decayc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + + if (a == strcol) { if (listener) { listener->panelChanged(Evlocallabstrcol, @@ -1867,6 +1945,7 @@ void LocallabColor::convertParamToNormal() HHhmaskshape->setCurve(defSpot.HHhmaskcurve); LLmaskcolshapewav->setCurve(defSpot.LLmaskcolcurvewav); csThresholdcol->setValue(defSpot.csthresholdcol); + decayc->setValue(defSpot.decayc); // Enable all listeners enableListener(); @@ -1901,13 +1980,17 @@ void LocallabColor::convertParamToSimple() showmaskcolMethod->set_active(0); showmaskcolMethodinv->set_active(0); enaColorMask->set_active(defSpot.enaColorMask); - CCmaskshape->setCurve(defSpot.CCmaskcurve); - LLmaskshape->setCurve(defSpot.LLmaskcurve); - HHmaskshape->setCurve(defSpot.HHmaskcurve); - blendmaskcol->setValue((double)defSpot.blendmaskcol); - radmaskcol->setValue(defSpot.radmaskcol); - chromaskcol->setValue(defSpot.chromaskcol); - Lmaskshape->setCurve(defSpot.Lmaskcurve); +// CCmaskshape->setCurve(defSpot.CCmaskcurve); +// LLmaskshape->setCurve(defSpot.LLmaskcurve); +// HHmaskshape->setCurve(defSpot.HHmaskcurve); +// blendmaskcol->setValue((double)defSpot.blendmaskcol); +// radmaskcol->setValue(defSpot.radmaskcol); +// chromaskcol->setValue(defSpot.chromaskcol); +// Lmaskshape->setCurve(defSpot.Lmaskcurve); + recothresc->setValue(defSpot.recothresc); + lowthresc->setValue(defSpot.lowthresc); + higthresc->setValue(defSpot.higthresc); + decayc->setValue(defSpot.decayc); // Enable all listeners enableListener(); @@ -1925,7 +2008,10 @@ void LocallabColor::updateGUIToMode(const modeType new_type) expcurvcol->hide(); expmaskcol1->hide(); expmaskcol->hide(); - + exprecov->hide(); + maskusablec->hide(); + maskunusablec->hide(); + decayc->hide(); break; case Normal: @@ -1940,6 +2026,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type) H2CurveEditorG->hide(); rgbCurveEditorG->hide(); special->hide(); + exprecov->show(); expmaskcol1->hide(); struFrame->hide(); blurFrame->hide(); @@ -1952,13 +2039,23 @@ void LocallabColor::updateGUIToMode(const modeType new_type) csThresholdcol->hide(); // Specific Simple mode widgets are shown in Normal mode softradiuscol->show(); + if (enaColorMask->get_active()) { + maskusablec->show(); + maskunusablec->hide(); + + } else { + maskusablec->hide(); + maskunusablec->show(); + } if (!invers->get_active()) { // Keep widget hidden when invers is toggled expgradcol->show(); + exprecov->show(); } expcurvcol->show(); expmaskcol->show(); + decayc->hide(); break; @@ -1970,11 +2067,23 @@ void LocallabColor::updateGUIToMode(const modeType new_type) if (!invers->get_active()) { // Keep widget hidden when invers is toggled softradiuscol->show(); expgradcol->show(); + exprecov->show(); } strcolab->show(); strcolh->show(); expcurvcol->show(); + if (enaColorMask->get_active()) { + maskusablec->show(); + maskunusablec->hide(); + + } else { + maskusablec->hide(); + maskunusablec->show(); + } + + exprecov->show(); + decayc->show(); if (!invers->get_active()) { // Keep widgets hidden when invers is toggled clCurveEditorG->show(); @@ -2173,6 +2282,15 @@ void LocallabColor::showmaskcolMethodChangedinv() void LocallabColor::enaColorMaskChanged() { + if (enaColorMask->get_active()) { + maskusablec->show(); + maskunusablec->hide(); + + } else { + maskusablec->hide(); + maskunusablec->show(); + } + if (isLocActivated && exp->getEnabled()) { if (listener) { if (enaColorMask->get_active()) { @@ -2227,6 +2345,7 @@ void LocallabColor::updateColorGUI1() structcol->hide(); softradiuscol->hide(); expgradcol->hide(); + exprecov->hide(); labqualcurv->hide(); qualitycurveMethod->hide(); clCurveEditorG->hide(); @@ -2251,6 +2370,7 @@ void LocallabColor::updateColorGUI1() if (mode == Expert || mode == Normal) { // Keep widget hidden in Simple mode softradiuscol->show(); expgradcol->show(); + exprecov->show(); } labqualcurv->show(); @@ -3250,13 +3370,13 @@ void LocallabExposure::convertParamToSimple() softradiusexp->setValue(defSpot.softradiusexp); enaExpMask->set_active(defSpot.enaExpMask); enaExpMaskaft->set_active(defSpot.enaExpMaskaft); - CCmaskexpshape->setCurve(defSpot.CCmaskexpcurve); - LLmaskexpshape->setCurve(defSpot.CCmaskexpcurve); - HHmaskexpshape->setCurve(defSpot.HHmaskexpcurve); - blendmaskexp->setValue((double)defSpot.blendmaskexp); - radmaskexp->setValue(defSpot.radmaskexp); - chromaskexp->setValue(defSpot.chromaskexp); - Lmaskexpshape->setCurve(defSpot.Lmaskexpcurve); + // CCmaskexpshape->setCurve(defSpot.CCmaskexpcurve); + // LLmaskexpshape->setCurve(defSpot.CCmaskexpcurve); + // HHmaskexpshape->setCurve(defSpot.HHmaskexpcurve); + // blendmaskexp->setValue((double)defSpot.blendmaskexp); + // radmaskexp->setValue(defSpot.radmaskexp); +// chromaskexp->setValue(defSpot.chromaskexp); +// Lmaskexpshape->setCurve(defSpot.Lmaskexpcurve); // Enable all listeners enableListener(); @@ -4262,13 +4382,13 @@ void LocallabShadow::convertParamToSimple() showmaskSHMethod->set_active(0); showmaskSHMethodinv->set_active(0); enaSHMask->set_active(defSpot.enaSHMask); - CCmaskSHshape->setCurve(defSpot.CCmaskSHcurve); - LLmaskSHshape->setCurve(defSpot.LLmaskSHcurve); - HHmaskSHshape->setCurve(defSpot.HHmaskSHcurve); - blendmaskSH->setValue((double)defSpot.blendmaskSH); - radmaskSH->setValue(defSpot.radmaskSH); - chromaskSH->setValue(defSpot.chromaskSH); - LmaskSHshape->setCurve(defSpot.LmaskSHcurve); + // CCmaskSHshape->setCurve(defSpot.CCmaskSHcurve); + // LLmaskSHshape->setCurve(defSpot.LLmaskSHcurve); + // HHmaskSHshape->setCurve(defSpot.HHmaskSHcurve); + // blendmaskSH->setValue((double)defSpot.blendmaskSH); + // radmaskSH->setValue(defSpot.radmaskSH); + // chromaskSH->setValue(defSpot.chromaskSH); + // LmaskSHshape->setCurve(defSpot.LmaskSHcurve); // Enable all listeners enableListener(); @@ -5169,13 +5289,13 @@ void LocallabVibrance::convertParamToSimple() angvib->setValue(defSpot.angvib); showmaskvibMethod->set_active(0); enavibMask->set_active(defSpot.enavibMask); - CCmaskvibshape->setCurve(defSpot.CCmaskvibcurve); - LLmaskvibshape->setCurve(defSpot.LLmaskvibcurve); - HHmaskvibshape->setCurve(defSpot.HHmaskvibcurve); - blendmaskvib->setValue((double)defSpot.blendmaskvib); - radmaskvib->setValue(defSpot.radmaskvib); - chromaskvib->setValue(defSpot.chromaskvib); - Lmaskvibshape->setCurve(defSpot.Lmaskvibcurve); + // CCmaskvibshape->setCurve(defSpot.CCmaskvibcurve); + // LLmaskvibshape->setCurve(defSpot.LLmaskvibcurve); + // HHmaskvibshape->setCurve(defSpot.HHmaskvibcurve); + // blendmaskvib->setValue((double)defSpot.blendmaskvib); + // radmaskvib->setValue(defSpot.radmaskvib); + // chromaskvib->setValue(defSpot.chromaskvib); + // Lmaskvibshape->setCurve(defSpot.Lmaskvibcurve); // Enable all listener enableListener(); @@ -7158,15 +7278,15 @@ void LocallabBlur::convertParamToSimple() } lnoiselow->setValue(defSpot.lnoiselow); enablMask->set_active(defSpot.enablMask); - CCmaskblshape->setCurve(defSpot.CCmaskblcurve); - LLmaskblshape->setCurve(defSpot.LLmaskblcurve); - HHmaskblshape->setCurve(defSpot.HHmaskblcurve); - blendmaskbl->setValue((double)defSpot.blendmaskbl); - radmaskbl->setValue(defSpot.radmaskbl); - chromaskbl->setValue(defSpot.chromaskbl); - gammaskbl->setValue(defSpot.gammaskbl); - slomaskbl->setValue(defSpot.slomaskbl); - Lmaskblshape->setCurve(defSpot.Lmasklccurve); + // CCmaskblshape->setCurve(defSpot.CCmaskblcurve); + // LLmaskblshape->setCurve(defSpot.LLmaskblcurve); + // HHmaskblshape->setCurve(defSpot.HHmaskblcurve); + // blendmaskbl->setValue((double)defSpot.blendmaskbl); + // radmaskbl->setValue(defSpot.radmaskbl); + // chromaskbl->setValue(defSpot.chromaskbl); + // gammaskbl->setValue(defSpot.gammaskbl); + // slomaskbl->setValue(defSpot.slomaskbl); + // Lmaskblshape->setCurve(defSpot.Lmasklccurve); levelthr->setValue(defSpot.levelthr); lnoiselow->setValue(defSpot.lnoiselow); levelthrlow->setValue(defSpot.levelthrlow); diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 4410f823e..6d3bb9b50 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -189,6 +189,13 @@ private: Adjuster* const structcol; Adjuster* const blurcolde; Adjuster* const softradiuscol; + MyExpander* const exprecov; + Gtk::Label* const maskusablec; + Gtk::Label* const maskunusablec; + Adjuster* const recothresc; + Adjuster* const lowthresc; + Adjuster* const higthresc; + Adjuster* const decayc; Gtk::CheckButton* const invers; MyExpander* const expgradcol; Adjuster* const strcol; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 52d5d9ad3..aa08fe86d 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -555,13 +555,13 @@ void LocallabTone::convertParamToSimple() showmasktmMethod->set_active(0); enatmMask->set_active(defSpot.enatmMask); enatmMaskaft->set_active(defSpot.enatmMaskaft); - CCmasktmshape->setCurve(defSpot.CCmasktmcurve); - LLmasktmshape->setCurve(defSpot.LLmasktmcurve); - HHmasktmshape->setCurve(defSpot.HHmasktmcurve); - blendmasktm->setValue((double)defSpot.blendmasktm); - radmasktm->setValue(defSpot.radmasktm); - chromasktm->setValue(defSpot.chromasktm); - Lmasktmshape->setCurve(defSpot.Lmasktmcurve); +// CCmasktmshape->setCurve(defSpot.CCmasktmcurve); +// LLmasktmshape->setCurve(defSpot.LLmasktmcurve); +// HHmasktmshape->setCurve(defSpot.HHmasktmcurve); +// blendmasktm->setValue((double)defSpot.blendmasktm); +// radmasktm->setValue(defSpot.radmasktm); +// chromasktm->setValue(defSpot.chromasktm); +// Lmasktmshape->setCurve(defSpot.Lmasktmcurve); // Enable all listeners enableListener(); @@ -3584,13 +3584,13 @@ void LocallabContrast::convertParamToSimple() showmasklcMethod->set_active(0); enalcMask->set_active(defSpot.enalcMask); - CCmasklcshape->setCurve(defSpot.CCmasklccurve); - LLmasklcshape->setCurve(defSpot.LLmasklccurve); - HHmasklcshape->setCurve(defSpot.HHmasklccurve); - blendmasklc->setValue((double)defSpot.blendmasklc); - radmasklc->setValue(defSpot.radmasklc); - chromasklc->setValue(defSpot.chromasklc); - Lmasklcshape->setCurve(defSpot.Lmasklccurve); +// CCmasklcshape->setCurve(defSpot.CCmasklccurve); +// LLmasklcshape->setCurve(defSpot.LLmasklccurve); +// HHmasklcshape->setCurve(defSpot.HHmasklccurve); +// blendmasklc->setValue((double)defSpot.blendmasklc); +// radmasklc->setValue(defSpot.radmasklc); +// chromasklc->setValue(defSpot.chromasklc); +// Lmasklcshape->setCurve(defSpot.Lmasklccurve); // Enable all listeners enableListener(); @@ -4505,15 +4505,15 @@ void LocallabCBDL::convertParamToSimple() softradiuscb->setValue(defSpot.softradiuscb); showmaskcbMethod->set_active(0); enacbMask->set_active(defSpot.enacbMask); - CCmaskcbshape->setCurve(defSpot.CCmaskcbcurve); - LLmaskcbshape->setCurve(defSpot.LLmaskcbcurve); - HHmaskcbshape->setCurve(defSpot.HHmaskcbcurve); - blendmaskcb->setValue((double)defSpot.blendmaskcb); - radmaskcb->setValue(defSpot.radmaskcb); - chromaskcb->setValue(defSpot.chromaskcb); - gammaskcb->setValue(defSpot.gammaskcb); - slomaskcb->setValue(defSpot.slomaskcb); - Lmaskcbshape->setCurve(defSpot.Lmaskcbcurve); +// CCmaskcbshape->setCurve(defSpot.CCmaskcbcurve); +// LLmaskcbshape->setCurve(defSpot.LLmaskcbcurve); +// HHmaskcbshape->setCurve(defSpot.HHmaskcbcurve); +// blendmaskcb->setValue((double)defSpot.blendmaskcb); +// radmaskcb->setValue(defSpot.radmaskcb); +// chromaskcb->setValue(defSpot.chromaskcb); +// gammaskcb->setValue(defSpot.gammaskcb); +// slomaskcb->setValue(defSpot.slomaskcb); +// Lmaskcbshape->setCurve(defSpot.Lmaskcbcurve); // Enable all listers enableListener(); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 350a7f87f..cc5e3ef59 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1151,6 +1151,10 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).Lmaskcurve = locallab.spots.at(j).Lmaskcurve && pSpot.Lmaskcurve == otherSpot.Lmaskcurve; locallab.spots.at(j).LLmaskcolcurvewav = locallab.spots.at(j).LLmaskcolcurvewav && pSpot.LLmaskcolcurvewav == otherSpot.LLmaskcolcurvewav; locallab.spots.at(j).csthresholdcol = locallab.spots.at(j).csthresholdcol && pSpot.csthresholdcol == otherSpot.csthresholdcol; + locallab.spots.at(j).recothresc = locallab.spots.at(j).recothresc && pSpot.recothresc == otherSpot.recothresc; + locallab.spots.at(j).lowthresc = locallab.spots.at(j).lowthresc && pSpot.lowthresc == otherSpot.lowthresc; + locallab.spots.at(j).higthresc = locallab.spots.at(j).higthresc && pSpot.higthresc == otherSpot.higthresc; + locallab.spots.at(j).decayc = locallab.spots.at(j).decayc && pSpot.decayc == otherSpot.decayc; // Exposure locallab.spots.at(j).visiexpose = locallab.spots.at(j).visiexpose && pSpot.visiexpose == otherSpot.visiexpose; locallab.spots.at(j).expexpose = locallab.spots.at(j).expexpose && pSpot.expexpose == otherSpot.expexpose; @@ -3562,6 +3566,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).csthresholdcol = mods.locallab.spots.at(i).csthresholdcol; } + if (locallab.spots.at(i).recothresc) { + toEdit.locallab.spots.at(i).recothresc = mods.locallab.spots.at(i).recothresc; + } + + if (locallab.spots.at(i).lowthresc) { + toEdit.locallab.spots.at(i).lowthresc = mods.locallab.spots.at(i).lowthresc; + } + + if (locallab.spots.at(i).higthresc) { + toEdit.locallab.spots.at(i).higthresc = mods.locallab.spots.at(i).higthresc; + } + + if (locallab.spots.at(i).decayc) { + toEdit.locallab.spots.at(i).decayc = mods.locallab.spots.at(i).decayc; + } + // Exposure if (locallab.spots.at(i).visiexpose) { toEdit.locallab.spots.at(i).visiexpose = mods.locallab.spots.at(i).visiexpose; @@ -6504,6 +6524,10 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : Lmaskcurve(v), LLmaskcolcurvewav(v), csthresholdcol(v), + recothresc(v), + lowthresc(v), + higthresc(v), + decayc(v), // Exposure visiexpose(v), expexpose(v), @@ -7028,6 +7052,10 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) Lmaskcurve = v; LLmaskcolcurvewav = v; csthresholdcol = v; + recothresc = v; + lowthresc = v; + higthresc = v; + decayc = v; // Exposure visiexpose = v; expexpose = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index eccbc7a43..d48f251db 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -492,6 +492,10 @@ public: bool Lmaskcurve; bool LLmaskcolcurvewav; bool csthresholdcol; + bool recothresc; + bool lowthresc; + bool higthresc; + bool decayc; // Exposure bool visiexpose; bool expexpose;