diff --git a/rtdata/languages/default b/rtdata/languages/default index 18f95d88e..9dffe942a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1120,7 +1120,9 @@ HISTORY_MSG_880;Local - LC Chroma blur levels HISTORY_MSG_881;Local - Contrast Offset Luminance HISTORY_MSG_882;Local - Contrast Blur HISTORY_MSG_883;Local - Contrast By Levels -HISTORY_MSG_884;Local - Contrast Dynamic Range +HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian +HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet +HISTORY_MSG_886;Local - Contrast Wavelet 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 @@ -2247,7 +2249,8 @@ 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_COMPFRA;Levels Dynamic Laplacian Range Compression ƒ +TP_LOCALLAB_COMPREFRA;Levels Dynamic Wavelet Range Compression TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend Images".\nUses a lot of resources TP_LOCALLAB_COMPLEX_METHOD;Software Complexity TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustements rubrics. @@ -2617,6 +2620,7 @@ 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_WAVCOMPRE;Compression by Level TP_LOCALLAB_WAVCON;Contrast by Level TP_LOCALLAB_WAVDEN;Luminance denoise by level (0 1 2 + 3 and more) TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 3 first levels (fine).\nThe right limit of the curve correspond to coarse : level 3 and beyond diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 3336778d6..fe982989c 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -936,6 +936,7 @@ void Crop::update(int todo) bool loclevwavutili = parent->loclevwavutili; bool locconwavutili = parent->locconwavutili; bool loccompwavutili = parent->loccompwavutili; + bool loccomprewavutili = parent->loccomprewavutili; bool lmasutiliblwav = parent->lmasutiliblwav; bool lmasutilicolwav = parent->lmasutilicolwav; @@ -981,6 +982,7 @@ void Crop::update(int todo) LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; LocwavCurve loccompwavCurve; + LocwavCurve loccomprewavCurve; LocwavCurve locwavCurveden; LocretigainCurverab locRETgainCurverab; @@ -1032,6 +1034,7 @@ void Crop::update(int todo) 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); + loccomprewavCurve.Set(params.locallab.spots.at(sp).loccomprewavcurve, loccomprewavutili); locallutili = false; CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve2, sca); localclutili = false; @@ -1128,6 +1131,7 @@ void Crop::update(int todo) loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, locwavCurveden, locwavdenutili, LHutili, HHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, @@ -1165,6 +1169,7 @@ void Crop::update(int todo) loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, locwavCurveden, locwavdenutili, 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, 0, diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index a58b56325..7c8aba9b0 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -228,6 +228,7 @@ ImProcCoordinator::ImProcCoordinator() : loclevwavutili(false), locconwavutili(false), loccompwavutili(false), + loccomprewavutili(false), lmasutiliblwav(false), lmasutilicolwav(false), LHutili(false), @@ -1096,6 +1097,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) loclevwavutili = false; locconwavutili = false; loccompwavutili = false; + loccomprewavutili = false; lmasutiliblwav = false; lmasutilicolwav = false; locRETgainCurve.Set(params->locallab.spots.at(sp).localTgaincurve); @@ -1137,6 +1139,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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); + loccomprewavCurve.Set(params->locallab.spots.at(sp).loccomprewavcurve, loccomprewavutili); locwavCurveden.Set(params->locallab.spots.at(sp).locwavcurveden, locwavdenutili); CurveFactory::curveLocal(locallutili, params->locallab.spots.at(sp).llcurve, lllocalcurve, sca); CurveFactory::curveLocal(localclutili, params->locallab.spots.at(sp).clcurve, cllocalcurve, sca); @@ -1250,6 +1253,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, locwavCurveden, locwavdenutili, LHutili, HHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, lastsav, @@ -1292,6 +1296,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, locwavCurveden, locwavdenutili, 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, 0, diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 735998647..c4191dc0e 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -291,6 +291,7 @@ protected: LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; LocwavCurve loccompwavCurve; + LocwavCurve loccomprewavCurve; LocwavCurve locwavCurveden; bool locallutili; @@ -341,6 +342,7 @@ protected: bool loclevwavutili; bool locconwavutili; bool loccompwavutili; + bool loccomprewavutili; bool lmasutiliblwav; bool lmasutilicolwav; bool LHutili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 1a1be8c8f..8f64fc2ee 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -210,6 +210,7 @@ public: void EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0); void CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost); + void Compresslevels(float **Source, int W_L, int H_L, float Compression, float DetailBoost); void ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0); void EPDToneMap(LabImage *lab, unsigned int Iterates = 0, int skip = 1); @@ -303,6 +304,7 @@ public: const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & locconwavCurve, bool & locconwavutili, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, + const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, const LocwavCurve & locwavCurveden, bool & locwavdenutili, 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, @@ -321,11 +323,13 @@ public: const LocwavCurve & loclevwavCurve, bool & loclevwavutili, bool wavcurvelev, const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, - float sigm, float offs,int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena); + const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, bool wavcurvecompre, + float sigm, float offs,int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena); void wavcont(wavelet_decomposition &wdspot, float ****templevel, int level_bl, int maxlvl, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, + const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, float radlevblur, int process, procparams::FattalToneMappingParams &fatParams, float chromablu); void wavcbd(wavelet_decomposition &wdspot, int level_bl, int maxlvl, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 5518ed3c6..3394b23bd 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -4128,7 +4128,9 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int bool wavcurvecon = false; bool loccompwavutili = false; bool wavcurvecomp = false; - wavcontrast4(bufmaskblurcol->L, nullptr, nullptr, contrast, 0.f, 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, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false); + bool loccomprewavutili = false; + bool wavcurvecompre = false; + wavcontrast4(bufmaskblurcol->L, nullptr, nullptr, contrast, 0.f, 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, dummy, loccomprewavutili, wavcurvecompre, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false, false); } @@ -7076,10 +7078,49 @@ void ImProcFunctions::wavcbd(wavelet_decomposition &wdspot, int level_bl, int ma } +void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float Compression, float DetailBoost) +{ + + float exponent; + + if (DetailBoost > 0.f && DetailBoost < 0.05f) { + float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) + exponent = 1.2f * xlogf(-betemp); + exponent /= 20.f; + } else if (DetailBoost >= 0.05f && DetailBoost < 0.25f) { + float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; + exponent = 1.2f * xlogf(-betemp); + exponent /= (-75.f * DetailBoost + 23.75f); + } else if (DetailBoost >= 0.25f) { + float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; + exponent = 1.2f * xlogf(-betemp); + exponent /= (-2.f * DetailBoost + 5.5f); + } else { + exponent = (Compression - 1.0f) / 20.f; + } + + exponent += 1.f; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + if (Source[y][x] > 0.f) { + Source[y][x] = xexpf(xlogf(Source[y][x]) * exponent); + } else { + Source[y][x] = -xexpf(xlogf(-Source[y][x]) * exponent); + } + } + } +} + void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel, int level_bl, int maxlvl, const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, + const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, float radlevblur, int process, FattalToneMappingParams &fatParams, float chromablu) { @@ -7120,7 +7161,7 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel } } - if (process == 2) { //Dynamic compression + if (process == 2) { //Dynamic compression laplacian - Huge ressources for (int dir = 1; dir < 4; dir++) { for (int level = level_bl; level < maxlvl; ++level) { int W_L = wdspot.level_W(level); @@ -7138,6 +7179,29 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel } } + if (process == 3) { //Dynamic compression wavelet + + 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 (loccomprewavCurve && loccomprewavutili) { + float klev = 2.f * (loccomprewavCurve[level * 55.5f] - 0.5f); + + if (klev < 0.f) { + klev *= 2.f; + } + + float Compression = expf(-klev); + float DetailBoost = klev; + Compresslevels(templevel[dir - 1][level], W_L, H_L, Compression, DetailBoost); + } + } + } + } + + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -7163,7 +7227,8 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f 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, float offs, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena) + const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, bool wavcurvecompre, + float sigm, float offs, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena) { wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6); @@ -7305,7 +7370,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f float ****templevelb = nullptr; - if (wavcurvelev || wavcurvecomp) {//compress dynamic and blur + if (wavcurvelev || wavcurvecomp || wavcurvecompre) {//compress dynamic and blur fatParams.enabled = wavcurvecomp; templevel = new float***[dir]; @@ -7329,16 +7394,19 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f } if (wavcurvelev && radlevblur > 0.f && blurena) { - wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, radlevblur, 1, fatParams, 1.f); + wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, 1.f); } if (wavcurvecomp && comprena) { - wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, radlevblur, 2, fatParams, 1.f); + wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, fatParams, 1.f); } + if (wavcurvecompre && compreena) { + wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, fatParams, 1.f); + } //free memory templevel - if (wavcurvelev || wavcurvecomp) { + if (wavcurvelev || wavcurvecomp || wavcurvecompre) { for (int i = 0; i < dir; i++) { @@ -7504,7 +7572,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f } if (wavcurvelev && radlevblur > 0.f) { - wavcont(*wdspota, templevela, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, radlevblur, 1, fatParams, chromablu); + wavcont(*wdspota, templevela, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu); } wdspota->reconstruct(tmpa[0], 1.f); @@ -7559,7 +7627,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f } if (wavcurvelev && radlevblur > 0.f) { - wavcont(*wdspotb, templevelb, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, radlevblur, 1, fatParams, chromablu); + wavcont(*wdspotb, templevelb, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu); } wdspotb->reconstruct(tmpb[0], 1.f); @@ -9190,6 +9258,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & locconwavCurve, bool & locconwavutili, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, + const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, const LocwavCurve & locwavCurveden, bool & locwavdenutili, 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, @@ -9591,7 +9660,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool wavcurvecon = false; bool loccompwavutili = false; bool wavcurvecomp = false; - wavcontrast4(bufmaskblurbl->L, nullptr, nullptr, contrast, 0.f, 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, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false); + bool loccomprewavutili = false; + bool wavcurvecompre = false; + wavcontrast4(bufmaskblurbl->L, nullptr, nullptr, contrast, 0.f, 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, dummy, loccomprewavutili, wavcurvecompre, 1.f, 1.f, maxlvl, 0.f, 0.f, 1.f, 1.f, false, false, false, false, false); } int shado = params->locallab.spots.at(sp).shadmaskbl; @@ -11294,8 +11365,20 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } } + bool wavcurvecompre = false; - if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || 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) { + if (loccomprewavCurve && loccomprewavutili) { + if (lp.locmet == 1) { + for (int i = 0; i < 500; i++) { + if (loccomprewavCurve[i] != 0.5) { + wavcurvecompre = true; + } + } + } + } + + + if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || wavcurvelev || wavcurvecon || wavcurvecomp || wavcurvecompre || 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); @@ -11528,8 +11611,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const bool blurena = params->locallab.spots.at(sp).wavblur; const bool levelena = params->locallab.spots.at(sp).wavcont; const bool comprena = params->locallab.spots.at(sp).wavcomp; + const bool compreena = params->locallab.spots.at(sp).wavcompre; - wavcontrast4(tmp1->L, tmp1->a, tmp1->b, contrast, fatres, 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, offs, maxlvl, fatdet, fatanch, chrol, chrobl, blurlc, blurena, levelena, comprena); + wavcontrast4(tmp1->L, tmp1->a, tmp1->b, contrast, fatres, 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, loccomprewavCurve, loccomprewavutili, wavcurvecompre, sigma, offs, maxlvl, fatdet, fatanch, chrol, chrobl, blurlc, blurena, levelena, comprena, compreena); const float satur = params->locallab.spots.at(sp).residchro; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index d6f4950f2..1146999fc 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -910,6 +910,8 @@ enum ProcEventCode { Evlocallabwavblur = 881, Evlocallabwavcont = 882, Evlocallabwavcomp = 883, + Evlocallabwavcompre = 884, + EvlocallabwavCurvecompre = 885, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index bc5927032..8bf0f3b9d 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2742,6 +2742,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : wavblur(false), wavcont(false), wavcomp(false), + wavcompre(false), origlc(false), localcontMethod("loc"), locwavcurve{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, @@ -2749,6 +2750,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : 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}, + loccomprewavcurve{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, CCmasklccurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35 }, LLmasklccurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, HHmasklccurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.0, 1.0, 0.35, 0.35}, @@ -3153,6 +3155,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && wavblur == other.wavblur && wavcont == other.wavcont && wavcomp == other.wavcomp + && wavcompre == other.wavcompre && origlc == other.origlc && localcontMethod == other.localcontMethod && locwavcurve == other.locwavcurve @@ -3160,6 +3163,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && loclevwavcurve == other.loclevwavcurve && locconwavcurve == other.locconwavcurve && loccompwavcurve == other.loccompwavcurve + && loccomprewavcurve == other.loccomprewavcurve && CCmasklccurve == other.CCmasklccurve && LLmasklccurve == other.LLmasklccurve && HHmasklccurve == other.HHmasklccurve @@ -4543,12 +4547,14 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).wavblur, "Locallab", "Wavblur_" + std::to_string(i), spot.wavblur, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).wavcont, "Locallab", "Wavcont_" + std::to_string(i), spot.wavcont, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).wavcomp, "Locallab", "Wavcomp_" + std::to_string(i), spot.wavcomp, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).wavcompre, "Locallab", "Wavcompre_" + std::to_string(i), spot.wavcompre, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).origlc, "Locallab", "Origlc_" + std::to_string(i), spot.origlc, keyFile); 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).loccompwavcurve, "Locallab", "LoccompwavCurve_" + std::to_string(i), spot.loccompwavcurve, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).loccomprewavcurve, "Locallab", "LoccomprewavCurve_" + std::to_string(i), spot.loccomprewavcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).csthreshold, "Locallab", "CSThreshold_" + std::to_string(i), spot.csthreshold.toVector(), keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).CCmasklccurve, "Locallab", "CCmasklcCurve_" + std::to_string(i), spot.CCmasklccurve, keyFile); @@ -6084,12 +6090,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Wavblur_" + std::to_string(i), pedited, spot.wavblur, spotEdited.wavblur); assignFromKeyfile(keyFile, "Locallab", "Wavcont_" + std::to_string(i), pedited, spot.wavcont, spotEdited.wavcont); assignFromKeyfile(keyFile, "Locallab", "Wavcomp_" + std::to_string(i), pedited, spot.wavcomp, spotEdited.wavcomp); + assignFromKeyfile(keyFile, "Locallab", "Wavcompre_" + std::to_string(i), pedited, spot.wavcompre, spotEdited.wavcompre); assignFromKeyfile(keyFile, "Locallab", "Origlc_" + std::to_string(i), pedited, spot.origlc, spotEdited.origlc); 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); assignFromKeyfile(keyFile, "Locallab", "LoccompwavCurve_" + std::to_string(i), pedited, spot.loccompwavcurve, spotEdited.loccompwavcurve); + assignFromKeyfile(keyFile, "Locallab", "LoccomprewavCurve_" + std::to_string(i), pedited, spot.loccomprewavcurve, spotEdited.loccomprewavcurve); assignFromKeyfile(keyFile, "Locallab", "CCmasklcCurve_" + std::to_string(i), pedited, spot.CCmasklccurve, spotEdited.CCmasklccurve); assignFromKeyfile(keyFile, "Locallab", "LLmasklcCurve_" + std::to_string(i), pedited, spot.LLmasklccurve, spotEdited.LLmasklccurve); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0b108fbc7..7badbb1bd 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1285,6 +1285,7 @@ struct LocallabParams { bool wavblur; bool wavcont; bool wavcomp; + bool wavcompre; bool origlc; Glib::ustring localcontMethod; std::vector locwavcurve; @@ -1292,6 +1293,7 @@ struct LocallabParams { std::vector loclevwavcurve; std::vector locconwavcurve; std::vector loccompwavcurve; + std::vector loccomprewavcurve; std::vector CCmasklccurve; std::vector LLmasklccurve; std::vector HHmasklccurve; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 80e874dd8..6f385d149 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -913,7 +913,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallaboffset LUMINANCECURVE, //Evlocallabwavblur LUMINANCECURVE, //Evlocallabwavcont - LUMINANCECURVE //Evlocallabwavcomp + LUMINANCECURVE, //Evlocallabwavcomp + LUMINANCECURVE, //Evlocallabwavcompre + LUMINANCECURVE //EvlocallabwavCurvecompre }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index e4a56bc0c..d819d0d84 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1122,6 +1122,7 @@ private: LocwavCurve loclevwavCurve; LocwavCurve locconwavCurve; LocwavCurve loccompwavCurve; + LocwavCurve loccomprewavCurve; LocwavCurve locwavCurveden; LUTf lllocalcurve(65536, 0); LUTf lclocalcurve(65536, 0); @@ -1206,6 +1207,7 @@ private: bool loclevwavutili = false; bool locconwavutili = false; bool loccompwavutili = false; + bool loccomprewavutili = false; bool lmasutiliblwav = false; bool lmasutilicolwav = false; locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); @@ -1245,6 +1247,7 @@ private: 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); + loccomprewavCurve.Set(params.locallab.spots.at(sp).loccomprewavcurve, loccomprewavutili); 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); @@ -1322,6 +1325,7 @@ private: loclevwavCurve, loclevwavutili, locconwavCurve, locconwavutili, loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, locwavCurveden, locwavdenutili, 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, 0, diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index bd0effadd..22b962092 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -357,6 +357,9 @@ Locallab::Locallab(): LocalcurveEditorwavcomp(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCOMP"))), wavshapecomp(static_cast(LocalcurveEditorwavcomp->addCurve(CT_Flat, "", nullptr, false, false))), + LocalcurveEditorwavcompre(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCOMPRE"))), + wavshapecompre(static_cast(LocalcurveEditorwavcompre->addCurve(CT_Flat, "", nullptr, false, false))), + masklcCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), mask2lcCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), @@ -691,6 +694,7 @@ enalcMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), wavblur(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_BLURLEVELFRA")))), wavcont(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_CONTFRA")))), wavcomp(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_COMPFRA")))), +wavcompre(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_COMPREFRA")))), //CBDL enacbMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), //encoding log @@ -772,6 +776,7 @@ clariFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), blurlevelFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_BLURLEVELFRA")))), contFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTFRA")))), compFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COMPFRA")))), +compreFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COMPREFRA")))), 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")))), @@ -2843,6 +2848,7 @@ pe(nullptr) wavblurConn = wavblur->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::wavblurChanged)); wavcontConn = wavcont->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::wavcontChanged)); wavcompConn = wavcomp->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::wavcompChanged)); + wavcompreConn = wavcompre->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::wavcompreChanged)); origlcConn = origlc->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::origlcChanged)); csThreshold->setAdjusterListener(this); @@ -2894,6 +2900,17 @@ pe(nullptr) LocalcurveEditorwavcomp->curveListComplete(); + LocalcurveEditorwavcompre->setCurveListener(this); + + wavshapecompre->setIdentityValue(0.); + wavshapecompre->setResetCurve(FlatCurveType(defSpot.loccomprewavcurve.at(0)), defSpot.loccomprewavcurve); + + if (showtooltip) { +// wavshape->setTooltip(M("TP_RETINEX_WAV_TOOLTIP")); + } + + LocalcurveEditorwavcompre->curveListComplete(); + localcontMethod->append(M("TP_LOCALLAB_LOCCONT")); localcontMethod->append(M("TP_LOCALLAB_WAVE")); localcontMethod->set_active(0); @@ -2994,6 +3011,14 @@ pe(nullptr) compBox->set_spacing(2); wavcomp->set_active (false); compFrame->set_label_widget(*wavcomp); + + compreFrame->set_label_align(0.025, 0.5); + Gtk::VBox *compreBox = Gtk::manage ( new Gtk::VBox()); + compreBox->set_spacing(2); + wavcompre->set_active (false); + compreFrame->set_label_widget(*wavcompre); + compreBox->pack_start(*LocalcurveEditorwavcompre, Gtk::PACK_SHRINK, 4); + compreFrame->add(*compreBox); // ToolParamBlock* const compBox = Gtk::manage(new ToolParamBlock()); compBox->pack_start(*fatdet); @@ -3018,6 +3043,7 @@ pe(nullptr) ToolParamBlock* const blurcontBox = Gtk::manage(new ToolParamBlock()); blurcontBox->pack_start(*clariFrame); blurcontBox->pack_start(*contFrame); + blurcontBox->pack_start(*compreFrame); if (complexsoft < 2) { blurcontBox->pack_start(*compFrame); } @@ -3813,6 +3839,7 @@ Locallab::~Locallab() delete LocalcurveEditorwavden; delete LocalcurveEditorwavcon; delete LocalcurveEditorwavcomp; + delete LocalcurveEditorwavcompre; delete masktmCurveEditorG; delete maskblCurveEditorG; delete mask2blCurveEditorG; @@ -5317,12 +5344,14 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).wavblur = wavblur->get_active(); pp->locallab.spots.at(pp->locallab.selspot).wavcont = wavcont->get_active(); pp->locallab.spots.at(pp->locallab.selspot).wavcomp = wavcomp->get_active(); + pp->locallab.spots.at(pp->locallab.selspot).wavcompre = wavcompre->get_active(); pp->locallab.spots.at(pp->locallab.selspot).origlc = origlc->get_active(); 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(); pp->locallab.spots.at(pp->locallab.selspot).loccompwavcurve = wavshapecomp->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).loccomprewavcurve = wavshapecompre->getCurve(); if (localcontMethod->get_active_row_number() == 0) { pp->locallab.spots.at(pp->locallab.selspot).localcontMethod = "loc"; @@ -5731,6 +5760,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).wavblur = pe->locallab.spots.at(pp->locallab.selspot).wavblur || !wavblur->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).wavcont = pe->locallab.spots.at(pp->locallab.selspot).wavcont || !wavcont->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).wavcomp = pe->locallab.spots.at(pp->locallab.selspot).wavcomp || !wavcomp->get_inconsistent(); + pe->locallab.spots.at(pp->locallab.selspot).wavcompre = pe->locallab.spots.at(pp->locallab.selspot).wavcompre || !wavcompre->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).origlc = pe->locallab.spots.at(pp->locallab.selspot).origlc || !origlc->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).localcontMethod = pe->locallab.spots.at(pp->locallab.selspot).localcontMethod || localcontMethod->get_active_text() != M("GENERAL_UNCHANGED"); pe->locallab.spots.at(pp->locallab.selspot).locwavcurve = pe->locallab.spots.at(pp->locallab.selspot).locwavcurve || !wavshape->isUnChanged(); @@ -5738,6 +5768,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited 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(); + pe->locallab.spots.at(pp->locallab.selspot).loccomprewavcurve = pe->locallab.spots.at(pp->locallab.selspot).loccomprewavcurve || !wavshapecompre->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).CCmasklccurve = pe->locallab.spots.at(pp->locallab.selspot).CCmasklccurve || !CCmasklcshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).LLmasklccurve = pe->locallab.spots.at(pp->locallab.selspot).LLmasklccurve || !LLmasklcshape->isUnChanged(); @@ -6144,12 +6175,14 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).wavblur = pedited->locallab.spots.at(pp->locallab.selspot).wavblur || !wavblur->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).wavcont = pedited->locallab.spots.at(pp->locallab.selspot).wavcont || !wavcont->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).wavcomp = pedited->locallab.spots.at(pp->locallab.selspot).wavcomp || !wavcomp->get_inconsistent(); + pedited->locallab.spots.at(pp->locallab.selspot).wavcompre = pedited->locallab.spots.at(pp->locallab.selspot).wavcompre || !wavcompre->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).origlc = pedited->locallab.spots.at(pp->locallab.selspot).origlc || !origlc->get_inconsistent(); 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(); pedited->locallab.spots.at(pp->locallab.selspot).loccompwavcurve = pedited->locallab.spots.at(pp->locallab.selspot).loccompwavcurve || !wavshapecomp->isUnChanged(); + pedited->locallab.spots.at(pp->locallab.selspot).loccomprewavcurve = pedited->locallab.spots.at(pp->locallab.selspot).loccomprewavcurve || !wavshapecompre->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).CCmasklccurve = pedited->locallab.spots.at(pp->locallab.selspot).CCmasklccurve || !CCmasklcshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).LLmasklccurve = pedited->locallab.spots.at(pp->locallab.selspot).LLmasklccurve || !LLmasklcshape->isUnChanged(); @@ -6659,6 +6692,12 @@ void Locallab::curveChanged(CurveEditor* ce) } } + if (ce == wavshapecompre) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvecompre, M("HISTORY_CUSTOMCURVE")); + } + } + if (ce == CCmasklcshape) { if (listener) { listener->panelChanged(EvlocallabCCmasklcshape, M("HISTORY_CUSTOMCURVE")); @@ -6730,6 +6769,7 @@ void Locallab::localcontMethodChanged() LocalcurveEditorwavlev->hide(); LocalcurveEditorwavcon->hide(); LocalcurveEditorwavcomp->hide(); + LocalcurveEditorwavcompre->hide(); fftwlc->show(); blurlc->show(); wavblur->show(); @@ -6760,6 +6800,7 @@ void Locallab::localcontMethodChanged() LocalcurveEditorwavlev->hide(); LocalcurveEditorwavcon->hide(); LocalcurveEditorwavcomp->hide(); + LocalcurveEditorwavcompre->hide(); fftwlc->hide(); blurlc->show(); wavblur->show(); @@ -8382,6 +8423,29 @@ void Locallab::wavcompChanged() } } +void Locallab::wavcompreChanged() +{ + + if (multiImage) { + if (wavcompre->get_inconsistent()) { + wavcompre->set_inconsistent(false); + wavcompreConn.block(true); + wavcompre->set_active(false); + wavcompreConn.block(false); + } + } + + if (getEnabled() && expcontrast->getEnabled()) { + if (listener) { + if (wavcompre->get_active()) { + listener->panelChanged(Evlocallabwavcompre, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabwavcompre, M("GENERAL_DISABLED")); + } + } + } +} + void Locallab::origlcChanged() { @@ -11393,6 +11457,7 @@ void Locallab::enableListener() wavblurConn.block(false); wavcontConn.block(false); wavcompConn.block(false); + wavcompreConn.block(false); origlcConn.block(false); showmasklcMethodConn.block(false); enalcMaskConn.block(false); @@ -11494,6 +11559,7 @@ void Locallab::disableListener() wavblurConn.block(true); wavcontConn.block(true); wavcompConn.block(true); + wavcompreConn.block(true); origlcConn.block(true); showmasklcMethodConn.block(true); enalcMaskConn.block(true); @@ -12169,6 +12235,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con wavblur->set_active(pp->locallab.spots.at(index).wavblur); wavcont->set_active(pp->locallab.spots.at(index).wavcont); wavcomp->set_active(pp->locallab.spots.at(index).wavcomp); + wavcompre->set_active(pp->locallab.spots.at(index).wavcompre); origlc->set_active(pp->locallab.spots.at(index).origlc); csThreshold->setValue(pp->locallab.spots.at(index).csthreshold); @@ -12194,6 +12261,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con wavshapelev->setCurve(pp->locallab.spots.at(index).loclevwavcurve); wavshapecon->setCurve(pp->locallab.spots.at(index).locconwavcurve); wavshapecomp->setCurve(pp->locallab.spots.at(index).loccompwavcurve); + wavshapecompre->setCurve(pp->locallab.spots.at(index).loccomprewavcurve); CCmasklcshape->setCurve(pp->locallab.spots.at(index).CCmasklccurve); LLmasklcshape->setCurve(pp->locallab.spots.at(index).LLmasklccurve); @@ -12688,12 +12756,14 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con wavblur->set_inconsistent(multiImage && !spotState->wavblur); wavcont->set_inconsistent(multiImage && !spotState->wavcont); wavcomp->set_inconsistent(multiImage && !spotState->wavcomp); + wavcompre->set_inconsistent(multiImage && !spotState->wavcompre); origlc->set_inconsistent(multiImage && !spotState->origlc); wavshape->setUnChanged(!spotState->locwavcurve); wavshapelev->setUnChanged(!spotState->loclevwavcurve); csThreshold->setEditedState(spotState->csthreshold ? Edited : UnEdited); wavshapecon->setUnChanged(!spotState->locconwavcurve); wavshapecomp->setUnChanged(!spotState->loccompwavcurve); + wavshapecompre->setUnChanged(!spotState->loccomprewavcurve); LLmasklcshape->setUnChanged(!spotState->LLmasklccurve); HHmasklcshape->setUnChanged(!spotState->HHmasklccurve); @@ -13221,6 +13291,7 @@ void Locallab::updateSpecificGUIState() LocalcurveEditorwavlev->hide(); LocalcurveEditorwavcon->hide(); LocalcurveEditorwavcomp->hide(); + LocalcurveEditorwavcompre->hide(); fftwlc->show(); blurlc->show(); wavblur->show(); @@ -13251,6 +13322,7 @@ void Locallab::updateSpecificGUIState() LocalcurveEditorwavlev->show(); LocalcurveEditorwavcon->show(); LocalcurveEditorwavcomp->show(); + LocalcurveEditorwavcompre->show(); fftwlc->hide(); blurlc->show(); wavblur->show(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index d305ddd4c..3d583fd6a 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -173,6 +173,8 @@ private: FlatCurveEditor* const wavshapecon; CurveEditorGroup* const LocalcurveEditorwavcomp; FlatCurveEditor* const wavshapecomp; + CurveEditorGroup* const LocalcurveEditorwavcompre; + FlatCurveEditor* const wavshapecompre; CurveEditorGroup* const masklcCurveEditorG; CurveEditorGroup* const mask2lcCurveEditorG; DiagonalCurveEditor* const Lmasklcshape; @@ -496,6 +498,8 @@ private: sigc::connection wavcontConn; Gtk::CheckButton* const wavcomp; sigc::connection wavcompConn; + Gtk::CheckButton* const wavcompre; + sigc::connection wavcompreConn; //CBDL Gtk::CheckButton* const enacbMask; @@ -612,6 +616,7 @@ private: Gtk::Frame* const blurlevelFrame; Gtk::Frame* const contFrame; Gtk::Frame* const compFrame; + Gtk::Frame* const compreFrame; Gtk::Frame* const grainFrame; Gtk::Frame* const logFrame; Gtk::Frame* const logPFrame; @@ -705,6 +710,7 @@ private: void wavblurChanged(); void wavcontChanged(); void wavcompChanged(); + void wavcompreChanged(); //CBDL void enacbMaskChanged(); // ComboBox event functions diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 03e380ebf..15efff4b0 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1278,12 +1278,14 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).wavblur = locallab.spots.at(j).wavblur && pSpot.wavblur == otherSpot.wavblur; locallab.spots.at(j).wavcont = locallab.spots.at(j).wavcont && pSpot.wavcont == otherSpot.wavcont; locallab.spots.at(j).wavcomp = locallab.spots.at(j).wavcomp && pSpot.wavcomp == otherSpot.wavcomp; + locallab.spots.at(j).wavcompre = locallab.spots.at(j).wavcompre && pSpot.wavcompre == otherSpot.wavcompre; locallab.spots.at(j).origlc = locallab.spots.at(j).origlc && pSpot.origlc == otherSpot.origlc; 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).loccompwavcurve = locallab.spots.at(j).loccompwavcurve && pSpot.loccompwavcurve == otherSpot.loccompwavcurve; + locallab.spots.at(j).loccomprewavcurve = locallab.spots.at(j).loccomprewavcurve && pSpot.loccomprewavcurve == otherSpot.loccomprewavcurve; locallab.spots.at(j).csthreshold = locallab.spots.at(j).csthreshold && pSpot.csthreshold == otherSpot.csthreshold; locallab.spots.at(j).CCmasklccurve = locallab.spots.at(j).CCmasklccurve && pSpot.CCmasklccurve == otherSpot.CCmasklccurve; @@ -4092,6 +4094,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).wavcomp = mods.locallab.spots.at(i).wavcomp; } + if (locallab.spots.at(i).wavcompre) { + toEdit.locallab.spots.at(i).wavcompre = mods.locallab.spots.at(i).wavcompre; + } + if (locallab.spots.at(i).origlc) { toEdit.locallab.spots.at(i).origlc = mods.locallab.spots.at(i).origlc; } @@ -4116,6 +4122,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).loccompwavcurve = mods.locallab.spots.at(i).loccompwavcurve; } + if (locallab.spots.at(i).loccomprewavcurve) { + toEdit.locallab.spots.at(i).loccomprewavcurve = mods.locallab.spots.at(i).loccomprewavcurve; + } + if (locallab.spots.at(i).csthreshold) { toEdit.locallab.spots.at(i).csthreshold = mods.locallab.spots.at(i).csthreshold; } @@ -5642,12 +5652,14 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : wavblur(v), wavcont(v), wavcomp(v), + wavcompre(v), origlc(v), localcontMethod(v), locwavcurve(v), loclevwavcurve(v), locconwavcurve(v), loccompwavcurve(v), + loccomprewavcurve(v), csthreshold(v), CCmasklccurve(v), LLmasklccurve(v), @@ -6043,12 +6055,14 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) wavblur = v; wavcont = v; wavcomp = v; + wavcompre = v; origlc = v; localcontMethod = v; locwavcurve = v; loclevwavcurve = v; locconwavcurve = v; loccompwavcurve = v; + loccomprewavcurve = v; csthreshold = v; CCmasklccurve = v; LLmasklccurve = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index d191855f2..ee946b606 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -711,12 +711,14 @@ public: bool wavblur; bool wavcont; bool wavcomp; + bool wavcompre; bool origlc; bool localcontMethod; bool locwavcurve; bool loclevwavcurve; bool locconwavcurve; bool loccompwavcurve; + bool loccomprewavcurve; bool csthreshold; bool CCmasklccurve; bool LLmasklccurve;