diff --git a/rtdata/languages/default b/rtdata/languages/default index 27f2650cd..ef4903ed2 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1100,6 +1100,9 @@ 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_863;Local - Contrast Merge Original +HISTORY_MSG_864;Local - Contrast Detail +HISTORY_MSG_865;Local - Contrast Anchor +HISTORY_MSG_866;Local - Contrast Curve compression 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 +2225,7 @@ TP_LOCALLAB_CLIPTM;Clip Restored datas (gain) TP_LOCALLAB_COFR;Color & Light - Small defects TP_LOCALLAB_COL_NAME;Name TP_LOCALLAB_COL_VIS;Status +TP_LOCALLAB_COMPFRA;Levels Dynamic Range Compression TP_LOCALLAB_COMPLEX_METHOD;Software Complexity TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustements rubrics. TP_LOCALLAB_CONTCOL;Contrast threshold Mask Blur @@ -2583,6 +2587,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_WAVCOMP;Compression by Level TP_LOCALLAB_WAVCON;Contrast by Level TP_LOCALLAB_WAVE;Wavelet TP_LOCALLAB_WAVHIGH;Wavelet high diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index bf087ebcb..3387125d0 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -737,7 +737,7 @@ void Crop::update(int todo) if (need_fattal) { parent->ipf.dehaze(f, params.dehaze); - parent->ipf.ToneMapFattal02(f, params.fattal, 3); + parent->ipf.ToneMapFattal02(f, params.fattal, 3, false, nullptr, 0, 0); } // crop back to the size expected by the rest of the pipeline @@ -929,6 +929,7 @@ void Crop::update(int todo) bool locwavutili = parent->locwavutili; bool loclevwavutili = parent->loclevwavutili; bool locconwavutili = parent->locconwavutili; + bool loccompwavutili = parent->loccompwavutili; bool lmasutiliblwav = parent->lmasutiliblwav; bool lmasutilicolwav = parent->lmasutilicolwav; @@ -970,6 +971,7 @@ void Crop::update(int todo) LocwavCurve loclmasCurvecolwav; LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; + LocwavCurve loccompwavCurve; LocretigainCurverab locRETgainCurverab; locallutili = false; @@ -1015,6 +1017,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); + loccompwavCurve.Set(params.locallab.spots.at(sp).loccompwavcurve, loccompwavutili); locallutili = false; CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve2, sca); localclutili = false; @@ -1108,6 +1111,7 @@ void Crop::update(int todo) locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, 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, @@ -1141,6 +1145,7 @@ void Crop::update(int todo) locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, 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); @@ -1198,6 +1203,7 @@ void Crop::update(int todo) locwavCurve.Reset(); loclevwavCurve.Reset(); locconwavCurve.Reset(); + loccompwavCurve.Reset(); loclmasCurveblwav.Reset(); loclmasCurvecolwav.Reset(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 513820f19..0c9797a3c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -221,6 +221,7 @@ ImProcCoordinator::ImProcCoordinator() : locwavutili(false), loclevwavutili(false), locconwavutili(false), + loccompwavutili(false), lmasutiliblwav(false), lmasutilicolwav(false), LHutili(false), @@ -636,7 +637,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } ipf.dehaze(orig_prev, params->dehaze); - ipf.ToneMapFattal02(orig_prev, params->fattal, 3); + ipf.ToneMapFattal02(orig_prev, params->fattal, 3, false, nullptr, 0, 0); if (oprevi != orig_prev) { delete oprevi; @@ -1083,6 +1084,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locwavutili = false; loclevwavutili = false; locconwavutili = false; + loccompwavutili = false; lmasutiliblwav = false; lmasutilicolwav = false; locRETgainCurve.Set(params->locallab.spots.at(sp).localTgaincurve); @@ -1120,6 +1122,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); + loccompwavCurve.Set(params->locallab.spots.at(sp).loccompwavcurve, loccompwavutili); 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); @@ -1229,6 +1232,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, 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, @@ -1267,6 +1271,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, 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); @@ -1346,6 +1351,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locwavCurve.Reset(); loclevwavCurve.Reset(); locconwavCurve.Reset(); + loccompwavCurve.Reset(); loclmasCurveblwav.Reset(); loclmasCurvecolwav.Reset(); } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 7ca578920..fb8ff3d9a 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -286,6 +286,7 @@ protected: LocwavCurve loclmasCurvecolwav; LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; + LocwavCurve loccompwavCurve; bool locallutili; bool localclutili; @@ -329,6 +330,7 @@ protected: bool locwavutili; bool loclevwavutili; bool locconwavutili; + bool loccompwavutili; bool lmasutiliblwav; bool lmasutilicolwav; bool LHutili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index f2c0cba73..e4d1571b9 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -300,6 +300,7 @@ public: const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & locconwavCurve, bool & locconwavutili, + const LocwavCurve & loccompwavCurve, bool & loccompwavutili, 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, @@ -313,7 +314,12 @@ 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, const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, float sigm, 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, + const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, + float sigm, int & maxlvl, float fatdet, float fatanch); + 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); @@ -405,7 +411,7 @@ public: void dehaze(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams); void dehazeloc(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams); - void ToneMapFattal02(Imagefloat *rgb, const procparams::FattalToneMappingParams &fatParams, int detail_level); + void ToneMapFattal02(Imagefloat *rgb, const procparams::FattalToneMappingParams &fatParams, int detail_level, bool Lalone, float **Lum, int WW, int HH); void localContrast(LabImage *lab, float **destination, const procparams::LocalContrastParams &localContrastParams, bool fftwlc, double scale); void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); // void shadowsHighlights(LabImage *lab); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 5314dc457..b7fb3f580 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -3997,7 +3997,9 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int bool wavcurvelev = false; 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); + bool loccompwavutili = false; + bool wavcurvecomp = 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, dummy, loccompwavutili, wavcurvecomp, 1.f, maxlvl, 0.f, 0.f); } @@ -4050,7 +4052,7 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int Imagefloat *tmpImagefat = nullptr; tmpImagefat = new Imagefloat(bfw, bfh); lab2rgb(*bufmaskblurcol, *tmpImagefat, params->icm.workingProfile); - ToneMapFattal02(tmpImagefat, fatParams, nlev); + ToneMapFattal02(tmpImagefat, fatParams, nlev, false, nullptr, 0, 0); rgb2lab(*tmpImagefat, *bufmaskblurcol, params->icm.workingProfile); delete tmpImagefat; } @@ -6735,7 +6737,10 @@ void ImProcFunctions::fftw_tile_blur(int GW, int GH, int tilssize, int max_numbl 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, const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, float sigm, int & maxlvl) + const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, + const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, + const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, + float sigm, int & maxlvl, float fatdet, float fatanch) { wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, level_br, 1, sk, numThreads, 6); @@ -6927,7 +6932,13 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, float ****templevel = nullptr; - if (wavcurvelev) { + if (wavcurvelev || wavcurvecomp) { + FattalToneMappingParams fatParams; + fatParams.enabled = wavcurvecomp; + fatParams.threshold = fatdet; + fatParams.amount = 50; + fatParams.anchor = fatanch; + templevel = new float***[dir]; //allocate memory for 3 DIR n levels, H_L, W_L @@ -6959,19 +6970,41 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, float radblur, } } +//Compress dynamic range + if (wavcurvecomp) { + 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); + + if (loccompwavCurve && loccompwavutili) { + + float klev = (loccompwavCurve[level * 50.f]); + fatParams.amount = 50.f * klev; + { + ToneMapFattal02(nullptr, fatParams, 3, true, templevel[dir - 1][level], W_L, H_L); + } + } + } + } + + } + + //blur level and dir - 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); + if (wavcurvelev) { + 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); - if (loclevwavCurve && loclevwavutili) { + if (loclevwavCurve && loclevwavutili) { - float klev = (loclevwavCurve[level * 50.f]); - - #pragma omp parallel - { - gaussianBlur(templevel[dir - 1][level], templevel[dir - 1][level], W_L, H_L, radlevblur * klev); + float klev = 0.25f * (loclevwavCurve[level * 50.f]); + #pragma omp parallel + { + gaussianBlur(templevel[dir - 1][level], templevel[dir - 1][level], W_L, H_L, radlevblur * klev); + } } } } @@ -8686,6 +8719,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const LocwavCurve & locwavCurve, bool & locwavutili, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & locconwavCurve, bool & locconwavutili, + const LocwavCurve & loccompwavCurve, bool & loccompwavutili, 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, @@ -9085,7 +9119,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool wavcurvelev = false; 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); + bool loccompwavutili = false; + bool wavcurvecomp = 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, dummy, loccompwavutili, wavcurvecomp, 1.f, maxlvl, 0.f, 0.f); } int shado = params->locallab.spots.at(sp).shadmaskbl; @@ -10776,7 +10812,19 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } - 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) { + bool wavcurvecomp = false; + + if (loccompwavCurve && loccompwavutili) { + if (lp.locmet == 1) { + for (int i = 0; i < 500; i++) { + if (loccompwavCurve[i] != 0.) { + wavcurvecomp = true; + } + } + } + } + + if ((lp.lcamount > 0.f || wavcurve || wavcurvelev || wavcurvecon || wavcurvecomp || 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); @@ -10904,8 +10952,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o 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; + const float fatdet = params->locallab.spots.at(sp).fatdet; + const float fatanch = params->locallab.spots.at(sp).fatanch; - 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); + 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, loccompwavCurve, loccompwavutili, wavcurvecomp, sigma, maxlvl, fatdet, fatanch); const float satur = params->locallab.spots.at(sp).residchro; @@ -11028,6 +11078,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif + //copy previous calculation in merge possibilities for (int y = 0; y < bfhr; y++) { for (int x = 0; x < bfwr; x++) { @@ -12202,7 +12253,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int nlev = params->locallab.spots.at(sp).fatlevel; tmpImagefat = new Imagefloat(bfwr, bfhr); lab2rgb(*bufexpfin, *tmpImagefat, params->icm.workingProfile); - ToneMapFattal02(tmpImagefat, fatParams, nlev); + ToneMapFattal02(tmpImagefat, fatParams, nlev, false, nullptr, 0, 0); rgb2lab(*tmpImagefat, *bufexpfin, params->icm.workingProfile); delete tmpImagefat; } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index ce4a001a0..184d40ff3 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -889,6 +889,9 @@ enum ProcEventCode { EvlocallabwavCurvecon = 860, Evlocallabsigma = 861, Evlocallaboriglc = 862, + Evlocallabfatdet = 863, + Evlocallabfatanch = 864, + EvlocallabwavCurvecomp = 865, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index bc120a020..5267509fb 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2726,6 +2726,8 @@ LocallabParams::LocallabSpot::LocallabSpot() : levelblur(0.0), residchro(0.0), sigma(1.0), + fatdet(40.0), + fatanch(50.0), clarilres(0.0), claricres(0.0), clarisoft(1.0), @@ -2738,6 +2740,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : csthreshold(0, 0, 6, 6, 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}, + loccompwavcurve{(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}, // Contrast by detail levels expcbdl(false), mult{1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, @@ -3116,6 +3119,8 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && levelblur == other.levelblur && residchro == other.residchro && sigma == other.sigma + && fatdet == other.fatdet + && fatanch == other.fatanch && clarilres == other.clarilres && claricres == other.claricres && clarisoft == other.clarisoft @@ -3128,6 +3133,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && csthreshold == other.csthreshold && loclevwavcurve == other.loclevwavcurve && locconwavcurve == other.locconwavcurve + && loccompwavcurve == other.loccompwavcurve // Constrast by detail levels && expcbdl == other.expcbdl && [this, &other]()->bool { @@ -4486,6 +4492,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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).fatdet, "Locallab", "Fatdet_" + std::to_string(i), spot.fatdet, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatanch, "Locallab", "Fatanch_" + std::to_string(i), spot.fatanch, 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); @@ -4497,6 +4505,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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).loccompwavcurve, "Locallab", "LoccompwavCurve_" + std::to_string(i), spot.loccompwavcurve, 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); @@ -6005,6 +6014,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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", "Fatdet_" + std::to_string(i), pedited, spot.fatdet, spotEdited.fatdet); + assignFromKeyfile(keyFile, "Locallab", "Fatanch_" + std::to_string(i), pedited, spot.fatanch, spotEdited.fatanch); 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); @@ -6016,6 +6027,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + assignFromKeyfile(keyFile, "Locallab", "LoccompwavCurve_" + std::to_string(i), pedited, spot.loccompwavcurve, spotEdited.loccompwavcurve); 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 9aa48f42c..2c91d8d7a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1269,6 +1269,8 @@ struct LocallabParams { double levelblur; double residchro; double sigma; + double fatdet; + double fatanch; double clarilres; double claricres; double clarisoft; @@ -1281,6 +1283,7 @@ struct LocallabParams { Threshold csthreshold; std::vector loclevwavcurve; std::vector locconwavcurve; + std::vector loccompwavcurve; // Contrast by detail levels bool expcbdl; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index c40e67aa4..d9b89ab1c 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -892,8 +892,10 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabwavCurvelev LUMINANCECURVE, //EvlocallabwavCurvecon LUMINANCECURVE, //Evlocallabsigma - LUMINANCECURVE // Evlocallaboriglc - + LUMINANCECURVE, // Evlocallaboriglc + LUMINANCECURVE, // Evlocallabfatdet + LUMINANCECURVE, // Evlocallabfatanch + LUMINANCECURVE //EvlocallabwavCurvecomp }; namespace rtengine diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 6e5d744ad..470023135 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1244,7 +1244,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ipf.firstAnalysis (baseImg, params, hist16); ipf.dehaze(baseImg, params.dehaze); - ipf.ToneMapFattal02(baseImg, params.fattal, 3); + ipf.ToneMapFattal02(baseImg, params.fattal, 3, false, nullptr, 0, 0); // perform transform if (ipf.needsTransform()) { diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 9fdbc11ed..0228ac805 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -872,7 +872,7 @@ private: ipf.firstAnalysis(baseImg, params, hist16); ipf.dehaze(baseImg, params.dehaze); - ipf.ToneMapFattal02(baseImg, params.fattal, 3); + ipf.ToneMapFattal02(baseImg, params.fattal, 3, false, nullptr, 0, 0); // perform transform (excepted resizing) if (ipf.needsTransform()) { @@ -1118,6 +1118,7 @@ private: LocwavCurve locwavCurve; LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; + LocwavCurve loccompwavCurve; LUTf lllocalcurve(65536, 0); LUTf lclocalcurve(65536, 0); LUTf cllocalcurve(65536, 0); @@ -1194,6 +1195,7 @@ private: bool locwavutili = false; bool loclevwavutili = false; bool locconwavutili = false; + bool loccompwavutili = false; bool lmasutiliblwav = false; bool lmasutilicolwav = false; locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); @@ -1231,6 +1233,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); + loccompwavCurve.Set(params.locallab.spots.at(sp).loccompwavcurve, loccompwavutili); 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); @@ -1304,6 +1307,7 @@ private: locwavCurve, locwavutili, loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, 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/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index c8d8d1924..144a28245 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1056,7 +1056,7 @@ inline int find_fast_dim(int dim) } // namespace -void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingParams &fatParams, int detail_level) +void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingParams &fatParams, int detail_level, bool Lalone, float **Lum, int WW, int HH) { if (!fatParams.enabled) { return; @@ -1080,8 +1080,16 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingPa return; } - int w = rgb->getWidth(); - int h = rgb->getHeight(); + int w; + int h; + if(Lalone) { + w = WW; + h = HH; + } else { + w = rgb->getWidth(); + h = rgb->getHeight(); + } + Array2Df Yr(w, h); @@ -1090,16 +1098,21 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingPa constexpr float min_luminance = 1.f; TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); - +printf("OK 1\n"); #ifdef _OPENMP #pragma omp parallel for if(multiThread) #endif for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { - Yr(x, y) = std::max(luminance(rgb->r(y, x), rgb->g(y, x), rgb->b(y, x), ws), min_luminance); // clip really black pixels + if(Lalone) { + Yr(x, y) = std::max(2.f * Lum[y][x], min_luminance); // clip really black pixels + } else { + Yr(x, y) = std::max(luminance(rgb->r(y, x), rgb->g(y, x), rgb->b(y, x), ws), min_luminance); // clip really black pixels + } } } +printf("OK 2\n"); float oldMedian; const float percentile = float(LIM(fatParams.anchor, 1, 100)) / 100.f; @@ -1139,8 +1152,10 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingPa } rescale_nearest(Yr, L, multiThread); +printf("OK 3\n"); tmo_fattal02(w2, h2, L, L, alpha, beta, noise, detail_level, multiThread); +printf("OK 4\n"); const float hr = float(h2) / float(h); const float wr = float(w2) / float(w); @@ -1161,6 +1176,7 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingPa float Y = std::max(Yr(x, y), epsilon); float l = std::max(L(xx, yy), epsilon) * (scale / Y); + if(!Lalone) { rgb->r(y, x) *= l; rgb->g(y, x) *= l; rgb->b(y, x) *= l; @@ -1168,8 +1184,12 @@ void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingPa assert(std::isfinite(rgb->r(y, x))); assert(std::isfinite(rgb->g(y, x))); assert(std::isfinite(rgb->b(y, x))); + } else { + Lum[y][x] *= (0.5f * l); + } } } +printf("OK 5\n"); } diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 7f088cf42..e46eea105 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -351,6 +351,9 @@ Locallab::Locallab(): LocalcurveEditorwavcon(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCON"))), wavshapecon(static_cast(LocalcurveEditorwavcon->addCurve(CT_Flat, "", nullptr, false, false))), + LocalcurveEditorwavcomp(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCOMP"))), + wavshapecomp(static_cast(LocalcurveEditorwavcomp->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"))), @@ -558,6 +561,9 @@ claricres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARICRES"), -20., 100., 0.5, 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.2, 2.5, 0.01, 1.))), +fatdet(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATDETAIL"), -100., 300., 1., 0.))), +fatanch(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 1., 100., 1., 50., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + multiplier( [this]() -> std::array { std::array res = {}; @@ -738,6 +744,7 @@ 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")))), +compFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COMPFRA")))), 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")))), @@ -2819,6 +2826,16 @@ pe(nullptr) LocalcurveEditorwavcon->curveListComplete(); + LocalcurveEditorwavcomp->setCurveListener(this); + + wavshapecomp->setIdentityValue(0.); + wavshapecomp->setResetCurve(FlatCurveType(defSpot.loccompwavcurve.at(0)), defSpot.loccompwavcurve); + + if (showtooltip) { +// wavshape->setTooltip(M("TP_RETINEX_WAV_TOOLTIP")); + } + + LocalcurveEditorwavcomp->curveListComplete(); localcontMethod->append(M("TP_LOCALLAB_LOCCONT")); localcontMethod->append(M("TP_LOCALLAB_WAVE")); @@ -2852,6 +2869,8 @@ pe(nullptr) levelblur->setAdjusterListener(this); residchro->setAdjusterListener(this); sigma->setAdjusterListener(this); + fatdet->setAdjusterListener(this); + fatanch->setAdjusterListener(this); clarilres->setAdjusterListener(this); clarisoft->setLogScale(10, -10); clarisoft->setAdjusterListener(this); @@ -2890,14 +2909,22 @@ pe(nullptr) contlevBox->pack_start(*LocalcurveEditorwavcon, Gtk::PACK_SHRINK, 4); contFrame->add(*contlevBox); + compFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const compBox = Gtk::manage(new ToolParamBlock()); + compBox->pack_start(*fatdet); + compBox->pack_start(*fatanch); + compBox->pack_start(*LocalcurveEditorwavcomp, Gtk::PACK_SHRINK, 4); + compFrame->add(*compBox); + 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); ToolParamBlock* const blurcontBox = Gtk::manage(new ToolParamBlock()); blurcontBox->pack_start(*clariFrame); + blurcontBox->pack_start(*contFrame); + blurcontBox->pack_start(*compFrame); blurcontBox->pack_start(*blurresidFrame); blurcontBox->pack_start(*blurlevelFrame); - blurcontBox->pack_start(*contFrame); expcontrastpyr->add(*blurcontBox, false); @@ -3586,6 +3613,7 @@ Locallab::~Locallab() delete LocalcurveEditorwav; delete LocalcurveEditorwavlev; delete LocalcurveEditorwavcon; + delete LocalcurveEditorwavcomp; delete masktmCurveEditorG; delete maskblCurveEditorG; delete mask2blCurveEditorG; @@ -5062,6 +5090,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).fatdet = fatdet->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).fatanch = fatanch->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(); @@ -5073,6 +5103,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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(); + pp->locallab.spots.at(pp->locallab.selspot).loccompwavcurve = wavshapecomp->getCurve(); if (localcontMethod->get_active_row_number() == 0) { pp->locallab.spots.at(pp->locallab.selspot).localcontMethod = "loc"; @@ -5455,6 +5486,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).fatdet = pe->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).fatanch = pe->locallab.spots.at(pp->locallab.selspot).fatanch || fatanch->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(); @@ -5467,6 +5500,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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(); + pe->locallab.spots.at(pp->locallab.selspot).loccompwavcurve = pe->locallab.spots.at(pp->locallab.selspot).loccompwavcurve || !wavshapecomp->isUnChanged(); // Contrast by detail levels pe->locallab.spots.at(pp->locallab.selspot).expcbdl = pe->locallab.spots.at(pp->locallab.selspot).expcbdl || !expcbdl->get_inconsistent(); @@ -5845,6 +5879,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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).fatdet = pedited->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).fatanch = pedited->locallab.spots.at(pp->locallab.selspot).fatanch || fatanch->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(); @@ -5856,6 +5892,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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(); + pedited->locallab.spots.at(pp->locallab.selspot).loccompwavcurve = pedited->locallab.spots.at(pp->locallab.selspot).loccompwavcurve || !wavshapecomp->isUnChanged(); // Contrast by detail levels pedited->locallab.spots.at(pp->locallab.selspot).expcbdl = pedited->locallab.spots.at(pp->locallab.selspot).expcbdl || !expcbdl->get_inconsistent(); @@ -6347,6 +6384,12 @@ void Locallab::curveChanged(CurveEditor* ce) } } + if (ce == wavshapecomp) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvecomp, M("HISTORY_CUSTOMCURVE")); + } + } + } } @@ -6360,6 +6403,8 @@ void Locallab::localcontMethodChanged() levelblur->hide(); residchro->hide(); sigma->hide(); + fatdet->hide(); + fatanch->hide(); clarilres->hide(); claricres->hide(); clarisoft->hide(); @@ -6372,6 +6417,7 @@ void Locallab::localcontMethodChanged() LocalcurveEditorwav->hide(); LocalcurveEditorwavlev->hide(); LocalcurveEditorwavcon->hide(); + LocalcurveEditorwavcomp->hide(); fftwlc->show(); blurlc->show(); origlc->hide(); @@ -6382,6 +6428,8 @@ void Locallab::localcontMethodChanged() levelblur->show(); residchro->show(); sigma->show(); + fatdet->show(); + fatanch->show(); clarilres->show(); claricres->show(); clarisoft->show(); @@ -6394,6 +6442,7 @@ void Locallab::localcontMethodChanged() LocalcurveEditorwav->show(); LocalcurveEditorwavlev->hide(); LocalcurveEditorwavcon->hide(); + LocalcurveEditorwavcomp->hide(); fftwlc->hide(); blurlc->show(); origlc->show(); @@ -8387,6 +8436,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c levelblur->setDefault(defSpot->levelblur); residchro->setDefault(defSpot->residchro); sigma->setDefault(defSpot->sigma); + fatdet->setDefault(defSpot->fatdet); + fatanch->setDefault(defSpot->fatanch); clarilres->setDefault(defSpot->clarilres); claricres->setDefault(defSpot->claricres); clarisoft->setDefault(defSpot->clarisoft); @@ -8620,6 +8671,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c levelblur->setDefaultEditedState(Irrelevant); residchro->setDefaultEditedState(Irrelevant); sigma->setDefaultEditedState(Irrelevant); + fatdet->setDefaultEditedState(Irrelevant); + fatanch->setDefaultEditedState(Irrelevant); clarilres->setDefaultEditedState(Irrelevant); claricres->setDefaultEditedState(Irrelevant); clarisoft->setDefaultEditedState(Irrelevant); @@ -8858,6 +8911,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c levelblur->setDefaultEditedState(defSpotState->levelblur ? Edited : UnEdited); residchro->setDefaultEditedState(defSpotState->residchro ? Edited : UnEdited); sigma->setDefaultEditedState(defSpotState->sigma ? Edited : UnEdited); + fatdet->setDefaultEditedState(defSpotState->fatdet ? Edited : UnEdited); + fatanch->setDefaultEditedState(defSpotState->fatanch ? Edited : UnEdited); clarilres->setDefaultEditedState(defSpotState->clarilres ? Edited : UnEdited); claricres->setDefaultEditedState(defSpotState->claricres ? Edited : UnEdited); clarisoft->setDefaultEditedState(defSpotState->clarisoft ? Edited : UnEdited); @@ -10023,12 +10078,24 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } - if (a ==sigma) { + if (a == sigma) { if (listener) { listener->panelChanged(Evlocallabsigma, sigma->getTextValue()); } } + if (a == fatdet) { + if (listener) { + listener->panelChanged(Evlocallabfatdet, fatdet->getTextValue()); + } + } + + if (a == fatanch) { + if (listener) { + listener->panelChanged(Evlocallabfatanch, fatanch->getTextValue()); + } + } + if (a == clarilres) { if (listener) { listener->panelChanged(Evlocallabclarilres, clarilres->getTextValue()); @@ -10501,6 +10568,8 @@ void Locallab::setBatchMode(bool batchMode) levelblur->showEditedCB(); residchro->showEditedCB(); sigma->showEditedCB(); + fatdet->showEditedCB(); + fatanch->showEditedCB(); clarilres->showEditedCB(); claricres->showEditedCB(); clarisoft->showEditedCB(); @@ -11552,6 +11621,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con levelblur->setValue(pp->locallab.spots.at(index).levelblur); residchro->setValue(pp->locallab.spots.at(index).residchro); sigma->setValue(pp->locallab.spots.at(index).sigma); + fatdet->setValue(pp->locallab.spots.at(index).fatdet); + fatanch->setValue(pp->locallab.spots.at(index).fatanch); clarilres->setValue(pp->locallab.spots.at(index).clarilres); claricres->setValue(pp->locallab.spots.at(index).claricres); clarisoft->setValue(pp->locallab.spots.at(index).clarisoft); @@ -11581,6 +11652,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); + wavshapecomp->setCurve(pp->locallab.spots.at(index).loccompwavcurve); if (fftwlc->get_active()) { lcradius->setLimits(20, 1000, 1, 80); @@ -12049,6 +12121,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con levelblur->setEditedState(spotState->levelblur ? Edited : UnEdited); residchro->setEditedState(spotState->residchro ? Edited : UnEdited); sigma->setEditedState(spotState->sigma ? Edited : UnEdited); + fatdet->setEditedState(spotState->fatdet ? Edited : UnEdited); + fatanch->setEditedState(spotState->fatanch ? Edited : UnEdited); clarilres->setEditedState(spotState->clarilres ? Edited : UnEdited); claricres->setEditedState(spotState->claricres ? Edited : UnEdited); clarisoft->setEditedState(spotState->clarisoft ? Edited : UnEdited); @@ -12060,6 +12134,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con wavshapelev->setUnChanged(!spotState->loclevwavcurve); csThreshold->setEditedState(spotState->csthreshold ? Edited : UnEdited); wavshapecon->setUnChanged(!spotState->locconwavcurve); + wavshapecomp->setUnChanged(!spotState->loccompwavcurve); if (!spotState->retinexMethod) { localcontMethod->set_active_text(M("GENERAL_UNCHANGED")); @@ -12558,6 +12633,8 @@ void Locallab::updateSpecificGUIState() levelblur->hide(); residchro->hide(); sigma->hide(); + fatdet->hide(); + fatanch->hide(); clarilres->hide(); claricres->hide(); clarisoft->hide(); @@ -12570,6 +12647,7 @@ void Locallab::updateSpecificGUIState() LocalcurveEditorwav->hide(); LocalcurveEditorwavlev->hide(); LocalcurveEditorwavcon->hide(); + LocalcurveEditorwavcomp->hide(); fftwlc->show(); blurlc->show(); origlc->hide(); @@ -12579,6 +12657,8 @@ void Locallab::updateSpecificGUIState() residblur->show(); levelblur->show(); sigma->show(); + fatdet->show(); + fatanch->show(); residchro->show(); clarilres->show(); claricres->show(); @@ -12592,6 +12672,7 @@ void Locallab::updateSpecificGUIState() LocalcurveEditorwav->show(); LocalcurveEditorwavlev->show(); LocalcurveEditorwavcon->show(); + LocalcurveEditorwavcomp->show(); fftwlc->hide(); blurlc->show(); origlc->show(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index d35072b00..71c1bdd37 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -170,6 +170,8 @@ private: FlatCurveEditor* const wavshapelev; CurveEditorGroup* const LocalcurveEditorwavcon; FlatCurveEditor* const wavshapecon; + CurveEditorGroup* const LocalcurveEditorwavcomp; + FlatCurveEditor* const wavshapecomp; //Cbdl CurveEditorGroup* const maskcbCurveEditorG; @@ -358,6 +360,8 @@ private: Adjuster* const sensilc; Adjuster* const residchro; Adjuster* const sigma; + Adjuster* const fatdet; + Adjuster* const fatanch; // Contrast by detail levels const std::array multiplier; Adjuster* const chromacbdl; @@ -579,6 +583,7 @@ private: Gtk::Frame* const blurlevelFrame; Gtk::Frame* const blurresidFrame; Gtk::Frame* const contFrame; + Gtk::Frame* const compFrame; Gtk::Frame* const grainFrame; Gtk::Frame* const logFrame; Gtk::Frame* const logPFrame; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index bd791565b..4cc967c5d 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1262,6 +1262,8 @@ void ParamsEdited::initFrom(const std::vector& 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).fatdet = locallab.spots.at(j).fatdet && pSpot.fatdet == otherSpot.fatdet; + locallab.spots.at(j).fatanch = locallab.spots.at(j).fatanch && pSpot.fatanch == otherSpot.fatanch; 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; @@ -1273,6 +1275,7 @@ void ParamsEdited::initFrom(const std::vector& 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).loccompwavcurve = locallab.spots.at(j).loccompwavcurve && pSpot.loccompwavcurve == otherSpot.loccompwavcurve; 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; @@ -4006,6 +4009,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).sigma = mods.locallab.spots.at(i).sigma; } + if (locallab.spots.at(i).fatdet) { + toEdit.locallab.spots.at(i).fatdet = mods.locallab.spots.at(i).fatdet; + } + + if (locallab.spots.at(i).fatanch) { + toEdit.locallab.spots.at(i).fatanch = mods.locallab.spots.at(i).fatanch; + } + if (locallab.spots.at(i).clarilres) { toEdit.locallab.spots.at(i).clarilres = mods.locallab.spots.at(i).clarilres; } @@ -4050,6 +4061,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).locconwavcurve = mods.locallab.spots.at(i).locconwavcurve; } + if (locallab.spots.at(i).loccompwavcurve) { + toEdit.locallab.spots.at(i).loccompwavcurve = mods.locallab.spots.at(i).loccompwavcurve; + } + if (locallab.spots.at(i).csthreshold) { toEdit.locallab.spots.at(i).csthreshold = mods.locallab.spots.at(i).csthreshold; } @@ -5523,6 +5538,8 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : levelblur(v), residchro(v), sigma(v), + fatdet(v), + fatanch(v), clarilres(v), claricres(v), clarisoft(v), @@ -5534,6 +5551,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : locwavcurve(v), loclevwavcurve(v), locconwavcurve(v), + loccompwavcurve(v), csthreshold(v), // Contrast by detail levels expcbdl(v), @@ -5903,6 +5921,8 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) levelblur = v; residchro = v; sigma = v; + fatdet = v; + fatanch = v; clarilres = v; claricres = v; clarisoft = v; @@ -5914,6 +5934,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) locwavcurve = v; loclevwavcurve = v; locconwavcurve = v; + loccompwavcurve = v; csthreshold = v; // Contrast by detail levels expcbdl = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index c09c9e1ca..3c3d38202 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -695,6 +695,8 @@ public: bool levelblur; bool residchro; bool sigma; + bool fatdet; + bool fatanch; bool clarilres; bool claricres; bool clarisoft; @@ -706,6 +708,7 @@ public: bool locwavcurve; bool loclevwavcurve; bool locconwavcurve; + bool loccompwavcurve; bool csthreshold; // Contrast by detail levels bool expcbdl;