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;