diff --git a/rtdata/languages/default b/rtdata/languages/default
index 00da0fae3..f04ef1f78 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -1226,6 +1226,7 @@ HISTORY_MSG_978;Local - Log encoding Sursource
HISTORY_MSG_979;Local - Log encoding Brightness Q
HISTORY_MSG_980;Local - Log encoding Colorfulness M
HISTORY_MSG_981;Local - Log encoding Strength
+HISTORY_MSG_982;Local - Equalizer hue
HISTORY_MSG_BLSHAPE;Blur by level
HISTORY_MSG_BLURCWAV;Blur chroma
HISTORY_MSG_BLURWAV;Blur luminance
@@ -3021,7 +3022,7 @@ TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtr
TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level
TP_LOCALLAB_WARM;Warm/Cool & Color artifacts
TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases.
-TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve corresponds to the first 3 levels 0,1 &2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3 and beyond).
+TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve corresponds to the first 3 levels 0,1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3 and beyond).
TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level.
TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred.
TP_LOCALLAB_WAT_CLARIC_TOOLTIP;“Merge chroma” is used to select the intensity of the desired effect on chrominance.
diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc
index 64e2d6e60..a787f1300 100644
--- a/rtengine/dcrop.cc
+++ b/rtengine/dcrop.cc
@@ -935,6 +935,7 @@ void Crop::update(int todo)
auto& loccompwavCurve = parent->loccompwavCurve;
auto& loccomprewavCurve = parent->loccomprewavCurve;
auto& locedgwavCurve = parent->locedgwavCurve;
+ auto& locwavCurvehue = parent->locwavCurvehue;
auto& locwavCurveden = parent->locwavCurveden;
auto& lmasklocal_curve2 = parent->lmasklocal_curve;
auto& loclmasCurve_wav = parent->loclmasCurve_wav;
@@ -985,6 +986,7 @@ void Crop::update(int todo)
const bool llmaslcutili = locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve);
const bool lhmaslcutili = lochhmaslcCurve.Set(params.locallab.spots.at(sp).HHmasklccurve);
const bool locwavutili = locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve);
+ const bool locwavhueutili = locwavCurvehue.Set(params.locallab.spots.at(sp).locwavcurvehue);
const bool locwavdenutili = locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden);
const bool loclevwavutili = loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve);
const bool locconwavutili = locconwavCurve.Set(params.locallab.spots.at(sp).locconwavcurve);
@@ -1080,6 +1082,7 @@ void Crop::update(int todo)
locconwavCurve, locconwavutili,
loccompwavCurve, loccompwavutili,
loccomprewavCurve, loccomprewavutili,
+ locwavCurvehue, locwavhueutili,
locwavCurveden, locwavdenutili,
locedgwavCurve, locedgwavutili,
loclmasCurve_wav,lmasutili_wav,
@@ -1125,6 +1128,7 @@ void Crop::update(int todo)
locconwavCurve, locconwavutili,
loccompwavCurve, loccompwavutili,
loccomprewavCurve, loccomprewavutili,
+ locwavCurvehue, locwavhueutili,
locwavCurveden, locwavdenutili,
locedgwavCurve, locedgwavutili,
loclmasCurve_wav,lmasutili_wav,
diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc
index e63bb19f4..1bee058c8 100644
--- a/rtengine/improccoordinator.cc
+++ b/rtengine/improccoordinator.cc
@@ -1119,6 +1119,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
const bool locconwavutili = locconwavCurve.Set(params->locallab.spots.at(sp).locconwavcurve);
const bool loccompwavutili = loccompwavCurve.Set(params->locallab.spots.at(sp).loccompwavcurve);
const bool loccomprewavutili = loccomprewavCurve.Set(params->locallab.spots.at(sp).loccomprewavcurve);
+ const bool locwavhueutili = locwavCurvehue.Set(params->locallab.spots.at(sp).locwavcurvehue);
const bool locwavdenutili = locwavCurveden.Set(params->locallab.spots.at(sp).locwavcurveden);
const bool locedgwavutili = locedgwavCurve.Set(params->locallab.spots.at(sp).locedgwavcurve);
const bool lmasutili_wav = loclmasCurve_wav.Set(params->locallab.spots.at(sp).LLmask_curvewav);
@@ -1227,6 +1228,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
locconwavCurve, locconwavutili,
loccompwavCurve, loccompwavutili,
loccomprewavCurve, loccomprewavutili,
+ locwavCurvehue, locwavhueutili,
locwavCurveden, locwavdenutili,
locedgwavCurve, locedgwavutili,
loclmasCurve_wav, lmasutili_wav,
diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h
index 8097dd9ce..5c17f36b8 100644
--- a/rtengine/improccoordinator.h
+++ b/rtengine/improccoordinator.h
@@ -329,6 +329,7 @@ protected:
LocwavCurve locwavCurveden;
LocwavCurve locedgwavCurve;
LocwavCurve loclmasCurve_wav;
+ LocwavCurve locwavCurvehue;
std::vector huerefs;
std::vector huerefblurs;
diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h
index b7b0b5741..a8d168383 100644
--- a/rtengine/improcfun.h
+++ b/rtengine/improcfun.h
@@ -325,6 +325,7 @@ public:
const LocwavCurve& locconwavCurve, bool locconwavutili,
const LocwavCurve& loccompwavCurve, bool loccompwavutili,
const LocwavCurve& loccomprewavCurve, bool loccomprewavutili,
+ const LocwavCurve& locwavCurvehue, bool locwavhueutili,
const LocwavCurve& locwavCurveden, bool locwavdenutili,
const LocwavCurve& locedgwavCurve, bool locedgwavutili,
const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav,
@@ -368,7 +369,7 @@ public:
void DeNoise_Local(int call, const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk);
void DeNoise_Local2(const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk);
- void DeNoise(int call, float * slidL, float * slida, float * slidb, int aut, bool noiscfactiv, const struct local_params& lp, LabImage* originalmaskbl, int levred, float huerefblur, float lumarefblur, float chromarefblur, LabImage* original, LabImage* transformed, int cx, int cy, int sk);
+ void DeNoise(int call, float * slidL, float * slida, float * slidb, int aut, bool noiscfactiv, const struct local_params& lp, LabImage* originalmaskbl, int levred, float huerefblur, float lumarefblur, float chromarefblur, LabImage* original, LabImage* transformed, int cx, int cy, int sk, const LocwavCurve& locwavCurvehue, bool locwavhueutili);
void fftw_denoise(int GW, int GH, int max_numblox_W, int min_numblox_W, float **tmp1, array2D *Lin, int numThreads, const struct local_params & lp, int chrom);
diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc
index 9271f0b65..d4cf7041b 100644
--- a/rtengine/iplocallab.cc
+++ b/rtengine/iplocallab.cc
@@ -8650,7 +8650,7 @@ void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_nu
}
-void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * slidb, int aut, bool noiscfactiv, const struct local_params & lp, LabImage * originalmaskbl, int levred, float huerefblur, float lumarefblur, float chromarefblur, LabImage * original, LabImage * transformed, int cx, int cy, int sk)
+void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * slidb, int aut, bool noiscfactiv, const struct local_params & lp, LabImage * originalmaskbl, int levred, float huerefblur, float lumarefblur, float chromarefblur, LabImage * original, LabImage * transformed, int cx, int cy, int sk, const LocwavCurve& locwavCurvehue, bool locwavhueutili)
{
//local denoise
@@ -8681,6 +8681,16 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
int GW = transformed->W;
int GH = transformed->H;
+ bool HHhuecurve = false;
+
+ if (locwavCurvehue && locwavhueutili) {
+ for (int i = 0; i < 500; i++) {
+ if (locwavCurvehue[i] != 0.5) {
+ HHhuecurve = true;
+ break;
+ }
+ }
+ }
#ifdef _OPENMP
const int numThreads = omp_get_max_threads();
@@ -8817,6 +8827,7 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
}
float* noisevarlum = new float[GH * GW];
+ float* noisevarhue = new float[GH * GW];
int GW2 = (GW + 1) / 2;
float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value
@@ -8844,6 +8855,20 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
}
}
+ if(HHhuecurve) {
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+ for (int ir = 0; ir < GH; ir++)
+ for (int jr = 0; jr < GW; jr++) {
+ float hueG = xatan2f(tmp1.b[ir][jr], tmp1.a[ir][jr]);
+ float valparam = float (2.f * (locwavCurvehue[500.f * Color::huelab_to_huehsv2(hueG)] - 0.5f)); //get H=f(H)
+ noisevarhue[(ir >> 1)*GW2 + (jr >> 1)] = 1.f + valparam;
+ noisevarlum[(ir >> 1)*GW2 + (jr >> 1)] *= noisevarhue[(ir >> 1)*GW2 + (jr >> 1)];
+ }
+ }
+
+
if ((lp.quamet == 0 && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) {
WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads);
@@ -8856,6 +8881,7 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
}
delete[] noisevarlum;
+ delete[] noisevarhue;
}
}
@@ -9371,6 +9397,7 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
// float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL
float* noisevarlum = new float[bfh * bfw];
+ float* noisevarhue = new float[bfh * bfw];
int bfw2 = (bfw + 1) / 2;
float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value
@@ -9398,6 +9425,19 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
}
}
+ if(HHhuecurve) {
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+ for (int ir = 0; ir < bfh; ir++)
+ for (int jr = 0; jr < bfw; jr++) {
+ float hueG = xatan2f(bufwv.b[ir][jr], bufwv.a[ir][jr]);
+ float valparam = float (2.f * (locwavCurvehue[500.f * Color::huelab_to_huehsv2(hueG)] - 0.5f)); //get H=f(H)
+ noisevarhue[(ir >> 1)* bfw2 + (jr >> 1)] = 1.f + valparam;
+ noisevarlum[(ir >> 1)* bfw2 + (jr >> 1)] *= noisevarhue[(ir >> 1)* bfw2 + (jr >> 1)];
+ }
+ }
+
if ((lp.quamet == 0 && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) {
WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads);
@@ -9407,6 +9447,7 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
}
delete [] noisevarlum;
+ delete [] noisevarhue;
}
}
@@ -10129,6 +10170,7 @@ void ImProcFunctions::Lab_Local(
const LocwavCurve& locconwavCurve, bool locconwavutili,
const LocwavCurve& loccompwavCurve, bool loccompwavutili,
const LocwavCurve& loccomprewavCurve, bool loccomprewavutili,
+ const LocwavCurve& locwavCurvehue, bool locwavhueutili,
const LocwavCurve& locwavCurveden, bool locwavdenutili,
const LocwavCurve& locedgwavCurve, bool locedgwavutili,
const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav,
@@ -11074,7 +11116,7 @@ void ImProcFunctions::Lab_Local(
float slida[8] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
float slidb[8] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
constexpr int aut = 0;
- DeNoise(call, slidL, slida, slidb, aut, noiscfactiv, lp, originalmaskbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, cx, cy, sk);
+ DeNoise(call, slidL, slida, slidb, aut, noiscfactiv, lp, originalmaskbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, cx, cy, sk, locwavCurvehue, locwavhueutili);
if (params->locallab.spots.at(sp).recurs) {
original->CopyFrom(transformed, multiThread);
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 9f4e3e77c..7464152a3 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -1004,7 +1004,7 @@ enum ProcEventCode {
Evlocallablightq = 978,
Evlocallabcolorfl = 979,
Evlocallabrepar = 980,
-
+ EvlocallabwavCurvehue = 981,
NUMOFEVENTS
};
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 1fed31dc1..8f9567b41 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -3336,6 +3336,33 @@ LocallabParams::LocallabSpot::LocallabSpot() :
0.35,
0.35
},
+ locwavcurvehue{
+ static_cast(FCT_MinMaxCPoints),
+ 0.0,
+ 0.50,
+ 0.35,
+ 0.35,
+ 0.166,
+ 0.50,
+ 0.35,
+ 0.35,
+ 0.333,
+ 0.50,
+ 0.35,
+ 0.35,
+ 0.50,
+ 0.50,
+ 0.35,
+ 0.35,
+ 0.666,
+ 0.50,
+ 0.35,
+ 0.35,
+ 0.833,
+ 0.50,
+ 0.35,
+ 0.35
+ },
showmaskblMethodtyp("blur"),
CCmaskblcurve{
static_cast(FCT_MinMaxCPoints),
@@ -4335,6 +4362,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
&& sensiden == other.sensiden
&& detailthr == other.detailthr
&& locwavcurveden == other.locwavcurveden
+ && locwavcurvehue == other.locwavcurvehue
&& showmaskblMethodtyp == other.showmaskblMethodtyp
&& CCmaskblcurve == other.CCmaskblcurve
&& LLmaskblcurve == other.LLmaskblcurve
@@ -5916,6 +5944,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || spot_edited->sensiden, "Locallab", "Sensiden_" + index_str, spot.sensiden, keyFile);
saveToKeyfile(!pedited || spot_edited->detailthr, "Locallab", "Detailthr_" + index_str, spot.detailthr, keyFile);
saveToKeyfile(!pedited || spot_edited->locwavcurveden, "Locallab", "LocwavCurveden_" + index_str, spot.locwavcurveden, keyFile);
+ saveToKeyfile(!pedited || spot_edited->locwavcurvehue, "Locallab", "LocwavCurvehue_" + index_str, spot.locwavcurvehue, keyFile);
saveToKeyfile(!pedited || spot_edited->showmaskblMethodtyp, "Locallab", "Showmasktyp_" + index_str, spot.showmaskblMethodtyp, keyFile);
saveToKeyfile(!pedited || spot_edited->CCmaskblcurve, "Locallab", "CCmaskblCurve_" + index_str, spot.CCmaskblcurve, keyFile);
saveToKeyfile(!pedited || spot_edited->LLmaskblcurve, "Locallab", "LLmaskblCurve_" + index_str, spot.LLmaskblcurve, keyFile);
@@ -7713,6 +7742,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Locallab", "Sensiden_" + index_str, pedited, spot.sensiden, spotEdited.sensiden);
assignFromKeyfile(keyFile, "Locallab", "Detailthr_" + index_str, pedited, spot.detailthr, spotEdited.detailthr);
assignFromKeyfile(keyFile, "Locallab", "LocwavCurveden_" + index_str, pedited, spot.locwavcurveden, spotEdited.locwavcurveden);
+ assignFromKeyfile(keyFile, "Locallab", "LocwavCurvehue_" + index_str, pedited, spot.locwavcurvehue, spotEdited.locwavcurvehue);
assignFromKeyfile(keyFile, "Locallab", "Showmasktyp_" + index_str, pedited, spot.showmaskblMethodtyp, spotEdited.showmaskblMethodtyp);
assignFromKeyfile(keyFile, "Locallab", "CCmaskblCurve_" + index_str, pedited, spot.CCmaskblcurve, spotEdited.CCmaskblcurve);
assignFromKeyfile(keyFile, "Locallab", "LLmaskblCurve_" + index_str, pedited, spot.LLmaskblcurve, spotEdited.LLmaskblcurve);
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 25d39202e..520b12763 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -1229,6 +1229,7 @@ struct LocallabParams {
int sensiden;
int detailthr;
std::vector locwavcurveden;
+ std::vector locwavcurvehue;
Glib::ustring showmaskblMethodtyp;
std::vector CCmaskblcurve;
std::vector LLmaskblcurve;
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index e424ef14d..331945848 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -1007,8 +1007,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
LUMINANCECURVE, // Evlocallabsursour
LUMINANCECURVE, // Evlocallablightq
LUMINANCECURVE, // Evlocallabcolorfl
- LUMINANCECURVE // Evlocallabrepar
-
+ LUMINANCECURVE, // Evlocallabrepar
+ LUMINANCECURVE //EvlocallabwavCurvehue
};
diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc
index 57e239b66..7573f70c1 100644
--- a/rtengine/simpleprocess.cc
+++ b/rtengine/simpleprocess.cc
@@ -1139,6 +1139,7 @@ private:
LocwavCurve loccompwavCurve;
LocwavCurve loccomprewavCurve;
LocwavCurve locedgwavCurve;
+ LocwavCurve locwavCurvehue;
LocwavCurve locwavCurveden;
LUTf lllocalcurve(65536, LUT_CLIP_OFF);
LUTf lclocalcurve(65536, LUT_CLIP_OFF);
@@ -1217,6 +1218,7 @@ private:
const bool llmaslcutili = locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve);
const bool lmasutili_wav = loclmasCurve_wav.Set(params.locallab.spots.at(sp).LLmask_curvewav);
const bool locwavutili = locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve);
+ const bool locwavhueutili = locwavCurvehue.Set(params.locallab.spots.at(sp).locwavcurvehue);
const bool locwavdenutili = locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden);
const bool loclevwavutili = loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve);
const bool locconwavutili = locconwavCurve.Set(params.locallab.spots.at(sp).locconwavcurve);
@@ -1301,7 +1303,7 @@ private:
locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili,
locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili,
locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili,
-
+
locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili,
lochhhmas_Curve, lhhmas_utili,
loclmasCurveblwav,lmasutiliblwav,
@@ -1311,6 +1313,7 @@ private:
locconwavCurve, locconwavutili,
loccompwavCurve, loccompwavutili,
loccomprewavCurve, loccomprewavutili,
+ locwavCurvehue, locwavhueutili,
locwavCurveden, locwavdenutili,
locedgwavCurve, locedgwavutili,
loclmasCurve_wav,lmasutili_wav,
diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc
index da5f746dd..d06fa1837 100644
--- a/rtgui/locallabtools.cc
+++ b/rtgui/locallabtools.cc
@@ -5766,6 +5766,8 @@ LocallabBlur::LocallabBlur():
noiselumc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMCOARSE"), MINCHRO, MAXCHROCC, 0.01, 0.))),
noiselumdetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMDETAIL"), 0., 100., 0.01, 0.))),
noiselequal(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELEQUAL"), -2, 10, 1, 7, Gtk::manage(new RTImage("circle-white-small.png")), Gtk::manage(new RTImage("circle-black-small.png"))))),
+ LocalcurveEditorwavhue(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_WAVELET_DENOISEHUE"))),
+ wavhue(static_cast(LocalcurveEditorwavhue->addCurve(CT_Flat, "", nullptr, false, true))),
noisechrof(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHROFINE"), MINCHRO, MAXCHRO, 0.01, 0.))),
noisechroc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHROCOARSE"), MINCHRO, MAXCHROCC, 0.01, 0.))),
noisechrodetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHRODETAIL"), 0., 100., 0.01, 0.))),
@@ -5803,6 +5805,14 @@ LocallabBlur::LocallabBlur():
// Parameter Blur, Noise & Denoise specific widgets
setExpandAlignProperties(expblnoise, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
+ float R, G, B;
+ std::vector six_shape;
+
+ for (int i = 0; i < 6; i++) {
+ const float x = static_cast(i) * (1.f / 6.f);
+ Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B);
+ six_shape.emplace_back(x, R, G, B);
+ }
blMethod->append(M("TP_LOCALLAB_BLUR"));
blMethod->append(M("TP_LOCALLAB_BLMED"));
@@ -5886,6 +5896,19 @@ LocallabBlur::LocallabBlur():
noiselequal->setAdjusterListener(this);
+ LocalcurveEditorwavhue->setCurveListener(this);
+
+ wavhue->setIdentityValue(0.);
+ wavhue->setResetCurve(FlatCurveType(defSpot.locwavcurvehue.at(0)), defSpot.locwavcurvehue);
+ wavhue->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP"));
+ wavhue->setCurveColorProvider(this, 3);
+ wavhue->setBottomBarBgGradient(six_shape);
+
+// wavguid->setIdentityValue(0.);
+// wavguid->setResetCurve(FlatCurveType(defSpot.locwavcurveguid.at(0)), defSpot.locwavcurveguid);
+
+ LocalcurveEditorwavhue->curveListComplete();
+
noisechrof->setAdjusterListener(this);
noisechroc->set_tooltip_text(M("TP_LOCALLAB_NOISECHROC_TOOLTIP"));
@@ -6008,6 +6031,7 @@ LocallabBlur::LocallabBlur():
// wavBox->pack_start(*noiselumc);
wavBox->pack_start(*noiselumdetail);
wavBox->pack_start(*noiselequal);
+ wavBox->pack_start(*LocalcurveEditorwavhue, Gtk::PACK_SHRINK, 4);
wavBox->pack_start(*noisechrof);
wavBox->pack_start(*noisechroc);
wavBox->pack_start(*noisechrodetail);
@@ -6050,6 +6074,7 @@ LocallabBlur::LocallabBlur():
LocallabBlur::~LocallabBlur()
{
delete LocalcurveEditorwavden;
+ delete LocalcurveEditorwavhue;
delete maskblCurveEditorG;
delete mask2blCurveEditorG;
delete mask2blCurveEditorGwav;
@@ -6091,6 +6116,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
expdenoise->set_tooltip_markup(M("TP_LOCALLAB_DENOI_TOOLTIP"));
quamethod->set_tooltip_markup(M("TP_LOCALLAB_DENOIQUA_TOOLTIP"));
wavshapeden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP"));
+// wavhue->setTooltip(M("TP_LOCALLAB_WAVHUE_TOOLTIP"));
LocalcurveEditorwavden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP"));
noiselequal->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUAL_TOOLTIP"));
noiselumdetail->set_tooltip_text(M("TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP"));
@@ -6173,6 +6199,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
shadmaskbl->set_tooltip_text("");
shadmaskblsha->set_tooltip_text("");
csThresholdblur->set_tooltip_text("");
+// wavhue->setTooltip("");
sensiden->set_tooltip_text("");
}
@@ -6294,6 +6321,7 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params
activlum->set_active(spot.activlum);
wavshapeden->setCurve(spot.locwavcurveden);
+ wavhue->setCurve(spot.locwavcurvehue);
noiselumf0->setValue(spot.noiselumf0);
noiselumf->setValue(spot.noiselumf);
noiselumf2->setValue(spot.noiselumf2);
@@ -6414,6 +6442,7 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped
spot.activlum = activlum->get_active();
spot.locwavcurveden = wavshapeden->getCurve();
+ spot.locwavcurvehue = wavhue->getCurve();
spot.noiselumf0 = noiselumf0->getValue();
spot.noiselumf = noiselumf->getValue();
spot.noiselumf2 = noiselumf2->getValue();
@@ -6754,6 +6783,13 @@ void LocallabBlur::curveChanged(CurveEditor* ce)
}
}
+ if (ce == wavhue) {
+ if (listener) {
+ listener->panelChanged(EvlocallabwavCurvehue,
+ M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(spotName) + ")");
+ }
+ }
+
if (ce == CCmaskblshape) {
if (listener) {
listener->panelChanged(EvlocallabCCmaskblshape,
diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h
index c221983c1..e15cd716c 100644
--- a/rtgui/locallabtools.h
+++ b/rtgui/locallabtools.h
@@ -665,6 +665,8 @@ private:
Adjuster* const noiselumc;
Adjuster* const noiselumdetail;
Adjuster* const noiselequal;
+ CurveEditorGroup* const LocalcurveEditorwavhue;
+ FlatCurveEditor* wavhue;
Adjuster* const noisechrof;
Adjuster* const noisechroc;
Adjuster* const noisechrodetail;
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index 08307d325..628d07214 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -1300,6 +1300,7 @@ void ParamsEdited::initFrom(const std::vector&
locallab.spots.at(j).sensiden = locallab.spots.at(j).sensiden && pSpot.sensiden == otherSpot.sensiden;
locallab.spots.at(j).detailthr = locallab.spots.at(j).detailthr && pSpot.detailthr == otherSpot.detailthr;
locallab.spots.at(j).locwavcurveden = locallab.spots.at(j).locwavcurveden && pSpot.locwavcurveden == otherSpot.locwavcurveden;
+ locallab.spots.at(j).locwavcurvehue = locallab.spots.at(j).locwavcurvehue && pSpot.locwavcurvehue == otherSpot.locwavcurvehue;
locallab.spots.at(j).showmaskblMethodtyp = locallab.spots.at(j).showmaskblMethodtyp && pSpot.showmaskblMethodtyp == otherSpot.showmaskblMethodtyp;
locallab.spots.at(j).CCmaskblcurve = locallab.spots.at(j).CCmaskblcurve && pSpot.CCmaskblcurve == otherSpot.CCmaskblcurve;
locallab.spots.at(j).LLmaskblcurve = locallab.spots.at(j).LLmaskblcurve && pSpot.LLmaskblcurve == otherSpot.LLmaskblcurve;
@@ -4115,6 +4116,11 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.locallab.spots.at(i).locwavcurveden = mods.locallab.spots.at(i).locwavcurveden;
}
+ if (locallab.spots.at(i).locwavcurvehue) {
+ toEdit.locallab.spots.at(i).locwavcurvehue = mods.locallab.spots.at(i).locwavcurvehue;
+ }
+
+
if (locallab.spots.at(i).showmaskblMethodtyp) {
toEdit.locallab.spots.at(i).showmaskblMethodtyp = mods.locallab.spots.at(i).showmaskblMethodtyp;
}
@@ -6578,6 +6584,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) :
sensiden(v),
detailthr(v),
locwavcurveden(v),
+ locwavcurvehue(v),
showmaskblMethodtyp(v),
CCmaskblcurve(v),
LLmaskblcurve(v),
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index bf248bbab..ea4ebfdce 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -637,6 +637,7 @@ public:
bool sensiden;
bool detailthr;
bool locwavcurveden;
+ bool locwavcurvehue;
bool showmaskblMethodtyp;
bool CCmaskblcurve;
bool LLmaskblcurve;