diff --git a/rtdata/languages/default b/rtdata/languages/default index 5832406de..8d4472f04 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -819,6 +819,7 @@ HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_EDGEFFECT;Edge Damper HISTORY_MSG_SIGMAFIN;Final contrast Damper HISTORY_MSG_SIGMATON;Toning Damper +HISTORY_MSG_SIGMACOL;Chroma Damper HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 9d50dedff..6fe88c209 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -115,6 +115,7 @@ struct cont_params { float balan; float sigmafin; float sigmaton; + float sigmacol; int ite; int contmet; bool opaW; @@ -195,6 +196,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.bam = false; cp.sigmafin = params->wavelet.sigmafin; cp.sigmaton = params->wavelet.sigmaton; + cp.sigmacol = params->wavelet.sigmacol; if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; @@ -3866,6 +3868,11 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f //to adjust increase contrast with local contrast bool useSkinControl = (skinprot != 0.f); + + + + + float alphaC = (1024.f + 15.f * cpMul * cpChrom / 50.f) / 1024.f ; for (int i = 0; i < W_ab * H_ab; i++) { @@ -3903,7 +3910,41 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f const float factorHard = (1.f - skinprotneg / 100.f); bool useSkinControl = (skinprot != 0.f); + + float mea[10]; + float effect = cp.sigmacol; + float betaab = 0.f; + float offs = 1.f; + + calceffect(level, meanab, sigmaab, mea, effect, offs); + for (int i = 0; i < W_ab * H_ab; i++) { + float WavCab = std::fabs(WavCoeffs_ab[dir][i]); + + if (WavCab < mea[0]) { + betaab = 0.05f; + } else if (WavCab < mea[1]) { + betaab = 0.2f; + } else if (WavCab < mea[2]) { + betaab = 0.7f; + } else if (WavCab < mea[3]) { + betaab = 1.f; //standard + } else if (WavCab < mea[4]) { + betaab = 1.f; + } else if (WavCab < mea[5]) { + betaab = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + betaab = 0.6f; + } else if (WavCab < mea[7]) { + betaab = 0.4f; + } else if (WavCab < mea[8]) { + betaab = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + betaab = 0.1f; + } else { + betaab = 0.0f; + } + int ii = i / W_ab; int jj = i - ii * W_ab; //WL and W_ab are identical @@ -3923,7 +3964,7 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } } - float beta = (1024.f + 20.f * cpMulC * scale) / 1024.f ; + float beta = (1024.f + 20.f * cpMulC * scale * betaab) / 1024.f ; if (beta < 0.02f) { beta = 0.02f; @@ -4022,12 +4063,11 @@ void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, f } else { betaab = 0.0f; } - } - float beta = (1024.f + 50.f * mulOpacity * betaab) / 1024.f ; - for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] *= beta; + float beta = (1024.f + 50.f * mulOpacity * betaab) / 1024.f ; + + WavCoeffs_ab[dir][co] *= beta; } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 8306f9a55..7b6a8f123 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2265,6 +2265,7 @@ WaveletParams::WaveletParams() : balance(0), sigmafin(1.0), sigmaton(1.0), + sigmacol(1.0), iter(0), expcontrast(false), expchroma(false), @@ -2381,6 +2382,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && balance == other.balance && sigmafin == other.sigmafin && sigmaton == other.sigmaton + && sigmacol == other.sigmacol && iter == other.iter && expcontrast == other.expcontrast && expchroma == other.expchroma @@ -3526,6 +3528,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmafin, "Wavelet", "Sigmafin", wavelet.sigmafin, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sigmaton, "Wavelet", "Sigmaton", wavelet.sigmaton, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmacol, "Wavelet", "Sigmacol", wavelet.sigmacol, keyFile); saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); @@ -4708,6 +4711,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); assignFromKeyfile(keyFile, "Wavelet", "Sigmafin", pedited, wavelet.sigmafin, pedited->wavelet.sigmafin); assignFromKeyfile(keyFile, "Wavelet", "Sigmaton", pedited, wavelet.sigmaton, pedited->wavelet.sigmaton); + assignFromKeyfile(keyFile, "Wavelet", "Sigmacol", pedited, wavelet.sigmacol, pedited->wavelet.sigmacol); assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 38883110b..536f260bc 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1223,6 +1223,7 @@ struct WaveletParams { int balance; double sigmafin; double sigmaton; + double sigmacol; int iter; bool expcontrast; bool expchroma; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index f6cfb78f9..8a97681e4 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -477,6 +477,7 @@ void ParamsEdited::set(bool v) wavelet.iter = v; wavelet.sigmafin = v; wavelet.sigmaton = v; + wavelet.sigmacol = v; wavelet.median = v; wavelet.medianlev = v; wavelet.linkedg = v; @@ -1090,6 +1091,7 @@ void ParamsEdited::initFrom(const std::vector& wavelet.iter = wavelet.iter && p.wavelet.iter == other.wavelet.iter; wavelet.sigmafin = wavelet.sigmafin && p.wavelet.sigmafin == other.wavelet.sigmafin; wavelet.sigmaton = wavelet.sigmaton && p.wavelet.sigmaton == other.wavelet.sigmaton; + wavelet.sigmacol = wavelet.sigmacol && p.wavelet.sigmacol == other.wavelet.sigmacol; wavelet.median = wavelet.median && p.wavelet.median == other.wavelet.median; wavelet.medianlev = wavelet.medianlev && p.wavelet.medianlev == other.wavelet.medianlev; wavelet.linkedg = wavelet.linkedg && p.wavelet.linkedg == other.wavelet.linkedg; @@ -2909,6 +2911,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.sigmaton = mods.wavelet.sigmaton; } + if (wavelet.sigmacol) { + toEdit.wavelet.sigmacol = mods.wavelet.sigmacol; + } + if (wavelet.iter) { toEdit.wavelet.iter = mods.wavelet.iter; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f602c04f1..c17ea52c7 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -501,6 +501,7 @@ struct WaveletParamsEdited { bool iter; bool sigmafin; bool sigmaton; + bool sigmacol; bool median; bool medianlev; bool linkedg; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index db3687b3e..475c6d866 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -114,6 +114,7 @@ Wavelet::Wavelet() : iter(Gtk::manage(new Adjuster(M("TP_WAVELET_ITER"), -3, 3, 1, 0))), sigmafin(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), sigmaton(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + sigmacol(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), hueskin(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKIN"), -314., 314., -5., 25., 170., 120., 0, false))), hueskin2(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKY"), -314., 314., -260., -250, -130., -140., 0, false))), hllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HIGHLIGHT"), 0., 100., 50., 75., 100., 98., 0, false))), @@ -212,6 +213,7 @@ Wavelet::Wavelet() : EvWavedgeffect = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_EDGEFFECT"); EvWavsigmafin = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMAFIN"); EvWavsigmaton = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMATON"); + EvWavsigmacol = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMACOL"); expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); @@ -456,8 +458,10 @@ Wavelet::Wavelet() : chBox->pack_start(*satlev); chro->set_tooltip_text(M("TP_WAVELET_CHR_TOOLTIP")); - chBox->pack_start(*chro); chro->setAdjusterListener(this); + sigmacol->setAdjusterListener(this); + chBox->pack_start(*chro); + chBox->pack_start(*sigmacol); Gtk::HBox* const buttonchBox = Gtk::manage(new Gtk::HBox(true, 10)); neutralchPressedConn = neutralchButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutralchPressed)); @@ -1438,6 +1442,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) iter->setValue(pp->wavelet.iter); sigmafin->setValue(pp->wavelet.sigmafin); sigmaton->setValue(pp->wavelet.sigmaton); + sigmacol->setValue(pp->wavelet.sigmacol); for (int i = 0; i < 9; i++) { correction[i]->setValue(pp->wavelet.c[i]); @@ -1557,6 +1562,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) iter->setEditedState(pedited->wavelet.iter ? Edited : UnEdited); sigmafin->setEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); sigmaton->setEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); + sigmacol->setEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); @@ -1830,6 +1836,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.wavclCurve = clshape->getCurve(); pp->wavelet.sigmafin = sigmafin->getValue(); pp->wavelet.sigmaton = sigmaton->getValue(); + pp->wavelet.sigmacol = sigmacol->getValue(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1938,6 +1945,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.iter = iter->getEditedState(); pedited->wavelet.sigmafin = sigmafin->getEditedState(); pedited->wavelet.sigmaton = sigmaton->getEditedState(); + pedited->wavelet.sigmacol = sigmacol->getEditedState(); pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); @@ -2120,6 +2128,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit iter->setDefault(defParams->wavelet.iter); sigmafin->setDefault(defParams->wavelet.sigmafin); sigmaton->setDefault(defParams->wavelet.sigmaton); + sigmacol->setDefault(defParams->wavelet.sigmacol); sigma->setDefault(defParams->wavelet.sigma); offset->setDefault(defParams->wavelet.offset); lowthr->setDefault(defParams->wavelet.lowthr); @@ -2244,6 +2253,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); sigmafin->setDefaultEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); sigmaton->setDefaultEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); + sigmacol->setDefaultEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); @@ -2308,6 +2318,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit iter->setDefaultEditedState(Irrelevant); sigmafin->setDefaultEditedState(Irrelevant); sigmaton->setDefaultEditedState(Irrelevant); + sigmacol->setDefaultEditedState(Irrelevant); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -2403,6 +2414,7 @@ void Wavelet::CHmethodUpdateUI() if (!batchMode) { if (CHmethod->get_active_row_number() == 0) { CHSLmethod->show(); + sigmacol->show(); pastlev->hide(); satlev->hide(); chroma->hide(); @@ -2422,6 +2434,7 @@ void Wavelet::CHmethodUpdateUI() } } else if (CHmethod->get_active_row_number() == 1) { CHSLmethod->show(); + sigmacol->show(); pastlev->show(); satlev->show(); chroma->show(); @@ -2441,6 +2454,7 @@ void Wavelet::CHmethodUpdateUI() } } else { chro->show(); + sigmacol->hide(); pastlev->hide(); satlev->hide(); chroma->hide(); @@ -2842,6 +2856,7 @@ void Wavelet::setBatchMode(bool batchMode) iter->showEditedCB(); sigmafin->showEditedCB(); sigmaton->showEditedCB(); + sigmacol->showEditedCB(); level0noise->showEditedCB(); level1noise->showEditedCB(); level2noise->showEditedCB(); @@ -2995,6 +3010,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavsigmafin, sigmafin->getTextValue()); } else if (a == sigmaton) { listener->panelChanged(EvWavsigmaton, sigmaton->getTextValue()); + } else if (a == sigmacol) { + listener->panelChanged(EvWavsigmacol, sigmacol->getTextValue()); } else if (a == greenhigh) { listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); } else if (a == bluehigh) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index e8154b680..4a4947b2a 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -95,6 +95,7 @@ private: rtengine::ProcEvent EvWavedgeffect; rtengine::ProcEvent EvWavsigmafin; rtengine::ProcEvent EvWavsigmaton; + rtengine::ProcEvent EvWavsigmacol; void foldAllButMe(GdkEventButton* event, MyExpander *expander); @@ -222,6 +223,7 @@ private: Adjuster* const iter; Adjuster* const sigmafin; Adjuster* const sigmaton; + Adjuster* const sigmacol; Adjuster* greenlow; Adjuster* bluelow;