From 2f414e20ed9a2cabf45ffde593072070f1ba8ef8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 14 Dec 2019 09:08:12 +0100 Subject: [PATCH] Add contrast by level to wavelet pyramid --- rtdata/languages/default | 5 ++ rtengine/dcrop.cc | 6 ++ rtengine/improccoordinator.cc | 6 ++ rtengine/improccoordinator.h | 2 + rtengine/improcfun.h | 3 +- rtengine/iplocallab.cc | 102 +++++++++++++++++++++++++++++++--- rtengine/procevents.h | 2 + rtengine/procparams.cc | 8 +++ rtengine/procparams.h | 2 + rtengine/refreshmap.cc | 4 +- rtengine/simpleprocess.cc | 4 ++ rtgui/locallab.cc | 62 ++++++++++++++++++++- rtgui/locallab.h | 4 ++ rtgui/paramsedited.cc | 14 +++++ rtgui/paramsedited.h | 2 + 15 files changed, 214 insertions(+), 12 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index e599458ae..8bdf623aa 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1097,6 +1097,8 @@ HISTORY_MSG_857;Local - Contrast Blur Residual HISTORY_MSG_858;Local - Contrast Luminance only HISTORY_MSG_859;Local - Contrast Maximum Blur levels HISTORY_MSG_860;Local - Contrast Curve Blur levels +HISTORY_MSG_861;Local - Contrast Curve Contrast levels +HISTORY_MSG_862;Local - Contrast Sigma luminance HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2222,6 +2224,7 @@ TP_LOCALLAB_COL_VIS;Status TP_LOCALLAB_COMPLEX_METHOD;Software Complexity TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustements rubrics. TP_LOCALLAB_CONTCOL;Contrast threshold Mask Blur +TP_LOCALLAB_CONTFRA;Contrast by Level TP_LOCALLAB_CONTRAST;Contrast TP_LOCALLAB_CONTRESID;Contrast TP_LOCALLAB_CONTTHR;Contrast Threshold @@ -2518,6 +2521,7 @@ TP_LOCALLAB_SHOWSTRUC;Show structure Spot TP_LOCALLAB_SHOWSTRUCEX;Show structure Spot - disabled in "normal" TP_LOCALLAB_SHOWT;4 - Mask and modifications TP_LOCALLAB_SHOWVI;3 - Mask and modifications +TP_LOCALLAB_SIGMAWAV;Sigma TP_LOCALLAB_SIM;Simple TP_LOCALLAB_SLOMASKCOL;Slope mask TP_LOCALLAB_SLOSH;Slope @@ -2577,6 +2581,7 @@ TP_LOCALLAB_WAMASKCOL;Mask Wavelet level TP_LOCALLAB_WARM;Warm - Cool & Color artifacts TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. TP_LOCALLAB_WAV;Levels local contrast +TP_LOCALLAB_WAVCON;Contrast by Level TP_LOCALLAB_WAVE;Wavelet TP_LOCALLAB_WAVHIGH;Wavelet high TP_LOCALLAB_WAVLEV;Blur by Level diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 2d5ae12a7..bf087ebcb 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -928,6 +928,7 @@ void Crop::update(int todo) bool llmasblutili = parent->llmasblutili; bool locwavutili = parent->locwavutili; bool loclevwavutili = parent->loclevwavutili; + bool locconwavutili = parent->locconwavutili; bool lmasutiliblwav = parent->lmasutiliblwav; bool lmasutilicolwav = parent->lmasutilicolwav; @@ -968,6 +969,7 @@ void Crop::update(int todo) LocwavCurve loclmasCurveblwav; LocwavCurve loclmasCurvecolwav; LocwavCurve loclevwavCurve; + LocwavCurve locconwavCurve; LocretigainCurverab locRETgainCurverab; locallutili = false; @@ -1012,6 +1014,7 @@ void Crop::update(int todo) locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve, locwavutili); loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve, loclevwavutili); + locconwavCurve.Set(params.locallab.spots.at(sp).locconwavcurve, locconwavutili); locallutili = false; CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve2, sca); localclutili = false; @@ -1104,6 +1107,7 @@ void Crop::update(int todo) loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, LHutili, HHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, parent->locallColorMask, parent->locallColorMaskinv, parent->locallExpMask, parent->locallExpMaskinv, parent->locallSHMask, parent->locallSHMaskinv, parent->locallvibMask, parent->locallcbMask, parent->locallretiMask, parent->locallsoftMask, parent->localltmMask, parent->locallblMask, @@ -1136,6 +1140,7 @@ void Crop::update(int todo) loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, LHutili, HHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); @@ -1192,6 +1197,7 @@ void Crop::update(int todo) lochhmasblCurve.Reset(); locwavCurve.Reset(); loclevwavCurve.Reset(); + locconwavCurve.Reset(); loclmasCurveblwav.Reset(); loclmasCurvecolwav.Reset(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 4523f585f..513820f19 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -220,6 +220,7 @@ ImProcCoordinator::ImProcCoordinator() : llmascbutili(false), locwavutili(false), loclevwavutili(false), + locconwavutili(false), lmasutiliblwav(false), lmasutilicolwav(false), LHutili(false), @@ -1081,6 +1082,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lcmasutili = false; locwavutili = false; loclevwavutili = false; + locconwavutili = false; lmasutiliblwav = false; lmasutilicolwav = false; locRETgainCurve.Set(params->locallab.spots.at(sp).localTgaincurve); @@ -1117,6 +1119,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locwavCurve.Set(params->locallab.spots.at(sp).locwavcurve, locwavutili); loclevwavCurve.Set(params->locallab.spots.at(sp).loclevwavcurve, loclevwavutili); + locconwavCurve.Set(params->locallab.spots.at(sp).locconwavcurve, locconwavutili); CurveFactory::curveLocal(locallutili, params->locallab.spots.at(sp).llcurve, lllocalcurve, sca); CurveFactory::curveLocal(localclutili, params->locallab.spots.at(sp).clcurve, cllocalcurve, sca); CurveFactory::curveLocal(locallcutili, params->locallab.spots.at(sp).lccurve, lclocalcurve, sca); @@ -1225,6 +1228,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) loclmasCurvecolwav, lmasutilicolwav, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, LHutili, HHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, lastsav, locallColorMask, locallColorMaskinv, locallExpMask, locallExpMaskinv, locallSHMask, locallSHMaskinv, locallvibMask, locallcbMask, locallretiMask, locallsoftMask, localltmMask, locallblMask, @@ -1262,6 +1266,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) loclmasCurvecolwav, lmasutilicolwav, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, LHutili, HHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, lastsav, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); @@ -1340,6 +1345,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lochhmasblCurve.Reset(); locwavCurve.Reset(); loclevwavCurve.Reset(); + locconwavCurve.Reset(); loclmasCurveblwav.Reset(); loclmasCurvecolwav.Reset(); } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 4e059cd9e..7ca578920 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -285,6 +285,7 @@ protected: LocwavCurve loclmasCurveblwav; LocwavCurve loclmasCurvecolwav; LocwavCurve loclevwavCurve; + LocwavCurve locconwavCurve; bool locallutili; bool localclutili; @@ -327,6 +328,7 @@ protected: bool llmasblutili; bool locwavutili; bool loclevwavutili; + bool locconwavutili; bool lmasutiliblwav; bool lmasutilicolwav; bool LHutili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index b1df3fa8e..f2c0cba73 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -299,6 +299,7 @@ public: const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, + const LocwavCurve & locconwavCurve, bool & locconwavutili, bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localcutili, LUTf & rgblocalcurve, bool & localrgbutili, 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, int &lastsav, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, @@ -312,7 +313,7 @@ public: static void strcurv_data(std::string retistr, int *s_datc, int &siz); void blendstruc(int bfw, int bfh, LabImage* bufcolorig, float radius, float stru, array2D & blend2, int sk, bool multiThread); - void wavcontrast4(float ** tmp, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, int & maxlvl); + void wavcontrast4(float ** tmp, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, float sigm, int & maxlvl); void transit_shapedetect2(int call, int senstype, const LabImage * bufexporig, const LabImage * bufexpfin, LabImage * originalmask, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); void transit_shapedetect_retinex(int call, int senstype, LabImage * bufexporig, LabImage * bufmask, LabImage * buforigmas, float **buflight, float **bufchro, const float hueref, const float chromaref, const float lumaref, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index bb42900ed..c0063ded2 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -3995,7 +3995,9 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int LocwavCurve dummy; bool loclevwavutili = false; bool wavcurvelev = false; - wavcontrast4(bufmaskblurcol->L, contrast, 0.f, 0.f, bfw, bfh, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, dummy, loclevwavutili, wavcurvelev, maxlvl); + bool locconwavutili = false; + bool wavcurvecon = false; + wavcontrast4(bufmaskblurcol->L, contrast, 0.f, 0.f, bfw, bfh, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, 1.f, maxlvl); } @@ -6732,7 +6734,8 @@ void ImProcFunctions::fftw_tile_blur(int GW, int GH, int tilssize, int max_numbl fftwf_destroy_plan(plan_backward_blox[1]); fftwf_cleanup(); } -void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, int & maxlvl) +void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, bool numThreads, + const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, float sigm, int & maxlvl) { wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, level_br, 1, sk, numThreads, 6); @@ -6774,10 +6777,6 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, } if (contrast != 0.) { -// int W_L = wdspot->level_W(0); -// int H_L = wdspot->level_H(0); -// float *wav_L0 = wdspot->coeff0; - double avedbl = 0.0; // use double precision for large summations @@ -6822,6 +6821,76 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, float MaxP[10]; float MaxN[10]; Evaluate2(*wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN); + + if (wavcurvecon) { + float beta; + float mea[9]; + + for (int dir = 1; dir < 4; dir++) { + for (int level = level_bl; level < maxlvl; ++level) { + int W_L = wdspot->level_W(level); + int H_L = wdspot->level_H(level); + float **wav_L = wdspot->level_coeffs(level); + mea[0] = mean[level] / 6.f; + mea[1] = mean[level] / 2.f; + mea[2] = mean[level]; // 50% data + mea[3] = mean[level] + sigm * sigma[level] / 2.f; + mea[4] = mean[level] + sigm * sigma[level]; //66% + mea[5] = mean[level] + sigm * 1.2f * sigma[level]; + mea[6] = mean[level] + sigm * 1.5f * sigma[level]; // + mea[7] = mean[level] + sigm * 2.f * sigma[level]; //95% + mea[8] = mean[level] + sigm * 2.5f * sigma[level]; //99% + + if (locconwavCurve && locconwavutili) { + + float cpMul = 200.f * (locconwavCurve[level * 50.f] - 0.5f); + + if(cpMul > 0.f) { + cpMul *= 2.f; + } + + cpMul /= sk; + + for (int i = 0; i < W_L * H_L; i++) { + + if (cpMul < 0.f) { + beta = 1.f; // disabled for negatives values "less contrast" + } else { + float WavCL = fabsf(wav_L[dir][i]); + + //reduction amplification: max action between mean / 2 and mean + sigma + // arbitrary coefficient, we can add a slider !! + if (WavCL < mea[0]) { + beta = 0.6f; //preserve very low contrast (sky...) + } else if (WavCL < mea[1]) { + beta = 0.8f; + } else if (WavCL < mea[2]) { + beta = 1.f; //standard + } else if (WavCL < mea[3]) { + beta = 1.f; + } else if (WavCL < mea[4]) { + beta = 0.8f; //+sigma + } else if (WavCL < mea[5]) { + beta = 0.6f; + } else if (WavCL < mea[6]) { + beta = 0.4f; + } else if (WavCL < mea[7]) { + beta = 0.2f; // + 2 sigma + } else if (WavCL < mea[8]) { + beta = 0.1f; + } else { + beta = 0.0f; + } + } + + float alpha = (1024.f + 15.f * (float) cpMul * beta) / 1024.f ; + wav_L[dir][i] *= alpha; + } + } + } + } + } + float alow = 1.f; float blow = 0.f; @@ -8480,6 +8549,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, + const LocwavCurve & locconwavCurve, bool & locconwavutili, bool & LHutili, bool & HHutili, LUTf & cclocalcurve, bool & localcutili, LUTf & rgblocalcurve, bool & localrgbutili, 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, int &lastsav, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, @@ -8877,7 +8947,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o LocwavCurve dummy; bool loclevwavutili = false; bool wavcurvelev = false; - wavcontrast4(bufmaskblurbl->L, contrast, 0.f, 0.f, GW, GH, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, dummy, loclevwavutili, wavcurvelev, maxlvl); + bool locconwavutili = false; + bool wavcurvecon = false; + wavcontrast4(bufmaskblurbl->L, contrast, 0.f, 0.f, GW, GH, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, dummy, loclevwavutili, wavcurvelev, dummy, locconwavutili, wavcurvecon, 1.f, maxlvl); } int shado = params->locallab.spots.at(sp).shadmaskbl; @@ -10556,8 +10628,19 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } + bool wavcurvecon = false; - if ((lp.lcamount > 0.f || wavcurve || wavcurvelev || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call < 3 && lp.lcena) { + if (locconwavCurve && locconwavutili) { + if (lp.locmet == 1) { + for (int i = 0; i < 500; i++) { + if (locconwavCurve[i] != 0.5) { + wavcurvecon = true; + } + } + } + } + + if ((lp.lcamount > 0.f || wavcurve || wavcurvelev || wavcurvecon || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call < 3 && lp.lcena) { int ystart = std::max(static_cast(lp.yc - lp.lyT) - cy, 0); int yend = std::min(static_cast(lp.yc + lp.ly) - cy, original->H); int xstart = std::max(static_cast(lp.xc - lp.lxL) - cx, 0); @@ -10803,8 +10886,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float radblur = (params->locallab.spots.at(sp).residblur) / sk; const bool blurlc = params->locallab.spots.at(sp).blurlc; const float radlevblur = (params->locallab.spots.at(sp).levelblur) / sk; + const float sigma = params->locallab.spots.at(sp).sigma; - wavcontrast4(tmp1->L, contrast, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, maxlvl); + wavcontrast4(tmp1->L, contrast, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, sigma, maxlvl); const float satur = params->locallab.spots.at(sp).residchro; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index ee86a59c9..9f8ffb470 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -886,6 +886,8 @@ enum ProcEventCode { Evlocallabblurlc = 857, Evlocallablevelblur = 858, EvlocallabwavCurvelev = 859, + EvlocallabwavCurvecon = 860, + Evlocallabsigma = 861, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 064b438ff..20f2e8d04 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2725,6 +2725,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : residblur(0.0), levelblur(0.0), residchro(0.0), + sigma(1.0), clarilres(0.0), claricres(0.0), clarisoft(0.0), @@ -2735,6 +2736,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : locwavcurve{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, csthreshold(0, 0, 5, 5, false), loclevwavcurve{(double)FCT_MinMaxCPoints, 0.0, 0.0, 0.0, 0.35, 0.5, 0., 0.35, 0.35, 1.0, 0.0, 0.35, 0.35}, + locconwavcurve{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, // Contrast by detail levels expcbdl(false), mult{1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, @@ -3112,6 +3114,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && residblur == other.residblur && levelblur == other.levelblur && residchro == other.residchro + && sigma == other.sigma && clarilres == other.clarilres && claricres == other.claricres && clarisoft == other.clarisoft @@ -3122,6 +3125,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && locwavcurve == other.locwavcurve && csthreshold == other.csthreshold && loclevwavcurve == other.loclevwavcurve + && locconwavcurve == other.locconwavcurve // Constrast by detail levels && expcbdl == other.expcbdl && [this, &other]()->bool { @@ -4479,6 +4483,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).residblur, "Locallab", "Residblur_" + std::to_string(i), spot.residblur, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).levelblur, "Locallab", "Levelblur_" + std::to_string(i), spot.levelblur, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).residchro, "Locallab", "Residchro_" + std::to_string(i), spot.residchro, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sigma, "Locallab", "Sigma_" + std::to_string(i), spot.sigma, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).clarilres, "Locallab", "ClariLres_" + std::to_string(i), spot.clarilres, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).claricres, "Locallab", "ClariCres_" + std::to_string(i), spot.claricres, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).clarisoft, "Locallab", "Clarisoft_" + std::to_string(i), spot.clarisoft, keyFile); @@ -4488,6 +4493,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).localcontMethod, "Locallab", "localcontMethod_" + std::to_string(i), spot.localcontMethod, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).locwavcurve, "Locallab", "LocwavCurve_" + std::to_string(i), spot.locwavcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).loclevwavcurve, "Locallab", "LoclevwavCurve_" + std::to_string(i), spot.loclevwavcurve, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).locconwavcurve, "Locallab", "LocconwavCurve_" + std::to_string(i), spot.locconwavcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).csthreshold, "Locallab", "CSThreshold_" + std::to_string(i), spot.csthreshold.toVector(), keyFile); // Contrast by detail levels saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expcbdl, "Locallab", "Expcbdl_" + std::to_string(i), spot.expcbdl, keyFile); @@ -5995,6 +6001,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Residblur_" + std::to_string(i), pedited, spot.residblur, spotEdited.residblur); assignFromKeyfile(keyFile, "Locallab", "Levelblur_" + std::to_string(i), pedited, spot.levelblur, spotEdited.levelblur); assignFromKeyfile(keyFile, "Locallab", "Residchro_" + std::to_string(i), pedited, spot.residchro, spotEdited.residchro); + assignFromKeyfile(keyFile, "Locallab", "Sigma_" + std::to_string(i), pedited, spot.sigma, spotEdited.sigma); assignFromKeyfile(keyFile, "Locallab", "ClariLres_" + std::to_string(i), pedited, spot.clarilres, spotEdited.clarilres); assignFromKeyfile(keyFile, "Locallab", "ClariCres_" + std::to_string(i), pedited, spot.claricres, spotEdited.claricres); assignFromKeyfile(keyFile, "Locallab", "Clarisoft_" + std::to_string(i), pedited, spot.clarisoft, spotEdited.clarisoft); @@ -6004,6 +6011,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "localcontMethod_" + std::to_string(i), pedited, spot.localcontMethod, spotEdited.localcontMethod); assignFromKeyfile(keyFile, "Locallab", "LocwavCurve_" + std::to_string(i), pedited, spot.locwavcurve, spotEdited.locwavcurve); assignFromKeyfile(keyFile, "Locallab", "LoclevwavCurve_" + std::to_string(i), pedited, spot.loclevwavcurve, spotEdited.loclevwavcurve); + assignFromKeyfile(keyFile, "Locallab", "LocconwavCurve_" + std::to_string(i), pedited, spot.locconwavcurve, spotEdited.locconwavcurve); if (keyFile.has_key("Locallab", "CSThreshold_" + std::to_string(i))) { const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThreshold_" + std::to_string(i)); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index f59bd802e..872c48233 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1268,6 +1268,7 @@ struct LocallabParams { double residblur; double levelblur; double residchro; + double sigma; double clarilres; double claricres; double clarisoft; @@ -1278,6 +1279,7 @@ struct LocallabParams { std::vector locwavcurve; Threshold csthreshold; std::vector loclevwavcurve; + std::vector locconwavcurve; // Contrast by detail levels bool expcbdl; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 6fd3280e9..4647d45bd 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -889,7 +889,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabresidblur LUMINANCECURVE, // Evlocallabblurlc LUMINANCECURVE, //Evlocallablevelblur - LUMINANCECURVE //EvlocallabwavCurvelev + LUMINANCECURVE, //EvlocallabwavCurvelev + LUMINANCECURVE, //EvlocallabwavCurvecon + LUMINANCECURVE //Evlocallabsigma }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 886f28292..9fdbc11ed 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1117,6 +1117,7 @@ private: LocwavCurve loclmasCurvecolwav; LocwavCurve locwavCurve; LocwavCurve loclevwavCurve; + LocwavCurve locconwavCurve; LUTf lllocalcurve(65536, 0); LUTf lclocalcurve(65536, 0); LUTf cllocalcurve(65536, 0); @@ -1192,6 +1193,7 @@ private: bool llmasblutili = false; bool locwavutili = false; bool loclevwavutili = false; + bool locconwavutili = false; bool lmasutiliblwav = false; bool lmasutilicolwav = false; locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); @@ -1228,6 +1230,7 @@ private: locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve, locwavutili); loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve, loclevwavutili); + locconwavCurve.Set(params.locallab.spots.at(sp).locconwavcurve, locconwavutili); CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve, 1); CurveFactory::curveLocal(localclutili, params.locallab.spots.at(sp).clcurve, cllocalcurve, 1); CurveFactory::curveLocal(locallcutili, params.locallab.spots.at(sp).lccurve, lclocalcurve, 1); @@ -1300,6 +1303,7 @@ private: loclmasCurvecolwav,lmasutilicolwav, locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, LHutili, HHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 889ccae8d..f44ddce45 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -348,6 +348,9 @@ Locallab::Locallab(): LocalcurveEditorwavlev(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVLEV"))), wavshapelev(static_cast(LocalcurveEditorwavlev->addCurve(CT_Flat, "", nullptr, false, false))), + LocalcurveEditorwavcon(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCON"))), + wavshapecon(static_cast(LocalcurveEditorwavcon->addCurve(CT_Flat, "", nullptr, false, false))), + //CBDL maskcbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), mask2cbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), @@ -554,6 +557,7 @@ clarisoft(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARISOFT"), 0., 100., 0.5, 0. claricres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARICRES"), -20., 100., 0.5, 0.))), sensilc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIS"), 0, 100, 1, 19))), residchro(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCHRO"), -100, 100, 1, 0))), +sigma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.3, 2., 0.01, 1.))), multiplier( [this]() -> std::array { std::array res = {}; @@ -732,6 +736,7 @@ residFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RESID")))), clariFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), blurlevelFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_BLURLEVELFRA")))), blurresidFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_BLURRESIDFRA")))), +contFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTFRA")))), grainFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRAINFRA")))), logFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA")))), logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), @@ -2797,6 +2802,18 @@ pe(nullptr) LocalcurveEditorwavlev->curveListComplete(); + LocalcurveEditorwavcon->setCurveListener(this); + + wavshapecon->setIdentityValue(0.); + wavshapecon->setResetCurve(FlatCurveType(defSpot.locconwavcurve.at(0)), defSpot.locconwavcurve); + + if (showtooltip) { +// wavshape->setTooltip(M("TP_RETINEX_WAV_TOOLTIP")); + } + + LocalcurveEditorwavcon->curveListComplete(); + + localcontMethod->append(M("TP_LOCALLAB_LOCCONT")); localcontMethod->append(M("TP_LOCALLAB_WAVE")); localcontMethod->set_active(0); @@ -2828,6 +2845,7 @@ pe(nullptr) residblur->setAdjusterListener(this); levelblur->setAdjusterListener(this); residchro->setAdjusterListener(this); + sigma->setAdjusterListener(this); clarilres->setAdjusterListener(this); clarisoft->setAdjusterListener(this); claricres->setAdjusterListener(this); @@ -2862,6 +2880,12 @@ pe(nullptr) blurlevcontBox->pack_start(*LocalcurveEditorwavlev, Gtk::PACK_SHRINK, 4); blurlevelFrame->add(*blurlevcontBox); + contFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const contlevBox = Gtk::manage(new ToolParamBlock()); + contlevBox->pack_start(*sigma); + contlevBox->pack_start(*LocalcurveEditorwavcon, Gtk::PACK_SHRINK, 4); + contFrame->add(*contlevBox); + setExpandAlignProperties(expcontrastpyr, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); expcontrastpyr->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expcontrastpyr)); expcontrastpyr->setLevel(2); @@ -2869,6 +2893,7 @@ pe(nullptr) blurcontBox->pack_start(*clariFrame); blurcontBox->pack_start(*blurresidFrame); blurcontBox->pack_start(*blurlevelFrame); + blurcontBox->pack_start(*contFrame); expcontrastpyr->add(*blurcontBox, false); @@ -3556,6 +3581,7 @@ Locallab::~Locallab() delete LocalcurveEditorgainT; delete LocalcurveEditorwav; delete LocalcurveEditorwavlev; + delete LocalcurveEditorwavcon; delete masktmCurveEditorG; delete maskblCurveEditorG; delete mask2blCurveEditorG; @@ -5031,6 +5057,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).residblur = residblur->getValue(); pp->locallab.spots.at(pp->locallab.selspot).levelblur = levelblur->getValue(); pp->locallab.spots.at(pp->locallab.selspot).residchro = residchro->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).sigma = sigma->getValue(); pp->locallab.spots.at(pp->locallab.selspot).clarilres = clarilres->getValue(); pp->locallab.spots.at(pp->locallab.selspot).claricres = claricres->getValue(); pp->locallab.spots.at(pp->locallab.selspot).clarisoft = clarisoft->getValue(); @@ -5040,6 +5067,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).locwavcurve = wavshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).csthreshold = csThreshold->getValue(); pp->locallab.spots.at(pp->locallab.selspot).loclevwavcurve = wavshapelev->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).locconwavcurve = wavshapecon->getCurve(); if (localcontMethod->get_active_row_number() == 0) { pp->locallab.spots.at(pp->locallab.selspot).localcontMethod = "loc"; @@ -5421,6 +5449,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).residblur = pe->locallab.spots.at(pp->locallab.selspot).residblur || residblur->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).levelblur = pe->locallab.spots.at(pp->locallab.selspot).levelblur || levelblur->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).residchro = pe->locallab.spots.at(pp->locallab.selspot).residchro || residchro->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).sigma = pe->locallab.spots.at(pp->locallab.selspot).sigma || sigma->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).clarilres = pe->locallab.spots.at(pp->locallab.selspot).clarilres || clarilres->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).claricres = pe->locallab.spots.at(pp->locallab.selspot).claricres || claricres->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).clarisoft = pe->locallab.spots.at(pp->locallab.selspot).clarisoft || clarisoft->getEditedState(); @@ -5431,6 +5460,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).locwavcurve = pe->locallab.spots.at(pp->locallab.selspot).locwavcurve || !wavshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).loclevwavcurve = pe->locallab.spots.at(pp->locallab.selspot).loclevwavcurve || !wavshapelev->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).csthreshold = pe->locallab.spots.at(pp->locallab.selspot).csthreshold || csThreshold->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).locconwavcurve = pe->locallab.spots.at(pp->locallab.selspot).locconwavcurve || !wavshapecon->isUnChanged(); // Contrast by detail levels pe->locallab.spots.at(pp->locallab.selspot).expcbdl = pe->locallab.spots.at(pp->locallab.selspot).expcbdl || !expcbdl->get_inconsistent(); @@ -5808,6 +5838,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).residblur = pedited->locallab.spots.at(pp->locallab.selspot).residblur || residblur->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).levelblur = pedited->locallab.spots.at(pp->locallab.selspot).levelblur || levelblur->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).residchro = pedited->locallab.spots.at(pp->locallab.selspot).residchro || residchro->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).sigma = pedited->locallab.spots.at(pp->locallab.selspot).sigma || sigma->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).clarilres = pedited->locallab.spots.at(pp->locallab.selspot).clarilres || clarilres->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).claricres = pedited->locallab.spots.at(pp->locallab.selspot).claricres || claricres->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).clarisoft = pedited->locallab.spots.at(pp->locallab.selspot).clarisoft || clarisoft->getEditedState(); @@ -5817,6 +5848,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).locwavcurve = pedited->locallab.spots.at(pp->locallab.selspot).locwavcurve || !wavshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).loclevwavcurve = pedited->locallab.spots.at(pp->locallab.selspot).loclevwavcurve || !wavshapelev->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).csthreshold = pedited->locallab.spots.at(pp->locallab.selspot).csthreshold || csThreshold->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).locconwavcurve = pedited->locallab.spots.at(pp->locallab.selspot).locconwavcurve || !wavshapecon->isUnChanged(); // Contrast by detail levels pedited->locallab.spots.at(pp->locallab.selspot).expcbdl = pedited->locallab.spots.at(pp->locallab.selspot).expcbdl || !expcbdl->get_inconsistent(); @@ -6302,6 +6334,12 @@ void Locallab::curveChanged(CurveEditor* ce) } } + if (ce == wavshapecon) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvecon, M("HISTORY_CUSTOMCURVE")); + } + } + } } @@ -6314,6 +6352,7 @@ void Locallab::localcontMethodChanged() residblur->hide(); levelblur->hide(); residchro->hide(); + sigma->hide(); clarilres->hide(); claricres->hide(); clarisoft->hide(); @@ -6325,6 +6364,7 @@ void Locallab::localcontMethodChanged() lclightness->show(); LocalcurveEditorwav->hide(); LocalcurveEditorwavlev->hide(); + LocalcurveEditorwavcon->hide(); fftwlc->show(); blurlc->show(); } else if (localcontMethod->get_active_row_number() == 1) { @@ -6333,6 +6373,7 @@ void Locallab::localcontMethodChanged() residblur->show(); levelblur->show(); residchro->show(); + sigma->show(); clarilres->show(); claricres->show(); clarisoft->show(); @@ -6343,7 +6384,8 @@ void Locallab::localcontMethodChanged() lcdarkness->hide(); lclightness->hide(); LocalcurveEditorwav->show(); - LocalcurveEditorwavlev->show(); + LocalcurveEditorwavlev->hide(); + LocalcurveEditorwavcon->hide(); fftwlc->hide(); blurlc->show(); } @@ -8312,6 +8354,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residblur->setDefault(defSpot->residblur); levelblur->setDefault(defSpot->levelblur); residchro->setDefault(defSpot->residchro); + sigma->setDefault(defSpot->sigma); clarilres->setDefault(defSpot->clarilres); claricres->setDefault(defSpot->claricres); clarisoft->setDefault(defSpot->clarisoft); @@ -8544,6 +8587,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residblur->setDefaultEditedState(Irrelevant); levelblur->setDefaultEditedState(Irrelevant); residchro->setDefaultEditedState(Irrelevant); + sigma->setDefaultEditedState(Irrelevant); clarilres->setDefaultEditedState(Irrelevant); claricres->setDefaultEditedState(Irrelevant); clarisoft->setDefaultEditedState(Irrelevant); @@ -8781,6 +8825,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residblur->setDefaultEditedState(defSpotState->residblur ? Edited : UnEdited); levelblur->setDefaultEditedState(defSpotState->levelblur ? Edited : UnEdited); residchro->setDefaultEditedState(defSpotState->residchro ? Edited : UnEdited); + sigma->setDefaultEditedState(defSpotState->sigma ? Edited : UnEdited); clarilres->setDefaultEditedState(defSpotState->clarilres ? Edited : UnEdited); claricres->setDefaultEditedState(defSpotState->claricres ? Edited : UnEdited); clarisoft->setDefaultEditedState(defSpotState->clarisoft ? Edited : UnEdited); @@ -9946,6 +9991,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a ==sigma) { + if (listener) { + listener->panelChanged(Evlocallabsigma, sigma->getTextValue()); + } + } + if (a == clarilres) { if (listener) { listener->panelChanged(Evlocallabclarilres, clarilres->getTextValue()); @@ -10417,6 +10468,7 @@ void Locallab::setBatchMode(bool batchMode) residblur->showEditedCB(); levelblur->showEditedCB(); residchro->showEditedCB(); + sigma->showEditedCB(); clarilres->showEditedCB(); claricres->showEditedCB(); clarisoft->showEditedCB(); @@ -11465,6 +11517,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con residblur->setValue(pp->locallab.spots.at(index).residblur); levelblur->setValue(pp->locallab.spots.at(index).levelblur); residchro->setValue(pp->locallab.spots.at(index).residchro); + sigma->setValue(pp->locallab.spots.at(index).sigma); clarilres->setValue(pp->locallab.spots.at(index).clarilres); claricres->setValue(pp->locallab.spots.at(index).claricres); clarisoft->setValue(pp->locallab.spots.at(index).clarisoft); @@ -11492,6 +11545,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con wavshape->setCurve(pp->locallab.spots.at(index).locwavcurve); wavshapelev->setCurve(pp->locallab.spots.at(index).loclevwavcurve); + wavshapecon->setCurve(pp->locallab.spots.at(index).locconwavcurve); if (fftwlc->get_active()) { lcradius->setLimits(20, 1000, 1, 80); @@ -11959,6 +12013,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con residblur->setEditedState(spotState->residblur ? Edited : UnEdited); levelblur->setEditedState(spotState->levelblur ? Edited : UnEdited); residchro->setEditedState(spotState->residchro ? Edited : UnEdited); + sigma->setEditedState(spotState->sigma ? Edited : UnEdited); clarilres->setEditedState(spotState->clarilres ? Edited : UnEdited); claricres->setEditedState(spotState->claricres ? Edited : UnEdited); clarisoft->setEditedState(spotState->clarisoft ? Edited : UnEdited); @@ -11968,6 +12023,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con wavshape->setUnChanged(!spotState->locwavcurve); wavshapelev->setUnChanged(!spotState->loclevwavcurve); csThreshold->setEditedState(spotState->csthreshold ? Edited : UnEdited); + wavshapecon->setUnChanged(!spotState->locconwavcurve); if (!spotState->retinexMethod) { localcontMethod->set_active_text(M("GENERAL_UNCHANGED")); @@ -12465,6 +12521,7 @@ void Locallab::updateSpecificGUIState() residblur->hide(); levelblur->hide(); residchro->hide(); + sigma->hide(); clarilres->hide(); claricres->hide(); clarisoft->hide(); @@ -12476,6 +12533,7 @@ void Locallab::updateSpecificGUIState() lclightness->show(); LocalcurveEditorwav->hide(); LocalcurveEditorwavlev->hide(); + LocalcurveEditorwavcon->hide(); fftwlc->show(); blurlc->show(); } else if (localcontMethod->get_active_row_number() == 1) { @@ -12483,6 +12541,7 @@ void Locallab::updateSpecificGUIState() residcont->show(); residblur->show(); levelblur->show(); + sigma->show(); residchro->show(); clarilres->show(); claricres->show(); @@ -12495,6 +12554,7 @@ void Locallab::updateSpecificGUIState() lclightness->hide(); LocalcurveEditorwav->show(); LocalcurveEditorwavlev->show(); + LocalcurveEditorwavcon->show(); fftwlc->hide(); blurlc->show(); } diff --git a/rtgui/locallab.h b/rtgui/locallab.h index c51fa085a..4f22c12bd 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -168,6 +168,8 @@ private: FlatCurveEditor* const wavshape; CurveEditorGroup* const LocalcurveEditorwavlev; FlatCurveEditor* const wavshapelev; + CurveEditorGroup* const LocalcurveEditorwavcon; + FlatCurveEditor* const wavshapecon; //Cbdl CurveEditorGroup* const maskcbCurveEditorG; @@ -355,6 +357,7 @@ private: Adjuster* const claricres; Adjuster* const sensilc; Adjuster* const residchro; + Adjuster* const sigma; // Contrast by detail levels const std::array multiplier; Adjuster* const chromacbdl; @@ -573,6 +576,7 @@ private: Gtk::Frame* const clariFrame; Gtk::Frame* const blurlevelFrame; Gtk::Frame* const blurresidFrame; + Gtk::Frame* const contFrame; Gtk::Frame* const grainFrame; Gtk::Frame* const logFrame; Gtk::Frame* const logPFrame; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 1d7a3c4cf..16c2aa169 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1261,6 +1261,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).residblur = locallab.spots.at(j).residblur && pSpot.residblur == otherSpot.residblur; locallab.spots.at(j).levelblur = locallab.spots.at(j).levelblur && pSpot.levelblur == otherSpot.levelblur; locallab.spots.at(j).residchro = locallab.spots.at(j).residchro && pSpot.residchro == otherSpot.residchro; + locallab.spots.at(j).sigma = locallab.spots.at(j).sigma && pSpot.sigma == otherSpot.sigma; locallab.spots.at(j).clarilres = locallab.spots.at(j).clarilres && pSpot.clarilres == otherSpot.clarilres; locallab.spots.at(j).claricres = locallab.spots.at(j).claricres && pSpot.claricres == otherSpot.claricres; locallab.spots.at(j).clarisoft = locallab.spots.at(j).clarisoft && pSpot.clarisoft == otherSpot.clarisoft; @@ -1270,6 +1271,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).localcontMethod = locallab.spots.at(j).localcontMethod && pSpot.localcontMethod == otherSpot.localcontMethod; locallab.spots.at(j).locwavcurve = locallab.spots.at(j).locwavcurve && pSpot.locwavcurve == otherSpot.locwavcurve; locallab.spots.at(j).loclevwavcurve = locallab.spots.at(j).loclevwavcurve && pSpot.loclevwavcurve == otherSpot.loclevwavcurve; + locallab.spots.at(j).locconwavcurve = locallab.spots.at(j).locconwavcurve && pSpot.locconwavcurve == otherSpot.locconwavcurve; locallab.spots.at(j).csthreshold = locallab.spots.at(j).csthreshold && pSpot.csthreshold == otherSpot.csthreshold; // Contrast by detail levels locallab.spots.at(j).expcbdl = locallab.spots.at(j).expcbdl && pSpot.expcbdl == otherSpot.expcbdl; @@ -3999,6 +4001,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).residchro = mods.locallab.spots.at(i).residchro; } + if (locallab.spots.at(i).sigma) { + toEdit.locallab.spots.at(i).sigma = mods.locallab.spots.at(i).sigma; + } + if (locallab.spots.at(i).clarilres) { toEdit.locallab.spots.at(i).clarilres = mods.locallab.spots.at(i).clarilres; } @@ -4035,6 +4041,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).loclevwavcurve = mods.locallab.spots.at(i).loclevwavcurve; } + if (locallab.spots.at(i).locconwavcurve) { + toEdit.locallab.spots.at(i).locconwavcurve = mods.locallab.spots.at(i).locconwavcurve; + } + if (locallab.spots.at(i).csthreshold) { toEdit.locallab.spots.at(i).csthreshold = mods.locallab.spots.at(i).csthreshold; } @@ -5507,6 +5517,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : residblur(v), levelblur(v), residchro(v), + sigma(v), clarilres(v), claricres(v), clarisoft(v), @@ -5516,6 +5527,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : localcontMethod(v), locwavcurve(v), loclevwavcurve(v), + locconwavcurve(v), csthreshold(v), // Contrast by detail levels expcbdl(v), @@ -5884,6 +5896,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) residblur = v; levelblur = v; residchro = v; + sigma = v; clarilres = v; claricres = v; clarisoft = v; @@ -5893,6 +5906,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) localcontMethod = v; locwavcurve = v; loclevwavcurve = v; + locconwavcurve = v; csthreshold = v; // Contrast by detail levels expcbdl = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 227b5ca06..0c89d6c5a 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -694,6 +694,7 @@ public: bool residblur; bool levelblur; bool residchro; + bool sigma; bool clarilres; bool claricres; bool clarisoft; @@ -703,6 +704,7 @@ public: bool localcontMethod; bool locwavcurve; bool loclevwavcurve; + bool locconwavcurve; bool csthreshold; // Contrast by detail levels bool expcbdl;