diff --git a/rtdata/languages/default b/rtdata/languages/default index 5c29a9bd0..a46f09a88 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -803,7 +803,7 @@ HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_MSG_THRESWAV;Balance threshold -HISTORY_MSG_SOFTWAV;Soft radius +HISTORY_MSG_BLUWAV;Maximum blur HISTORY_MSG_WAVOLDSH;Old algorithm HISTORY_MSG_WAVOFFSET;Offset HISTORY_MSG_BLSHAPE;Blur by level @@ -2145,6 +2145,7 @@ TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method TP_WAVELET_BLCURVE;Blur by levels TP_WAVELET_BLURFRAME;Blur +TP_WAVELET_BLUWAV;Maximum Blur TP_WAVELET_CBENAB;Toning and Color Balance TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted TP_WAVELET_CCURVE;Local contrast @@ -2284,7 +2285,6 @@ TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are tr TP_WAVELET_SKY;Sky targetting/protection TP_WAVELET_SKY_TOOLTIP;At -100 sky-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 sky-tones are protected while all other tones are affected. TP_WAVELET_SOFTRAD;Soft Radius -TP_WAVELET_SOFWAV;Soft Radius TP_WAVELET_STREN;Strength TP_WAVELET_STRENGTH;Strength TP_WAVELET_SUPE;Extra @@ -2313,7 +2313,7 @@ TP_WAVELET_USHARP;Clarity method TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels. TP_WAVELET_WAVOFFSET;Offset -TP_WAVELET_OFFSET_TOOLTIP;Offset acts on mean of signal.\nHigh values will favor action on the contrast of the highlights.\nLow values will favor action on the contrast of shadows +TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\n High values will amplify the contrast increase of the highlights, while low values will amplify the contrast increase of the shadows. TP_WBALANCE_AUTO;Auto TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation TP_WBALANCE_AUTOOLD;Auto RGB grey diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index ede980ee6..99b915c65 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -67,6 +67,7 @@ struct cont_params { float conresH; float blurres; float blurcres; + float bluwav; float radius; float chrores; bool oldsh; @@ -399,6 +400,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.oldsh = waparams.oldsh; cp.blurres = waparams.resblur; cp.blurcres = waparams.resblurc; + cp.bluwav = 0.01f * waparams.bluwav; //cp.hueres=waparams.reshue; cp.hueres = 2.f; cp.th = float(waparams.thr); @@ -1766,7 +1768,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //Blur luma if(cp.blurres != 0.f && cp.resena) { - float rad = cp.blurres / skip; + float rad = 0.7f * cp.blurres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; @@ -1951,7 +1953,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * ContAllL(koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); //blur levels float klev = 1.f; - if(wavblcurve && wavcurvecomp && cp.blena) { + if(wavblcurve && wavcurvecomp && cp.blena && cp.bluwav > 0.f) { float * bef = new float[Wlvl_L * Hlvl_L]; float * aft = new float[Wlvl_L * Hlvl_L]; @@ -1961,7 +1963,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } klev = (wavblcurve[lvl * 55.5f]); - klev *= lvl * 50.f / skip; + klev *= cp.bluwav * lvl * 15.f / skip; boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { @@ -2173,7 +2175,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float //Blur chroma if(cp.blurcres != 0.f && cp.resena) { - float rad = cp.blurcres / skip; + float rad = 0.7f * cp.blurcres / skip; float * bef = new float[W_L * H_L]; float * aft = new float[W_L * H_L]; @@ -2204,7 +2206,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - + for (int dir = 1; dir < 4; dir++) { for (int lvl = 0; lvl < maxlvl; lvl++) { @@ -2214,7 +2216,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); - if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + if(wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f && cp.bluwav > 0.f) { float * bef = new float[Wlvl_ab * Hlvl_ab]; float * aft = new float[Wlvl_ab * Hlvl_ab]; float klev; @@ -2223,7 +2225,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } klev = (wavblcurve[lvl * 55.5f]); - klev *= cp.chrwav * lvl * 100.f / skip; + klev *= cp.bluwav * cp.chrwav * lvl * 25.f / skip; boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 574e4f3a2..20ae540f5 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2318,7 +2318,7 @@ WaveletParams::WaveletParams() : radius(40), skinprotect(0.0), chrwav(0.), - softwav(1.0), + bluwav(50.0), hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), hllev(50, 75, 100, 98, false), @@ -2433,7 +2433,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && radius == other.radius && skinprotect == other.skinprotect && chrwav == other.chrwav - && softwav == other.softwav + && bluwav == other.bluwav && hueskin == other.hueskin && hueskin2 == other.hueskin2 && hllev == other.hllev @@ -3588,7 +3588,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chrwav, "Wavelet", "chrwav", wavelet.chrwav, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.softwav, "Wavelet", "Softwav", wavelet.softwav, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluwav, "Wavelet", "bluwav", wavelet.bluwav, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); @@ -4894,7 +4894,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); assignFromKeyfile(keyFile, "Wavelet", "chrwav", pedited, wavelet.chrwav, pedited->wavelet.chrwav); - assignFromKeyfile(keyFile, "Wavelet", "Softwav", pedited, wavelet.softwav, pedited->wavelet.softwav); + assignFromKeyfile(keyFile, "Wavelet", "bluwav", pedited, wavelet.bluwav, pedited->wavelet.bluwav); assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 62ca88690..8ca3e5c29 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1277,7 +1277,7 @@ struct WaveletParams { int radius; double skinprotect; double chrwav; - double softwav; + double bluwav; Threshold hueskin; Threshold hueskin2; Threshold hllev; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 4dc81fc5f..b3c2b64d7 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -546,7 +546,7 @@ void ParamsEdited::set(bool v) wavelet.bllev = v; wavelet.edgcont = v; wavelet.chrwav = v; - wavelet.softwav = v; + wavelet.bluwav = v; wavelet.level0noise = v; wavelet.level1noise = v; wavelet.level2noise = v; @@ -1149,7 +1149,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.bllev = wavelet.bllev && p.wavelet.bllev == other.wavelet.bllev; wavelet.edgcont = wavelet.edgcont && p.wavelet.edgcont == other.wavelet.edgcont; wavelet.chrwav = wavelet.chrwav && p.wavelet.chrwav == other.wavelet.chrwav; - wavelet.softwav = wavelet.softwav && p.wavelet.softwav == other.wavelet.softwav; + wavelet.bluwav = wavelet.bluwav && p.wavelet.bluwav == other.wavelet.bluwav; wavelet.level0noise = wavelet.level0noise && p.wavelet.level0noise == other.wavelet.level0noise; wavelet.level1noise = wavelet.level1noise && p.wavelet.level1noise == other.wavelet.level1noise; wavelet.level2noise = wavelet.level2noise && p.wavelet.level2noise == other.wavelet.level2noise; @@ -3061,8 +3061,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.chrwav = mods.wavelet.chrwav; } - if (wavelet.softwav) { - toEdit.wavelet.softwav = mods.wavelet.softwav; + if (wavelet.bluwav) { + toEdit.wavelet.bluwav = mods.wavelet.bluwav; } if (wavelet.level0noise) { diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index de688d856..43254b015 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -562,7 +562,7 @@ struct WaveletParamsEdited { bool bllev; bool edgcont; bool chrwav; - bool softwav; + bool bluwav; bool level0noise; bool level1noise; bool level2noise; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 5ad6fda55..be7c74015 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -89,6 +89,7 @@ Wavelet::Wavelet() : reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), + bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.0, 100.0, 0.5, 50.))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), @@ -132,7 +133,6 @@ Wavelet::Wavelet() : softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), chrwav(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRWAV"), 0., 100., 0., 0.))), - softwav(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFWAV"), -10.0, 1000.0, 0.5, 1.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), @@ -190,7 +190,7 @@ Wavelet::Wavelet() : EvWavchrwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_chrwav"); EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); - EvWavsoftwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SOFTWAV"); + EvWavbluwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLUWAV"); EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLSHAPE"); EvWavresblur = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURWAV"); EvWavresblurc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURCWAV"); @@ -663,15 +663,14 @@ Wavelet::Wavelet() : curveEditorbl->curveListComplete(); curveEditorbl->show(); + blBox->pack_start(*bluwav); + bluwav->setAdjusterListener(this); blBox->pack_start(*curveEditorbl, Gtk::PACK_SHRINK, 4); chrwav->setAdjusterListener(this); blBox->pack_start(*chrwav); - softwav->setLogScale(10, -10); - softwav->setAdjusterListener(this); -// blBox->pack_start(*softwav); // Gamut @@ -1357,7 +1356,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) satlev->setValue(pp->wavelet.satlev); edgcont->setValue(pp->wavelet.edgcont); chrwav->setValue(pp->wavelet.chrwav); - softwav->setValue(pp->wavelet.softwav); + bluwav->setValue(pp->wavelet.bluwav); greenlow->setValue(pp->wavelet.greenlow); bluelow->setValue(pp->wavelet.bluelow); @@ -1536,7 +1535,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited); edgcont->setEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); chrwav->setEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); - softwav->setEditedState(pedited->wavelet.softwav ? Edited : UnEdited); + bluwav->setEditedState(pedited->wavelet.bluwav ? Edited : UnEdited); level0noise->setEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -1712,7 +1711,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.bllev = bllev->getValue (); pp->wavelet.edgcont = edgcont->getValue (); pp->wavelet.chrwav = chrwav->getValue(); - pp->wavelet.softwav = softwav->getValue(); + pp->wavelet.bluwav = bluwav->getValue(); pp->wavelet.level0noise = level0noise->getValue (); pp->wavelet.level1noise = level1noise->getValue (); pp->wavelet.level2noise = level2noise->getValue (); @@ -1825,7 +1824,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.blcurve = !blshape->isUnChanged(); pedited->wavelet.edgcont = edgcont->getEditedState(); pedited->wavelet.chrwav = chrwav->getEditedState(); - pedited->wavelet.softwav = softwav->getEditedState(); + pedited->wavelet.bluwav = bluwav->getEditedState(); pedited->wavelet.level0noise = level0noise->getEditedState(); pedited->wavelet.level1noise = level1noise->getEditedState(); pedited->wavelet.level2noise = level2noise->getEditedState(); @@ -2070,7 +2069,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit satlev->setDefault (defParams->wavelet.satlev); edgcont->setDefault (defParams->wavelet.edgcont); chrwav->setDefault(defParams->wavelet.chrwav); - softwav->setDefault(defParams->wavelet.softwav); + bluwav->setDefault(defParams->wavelet.bluwav); level0noise->setDefault (defParams->wavelet.level0noise); level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); @@ -2138,7 +2137,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit satlev->setDefaultEditedState(pedited->wavelet.satlev ? Edited : UnEdited); edgcont->setDefaultEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); chrwav->setDefaultEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); - softwav->setDefaultEditedState(pedited->wavelet.softwav ? Edited : UnEdited); + bluwav->setDefaultEditedState(pedited->wavelet.bluwav ? Edited : UnEdited); strength->setDefaultEditedState(pedited->wavelet.strength ? Edited : UnEdited); balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); @@ -2192,7 +2191,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit bllev->setDefaultEditedState(Irrelevant); edgcont->setDefaultEditedState(Irrelevant); chrwav->setDefaultEditedState(Irrelevant); - softwav->setDefaultEditedState(Irrelevant); + bluwav->setDefaultEditedState(Irrelevant); level0noise->setDefaultEditedState(Irrelevant); level1noise->setDefaultEditedState(Irrelevant); level2noise->setDefaultEditedState(Irrelevant); @@ -2728,7 +2727,7 @@ void Wavelet::setBatchMode(bool batchMode) satlev->showEditedCB(); edgcont->showEditedCB(); chrwav->showEditedCB(); - softwav->showEditedCB(); + bluwav->showEditedCB(); strength->showEditedCB(); balance->showEditedCB(); iter->showEditedCB(); @@ -2899,8 +2898,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavbluelow, bluelow->getTextValue()); } else if (a == chrwav) { listener->panelChanged(EvWavchrwav, chrwav->getTextValue()); - } else if (a == softwav) { - listener->panelChanged(EvWavsoftwav, softwav->getTextValue()); + } else if (a == bluwav) { + listener->panelChanged(EvWavbluwav, bluwav->getTextValue()); } if ((a == correction[0] || a == correction[1] || a == correction[2] || a == correction[3] || a == correction[4] || a == correction[5] || a == correction[6] || a == correction[7] || a == correction[8])) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 635d8c7a7..67a45b5ac 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -83,7 +83,7 @@ private: rtengine::ProcEvent EvWavchrwav; rtengine::ProcEvent EvWavoldsh; rtengine::ProcEvent EvWavoffset; - rtengine::ProcEvent EvWavsoftwav; + rtengine::ProcEvent EvWavbluwav; rtengine::ProcEvent EvWavblshape; rtengine::ProcEvent EvWavresblur; rtengine::ProcEvent EvWavresblurc; @@ -189,6 +189,7 @@ private: Adjuster* const reschro; Adjuster* const resblur; Adjuster* const resblurc; + Adjuster* const bluwav; Adjuster* const tmrs; Adjuster* const edgs; Adjuster* const scale; @@ -241,7 +242,6 @@ private: Adjuster* const softrad; Adjuster* const softradend; Adjuster* const chrwav; - Adjuster* const softwav; MyComboBoxText* const Lmethod; sigc::connection Lmethodconn;