diff --git a/rtdata/languages/default b/rtdata/languages/default
index e957a5e2a..313f7055a 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -804,8 +804,10 @@ HISTORY_MSG_WAVSOFTRADEND;Soft radius final
HISTORY_MSG_WAVUSHAMET;Clarity method
HISTORY_MSG_THRESWAV;Balance threshold
HISTORY_MSG_SOFTWAV;Soft radius
+HISTORY_MSG_WAVOLDSH;Old algorithm
+HISTORY_MSG_WAVOFFSET;Offset
HISTORY_MSG_TMSHAPE;Compression by level
-HISTORY_MSG_WAVTM;Tone mapping wavelet
+HISTORY_MSG_WAVBL;Blur levels
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -2151,6 +2153,7 @@ TP_WAVELET_CHRO;Saturated/pastel threshold
TP_WAVELET_CHROMAFRAME;Chroma
TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored.
TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength"
+TP_WAVELET_CHRWAV;Blur chroma
TP_WAVELET_CHSL;Sliders
TP_WAVELET_CHTYPE;Chrominance method
TP_WAVELET_CLA;Clarity
@@ -2247,6 +2250,7 @@ TP_WAVELET_NPLOW;Low
TP_WAVELET_NPNONE;None
TP_WAVELET_NPTYPE;Neighboring pixels
TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
+TP_WAVELET_OLDSH;Old algorithm using negatives values
TP_WAVELET_OPACITY;Opacity Blue-Yellow
TP_WAVELET_OPACITYW;Contrast balance d/v-h curve
TP_WAVELET_OPACITYWL;Final local contrast
@@ -2287,7 +2291,7 @@ TP_WAVELET_TILESFULL;Full image
TP_WAVELET_TILESIZE;Tiling method
TP_WAVELET_TILESLIT;Little tiles
TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-TP_WAVELET_TM;Tone mapping wavelet
+TP_WAVELET_BL;Blur levels
TP_WAVELET_TMEDGS;Edge stopping
TP_WAVELET_TMSCALE;Scale
TP_WAVELET_TMSTRENGTH;Compression strength
@@ -2299,6 +2303,7 @@ TP_WAVELET_USH;None
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_WBALANCE_AUTO;Auto
TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation
TP_WBALANCE_AUTOOLD;Auto RGB grey
diff --git a/rtengine/curves.cc b/rtengine/curves.cc
index a3e327dbf..14711c730 100644
--- a/rtengine/curves.cc
+++ b/rtengine/curves.cc
@@ -1209,28 +1209,28 @@ void WavCurve::Set(const std::vector &curvePoints)
}
}
-WavtmCurve::WavtmCurve() {}
+Wavblcurve::Wavblcurve() {}
-void WavtmCurve::Reset()
+void Wavblcurve::Reset()
{
- luttmCurve.reset();
+ lutblcurve.reset();
}
-void WavtmCurve::Set(const Curve &pCurve)
+void Wavblcurve::Set(const Curve &pCurve)
{
if (pCurve.isIdentity()) {
Reset(); // raise this value if the quality suffers from this number of samples
return;
}
- luttmCurve(501); // raise this value if the quality suffers from this number of samples
+ lutblcurve(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- luttmCurve[i] = pCurve.getVal(double(i) / 500.);
+ lutblcurve[i] = pCurve.getVal(double(i) / 500.);
}
}
-void WavtmCurve::Set(const std::vector &curvePoints)
+void Wavblcurve::Set(const std::vector &curvePoints)
{
if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
diff --git a/rtengine/curves.h b/rtengine/curves.h
index 380bad9d6..03fa3e812 100644
--- a/rtengine/curves.h
+++ b/rtengine/curves.h
@@ -627,26 +627,26 @@ public:
}
};
-class WavtmCurve
+class Wavblcurve
{
private:
- LUTf luttmCurve; // 0xffff range
+ LUTf lutblcurve; // 0xffff range
void Set(const Curve &pCurve);
public:
- virtual ~WavtmCurve() {};
- WavtmCurve();
+ virtual ~Wavblcurve() {};
+ Wavblcurve();
void Reset();
// void Set(const std::vector &curvePoints, bool &opautili);
void Set(const std::vector &curvePoints);
float operator[](float index) const
{
- return luttmCurve[index];
+ return lutblcurve[index];
}
operator bool (void) const
{
- return luttmCurve;
+ return lutblcurve;
}
};
diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc
index 8c3f4f140..11bf19edf 100644
--- a/rtengine/dcrop.cc
+++ b/rtengine/dcrop.cc
@@ -967,14 +967,14 @@ void Crop::update(int todo)
}
WavCurve wavCLVCurve;
- WavtmCurve wavtmCurve;
+ Wavblcurve wavblcurve;
WavOpacityCurveRG waOpacityCurveRG;
WavOpacityCurveBY waOpacityCurveBY;
WavOpacityCurveW waOpacityCurveW;
WavOpacityCurveWL waOpacityCurveWL;
LUTf wavclCurve;
- params.wavelet.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
+ params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
LabImage *unshar = nullptr;
Glib::ustring provis;
LabImage *provradius = nullptr;
@@ -1003,7 +1003,7 @@ void Crop::update(int todo)
unshar = new LabImage(labnCrop->W, labnCrop->H);
provis = params.wavelet.CLmethod;
params.wavelet.CLmethod = "all";
- parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip);
+ parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip);
unshar->CopyFrom(labnCrop);
params.wavelet.CLmethod = provis;
@@ -1016,7 +1016,7 @@ void Crop::update(int todo)
WaveParams.expnoise = false;
}
- parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip);
+ parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip);
if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") {
WaveParams.expcontrast = procont;
diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc
index 1ad3a0be1..45f9f2e56 100644
--- a/rtengine/improccoordinator.cc
+++ b/rtengine/improccoordinator.cc
@@ -867,7 +867,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
if ((params->wavelet.enabled)) {
WaveletParams WaveParams = params->wavelet;
- WaveParams.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
+ WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
int kall = 0;
LabImage *unshar = nullptr;
Glib::ustring provis;
@@ -898,7 +898,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
unshar = new LabImage(pW, pH);
provis = params->wavelet.CLmethod;
params->wavelet.CLmethod = "all";
- ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale);
+ ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale);
unshar->CopyFrom(nprevl);
@@ -912,7 +912,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
WaveParams.expnoise = false;
}
- ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale);
+ ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale);
if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") {
diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h
index c797986e5..d7d6052e9 100644
--- a/rtengine/improccoordinator.h
+++ b/rtengine/improccoordinator.h
@@ -139,7 +139,7 @@ protected:
NoiseCurve noiseLCurve;
NoiseCurve noiseCCurve;
WavCurve wavCLVCurve;
- WavtmCurve wavtmCurve;
+ Wavblcurve wavblcurve;
WavOpacityCurveRG waOpacityCurveRG;
WavOpacityCurveBY waOpacityCurveBY;
WavOpacityCurveW waOpacityCurveW;
diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h
index caad76a4f..d896342d5 100644
--- a/rtengine/improcfun.h
+++ b/rtengine/improcfun.h
@@ -53,7 +53,7 @@ class OpacityCurve;
class PipetteBuffer;
class ToneCurve;
class WavCurve;
-class WavtmCurve;
+class Wavblcurve;
class WavOpacityCurveBY;
class WavOpacityCurveRG;
class WavOpacityCurveW;
@@ -202,9 +202,9 @@ public:
int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/);
void Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip);
- void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavtmCurve & wavtmCurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip);
+ void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip);
- void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L,
+ void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve,
struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili);
void WaveletcontAllLfinal(const wavelet_decomposition &WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL);
void WaveletcontAllAB(LabImage * lab, float **varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW,
diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc
index 9d5237273..456a3bd1e 100644
--- a/rtengine/ipwavelet.cc
+++ b/rtengine/ipwavelet.cc
@@ -34,6 +34,8 @@
#include "improcfun.h"
#include "imagefloat.h"
#include "labimage.h"
+#include "gauss.h"
+#include "boxblur.h"
#include "LUT.h"
#include "median.h"
#include "opthelper.h"
@@ -64,6 +66,7 @@ struct cont_params {
float conresH;
float radius;
float chrores;
+ bool oldsh;
float hueres;
float sky;
float b_l, t_l, b_r, t_r;
@@ -124,7 +127,7 @@ struct cont_params {
bool finena;
bool toningena;
bool noiseena;
- bool tmena;
+ bool blena;
int maxilev;
float edgsens;
float edgampl;
@@ -135,7 +138,7 @@ struct cont_params {
int wavNestedLevels = 1;
-void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavtmCurve & wavtmCurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip)
+void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip)
{
@@ -205,7 +208,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const
cp.finena = params->wavelet.expfinal;
cp.toningena = params->wavelet.exptoning;
cp.noiseena = params->wavelet.expnoise;
- cp.tmena = params->wavelet.exptm;
+ cp.blena = params->wavelet.expbl;
if (params->wavelet.Backmethod == "black") {
cp.backm = 0;
@@ -390,6 +393,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const
cp.conresH = waparams.resconH;
cp.radius = waparams.radius;
cp.chrores = waparams.reschro;
+ cp.oldsh = waparams.oldsh;
//cp.hueres=waparams.reshue;
cp.hueres = 2.f;
cp.th = float(waparams.thr);
@@ -847,7 +851,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const
if (cp.val > 0 || ref || contr) { //edge
Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN);
}
-
+/*
//here TM wavelet
if(cp.tmena ){
float mean2[10];
@@ -981,7 +985,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const
}
// end TM wavelet
-
+*/
//init for edge and denoise
float vari[4];
@@ -1015,8 +1019,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const
Chutili = true;
}
-
- WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili);
+ WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili);
if (cp.val > 0 || ref || contr || cp.diagcurv) { //edge
Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN);
@@ -1688,7 +1691,7 @@ void ImProcFunctions::WaveletcontAllLfinal(const wavelet_decomposition &WaveletC
}
-void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L,
+void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, const wavelet_decomposition &WaveletCoeffs_L, const Wavblcurve & wavblcurve,
struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili)
{
const int maxlvl = WaveletCoeffs_L.maxlevel();
@@ -1827,7 +1830,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
}
}
- if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step
+ if ((cp.conres >= 0.f || cp.conresH >= 0.f) && cp.resena && !cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step
LabImage *temp = nullptr;
temp = new LabImage(W_L, H_L);
#ifdef _OPENMP
@@ -1858,6 +1861,53 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
}
+#ifdef _OPENMP
+ #pragma omp barrier
+#endif
+
+ if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step
+#ifdef _OPENMP
+ #pragma omp for nowait
+#endif
+
+ for (int i = 0; i < W_L * H_L; i++) {
+ float LL = WavCoeffs_L0[i];
+ float LL100 = LL / 327.68f;
+ float tran = 5.f;//transition
+ //shadow
+ float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ??
+
+ if(cp.th > (100.f - tran)) {
+ tran = 100.f - cp.th;
+ }
+
+ if(LL100 < cp.th) {
+ float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th
+ float kk = aalp * LL100 + alp;
+ WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f);
+ } else if(LL100 < cp.th + tran) {
+ float ath = -cp.conres / tran;
+ float bth = cp.conres - ath * cp.th;
+ WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f);
+ }
+
+ //highlight
+ tran = 5.f;
+
+ if(cp.thH < (tran)) {
+ tran = cp.thH;
+ }
+
+ if(LL100 > cp.thH) {
+ WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f);
+ } else if(LL100 > (cp.thH - tran)) {
+ float athH = cp.conresH / tran;
+ float bthH = cp.conresH - athH * cp.thH;
+ WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f);
+ }
+ }
+ }
+
#ifdef _OPENMP
#pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1)
@@ -2002,6 +2052,15 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
// end
}
+ bool wavcurvecomp = false;//not enable if 0.75
+
+ if (wavblcurve) {
+ for (int i = 0; i < 500; i++) {
+ if (wavblcurve[i] != 0.) {
+ wavcurvecomp = true;
+ }
+ }
+ }
#ifdef _OPENMP
#pragma omp for schedule(dynamic) collapse(2)
@@ -2016,8 +2075,28 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
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) {
+ float * bef = new float[Wlvl_L * Hlvl_L];
+ float * aft = new float[Wlvl_L * Hlvl_L];
+ for (int co = 0; co < Hlvl_L * Wlvl_L; co++) {
+ bef[co] = WavCoeffs_L[dir][co];
+ }
+ klev = 0.25f * (wavblcurve[lvl * 55.5f]);
+
+ klev *= 50.f / skip;
+ boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false);
+
+ for (int co = 0; co < Hlvl_L * Wlvl_L; co++) {
+ WavCoeffs_L[dir][co] = aft[co];
+ }
+
+ delete bef;
+ delete aft;
+ }
}
}
}
@@ -2983,13 +3062,14 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz
const float skinprot = params->wavelet.skinprotect;
const float skinprotneg = -skinprot;
const float factorHard = (1.f - skinprotneg / 100.f);
+ const float offs = params->wavelet.offset;
//to adjust increase contrast with local contrast
//for each pixel and each level
float beta;
float mea[9];
- float rap = mean[level] - 2.f * cp.sigm * sigma[level];
+ float rap = offs * mean[level] - 2.f * cp.sigm * sigma[level];
if (rap > 0.f) {
mea[0] = rap;
@@ -2997,7 +3077,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz
mea[0] = mean[level] / 6.f;
}
- rap = mean[level] - cp.sigm * sigma[level];
+ rap = offs * mean[level] - cp.sigm * sigma[level];
if (rap > 0.f) {
mea[1] = rap;
@@ -3005,13 +3085,13 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float *maxkoeLi, bool lipschitz
mea[1] = mean[level] / 2.f;
}
- mea[2] = mean[level]; // 50% data
- mea[3] = mean[level] + cp.sigm * sigma[level] / 2.f;
- mea[4] = mean[level] + cp.sigm * sigma[level]; //66%
- mea[5] = mean[level] + cp.sigm * 1.2f * sigma[level];
- mea[6] = mean[level] + cp.sigm * 1.5f * sigma[level]; //
- mea[7] = mean[level] + cp.sigm * 2.f * sigma[level]; //95%
- mea[8] = mean[level] + cp.sigm * 2.5f * sigma[level]; //99%
+ mea[2] = offs * mean[level]; // 50% data
+ mea[3] = offs * mean[level] + cp.sigm * sigma[level] / 2.f;
+ mea[4] = offs * mean[level] + cp.sigm * sigma[level]; //66%
+ mea[5] = offs * mean[level] + cp.sigm * 1.2f * sigma[level];
+ mea[6] = offs * mean[level] + cp.sigm * 1.5f * sigma[level]; //
+ mea[7] = offs * mean[level] + cp.sigm * 2.f * sigma[level]; //95%
+ mea[8] = offs * mean[level] + cp.sigm * 2.5f * sigma[level]; //99%
bool useChromAndHue = (skinprot != 0.f || cp.HSmet);
float modchro;
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index cf5a693f8..0c76e3003 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -2164,16 +2164,17 @@ WaveletParams::WaveletParams() :
0.35,
0.35
},
- tmcurve{
+ blcurve{
static_cast(FCT_MinMaxCPoints),
- 0.0,
+0.0, 0.0, 0.0, 0.35, 0.5, 0., 0.35, 0.35, 1.0, 0.0, 0.35, 0.35
+/* 0.0,
0.75,
0.35,
0.35,
1.0,
0.75,
0.35,
- 0.35
+ 0.35*/
},
opacityCurveRG{
static_cast(FCT_MinMaxCPoints),
@@ -2254,6 +2255,7 @@ WaveletParams::WaveletParams() :
lipst(false),
avoid(false),
showmask(false),
+ oldsh(true),
tmr(false),
strength(100),
balance(0),
@@ -2263,7 +2265,7 @@ WaveletParams::WaveletParams() :
c{},
ch{},
expedge(false),
- exptm(false),
+ expbl(false),
expresid(false),
expfinal(false),
exptoning(false),
@@ -2285,6 +2287,7 @@ WaveletParams::WaveletParams() :
Dirmethod("all"),
HSmethod("with"),
sigma(1.0),
+ offset(1.0),
rescon(0),
resconH(0),
reschro(0),
@@ -2312,7 +2315,7 @@ WaveletParams::WaveletParams() :
thrH(70),
radius(40),
skinprotect(0.0),
- threswav(1.4),
+ chrwav(0.),
softwav(1.0),
hueskin(-5, 25, 170, 120, false),
hueskin2(-260, -250, -130, -140, false),
@@ -2332,7 +2335,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const
{
return
ccwcurve == other.ccwcurve
- && tmcurve == other.tmcurve
+ && blcurve == other.blcurve
&& opacityCurveRG == other.opacityCurveRG
&& opacityCurveBY == other.opacityCurveBY
&& opacityCurveW == other.opacityCurveW
@@ -2358,6 +2361,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const
&& lipst == other.lipst
&& avoid == other.avoid
&& showmask == other.showmask
+ && oldsh == other.oldsh
&& tmr == other.tmr
&& strength == other.strength
&& balance == other.balance
@@ -2374,7 +2378,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const
return true;
}()
&& expedge == other.expedge
- && exptm == other.exptm
+ && expbl == other.expbl
&& expresid == other.expresid
&& expfinal == other.expfinal
&& expclari == other.expclari
@@ -2396,6 +2400,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const
&& Dirmethod == other.Dirmethod
&& HSmethod == other.HSmethod
&& sigma == other.sigma
+ && offset == other.offset
&& rescon == other.rescon
&& resconH == other.resconH
&& reschro == other.reschro
@@ -2423,7 +2428,7 @@ bool WaveletParams::operator ==(const WaveletParams& other) const
&& thrH == other.thrH
&& radius == other.radius
&& skinprotect == other.skinprotect
- && threswav == other.threswav
+ && chrwav == other.chrwav
&& softwav == other.softwav
&& hueskin == other.hueskin
&& hueskin2 == other.hueskin2
@@ -2445,7 +2450,7 @@ bool WaveletParams::operator !=(const WaveletParams& other) const
void WaveletParams::getCurves(
WavCurve& cCurve,
- WavtmCurve& tCurve,
+ Wavblcurve& tCurve,
WavOpacityCurveRG& opacityCurveLUTRG,
WavOpacityCurveBY& opacityCurveLUTBY,
WavOpacityCurveW& opacityCurveLUTW,
@@ -2453,7 +2458,7 @@ void WaveletParams::getCurves(
) const
{
cCurve.Set(this->ccwcurve);
- tCurve.Set(this->tmcurve);
+ tCurve.Set(this->blcurve);
opacityCurveLUTRG.Set(this->opacityCurveRG);
opacityCurveLUTBY.Set(this->opacityCurveBY);
opacityCurveLUTW.Set(this->opacityCurveW);
@@ -3514,7 +3519,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile);
- saveToKeyfile(!pedited || pedited->wavelet.exptm, "Wavelet", "Exptm", wavelet.exptm, keyFile);
+ saveToKeyfile(!pedited || pedited->wavelet.expbl, "Wavelet", "expbl", wavelet.expbl, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.expresid, "Wavelet", "Expresid", wavelet.expresid, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile);
@@ -3562,7 +3567,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->wavelet.TMmethod, "Wavelet", "TMMethod", wavelet.TMmethod, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.chro, "Wavelet", "ChromaLink", wavelet.chro, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.ccwcurve, "Wavelet", "ContrastCurve", wavelet.ccwcurve, keyFile);
- saveToKeyfile(!pedited || pedited->wavelet.tmcurve, "Wavelet", "TMCurve", wavelet.tmcurve, keyFile);
+ saveToKeyfile(!pedited || pedited->wavelet.blcurve, "Wavelet", "blcurve", wavelet.blcurve, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile);
saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile);
saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile);
@@ -3578,7 +3583,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->wavelet.cbenab, "Wavelet", "CBenab", wavelet.cbenab, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile);
- saveToKeyfile(!pedited || pedited->wavelet.threswav, "Wavelet", "Threswav", wavelet.threswav, 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.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile);
saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile);
@@ -3586,8 +3591,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.showmask, "Wavelet", "Showmask", wavelet.showmask, keyFile);
+ saveToKeyfile(!pedited || pedited->wavelet.oldsh, "Wavelet", "Oldsh", wavelet.oldsh, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.sigma, "Wavelet", "Sigma", wavelet.sigma, keyFile);
+ saveToKeyfile(!pedited || pedited->wavelet.offset, "Wavelet", "Offset", wavelet.offset, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile);
saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile);
@@ -4678,6 +4685,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst);
assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid);
assignFromKeyfile(keyFile, "Wavelet", "Showmask", pedited, wavelet.showmask, pedited->wavelet.showmask);
+ assignFromKeyfile(keyFile, "Wavelet", "Oldsh", pedited, wavelet.oldsh, pedited->wavelet.oldsh);
assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr);
if (ppVersion < 331) { // wavelet.Lmethod was a string before version 331
@@ -4707,6 +4715,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod);
assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod);
assignFromKeyfile(keyFile, "Wavelet", "Sigma", pedited, wavelet.sigma, pedited->wavelet.sigma);
+ assignFromKeyfile(keyFile, "Wavelet", "Offset", pedited, wavelet.offset, pedited->wavelet.offset);
assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon);
assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH);
assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro);
@@ -4734,7 +4743,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH);
assignFromKeyfile(keyFile, "Wavelet", "Residualradius", pedited, wavelet.radius, pedited->wavelet.radius);
assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve);
- assignFromKeyfile(keyFile, "Wavelet", "TMCurve", pedited, wavelet.tmcurve, pedited->wavelet.tmcurve);
+ assignFromKeyfile(keyFile, "Wavelet", "blcurve", pedited, wavelet.blcurve, pedited->wavelet.blcurve);
assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG);
assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY);
assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW);
@@ -4876,7 +4885,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
}
assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect);
- assignFromKeyfile(keyFile, "Wavelet", "Threswav", pedited, wavelet.threswav, pedited->wavelet.threswav);
+ assignFromKeyfile(keyFile, "Wavelet", "chrwav", pedited, wavelet.chrwav, pedited->wavelet.chrwav);
assignFromKeyfile(keyFile, "Wavelet", "Softwav", pedited, wavelet.softwav, pedited->wavelet.softwav);
assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast);
assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma);
@@ -4908,7 +4917,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
}
assignFromKeyfile(keyFile, "Wavelet", "Expedge", pedited, wavelet.expedge, pedited->wavelet.expedge);
- assignFromKeyfile(keyFile, "Wavelet", "Exptm", pedited, wavelet.exptm, pedited->wavelet.exptm);
+ assignFromKeyfile(keyFile, "Wavelet", "expbl", pedited, wavelet.expbl, pedited->wavelet.expbl);
assignFromKeyfile(keyFile, "Wavelet", "Expresid", pedited, wavelet.expresid, pedited->wavelet.expresid);
assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal);
assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning);
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 9bfdaab13..e78c8fc47 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -40,7 +40,7 @@ class OpacityCurve;
class RetinexgaintransmissionCurve;
class RetinextransmissionCurve;
class WavCurve;
-class WavtmCurve;
+class Wavblcurve;
class WavOpacityCurveBY;
class WavOpacityCurveRG;
class WavOpacityCurveW;
@@ -1186,7 +1186,7 @@ private:
struct WaveletParams {
std::vector ccwcurve;
- std::vector tmcurve;
+ std::vector blcurve;
std::vector opacityCurveRG;
std::vector opacityCurveBY;
std::vector opacityCurveW;
@@ -1213,6 +1213,7 @@ struct WaveletParams {
bool lipst;
bool avoid;
bool showmask;
+ bool oldsh;
bool tmr;
int strength;
int balance;
@@ -1222,7 +1223,7 @@ struct WaveletParams {
int c[9];
int ch[9];
bool expedge;
- bool exptm;
+ bool expbl;
bool expresid;
bool expfinal;
bool exptoning;
@@ -1245,6 +1246,7 @@ struct WaveletParams {
Glib::ustring Dirmethod;
Glib::ustring HSmethod;
double sigma;
+ double offset;
int rescon;
int resconH;
int reschro;
@@ -1272,7 +1274,7 @@ struct WaveletParams {
int thrH;
int radius;
double skinprotect;
- double threswav;
+ double chrwav;
double softwav;
Threshold hueskin;
Threshold hueskin2;
@@ -1293,7 +1295,7 @@ struct WaveletParams {
void getCurves(
WavCurve& cCurve,
- WavtmCurve& tCurve,
+ Wavblcurve& tCurve,
WavOpacityCurveRG&
opacityCurveLUTRG,
WavOpacityCurveBY& opacityCurveLUTBY,
diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc
index f5bfd81df..14df16550 100644
--- a/rtengine/simpleprocess.cc
+++ b/rtengine/simpleprocess.cc
@@ -1120,7 +1120,7 @@ private:
bool wavcontlutili = false;
WaveletParams WaveParams = params.wavelet;
WavCurve wavCLVCurve;
- WavtmCurve wavtmCurve;
+ Wavblcurve wavblcurve;
WavOpacityCurveRG waOpacityCurveRG;
WavOpacityCurveBY waOpacityCurveBY;
WavOpacityCurveW waOpacityCurveW;
@@ -1144,7 +1144,7 @@ private:
provradius->CopyFrom(labView);
}
- params.wavelet.getCurves(wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
+ params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);
CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1);
@@ -1152,7 +1152,7 @@ private:
unshar = new LabImage(fw, fh);
provis = params.wavelet.CLmethod;
params.wavelet.CLmethod = "all";
- ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1);
+ ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1);
unshar->CopyFrom(labView);
params.wavelet.CLmethod = provis;
@@ -1164,7 +1164,7 @@ private:
WaveParams.expnoise = false;
}
- ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavtmCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1);
+ ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1);
if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") {
WaveParams.expcontrast = procont;
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index f954a171a..b568d3b52 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -494,6 +494,7 @@ void ParamsEdited::set(bool v)
wavelet.ushamethod = v;
wavelet.avoid = v;
wavelet.showmask = v;
+ wavelet.oldsh = v;
wavelet.tmr = v;
wavelet.Lmethod = v;
wavelet.CLmethod = v;
@@ -509,7 +510,8 @@ void ParamsEdited::set(bool v)
wavelet.HSmethod = v;
wavelet.Dirmethod = v;
wavelet.sigma = v;
- wavelet.rescon = v;
+ wavelet.sigma = v;
+ wavelet.offset = v;
wavelet.resconH = v;
wavelet.reschro = v;
wavelet.tmrs = v;
@@ -541,14 +543,14 @@ void ParamsEdited::set(bool v)
wavelet.hllev = v;
wavelet.bllev = v;
wavelet.edgcont = v;
- wavelet.threswav = v;
+ wavelet.chrwav = v;
wavelet.softwav = v;
wavelet.level0noise = v;
wavelet.level1noise = v;
wavelet.level2noise = v;
wavelet.level3noise = v;
wavelet.ccwcurve = v;
- wavelet.tmcurve = v;
+ wavelet.blcurve = v;
wavelet.opacityCurveRG = v;
wavelet.opacityCurveBY = v;
wavelet.opacityCurveW = v;
@@ -568,7 +570,7 @@ void ParamsEdited::set(bool v)
wavelet.expcontrast = v;
wavelet.expchroma = v;
wavelet.expedge = v;
- wavelet.exptm = v;
+ wavelet.expbl = v;
wavelet.expresid = v;
wavelet.exptoning = v;
wavelet.expnoise = v;
@@ -1094,6 +1096,7 @@ void ParamsEdited::initFrom(const std::vector&
wavelet.ushamethod = wavelet.ushamethod && p.wavelet.ushamethod == other.wavelet.ushamethod;
wavelet.avoid = wavelet.avoid && p.wavelet.avoid == other.wavelet.avoid;
wavelet.showmask = wavelet.showmask && p.wavelet.showmask == other.wavelet.showmask;
+ wavelet.oldsh = wavelet.oldsh && p.wavelet.oldsh == other.wavelet.oldsh;
wavelet.tmr = wavelet.tmr && p.wavelet.tmr == other.wavelet.tmr;
wavelet.Lmethod = wavelet.Lmethod && p.wavelet.Lmethod == other.wavelet.Lmethod;
wavelet.CLmethod = wavelet.CLmethod && p.wavelet.CLmethod == other.wavelet.CLmethod;
@@ -1109,6 +1112,7 @@ void ParamsEdited::initFrom(const std::vector&
wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod;
wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod;
wavelet.sigma = wavelet.sigma && p.wavelet.sigma == other.wavelet.sigma;
+ wavelet.offset = wavelet.offset && p.wavelet.offset == other.wavelet.offset;
wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon;
wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH;
wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro;
@@ -1140,7 +1144,7 @@ void ParamsEdited::initFrom(const std::vector&
wavelet.hllev = wavelet.hllev && p.wavelet.hllev == other.wavelet.hllev;
wavelet.bllev = wavelet.bllev && p.wavelet.bllev == other.wavelet.bllev;
wavelet.edgcont = wavelet.edgcont && p.wavelet.edgcont == other.wavelet.edgcont;
- wavelet.threswav = wavelet.threswav && p.wavelet.threswav == other.wavelet.threswav;
+ wavelet.chrwav = wavelet.chrwav && p.wavelet.chrwav == other.wavelet.chrwav;
wavelet.softwav = wavelet.softwav && p.wavelet.softwav == other.wavelet.softwav;
wavelet.level0noise = wavelet.level0noise && p.wavelet.level0noise == other.wavelet.level0noise;
wavelet.level1noise = wavelet.level1noise && p.wavelet.level1noise == other.wavelet.level1noise;
@@ -1149,7 +1153,7 @@ void ParamsEdited::initFrom(const std::vector&
wavelet.pastlev = wavelet.pastlev && p.wavelet.pastlev == other.wavelet.pastlev;
wavelet.satlev = wavelet.satlev && p.wavelet.satlev == other.wavelet.satlev;
wavelet.ccwcurve = wavelet.ccwcurve && p.wavelet.ccwcurve == other.wavelet.ccwcurve;
- wavelet.tmcurve = wavelet.tmcurve && p.wavelet.tmcurve == other.wavelet.tmcurve;
+ wavelet.blcurve = wavelet.blcurve && p.wavelet.blcurve == other.wavelet.blcurve;
wavelet.opacityCurveRG = wavelet.opacityCurveRG && p.wavelet.opacityCurveRG == other.wavelet.opacityCurveRG;
wavelet.opacityCurveBY = wavelet.opacityCurveBY && p.wavelet.opacityCurveBY == other.wavelet.opacityCurveBY;
wavelet.opacityCurveW = wavelet.opacityCurveW && p.wavelet.opacityCurveW == other.wavelet.opacityCurveW;
@@ -1162,7 +1166,7 @@ void ParamsEdited::initFrom(const std::vector&
wavelet.expcontrast = wavelet.expcontrast && p.wavelet.expcontrast == other.wavelet.expcontrast;
wavelet.expchroma = wavelet.expchroma && p.wavelet.expchroma == other.wavelet.expchroma;
wavelet.expedge = wavelet.expedge && p.wavelet.expedge == other.wavelet.expedge;
- wavelet.exptm = wavelet.exptm && p.wavelet.exptm == other.wavelet.exptm;
+ wavelet.expbl = wavelet.expbl && p.wavelet.expbl == other.wavelet.expbl;
wavelet.expresid = wavelet.expresid && p.wavelet.expresid == other.wavelet.expresid;
wavelet.expfinal = wavelet.expfinal && p.wavelet.expfinal == other.wavelet.expfinal;
wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning;
@@ -2953,6 +2957,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.wavelet.showmask = mods.wavelet.showmask;
}
+ if (wavelet.oldsh) {
+ toEdit.wavelet.oldsh = mods.wavelet.oldsh;
+ }
+
if (wavelet.tmr) {
toEdit.wavelet.tmr = mods.wavelet.tmr;
}
@@ -3045,8 +3053,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.wavelet.edgcont = mods.wavelet.edgcont;
}
- if (wavelet.threswav) {
- toEdit.wavelet.threswav = mods.wavelet.threswav;
+ if (wavelet.chrwav) {
+ toEdit.wavelet.chrwav = mods.wavelet.chrwav;
}
if (wavelet.softwav) {
@@ -3081,8 +3089,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.wavelet.ccwcurve = mods.wavelet.ccwcurve;
}
- if (wavelet.tmcurve) {
- toEdit.wavelet.tmcurve = mods.wavelet.tmcurve;
+ if (wavelet.blcurve) {
+ toEdit.wavelet.blcurve = mods.wavelet.blcurve;
}
if (wavelet.opacityCurveRG) {
@@ -3126,8 +3134,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.wavelet.expedge = mods.wavelet.expedge;
}
- if (wavelet.exptm) {
- toEdit.wavelet.exptm = mods.wavelet.exptm;
+ if (wavelet.expbl) {
+ toEdit.wavelet.expbl = mods.wavelet.expbl;
}
if (wavelet.expresid) {
@@ -3186,6 +3194,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.wavelet.sigma = mods.wavelet.sigma;
}
+ if (wavelet.offset) {
+ toEdit.wavelet.offset = mods.wavelet.offset;
+ }
+
if (wavelet.resconH) {
toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH;
}
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index 619521c05..8e02ba58f 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -508,6 +508,7 @@ struct WaveletParamsEdited {
bool ushamethod;
bool avoid;
bool showmask;
+ bool oldsh;
bool tmr;
bool c[9];
bool ch[9];
@@ -525,6 +526,7 @@ struct WaveletParamsEdited {
bool daubcoeffmethod;
bool Dirmethod;
bool sigma;
+ bool offset;
bool rescon;
bool resconH;
bool reschro;
@@ -557,14 +559,14 @@ struct WaveletParamsEdited {
bool hllev;
bool bllev;
bool edgcont;
- bool threswav;
+ bool chrwav;
bool softwav;
bool level0noise;
bool level1noise;
bool level2noise;
bool level3noise;
bool ccwcurve;
- bool tmcurve;
+ bool blcurve;
bool opacityCurveBY;
bool opacityCurveRG;
bool opacityCurveW;
@@ -587,7 +589,7 @@ struct WaveletParamsEdited {
bool expcontrast;
bool expchroma;
bool expedge;
- bool exptm;
+ bool expbl;
bool expresid;
bool expfinal;
bool exptoning;
diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc
index a65e3c789..1bea8a3fa 100644
--- a/rtgui/wavelet.cc
+++ b/rtgui/wavelet.cc
@@ -80,10 +80,12 @@ Wavelet::Wavelet() :
avoid(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_AVOID")))),
tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))),
showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))),
+ oldsh(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_OLDSH")))),
neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))),
sigma(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMA"), 0.2, 2.5, 0.01, 1.))),
- rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), 0, 100, 1, 0))),
- resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))),
+ offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))),
+ rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))),
+ resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))),
reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))),
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))),
@@ -127,7 +129,7 @@ Wavelet::Wavelet() :
mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))),
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.))),
- threswav(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESWAV"), 0.9, 2., 0.01, 1.4))),
+ 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())),
@@ -162,7 +164,7 @@ Wavelet::Wavelet() :
expsettings(Gtk::manage(new MyExpander(false, M("TP_WAVELET_SETTINGS")))),
exptoning(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TON")))),
expclari(Gtk::manage(new MyExpander(true, M("TP_WAVELET_CLARI")))),
- exptm(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TM")))),
+ expbl(Gtk::manage(new MyExpander(true, M("TP_WAVELET_BL")))),
neutrHBox(Gtk::manage(new Gtk::HBox())),
usharpHBox(Gtk::manage(new Gtk::HBox()))
{
@@ -179,10 +181,12 @@ Wavelet::Wavelet() :
EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE");
EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS");
EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA");
- EvWavenatm = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVTM");
- EvWavthreswav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_THRESWAV");
+ EvWavenabl = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBL");
+ 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");
- EvWavtmshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_TMSHAPE");
+ EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_blshape");
expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings));
@@ -201,8 +205,8 @@ Wavelet::Wavelet() :
expedge->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expedge));
enableEdgeConn = expedge->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expedge));
- exptm->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), exptm));
- enabletmConn = exptm->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), exptm));
+ expbl->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expbl));
+ enabletmConn = expbl->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expbl));
expgamut->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expgamut));
@@ -340,6 +344,8 @@ Wavelet::Wavelet() :
sigma->setAdjusterListener(this);
levBox->pack_start(*sigma, Gtk::PACK_SHRINK);
+ offset->setAdjusterListener(this);
+ levBox->pack_start(*offset, Gtk::PACK_SHRINK);
levBox->pack_start(*sup);
sup->setAdjusterListener(this);
@@ -634,29 +640,29 @@ Wavelet::Wavelet() :
edgBox->pack_start(*ctboxES);
-//TM Wavelet
- ToolParamBlock* const tmBox = Gtk::manage(new ToolParamBlock());
+//Blur Wavelet
+ ToolParamBlock* const blBox = Gtk::manage(new ToolParamBlock());
curveEditortm->setCurveListener(this);
- tmshape = static_cast(curveEditortm->addCurve(CT_Flat, "", nullptr, false, false));
+ blshape = static_cast(curveEditortm->addCurve(CT_Flat, "", nullptr, false, false));
- tmshape->setIdentityValue(0.);
- tmshape->setResetCurve(FlatCurveType(default_params.tmcurve.at(0)), default_params.tmcurve);
- tmshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CC_TOOLTIP"));
+ blshape->setIdentityValue(0.);
+ blshape->setResetCurve(FlatCurveType(default_params.blcurve.at(0)), default_params.blcurve);
+ blshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CC_TOOLTIP"));
curveEditortm->curveListComplete();
curveEditortm->show();
- tmBox->pack_start(*curveEditortm, Gtk::PACK_SHRINK, 4);
+ blBox->pack_start(*curveEditortm, Gtk::PACK_SHRINK, 4);
- threswav->setAdjusterListener(this);
- tmBox->pack_start(*threswav);
+ chrwav->setAdjusterListener(this);
+ blBox->pack_start(*chrwav);
softwav->setLogScale(10, -10);
softwav->setAdjusterListener(this);
- tmBox->pack_start(*softwav);
+ blBox->pack_start(*softwav);
// Gamut
@@ -711,6 +717,9 @@ Wavelet::Wavelet() :
// Residual Image
ToolParamBlock* const resBox = Gtk::manage(new ToolParamBlock());
+ oldsh->set_active(true);
+ oldshConn = oldsh->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::oldshToggled));
+ resBox->pack_start(*oldsh);
rescon->setAdjusterListener(this);
resBox->pack_start(*rescon, Gtk::PACK_SHRINK);
@@ -975,9 +984,9 @@ Wavelet::Wavelet() :
expedge->setLevel(2);
pack_start(*expedge);
- exptm->add(*tmBox, false);
- exptm->setLevel(2);
- pack_start(*exptm);
+ expbl->add(*blBox, false);
+ expbl->setLevel(2);
+ pack_start(*expbl);
expclari->add(*clariBox, false);
expclari->setLevel(2);
@@ -1218,7 +1227,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
Lmethod->set_active(selectedLevel == -1 ? 4 : selectedLevel);
ccshape->setCurve(pp->wavelet.ccwcurve);
- tmshape->setCurve(pp->wavelet.tmcurve);
+ blshape->setCurve(pp->wavelet.blcurve);
opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG);
opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY);
opacityShape->setCurve(pp->wavelet.opacityCurveW);
@@ -1229,7 +1238,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
expcontrast->setEnabled(pp->wavelet.expcontrast);
expchroma->setEnabled(pp->wavelet.expchroma);
expedge->setEnabled(pp->wavelet.expedge);
- exptm->setEnabled(pp->wavelet.exptm);
+ expbl->setEnabled(pp->wavelet.expbl);
expresid->setEnabled(pp->wavelet.expresid);
expfinal->setEnabled(pp->wavelet.expfinal);
exptoning->setEnabled(pp->wavelet.exptoning);
@@ -1243,6 +1252,9 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
showmaskConn.block(true);
showmask->set_active(pp->wavelet.showmask);
showmaskConn.block(false);
+ oldshConn.block(true);
+ oldsh->set_active(pp->wavelet.oldsh);
+ oldshConn.block(false);
tmrConn.block(true);
tmr->set_active(pp->wavelet.tmr);
tmrConn.block(false);
@@ -1273,8 +1285,10 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
lastlipst = pp->wavelet.lipst;
lastavoid = pp->wavelet.avoid;
lastshowmask = pp->wavelet.showmask;
+ lastoldsh = pp->wavelet.oldsh;
lasttmr = pp->wavelet.tmr;
sigma->setValue(pp->wavelet.sigma);
+ offset->setValue(pp->wavelet.offset);
rescon->setValue(pp->wavelet.rescon);
resconH->setValue(pp->wavelet.resconH);
reschro->setValue(pp->wavelet.reschro);
@@ -1309,7 +1323,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
pastlev->setValue(pp->wavelet.pastlev);
satlev->setValue(pp->wavelet.satlev);
edgcont->setValue(pp->wavelet.edgcont);
- threswav->setValue(pp->wavelet.threswav);
+ chrwav->setValue(pp->wavelet.chrwav);
softwav->setValue(pp->wavelet.softwav);
greenlow->setValue(pp->wavelet.greenlow);
@@ -1408,11 +1422,11 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
set_inconsistent(multiImage && !pedited->wavelet.enabled);
ccshape->setUnChanged(!pedited->wavelet.ccwcurve);
- tmshape->setUnChanged(!pedited->wavelet.tmcurve);
+ blshape->setUnChanged(!pedited->wavelet.blcurve);
expcontrast->set_inconsistent(!pedited->wavelet.expcontrast);
expchroma->set_inconsistent(!pedited->wavelet.expchroma);
expedge->set_inconsistent(!pedited->wavelet.expedge);
- exptm->set_inconsistent(!pedited->wavelet.exptm);
+ expbl->set_inconsistent(!pedited->wavelet.expbl);
expresid->set_inconsistent(!pedited->wavelet.expresid);
expfinal->set_inconsistent(!pedited->wavelet.expfinal);
expclari->set_inconsistent(!pedited->wavelet.expclari);
@@ -1427,10 +1441,12 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
clshape->setUnChanged(!pedited->wavelet.wavclCurve);
avoid->set_inconsistent(!pedited->wavelet.avoid);
showmask->set_inconsistent(!pedited->wavelet.showmask);
+ oldsh->set_inconsistent(!pedited->wavelet.oldsh);
tmr->set_inconsistent(!pedited->wavelet.tmr);
edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited);
rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited);
sigma->setEditedState(pedited->wavelet.sigma ? Edited : UnEdited);
+ offset->setEditedState(pedited->wavelet.offset ? Edited : UnEdited);
resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited);
reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited);
tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited);
@@ -1484,7 +1500,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
satlev->setEditedState(pedited->wavelet.satlev ? Edited : UnEdited);
strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited);
edgcont->setEditedState(pedited->wavelet.edgcont ? Edited : UnEdited);
- threswav->setEditedState(pedited->wavelet.threswav ? Edited : UnEdited);
+ chrwav->setEditedState(pedited->wavelet.chrwav ? Edited : UnEdited);
softwav->setEditedState(pedited->wavelet.softwav ? Edited : UnEdited);
level0noise->setEditedState(pedited->wavelet.level0noise ? Edited : UnEdited);
level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited);
@@ -1591,7 +1607,7 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited)
void Wavelet::setEditProvider(EditDataProvider *provider)
{
ccshape->setEditProvider(provider);
- tmshape->setEditProvider(provider);
+ blshape->setEditProvider(provider);
opacityShapeRG->setEditProvider(provider);
opacityShapeBY->setEditProvider(provider);
opacityShape->setEditProvider(provider);
@@ -1604,7 +1620,7 @@ void Wavelet::setEditProvider(EditDataProvider *provider)
void Wavelet::autoOpenCurve()
{
ccshape->openIfNonlinear();
- tmshape->openIfNonlinear();
+ blshape->openIfNonlinear();
//opacityShapeRG->openIfNonlinear();
//opacityShapeBY->openIfNonlinear();
}
@@ -1615,8 +1631,10 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pp->wavelet.enabled = getEnabled();
pp->wavelet.avoid = avoid->get_active();
pp->wavelet.showmask = showmask->get_active();
+ pp->wavelet.oldsh = oldsh->get_active();
pp->wavelet.tmr = tmr->get_active();
pp->wavelet.sigma = sigma->getValue();
+ pp->wavelet.offset = offset->getValue();
pp->wavelet.rescon = rescon->getValue();
pp->wavelet.resconH = resconH->getValue();
pp->wavelet.reschro = reschro->getValue();
@@ -1655,14 +1673,14 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pp->wavelet.hllev = hllev->getValue ();
pp->wavelet.bllev = bllev->getValue ();
pp->wavelet.edgcont = edgcont->getValue ();
- pp->wavelet.threswav = threswav->getValue();
+ pp->wavelet.chrwav = chrwav->getValue();
pp->wavelet.softwav = softwav->getValue();
pp->wavelet.level0noise = level0noise->getValue ();
pp->wavelet.level1noise = level1noise->getValue ();
pp->wavelet.level2noise = level2noise->getValue ();
pp->wavelet.level3noise = level3noise->getValue ();
pp->wavelet.ccwcurve = ccshape->getCurve();
- pp->wavelet.tmcurve = tmshape->getCurve();
+ pp->wavelet.blcurve = blshape->getCurve();
pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve();
pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve();
pp->wavelet.opacityCurveW = opacityShape->getCurve();
@@ -1687,7 +1705,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pp->wavelet.expcontrast = expcontrast->getEnabled();
pp->wavelet.expchroma = expchroma->getEnabled();
pp->wavelet.expedge = expedge->getEnabled();
- pp->wavelet.exptm = exptm->getEnabled();
+ pp->wavelet.expbl = expbl->getEnabled();
pp->wavelet.expresid = expresid->getEnabled();
pp->wavelet.expfinal = expfinal->getEnabled();
pp->wavelet.exptoning = exptoning->getEnabled();
@@ -1709,6 +1727,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pedited->wavelet.enabled = !get_inconsistent();
pedited->wavelet.avoid = !avoid->get_inconsistent();
pedited->wavelet.showmask = !showmask->get_inconsistent();
+ pedited->wavelet.oldsh = !oldsh->get_inconsistent();
pedited->wavelet.tmr = !tmr->get_inconsistent();
pedited->wavelet.median = !median->get_inconsistent();
pedited->wavelet.medianlev = !medianlev->get_inconsistent();
@@ -1732,6 +1751,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pedited->wavelet.Dirmethod = Dirmethod->get_active_text() != M("GENERAL_UNCHANGED");
pedited->wavelet.edgthresh = edgthresh->getEditedState();
pedited->wavelet.sigma = sigma->getEditedState();
+ pedited->wavelet.offset = offset->getEditedState();
pedited->wavelet.rescon = rescon->getEditedState();
pedited->wavelet.resconH = resconH->getEditedState();
pedited->wavelet.reschro = reschro->getEditedState();
@@ -1762,9 +1782,9 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pedited->wavelet.skinprotect = skinprotect->getEditedState();
pedited->wavelet.hllev = hllev->getEditedState();
pedited->wavelet.ccwcurve = !ccshape->isUnChanged();
- pedited->wavelet.tmcurve = !tmshape->isUnChanged();
+ pedited->wavelet.blcurve = !blshape->isUnChanged();
pedited->wavelet.edgcont = edgcont->getEditedState();
- pedited->wavelet.threswav = threswav->getEditedState();
+ pedited->wavelet.chrwav = chrwav->getEditedState();
pedited->wavelet.softwav = softwav->getEditedState();
pedited->wavelet.level0noise = level0noise->getEditedState();
pedited->wavelet.level1noise = level1noise->getEditedState();
@@ -1796,7 +1816,7 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited)
pedited->wavelet.expcontrast = !expcontrast->get_inconsistent();
pedited->wavelet.expchroma = !expchroma->get_inconsistent();
pedited->wavelet.expedge = !expedge->get_inconsistent();
- pedited->wavelet.exptm = !exptm->get_inconsistent();
+ pedited->wavelet.expbl = !expbl->get_inconsistent();
pedited->wavelet.expresid = !expresid->get_inconsistent();
pedited->wavelet.expfinal = !expfinal->get_inconsistent();
pedited->wavelet.exptoning = !exptoning->get_inconsistent();
@@ -1938,8 +1958,8 @@ void Wavelet::curveChanged(CurveEditor* ce)
if (listener && getEnabled()) {
if (ce == ccshape) {
listener->panelChanged(EvWavCCCurve, M("HISTORY_CUSTOMCURVE"));
- } else if (ce == tmshape) {
- listener->panelChanged(EvWavtmshape, M("HISTORY_CUSTOMCURVE"));
+ } else if (ce == blshape) {
+ listener->panelChanged(EvWavblshape, M("HISTORY_CUSTOMCURVE"));
} else if (ce == opacityShapeRG) {
listener->panelChanged(EvWavColor, M("HISTORY_CUSTOMCURVE"));
} else if (ce == opacityShapeBY) {
@@ -1973,6 +1993,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
balance->setDefault(defParams->wavelet.balance);
iter->setDefault(defParams->wavelet.iter);
sigma->setDefault(defParams->wavelet.sigma);
+ offset->setDefault(defParams->wavelet.offset);
rescon->setDefault(defParams->wavelet.rescon);
resconH->setDefault(defParams->wavelet.resconH);
reschro->setDefault(defParams->wavelet.reschro);
@@ -2006,7 +2027,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
pastlev->setDefault (defParams->wavelet.pastlev);
satlev->setDefault (defParams->wavelet.satlev);
edgcont->setDefault (defParams->wavelet.edgcont);
- threswav->setDefault(defParams->wavelet.threswav);
+ chrwav->setDefault(defParams->wavelet.chrwav);
softwav->setDefault(defParams->wavelet.softwav);
level0noise->setDefault (defParams->wavelet.level0noise);
level1noise->setDefault (defParams->wavelet.level1noise);
@@ -2037,6 +2058,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited);
sigma->setDefault(defParams->wavelet.sigma);
+ offset->setDefault(defParams->wavelet.offset);
rescon->setDefault(defParams->wavelet.rescon);
resconH->setDefault(defParams->wavelet.resconH);
reschro->setDefault(defParams->wavelet.reschro);
@@ -2071,7 +2093,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
pastlev->setDefaultEditedState(pedited->wavelet.pastlev ? Edited : UnEdited);
satlev->setDefaultEditedState(pedited->wavelet.satlev ? Edited : UnEdited);
edgcont->setDefaultEditedState(pedited->wavelet.edgcont ? Edited : UnEdited);
- threswav->setDefaultEditedState(pedited->wavelet.threswav ? Edited : UnEdited);
+ chrwav->setDefaultEditedState(pedited->wavelet.chrwav ? Edited : UnEdited);
softwav->setDefaultEditedState(pedited->wavelet.softwav ? Edited : UnEdited);
strength->setDefaultEditedState(pedited->wavelet.strength ? Edited : UnEdited);
balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited);
@@ -2090,6 +2112,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
}
} else {
sigma->setDefaultEditedState(Irrelevant);
+ offset->setDefaultEditedState(Irrelevant);
rescon->setDefaultEditedState(Irrelevant);
resconH->setDefaultEditedState(Irrelevant);
reschro->setDefaultEditedState(Irrelevant);
@@ -2122,7 +2145,7 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit
hllev->setDefaultEditedState(Irrelevant);
bllev->setDefaultEditedState(Irrelevant);
edgcont->setDefaultEditedState(Irrelevant);
- threswav->setDefaultEditedState(Irrelevant);
+ chrwav->setDefaultEditedState(Irrelevant);
softwav->setDefaultEditedState(Irrelevant);
level0noise->setDefaultEditedState(Irrelevant);
level1noise->setDefaultEditedState(Irrelevant);
@@ -2621,6 +2644,7 @@ void Wavelet::setBatchMode(bool batchMode)
curveEditorRES->setBatchMode(batchMode);
curveEditorGAM->setBatchMode(batchMode);
sigma->showEditedCB();
+ offset->showEditedCB();
rescon->showEditedCB();
resconH->showEditedCB();
reschro->showEditedCB();
@@ -2655,7 +2679,7 @@ void Wavelet::setBatchMode(bool batchMode)
pastlev->showEditedCB();
satlev->showEditedCB();
edgcont->showEditedCB();
- threswav->showEditedCB();
+ chrwav->showEditedCB();
softwav->showEditedCB();
strength->showEditedCB();
balance->showEditedCB();
@@ -2706,6 +2730,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval)
listener->panelChanged(EvWavrescon, rescon->getTextValue());
} else if (a == sigma) {
listener->panelChanged(EvWavsigma, sigma->getTextValue());
+ } else if (a == offset) {
+ listener->panelChanged(EvWavoffset, offset->getTextValue());
} else if (a == resconH) {
listener->panelChanged(EvWavresconH, resconH->getTextValue());
} else if (a == reschro) {
@@ -2819,8 +2845,8 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval)
listener->panelChanged(EvWavgreenlow, greenlow->getTextValue());
} else if (a == bluelow) {
listener->panelChanged(EvWavbluelow, bluelow->getTextValue());
- } else if (a == threswav) {
- listener->panelChanged(EvWavthreswav, threswav->getTextValue());
+ } else if (a == chrwav) {
+ listener->panelChanged(EvWavchrwav, chrwav->getTextValue());
} else if (a == softwav) {
listener->panelChanged(EvWavsoftwav, softwav->getTextValue());
}
@@ -3194,6 +3220,38 @@ void Wavelet::showmaskToggled()
}
}
+void Wavelet::oldshToggled()
+{
+ if (oldsh->get_active()) {
+ radius->hide();
+ } else {
+ radius->show();
+ }
+
+ if (multiImage) {
+ if (oldsh->get_inconsistent()) {
+ oldsh->set_inconsistent(false);
+ oldshConn.block(true);
+ oldsh->set_active(false);
+ oldshConn.block(false);
+ } else if (lastoldsh) {
+ oldsh->set_inconsistent(true);
+ }
+
+ lastoldsh = oldsh->get_active();
+ }
+
+ if (listener && (multiImage || getEnabled())) {
+ if (oldsh->get_inconsistent()) {
+ listener->panelChanged(EvWavoldsh, M("GENERAL_UNCHANGED"));
+ } else if (oldsh->get_active()) {
+ listener->panelChanged(EvWavoldsh, M("GENERAL_ENABLED"));
+ } else {
+ listener->panelChanged(EvWavoldsh, M("GENERAL_DISABLED"));
+ }
+ }
+}
+
void Wavelet::tmrToggled()
{
@@ -3344,7 +3402,7 @@ void Wavelet::foldAllButMe(GdkEventButton* event, MyExpander *expander)
exptoning->set_expanded(exptoning == expander);
expnoise->set_expanded(expnoise == expander);
expedge->set_expanded(expedge == expander);
- exptm->set_expanded(exptm == expander);
+ expbl->set_expanded(expbl == expander);
expgamut->set_expanded(expgamut == expander);
expresid->set_expanded(expresid == expander);
expfinal->set_expanded(expfinal == expander);
@@ -3367,8 +3425,8 @@ void Wavelet::enableToggled(MyExpander *expander)
event = EvWavenanoise;
} else if (expander == expedge) {
event = EvWavenaedge;
- } else if (expander == exptm) {
- event = EvWavenatm;
+ } else if (expander == expbl) {
+ event = EvWavenabl;
} else if (expander == expresid) {
event = EvWavenares;
} else if (expander == expfinal) {
@@ -3431,7 +3489,7 @@ void Wavelet::writeOptions(std::vector &tpOpen)
tpOpen.push_back(exptoning->get_expanded());
tpOpen.push_back(expnoise->get_expanded());
tpOpen.push_back(expedge->get_expanded());
- tpOpen.push_back(exptm->get_expanded());
+ tpOpen.push_back(expbl->get_expanded());
tpOpen.push_back(expgamut->get_expanded());
tpOpen.push_back(expresid->get_expanded());
tpOpen.push_back(expfinal->get_expanded());
@@ -3447,7 +3505,7 @@ void Wavelet::updateToolState(const std::vector& tpOpen)
exptoning->set_expanded(false);
expnoise->set_expanded(false);
expedge->set_expanded(false);
- exptm->set_expanded(false);
+ expbl->set_expanded(false);
expgamut->set_expanded(false);
expresid->set_expanded(false);
expfinal->set_expanded(false);
@@ -3462,7 +3520,7 @@ void Wavelet::updateToolState(const std::vector& tpOpen)
exptoning->set_expanded(tpOpen[3]);
expnoise->set_expanded(tpOpen[4]);
expedge->set_expanded(tpOpen[5]);
- exptm->set_expanded(tpOpen[6]);
+ expbl->set_expanded(tpOpen[6]);
expgamut->set_expanded(tpOpen[7]);
expresid->set_expanded(tpOpen[8]);
expfinal->set_expanded(tpOpen[9]);
diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h
index 356241fa0..15ad773fc 100644
--- a/rtgui/wavelet.h
+++ b/rtgui/wavelet.h
@@ -79,10 +79,12 @@ private:
rtengine::ProcEvent EvWavscale;
rtengine::ProcEvent EvWavradius;
rtengine::ProcEvent EvWavsigma;
- rtengine::ProcEvent EvWavenatm;
- rtengine::ProcEvent EvWavthreswav;
+ rtengine::ProcEvent EvWavenabl;
+ rtengine::ProcEvent EvWavchrwav;
+ rtengine::ProcEvent EvWavoldsh;
+ rtengine::ProcEvent EvWavoffset;
rtengine::ProcEvent EvWavsoftwav;
- rtengine::ProcEvent EvWavtmshape;
+ rtengine::ProcEvent EvWavblshape;
void foldAllButMe(GdkEventButton* event, MyExpander *expander);
@@ -102,6 +104,7 @@ private:
void TilesmethodChanged();
void avoidToggled();
void showmaskToggled ();
+ void oldshToggled ();
void cbenabToggled();
void contrastMinusPressed();
void contrastPlusPressed();
@@ -163,7 +166,7 @@ private:
DiagonalCurveEditor* clshape;
FlatCurveEditor* ccshape;
- FlatCurveEditor* tmshape;
+ FlatCurveEditor* blshape;
Gtk::CheckButton* const median;
Gtk::CheckButton* const medianlev;
Gtk::CheckButton* const linkedg;
@@ -172,11 +175,13 @@ private:
Gtk::CheckButton* const avoid;
Gtk::CheckButton* const tmr;
Gtk::CheckButton* const showmask;
+ Gtk::CheckButton* const oldsh;
Gtk::Button* const neutralchButton;
Adjuster* correction[9];
Adjuster* correctionch[9];
Adjuster* const sigma;
+ Adjuster* const offset;
Adjuster* const rescon;
Adjuster* const resconH;
Adjuster* const reschro;
@@ -231,7 +236,7 @@ private:
Adjuster* const mergeC;
Adjuster* const softrad;
Adjuster* const softradend;
- Adjuster* const threswav;
+ Adjuster* const chrwav;
Adjuster* const softwav;
MyComboBoxText* const Lmethod;
@@ -284,20 +289,20 @@ private:
MyExpander* const expsettings;
MyExpander* const exptoning;
MyExpander* const expclari;
- MyExpander* const exptm;
+ MyExpander* const expbl;
Gtk::HBox* const neutrHBox;
Gtk::HBox* const usharpHBox;
sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enabletmConn, enableFinalConn, enableclariConn;
sigc::connection enableNoiseConn, enableResidConn, enableToningConn;
- sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn;
+ sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn, oldshConn;
sigc::connection neutralPressedConn;
sigc::connection contrastPlusPressedConn;
sigc::connection contrastMinusPressedConn;
sigc::connection neutralchPressedConn;
- bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask;
+ bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask, lastoldsh;
int nextnlevel;
IdleRegister idle_register;