diff --git a/rtdata/languages/default b/rtdata/languages/default index 51194f273..cba87d663 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1016,6 +1016,8 @@ HISTORY_MSG_775;Local - CBDL Mask contrast curve HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve HISTORY_MSG_777;Local - Blur Mask local contrast curve HISTORY_MSG_778;Local - Blur Mask Wavelet level +HISTORY_MSG_779;Local - Color Mask local contrast curve +HISTORY_MSG_780;Local - Color Mask Wavelet level HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2303,7 +2305,7 @@ TP_LOCALLAB_SHOWT;3 - Mask and modifications TP_LOCALLAB_SHOWS;4+ - Mask and modifications TP_LOCALLAB_SHOWR;5 - Mask and modifications TP_LOCALLAB_SHOWE;6+ - Mask and modifications -TP_LOCALLAB_SHOWC;7+ - Mask and modifications +TP_LOCALLAB_SHOWC;7+* - Mask and modifications TP_LOCALLAB_SHOWPLUS;1+* - Mask and modifications - Smooth-Blur & Denoise TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display modifications.\nBeware, you can only view one modification (color and light or Exposure or Shadows-Highlight or TM or CBDL or Retinex MSR or Blur).\n\nUse Mask is before algorihtm shape detection TP_LOCALLAB_SHOWMNONE;None diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 1d5ed3198..8145f0dda 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -929,6 +929,7 @@ void Crop::update(int todo) bool llmasblutili = parent->llmasblutili; bool locwavutili = parent->locwavutili; bool lmasutiliblwav = parent->lmasutiliblwav; + bool lmasutilicolwav = parent->lmasutilicolwav; // float avg = parent->avg; LUTu dummy; @@ -960,6 +961,7 @@ void Crop::update(int todo) LocHHmaskCurve lochhmasblCurve; LocwavCurve locwavCurve; LocwavCurve loclmasCurveblwav; + LocwavCurve loclmasCurvecolwav; LocretigainCurverab locRETgainCurverab; locallutili = false; @@ -996,6 +998,7 @@ void Crop::update(int todo) locllmasblCurve.Set(params.locallab.spots.at(sp).LLmaskblcurve, llmasblutili); lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve, lhmastmutili); loclmasCurveblwav.Set(params.locallab.spots.at(sp).LLmaskblcurvewav, lmasutiliblwav); + loclmasCurvecolwav.Set(params.locallab.spots.at(sp).LLmaskcolcurvewav, lmasutilicolwav); locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve, locwavutili); locallutili = false; @@ -1069,6 +1072,7 @@ void Crop::update(int todo) locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, LHutili, HHutili, cclocalcurve2, localcutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, @@ -1094,6 +1098,7 @@ void Crop::update(int todo) locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, LHutili, HHutili, cclocalcurve2, localcutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1140,6 +1145,7 @@ void Crop::update(int todo) lochhmasblCurve.Reset(); locwavCurve.Reset(); loclmasCurveblwav.Reset(); + loclmasCurvecolwav.Reset(); if (skip <= 2) { usleep(settings->cropsleep); //wait to avoid crash when crop 100% and move window diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 1e33fd7a9..6009cc0d2 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -202,6 +202,7 @@ ImProcCoordinator::ImProcCoordinator() : llmascbutili(false), locwavutili(false), lmasutiliblwav(false), + lmasutilicolwav(false), LHutili(false), HHutili(false), huerefs(500, -100000.f), @@ -959,6 +960,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lcmasutili = false; locwavutili = false; lmasutiliblwav = false; + lmasutilicolwav = false; locRETgainCurve.Set(params->locallab.spots.at(sp).localTgaincurve); locRETtransCurve.Set(params->locallab.spots.at(sp).localTtranscurve); loclhCurve.Set(params->locallab.spots.at(sp).LHcurve, LHutili); @@ -985,6 +987,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locccmasblCurve.Set(params->locallab.spots.at(sp).CCmaskblcurve, lcmasblutili); lochhmasblCurve.Set(params->locallab.spots.at(sp).HHmaskblcurve, lhmasblutili); loclmasCurveblwav.Set(params->locallab.spots.at(sp).LLmaskblcurvewav, lmasutiliblwav); + loclmasCurvecolwav.Set(params->locallab.spots.at(sp).LLmaskcolcurvewav, lmasutilicolwav); locwavCurve.Set(params->locallab.spots.at(sp).locwavcurve, locwavutili); CurveFactory::curveLocal(locallutili, params->locallab.spots.at(sp).llcurve, lllocalcurve, sca); @@ -1064,6 +1067,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, LHutili, HHutili, cclocalcurve, localcutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, @@ -1088,6 +1092,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, LHutili, HHutili, cclocalcurve, localcutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1141,6 +1146,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lochhmasblCurve.Reset(); locwavCurve.Reset(); loclmasCurveblwav.Reset(); + loclmasCurvecolwav.Reset(); } } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index a577466de..035f32d06 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -269,6 +269,7 @@ protected: LocHHmaskCurve lochhmasblCurve; LocwavCurve locwavCurve; LocwavCurve loclmasCurveblwav; + LocwavCurve loclmasCurvecolwav; bool locallutili; bool localcutili; @@ -303,6 +304,7 @@ protected: bool llmasblutili; bool locwavutili; bool lmasutiliblwav; + bool lmasutilicolwav; bool LHutili; bool HHutili; LUTf huerefs; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 23705ed07..df445c739 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -192,7 +192,8 @@ public: const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, - LUTf & lmasklocalcurve, bool & localmaskutili + LUTf & lmasklocalcurve, bool & localmaskutili, + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int wavlevel ); void discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t); void rex_poisson_dct(float * data, size_t nx, size_t ny, double m); @@ -240,6 +241,7 @@ public: const LocCCmaskCurve & locccmastmCurve, bool &lcmastmutili, const LocLLmaskCurve & locllmastmCurve, bool &llmastmutili, const LocHHmaskCurve & lochhmastmCurve, bool & lhmastmutili, const LocCCmaskCurve & locccmasblCurve, bool &lcmasblutili, const LocLLmaskCurve & locllmasblCurve, bool &llmasblutili, const LocHHmaskCurve & lochhmasblCurve, bool & lhmasblutili, const LocwavCurve & loclmasCurveblwav, bool & lmasutiliblwav, + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, const LocwavCurve & locwavCurve, bool & locwavutili, bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localcutili, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurveloc, LUTf & shtonecurveloc, LUTf & tonecurveloc, LUTf & lightCurveloc, double & huerefblur, double &chromarefblur, double & lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 864a204f6..01241ef5f 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2844,7 +2844,8 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, - LUTf & lmasklocalcurve, bool & localmaskutili + LUTf & lmasklocalcurve, bool & localmaskutili, + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int wavlevel ) { array2D ble(bfw, bfh); @@ -2983,6 +2984,37 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } + int wavelet_level = wavlevel; + + int minwin = min(bfw, bfh); + int maxlevelspot = 9; + while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { + --maxlevelspot ; + } + wavelet_level = min(wavelet_level, maxlevelspot); + int maxlvl; + float contrast = 0.f; + bool wavcurvemask = false; + + if (loclmasCurvecolwav && lmasutilicolwav) { + for (int i = 0; i < 500; i++) { + if (loclmasCurvecolwav[i] != 0.5) { + wavcurvemask = true; + } + } + } + + if(wavcurvemask) { +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + + wavcontrast(bufmaskblurcol->L, contrast, bfw, bfh, wavelet_level, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, maxlvl); + } + if (lap > 0.f) { float *datain = new float[bfh * bfw]; @@ -6841,6 +6873,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const LocCCmaskCurve & locccmastmCurve, bool & lcmastmutili, const LocLLmaskCurve & locllmastmCurve, bool & llmastmutili, const LocHHmaskCurve & lochhmastmCurve, bool & lhmastmutili, const LocCCmaskCurve & locccmasblCurve, bool & lcmasblutili, const LocLLmaskCurve & locllmasblCurve, bool & llmasblutili, const LocHHmaskCurve & lochhmasblCurve, bool & lhmasblutili, const LocwavCurve & loclmasCurveblwav, bool & lmasutiliblwav, + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, const LocwavCurve & locwavCurve, bool & locwavutili, bool & LHutili, bool & HHutili, LUTf & cclocalcurve, bool & localcutili, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurveloc, LUTf & shtonecurveloc, LUTf & tonecurveloc, LUTf & lightCurveloc, double & huerefblur, double & chromarefblur, double & lumarefblur, double & hueref, double & chromaref, double & lumaref, double & sobelref, @@ -7129,6 +7162,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o wavcontrast(bufmaskblurbl->L, contrast, GW, GH, wavelet_level, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, maxlvl); } + float lap = params->locallab.spots.at(sp).lapmaskbl; bool pde = params->locallab.spots.at(sp).laplac; @@ -7699,9 +7733,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacb; float lap = params->locallab.spots.at(sp).lapmaskcb; float pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool lmasutilicolwav = false; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, inv, lp, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskcblocalcurve, localmaskcbutili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 5); if (lp.showmaskcbmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); @@ -7974,10 +8010,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; if (!params->locallab.spots.at(sp).enatmMaskaft) { + LocwavCurve dummy; + bool lmasutilicolwav = false; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 5); if (lp.showmasktmmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); @@ -7997,10 +8035,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (enatmMasktmap) { //calculate new values for original, originalmasktm, bufmaskorigtm...in function of tmp1 + LocwavCurve dummy; + bool lmasutilicolwav = false; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 5); if (lp.showmasktmmet == 3) {//dispaly mask showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); @@ -8164,10 +8204,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; float pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool lmasutilicolwav = false; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigSH.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 5); if (lp.showmaskSHmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); @@ -8259,10 +8301,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; float pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool lmasutilicolwav = false; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 5); if (lp.showmaskSHmetinv == 1) { @@ -10223,10 +10267,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaexp; float lap = params->locallab.spots.at(sp).lapmaskexp; float pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool lmasutilicolwav = false; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 5); if (lp.showmaskexpmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); @@ -10488,10 +10534,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaexp; float lap = params->locallab.spots.at(sp).lapmaskexp; float pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool lmasutilicolwav = false; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 5); if (lp.showmaskexpmetinv == 1) { showmask(lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); @@ -10728,10 +10776,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacol; float lap = params->locallab.spots.at(sp).lapmaskcol; float pde = params->locallab.spots.at(sp).laplac; + int wavlevel = params->locallab.spots.at(sp).wavmaskcol; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, wavlevel); if (lp.showmaskcolmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); @@ -10931,10 +10980,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacol; float lap = params->locallab.spots.at(sp).lapmaskcol; float pde = params->locallab.spots.at(sp).laplac; + int wavlevel = params->locallab.spots.at(sp).wavmaskcol; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, wavlevel); if (lp.showmaskcolmetinv == 1) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 6194c40bf..a25ca3aea 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -805,6 +805,8 @@ enum ProcEventCode { EvlocallabLmaskblshape = 775, EvlocallabLLmaskblshapewav = 776, Evlocallabwavmaskbl = 777, + EvlocallabLLmaskcolshapewav = 778, + Evlocallabwavmaskcol = 779, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 6298318c0..f298b372d 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2452,6 +2452,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : chromaskcol(0.0), gammaskcol(1.0), slomaskcol(0.0), + wavmaskcol(5), lapmaskcol(0.0), qualitycurveMethod("none"), gridMethod("one"), @@ -2466,6 +2467,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : HHmaskcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.00, 1.0, 0.35, 0.35 }, softradiuscol(0.0), Lmaskcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, + LLmaskcolcurvewav{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, // Exposure expexpose(false), expcomp(0.0), @@ -2742,6 +2744,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chromaskcol == other.chromaskcol && gammaskcol == other.gammaskcol && slomaskcol == other.slomaskcol + && wavmaskcol == other.wavmaskcol && lapmaskcol == other.lapmaskcol && qualitycurveMethod == other.qualitycurveMethod && gridMethod == other.gridMethod @@ -2757,6 +2760,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && blurcolde == other.blurcolde && softradiuscol == other.softradiuscol && Lmaskcurve == other.Lmaskcurve + && LLmaskcolcurvewav == other.LLmaskcolcurvewav // Exposure && expexpose == other.expexpose && expcomp == other.expcomp @@ -4020,6 +4024,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromaskcol, "Locallab", "Chromaskcol_" + std::to_string(i), spot.chromaskcol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gammaskcol, "Locallab", "Gammaskcol_" + std::to_string(i), spot.gammaskcol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).slomaskcol, "Locallab", "Slomaskcol_" + std::to_string(i), spot.slomaskcol, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).wavmaskcol, "Locallab", "Wavmaskcollevel_" + std::to_string(i), spot.wavmaskcol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lapmaskcol, "Locallab", "Lapmaskcol_" + std::to_string(i), spot.lapmaskcol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).qualitycurveMethod, "Locallab", "QualityCurveMethod_" + std::to_string(i), spot.qualitycurveMethod, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).gridMethod, "Locallab", "gridMethod_" + std::to_string(i), spot.gridMethod, keyFile); @@ -4034,6 +4039,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).HHmaskcurve, "Locallab", "HHmaskCurve_" + std::to_string(i), spot.HHmaskcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).softradiuscol, "Locallab", "Softradiuscol_" + std::to_string(i), spot.softradiuscol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).Lmaskcurve, "Locallab", "LmaskCurve_" + std::to_string(i), spot.Lmaskcurve, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmaskcolcurvewav, "Locallab", "LLmaskcolCurvewav_" + std::to_string(i), spot.LLmaskcolcurvewav, keyFile); // Exposure saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expexpose, "Locallab", "Expexpose_" + std::to_string(i), spot.expexpose, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expcomp, "Locallab", "Expcomp_" + std::to_string(i), spot.expcomp, keyFile); @@ -5412,6 +5418,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Chromaskcol_" + std::to_string(i), pedited, spot.chromaskcol, spotEdited.chromaskcol); assignFromKeyfile(keyFile, "Locallab", "Gammaskcol_" + std::to_string(i), pedited, spot.gammaskcol, spotEdited.gammaskcol); assignFromKeyfile(keyFile, "Locallab", "Slomaskcol_" + std::to_string(i), pedited, spot.slomaskcol, spotEdited.slomaskcol); + assignFromKeyfile(keyFile, "Locallab", "Wavmaskcollevel_" + std::to_string(i), pedited, spot.wavmaskcol, spotEdited.wavmaskcol); assignFromKeyfile(keyFile, "Locallab", "Lapmaskcol_" + std::to_string(i), pedited, spot.lapmaskcol, spotEdited.lapmaskcol); assignFromKeyfile(keyFile, "Locallab", "QualityCurveMethod_" + std::to_string(i), pedited, spot.qualitycurveMethod, spotEdited.qualitycurveMethod); assignFromKeyfile(keyFile, "Locallab", "gridMethod_" + std::to_string(i), pedited, spot.gridMethod, spotEdited.gridMethod); @@ -5426,6 +5433,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "HHmaskCurve_" + std::to_string(i), pedited, spot.HHmaskcurve, spotEdited.HHmaskcurve); assignFromKeyfile(keyFile, "Locallab", "Softradiuscol_" + std::to_string(i), pedited, spot.softradiuscol, spotEdited.softradiuscol); assignFromKeyfile(keyFile, "Locallab", "LmaskCurve_" + std::to_string(i), pedited, spot.Lmaskcurve, spotEdited.Lmaskcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskcolCurvewav_" + std::to_string(i), pedited, spot.LLmaskcolcurvewav, spotEdited.LLmaskcolcurvewav); // Exposure assignFromKeyfile(keyFile, "Locallab", "Expexpose_" + std::to_string(i), pedited, spot.expexpose, spotEdited.expexpose); assignFromKeyfile(keyFile, "Locallab", "Expcomp_" + std::to_string(i), pedited, spot.expcomp, spotEdited.expcomp); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index f3b9c5f11..addf5e272 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -999,6 +999,7 @@ struct LocallabParams { double chromaskcol; double gammaskcol; double slomaskcol; + int wavmaskcol; double lapmaskcol; Glib::ustring qualitycurveMethod; Glib::ustring gridMethod; @@ -1013,6 +1014,7 @@ struct LocallabParams { std::vector HHmaskcurve; double softradiuscol; std::vector Lmaskcurve; + std::vector LLmaskcolcurvewav; // Exposure bool expexpose; // int expcomp; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 9020c649b..34a460d3a 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -804,7 +804,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabLmaskcbshape LUMINANCECURVE, //EvlocallabLmaskblshape LUMINANCECURVE, //EvlocallabLLmaskblshapewav - LUMINANCECURVE //Evlocallabwavmaskbl + LUMINANCECURVE, //Evlocallabwavmaskbl + LUMINANCECURVE, //EvlocallabLLmaskcolshapewav + LUMINANCECURVE //Evlocallabwavmaskcol }; namespace rtengine diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 06de1263c..95c978cb5 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1117,6 +1117,7 @@ private: LocLLmaskCurve locllmasblCurve; LocHHmaskCurve lochhmasblCurve; LocwavCurve loclmasCurveblwav; + LocwavCurve loclmasCurvecolwav; LocwavCurve locwavCurve; LUTf lllocalcurve(65536, 0); LUTf cclocalcurve(65536, 0); @@ -1181,6 +1182,7 @@ private: bool llmasblutili = false; bool locwavutili = false; bool lmasutiliblwav = false; + bool lmasutilicolwav = false; locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve); loclhCurve.Set(params.locallab.spots.at(sp).LHcurve, LHutili); @@ -1207,6 +1209,7 @@ private: locllmasblCurve.Set(params.locallab.spots.at(sp).LLmaskblcurve, llmasblutili); lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve, lhmasblutili); loclmasCurveblwav.Set(params.locallab.spots.at(sp).LLmaskblcurvewav, lmasutiliblwav); + loclmasCurvecolwav.Set(params.locallab.spots.at(sp).LLmaskcolcurvewav, lmasutilicolwav); locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve, locwavutili); CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve, 1); @@ -1267,6 +1270,7 @@ private: locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, LHutili, HHutili, cclocalcurve, localcutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index be198a53b..055f0c3d0 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -156,6 +156,7 @@ Locallab::Locallab(): HCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_HLH"))), maskCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), mask2CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + mask2CurveEditorGwav(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVMASK"))), // Exposure curveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_CURVEEDITOR_TONES_LABEL"))), maskexpCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), @@ -200,6 +201,7 @@ Locallab::Locallab(): gammaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), slomaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), lapmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + wavmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WAMASKCOL"), 1, 9, 1, 5))), softradiuscol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), // Exposure expcomp(Gtk::manage(new Adjuster(M("TP_EXPOSURE_EXPCOMP"), -2.0, 4.0, 0.05, 0.0))), @@ -510,6 +512,7 @@ Locallab::Locallab(): chromaskcol->setAdjusterListener(this); gammaskcol->setAdjusterListener(this); slomaskcol->setAdjusterListener(this); + wavmaskcol->setAdjusterListener(this); softradiuscol->setAdjusterListener(this); lapmaskcol->setAdjusterListener(this); @@ -691,8 +694,21 @@ Locallab::Locallab(): Lmaskshape->setLeftBarBgGradient(mLmaskshape); mask2CurveEditorG->curveListComplete(); + mask2CurveEditorGwav->setCurveListener(this); + LLmaskcolshapewav = static_cast(mask2CurveEditorGwav->addCurve(CT_Flat, "L(L)", nullptr, false, false)); + LLmaskcolshapewav->setIdentityValue(0.); + LLmaskcolshapewav->setResetCurve(FlatCurveType(defSpot.LLmaskcolcurvewav.at(0)), defSpot.LLmaskcolcurvewav); + + if (showtooltip) { + LLmaskcolshapewav->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + } + + LLmaskcolshapewav->setBottomBarBgGradient(mllshape); + mask2CurveEditorGwav->curveListComplete(); + + labgrid = Gtk::manage(new LabGrid(EvLocallabLabGridValue, M("TP_LOCALLAB_LABGRID_VALUES"))); ToolParamBlock* const colorBox = Gtk::manage(new ToolParamBlock()); @@ -736,6 +752,8 @@ Locallab::Locallab(): maskcolBox->pack_start(*gammaskcol, Gtk::PACK_SHRINK, 0); maskcolBox->pack_start(*slomaskcol, Gtk::PACK_SHRINK, 0); maskcolBox->pack_start(*mask2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskcolBox->pack_start(*mask2CurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskcolBox->pack_start(*wavmaskcol, Gtk::PACK_SHRINK, 0); expmaskcol->add(*maskcolBox, false); colorBox->pack_start(*expmaskcol); @@ -2358,6 +2376,7 @@ Locallab::~Locallab() delete HCurveEditorG; delete maskCurveEditorG; delete mask2CurveEditorG; + delete mask2CurveEditorGwav; delete mask2expCurveEditorG; delete mask2SHCurveEditorG; delete mask2tmCurveEditorG; @@ -3278,9 +3297,11 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chromaskcol = chromaskcol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).gammaskcol = gammaskcol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).slomaskcol = slomaskcol->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).wavmaskcol = wavmaskcol->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).lapmaskcol = lapmaskcol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).softradiuscol = softradiuscol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = Lmaskshape->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = LLmaskcolshapewav->getCurve(); // Exposure pp->locallab.spots.at(pp->locallab.selspot).expexpose = expexpose->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).expcomp = expcomp->getValue(); @@ -3638,9 +3659,11 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chromaskcol = pe->locallab.spots.at(pp->locallab.selspot).chromaskcol || chromaskcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).gammaskcol = pe->locallab.spots.at(pp->locallab.selspot).gammaskcol || gammaskcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).slomaskcol = pe->locallab.spots.at(pp->locallab.selspot).slomaskcol || slomaskcol->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).wavmaskcol = pe->locallab.spots.at(pp->locallab.selspot).wavmaskcol || wavmaskcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).lapmaskcol = pe->locallab.spots.at(pp->locallab.selspot).lapmaskcol || lapmaskcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).softradiuscol = pe->locallab.spots.at(pp->locallab.selspot).softradiuscol || softradiuscol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = pe->locallab.spots.at(pp->locallab.selspot).Lmaskcurve || !Lmaskshape->isUnChanged(); + pe->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = pe->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav || !LLmaskcolshapewav->isUnChanged(); // Exposure pe->locallab.spots.at(pp->locallab.selspot).expexpose = pe->locallab.spots.at(pp->locallab.selspot).expexpose || !expexpose->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).expcomp = pe->locallab.spots.at(pp->locallab.selspot).expcomp || expcomp->getEditedState(); @@ -3933,9 +3956,11 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chromaskcol = pedited->locallab.spots.at(pp->locallab.selspot).chromaskcol || chromaskcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).gammaskcol = pedited->locallab.spots.at(pp->locallab.selspot).gammaskcol || gammaskcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).slomaskcol = pedited->locallab.spots.at(pp->locallab.selspot).slomaskcol || slomaskcol->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).wavmaskcol = pedited->locallab.spots.at(pp->locallab.selspot).wavmaskcol || wavmaskcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcol = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcol || lapmaskcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).softradiuscol = pedited->locallab.spots.at(pp->locallab.selspot).softradiuscol || softradiuscol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcurve || !Lmaskshape->isUnChanged(); + pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav || !LLmaskcolshapewav->isUnChanged(); // Exposure pedited->locallab.spots.at(pp->locallab.selspot).expexpose = pedited->locallab.spots.at(pp->locallab.selspot).expexpose || !expexpose->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).expcomp = pedited->locallab.spots.at(pp->locallab.selspot).expcomp || expcomp->getEditedState(); @@ -4321,6 +4346,12 @@ void Locallab::curveChanged(CurveEditor* ce) } } + if (ce == LLmaskcolshapewav) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskcolshapewav, M("HISTORY_CUSTOMCURVE")); + } + } + } // Exposure @@ -5898,6 +5929,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskcol->setDefault(defSpot->chromaskcol); gammaskcol->setDefault(defSpot->gammaskcol); slomaskcol->setDefault(defSpot->slomaskcol); + wavmaskcol->setDefault(defSpot->wavmaskcol); lapmaskcol->setDefault(defSpot->lapmaskcol); softradiuscol->setDefault(defSpot->softradiuscol); // Exposure @@ -6075,6 +6107,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskcol->setDefaultEditedState(Irrelevant); gammaskcol->setDefaultEditedState(Irrelevant); slomaskcol->setDefaultEditedState(Irrelevant); + wavmaskcol->setDefaultEditedState(Irrelevant); lapmaskcol->setDefaultEditedState(Irrelevant); softradiuscol->setDefaultEditedState(Irrelevant); // Exposure @@ -6256,6 +6289,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chromaskcol->setDefaultEditedState(defSpotState->chromaskcol ? Edited : UnEdited); gammaskcol->setDefaultEditedState(defSpotState->gammaskcol ? Edited : UnEdited); slomaskcol->setDefaultEditedState(defSpotState->slomaskcol ? Edited : UnEdited); + wavmaskcol->setDefaultEditedState(defSpotState->wavmaskcol ? Edited : UnEdited); lapmaskcol->setDefaultEditedState(defSpotState->lapmaskcol ? Edited : UnEdited); softradiuscol->setDefaultEditedState(defSpotState->softradiuscol ? Edited : UnEdited); // Exposure @@ -6533,6 +6567,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == wavmaskcol) { + if (listener) { + listener->panelChanged(Evlocallabwavmaskcol, wavmaskcol->getTextValue()); + } + } + if (a == lapmaskcol) { if (listener) { listener->panelChanged(Evlocallablapmaskcol, lapmaskcol->getTextValue()); @@ -7531,6 +7571,7 @@ void Locallab::setBatchMode(bool batchMode) chromaskcol->showEditedCB(); gammaskcol->showEditedCB(); slomaskcol->showEditedCB(); + wavmaskcol->showEditedCB(); lapmaskcol->showEditedCB(); softradiuscol->showEditedCB(); // Exposure @@ -8066,9 +8107,11 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskcol->setValue(pp->locallab.spots.at(index).chromaskcol); gammaskcol->setValue(pp->locallab.spots.at(index).gammaskcol); slomaskcol->setValue(pp->locallab.spots.at(index).slomaskcol); + wavmaskcol->setValue(pp->locallab.spots.at(index).wavmaskcol); lapmaskcol->setValue(pp->locallab.spots.at(index).lapmaskcol); softradiuscol->setValue(pp->locallab.spots.at(index).softradiuscol); Lmaskshape->setCurve(pp->locallab.spots.at(index).Lmaskcurve); + LLmaskcolshapewav->setCurve(pp->locallab.spots.at(index).LLmaskcolcurvewav); // Exposure expexpose->setEnabled(pp->locallab.spots.at(index).expexpose); @@ -8450,9 +8493,11 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chromaskcol->setEditedState(spotState->chromaskcol ? Edited : UnEdited); gammaskcol->setEditedState(spotState->gammaskcol ? Edited : UnEdited); slomaskcol->setEditedState(spotState->slomaskcol ? Edited : UnEdited); + wavmaskcol->setEditedState(spotState->wavmaskcol ? Edited : UnEdited); lapmaskcol->setEditedState(spotState->lapmaskcol ? Edited : UnEdited); softradiuscol->setEditedState(spotState->softradiuscol ? Edited : UnEdited); Lmaskshape->setUnChanged(!spotState->Lmaskcurve); + LLmaskcolshapewav->setUnChanged(!spotState->LLmaskcolcurvewav); // Exposure expexpose->set_inconsistent(!spotState->expexpose); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 0b417ce06..18c7141b4 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -75,6 +75,7 @@ private: CurveEditorGroup* const HCurveEditorG; CurveEditorGroup* const maskCurveEditorG; CurveEditorGroup* const mask2CurveEditorG; + CurveEditorGroup* const mask2CurveEditorGwav; DiagonalCurveEditor* Lmaskshape; DiagonalCurveEditor* llshape; DiagonalCurveEditor* ccshape; @@ -83,6 +84,7 @@ private: FlatCurveEditor* CCmaskshape; FlatCurveEditor* LLmaskshape; FlatCurveEditor* HHmaskshape; + FlatCurveEditor* LLmaskcolshapewav; // Exposure CurveEditorGroup* const curveEditorG; CurveEditorGroup* const maskexpCurveEditorG; @@ -156,6 +158,7 @@ private: Adjuster* const gammaskcol; Adjuster* const slomaskcol; Adjuster* const lapmaskcol; + Adjuster* const wavmaskcol; Adjuster* const softradiuscol; // Exposure Adjuster* const expcomp; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 06dba48a9..1528b2d89 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -993,6 +993,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chromaskcol = locallab.spots.at(j).chromaskcol && pSpot.chromaskcol == otherSpot.chromaskcol; locallab.spots.at(j).gammaskcol = locallab.spots.at(j).gammaskcol && pSpot.gammaskcol == otherSpot.gammaskcol; locallab.spots.at(j).slomaskcol = locallab.spots.at(j).slomaskcol && pSpot.slomaskcol == otherSpot.slomaskcol; + locallab.spots.at(j).wavmaskcol = locallab.spots.at(j).wavmaskcol && pSpot.wavmaskcol == otherSpot.wavmaskcol; locallab.spots.at(j).lapmaskcol = locallab.spots.at(j).lapmaskcol && pSpot.lapmaskcol == otherSpot.lapmaskcol; locallab.spots.at(j).qualitycurveMethod = locallab.spots.at(j).qualitycurveMethod && pSpot.qualitycurveMethod == otherSpot.qualitycurveMethod; locallab.spots.at(j).gridMethod = locallab.spots.at(j).gridMethod && pSpot.gridMethod == otherSpot.gridMethod; @@ -1007,6 +1008,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).HHmaskcurve = locallab.spots.at(j).HHmaskcurve && pSpot.HHmaskcurve == otherSpot.HHmaskcurve; locallab.spots.at(j).softradiuscol = locallab.spots.at(j).softradiuscol && pSpot.softradiuscol == otherSpot.softradiuscol; locallab.spots.at(j).Lmaskcurve = locallab.spots.at(j).Lmaskcurve && pSpot.Lmaskcurve == otherSpot.Lmaskcurve; + locallab.spots.at(j).LLmaskcolcurvewav = locallab.spots.at(j).LLmaskcolcurvewav && pSpot.LLmaskcolcurvewav == otherSpot.LLmaskcolcurvewav; // Exposure locallab.spots.at(j).expexpose = locallab.spots.at(j).expexpose && pSpot.expexpose == otherSpot.expexpose; locallab.spots.at(j).expcomp = locallab.spots.at(j).expcomp && pSpot.expcomp == otherSpot.expcomp; @@ -2869,6 +2871,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).slomaskcol = mods.locallab.spots.at(i).slomaskcol; } + if (locallab.spots.at(i).wavmaskcol) { + toEdit.locallab.spots.at(i).wavmaskcol = mods.locallab.spots.at(i).wavmaskcol; + } + if (locallab.spots.at(i).lapmaskcol) { toEdit.locallab.spots.at(i).lapmaskcol = mods.locallab.spots.at(i).lapmaskcol; } @@ -2925,6 +2931,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).Lmaskcurve = mods.locallab.spots.at(i).Lmaskcurve; } + if (locallab.spots.at(i).LLmaskcolcurvewav) { + toEdit.locallab.spots.at(i).LLmaskcolcurvewav = mods.locallab.spots.at(i).LLmaskcolcurvewav; + } + // Exposure if (locallab.spots.at(i).expexpose) { toEdit.locallab.spots.at(i).expexpose = mods.locallab.spots.at(i).expexpose; @@ -4805,6 +4815,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chromaskcol(v), gammaskcol(v), slomaskcol(v), + wavmaskcol(v), lapmaskcol(v), qualitycurveMethod(v), gridMethod(v), @@ -4819,6 +4830,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : HHmaskcurve(v), softradiuscol(v), Lmaskcurve(v), + LLmaskcolcurvewav(v), // Exposure expexpose(v), expcomp(v), @@ -5093,6 +5105,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chromaskcol = v; gammaskcol = v; slomaskcol = v; + wavmaskcol = v; lapmaskcol = v; qualitycurveMethod = v; gridMethod = v; @@ -5107,6 +5120,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) HHmaskcurve = v; softradiuscol = v; Lmaskcurve = v; + LLmaskcolcurvewav = v; // Exposure expexpose = v; expcomp = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 3f7bebfc3..ebbd1213f 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -411,6 +411,7 @@ public: bool chromaskcol; bool gammaskcol; bool slomaskcol; + bool wavmaskcol; bool lapmaskcol; bool qualitycurveMethod; bool gridMethod; @@ -425,6 +426,7 @@ public: bool HHmaskcurve; bool softradiuscol; bool Lmaskcurve; + bool LLmaskcolcurvewav; // Exposure bool expexpose; bool expcomp;