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;