diff --git a/rtdata/languages/default b/rtdata/languages/default index f8ab3a3fa..9df4cdbe5 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1124,6 +1124,7 @@ 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_887;Local - Contrast Wavelet Compression Residual +HISTORY_MSG_888;Local - Contrast Wavelet Threshold HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2595,6 +2596,7 @@ TP_LOCALLAB_TARGET_GRAY;Target Gray Point TP_LOCALLAB_THRES;Threshold structure TP_LOCALLAB_THRESDELTAE;Threshold ΔE-scope TP_LOCALLAB_THRESRETI;Threshold +TP_LOCALLAB_THRESWAV;Threshold TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 TP_LOCALLAB_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index cf7fefecd..8510ef83e 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -210,7 +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 Compresslevels(float **Source, int W_L, int H_L, float compression, float detailBoost, float thres, float maxp, float maxn); 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); @@ -324,13 +324,13 @@ public: const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, 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, float compress); + float sigm, float offs,int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres); 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); + float radlevblur, int process, procparams::FattalToneMappingParams &fatParams, float chromablu, float thres); void wavcbd(wavelet_decomposition &wdspot, int level_bl, int maxlvl, const LocwavCurve & locconwavCurve, bool & locconwavutili, float sigm, float offs, float chromalev, int sk); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 301bbe49d..dbe7ce6e7 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -4096,7 +4096,7 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int bool wavcurvecomp = 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, 0.f); + 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, 0.f, 0.f); } @@ -7044,28 +7044,32 @@ 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) +void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float compression, float detailBoost, float thres, float maxp, float maxn) { + //J.Desmis 12-2019 float exponent; - if (DetailBoost > 0.f && DetailBoost < 0.05f) { - float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) + if (detailBoost > 0.f && detailBoost < 0.05f) { + float betemp = expf(-(2.f - detailBoost + 0.693147f)) - 1.f; //0.69315 = 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; + } else if (detailBoost >= 0.05f && detailBoost < 0.25f) { + float betemp = expf(-(2.f - detailBoost + 0.693147f)) - 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 /= (-75.f * detailBoost + 23.75f); + } else if (detailBoost >= 0.25f) { + float betemp = expf(-(2.f - detailBoost + 0.693147f)) - 1.f; exponent = 1.2f * xlogf(-betemp); - exponent /= (-2.f * DetailBoost + 5.5f); + exponent /= (-2.f * detailBoost + 5.5f); } else { - exponent = (Compression - 1.0f) / 20.f; + exponent = (compression - 1.0f) / 20.f; } exponent += 1.f; + if(thres == 0.f) { + thres = 0.00001f; + } #ifdef _OPENMP #pragma omp parallel for @@ -7073,10 +7077,10 @@ void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float Com 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); + if (Source[y][x] >= 0.f && Source[y][x] < (maxp - thres)) { + Source[y][x] = xexpf(xlogf(Source[y][x] + thres) * exponent); + } else if (Source[y][x] < 0.f && Source[y][x] > (maxn + thres)) { + Source[y][x] = -xexpf(xlogf(-Source[y][x] + thres) * exponent); } } } @@ -7088,7 +7092,7 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel const LocwavCurve & loclevwavCurve, bool & loclevwavutili, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, const LocwavCurve & loccomprewavCurve, bool & loccomprewavutili, - float radlevblur, int process, FattalToneMappingParams &fatParams, float chromablu) + float radlevblur, int process, FattalToneMappingParams &fatParams, float chromablu, float thres) { #ifdef _OPENMP @@ -7147,12 +7151,18 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel } if (process == 3) { //Dynamic compression wavelet + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + Evaluate2(wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN); 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); @@ -7160,14 +7170,18 @@ void ImProcFunctions::wavcont(wavelet_decomposition &wdspot, float ****templevel klev *= 2.f; } - float Compression = expf(-klev); - float DetailBoost = klev; + float compression = expf(-klev); + float detailBoost = klev; if (klev < 0.0f) { - DetailBoost = 0.0f; + detailBoost = 0.0f; } - - Compresslevels(templevel[dir - 1][level], W_L, H_L, Compression, DetailBoost); + + float thresref = mean[level]; + float thresreal = 0.2f * thres * thresref; + + + Compresslevels(templevel[dir - 1][level], W_L, H_L, compression, detailBoost, thresreal, MaxP[level], MaxN[level]); } } } @@ -7200,7 +7214,7 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f const LocwavCurve & locconwavCurve, bool & locconwavutili, bool wavcurvecon, const LocwavCurve & loccompwavCurve, bool & loccompwavutili, bool wavcurvecomp, 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, float compress) + float sigm, float offs, int & maxlvl, float fatdet, float fatanch, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres) { wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, 6); @@ -7356,6 +7370,15 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float ** tmpa, float ** tmpb, f if (wavcurvelev || wavcurvecomp || wavcurvecompre) {//compress dynamic and blur + + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + Evaluate2(*wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN); + fatParams.enabled = wavcurvecomp; templevel = new float***[dir]; @@ -7379,15 +7402,15 @@ 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, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, 1.f); + wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, 1.f, 0.f); } if (wavcurvecomp && comprena) { - wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, fatParams, 1.f); + wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, fatParams, 1.f, 0.f); } if (wavcurvecompre && compreena) { - wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, fatParams, 1.f); + wavcont(*wdspot, templevel, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, fatParams, 1.f, thres); } //free memory templevel @@ -7557,7 +7580,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, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu); + wavcont(*wdspota, templevela, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f); } wdspota->reconstruct(tmpa[0], 1.f); @@ -7612,7 +7635,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, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu); + wavcont(*wdspotb, templevelb, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, fatParams, chromablu, 0.f); } wdspotb->reconstruct(tmpb[0], 1.f); @@ -9647,7 +9670,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool wavcurvecomp = 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, 0.f); + 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, 0.f, 0.f); } int shado = params->locallab.spots.at(sp).shadmaskbl; @@ -11598,8 +11621,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const bool comprena = params->locallab.spots.at(sp).wavcomp; const bool compreena = params->locallab.spots.at(sp).wavcompre; const float compress = params->locallab.spots.at(sp).residcomp; + const float thres = params->locallab.spots.at(sp).threswav; - 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, compress); + 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, compress, thres); const float satur = params->locallab.spots.at(sp).residchro; diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index b0261803e..0192b32f1 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1432,15 +1432,15 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress float exponent; if (DetailBoost > 0.f && DetailBoost < 0.05f ) { - float betemp = expf (- (2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) + float betemp = expf (- (2.f - DetailBoost + 0.693147f)) - 1.f; //0.693147 = 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; //0.694 = log(2) + float betemp = expf (- (2.f - DetailBoost + 0.693147f)) - 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; //0.694 = log(2) + float betemp = expf (- (2.f - DetailBoost + 0.693147f)) - 1.f; exponent = 1.2f * xlogf( -betemp); exponent /= (-2.f * DetailBoost + 5.5f); } else { @@ -1448,6 +1448,7 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress } exponent += 1.f; + const float eps = 0.0001f; // now calculate Source = pow(Source, exponent) #ifdef __SSE2__ @@ -1456,17 +1457,19 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress #endif { vfloat exponentv = F2V(exponent); + __m128 epsv = _mm_set1_ps( eps ); + #ifdef _OPENMP #pragma omp for #endif for (int i = 0; i < n - 3; i += 4) { - STVFU(Source[i], xexpf(xlogf(LVFU(Source[i])) * exponentv)); + STVFU(Source[i], xexpf(xlogf(LVFU(Source[i]) + epsv) * exponentv)); } } for (int i = n - (n % 4); i < n; i++) { - Source[i] = xexpf(xlogf(Source[i]) * exponent); + Source[i] = xexpf(xlogf(Source[i] + eps) * exponent); } #else diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 73873de8a..d3009d9c7 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -913,6 +913,7 @@ enum ProcEventCode { Evlocallabwavcompre = 884, EvlocallabwavCurvecompre = 885, Evlocallabresidcomp = 886, + Evlocallabthreswav = 887, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4237ea7c8..50fd52644 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2729,6 +2729,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : residcomp(0.0), sigma(1.0), offset(1.0), + threswav(0.1), chromalev(1.0), chromablu(1.0), fatdet(40.0), @@ -3143,6 +3144,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && residcomp == other.residcomp && sigma == other.sigma && offset == other.offset + && threswav == other.threswav && chromalev == other.chromalev && chromablu == other.chromablu && fatdet == other.fatdet @@ -4536,6 +4538,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).residcomp, "Locallab", "Residcomp_" + std::to_string(i), spot.residcomp, 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).offset, "Locallab", "Offset_" + std::to_string(i), spot.offset, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).threswav, "Locallab", "Threswav_" + std::to_string(i), spot.threswav, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromalev, "Locallab", "Chromalev_" + std::to_string(i), spot.chromalev, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chromablu, "Locallab", "Chromablu_" + std::to_string(i), spot.chromablu, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fatdet, "Locallab", "Fatdet_" + std::to_string(i), spot.fatdet, keyFile); @@ -6080,6 +6083,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Residcomp_" + std::to_string(i), pedited, spot.residcomp, spotEdited.residcomp); assignFromKeyfile(keyFile, "Locallab", "Sigma_" + std::to_string(i), pedited, spot.sigma, spotEdited.sigma); assignFromKeyfile(keyFile, "Locallab", "Offset_" + std::to_string(i), pedited, spot.offset, spotEdited.offset); + assignFromKeyfile(keyFile, "Locallab", "Threswav_" + std::to_string(i), pedited, spot.threswav, spotEdited.threswav); assignFromKeyfile(keyFile, "Locallab", "Chromalev_" + std::to_string(i), pedited, spot.chromalev, spotEdited.chromalev); assignFromKeyfile(keyFile, "Locallab", "Chromablu_" + std::to_string(i), pedited, spot.chromablu, spotEdited.chromablu); assignFromKeyfile(keyFile, "Locallab", "Fatdet_" + std::to_string(i), pedited, spot.fatdet, spotEdited.fatdet); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 070e4db25..c25866a42 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1272,6 +1272,7 @@ struct LocallabParams { double residcomp; double sigma; double offset; + double threswav; double chromalev; double chromablu; double fatdet; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index e49ffcfe9..30fa164af 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -916,7 +916,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabwavcomp LUMINANCECURVE, //Evlocallabwavcompre LUMINANCECURVE, //EvlocallabwavCurvecompre - LUMINANCECURVE //Evlocallabresidcomp + LUMINANCECURVE, //Evlocallabresidcomp + LUMINANCECURVE //Evlocallabthreswav }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index dd63c3dbe..e084f319c 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -582,6 +582,7 @@ residchro(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCHRO"), -100., 100., 1., residcomp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCOMP"), -1., 1., 0.01, 0.))), sigma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), offset(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFSETWAV"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), +threswav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESWAV"), 0.001, 1., 0.001, 0.1))), chromalev(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMALEV"), 0.01, 2., 0.01, 1.))), chromablu(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMABLU"), 0.01, 2., 0.01, 1.))), fatdet(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATDETAIL"), -100., 300., 1., 0.))), @@ -2950,6 +2951,7 @@ pe(nullptr) residcomp->setAdjusterListener(this); sigma->setAdjusterListener(this); offset->setAdjusterListener(this); + threswav->setAdjusterListener(this); chromalev->setAdjusterListener(this); chromablu->setAdjusterListener(this); fatdet->setAdjusterListener(this); @@ -3024,6 +3026,7 @@ pe(nullptr) wavcompre->set_active (false); compreFrame->set_label_widget(*wavcompre); compreBox->pack_start(*LocalcurveEditorwavcompre, Gtk::PACK_SHRINK, 4); + compreBox->pack_start(*threswav); compreBox->pack_start(*residcomp); compreFrame->add(*compreBox); @@ -5340,6 +5343,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).residcomp = residcomp->getValue(); pp->locallab.spots.at(pp->locallab.selspot).sigma = sigma->getValue(); pp->locallab.spots.at(pp->locallab.selspot).offset = offset->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).threswav = threswav->getValue(); pp->locallab.spots.at(pp->locallab.selspot).chromalev = chromalev->getValue(); pp->locallab.spots.at(pp->locallab.selspot).chromablu = chromablu->getValue(); pp->locallab.spots.at(pp->locallab.selspot).fatdet = fatdet->getValue(); @@ -5757,6 +5761,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).residcomp = pe->locallab.spots.at(pp->locallab.selspot).residcomp || residcomp->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).offset = pe->locallab.spots.at(pp->locallab.selspot).offset || offset->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).threswav = pe->locallab.spots.at(pp->locallab.selspot).threswav || threswav->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).chromalev = pe->locallab.spots.at(pp->locallab.selspot).chromalev || chromalev->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).chromablu = pe->locallab.spots.at(pp->locallab.selspot).chromablu || chromablu->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).fatdet = pe->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState(); @@ -6173,6 +6178,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).residcomp = pedited->locallab.spots.at(pp->locallab.selspot).residcomp || residcomp->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).offset = pedited->locallab.spots.at(pp->locallab.selspot).offset || offset->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).threswav = pedited->locallab.spots.at(pp->locallab.selspot).threswav || threswav->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).chromalev = pedited->locallab.spots.at(pp->locallab.selspot).chromalev || chromalev->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).chromablu = pedited->locallab.spots.at(pp->locallab.selspot).chromablu || chromablu->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).fatdet = pedited->locallab.spots.at(pp->locallab.selspot).fatdet || fatdet->getEditedState(); @@ -6764,6 +6770,7 @@ void Locallab::localcontMethodChanged() residcomp->hide(); sigma->hide(); offset->hide(); + threswav->hide(); chromalev->hide(); chromablu->hide(); fatdet->hide(); @@ -6796,6 +6803,7 @@ void Locallab::localcontMethodChanged() residcomp->show(); sigma->show(); offset->show(); + threswav->show(); chromalev->show(); chromablu->show(); fatdet->show(); @@ -8967,6 +8975,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residcomp->setDefault(defSpot->residcomp); sigma->setDefault(defSpot->sigma); offset->setDefault(defSpot->offset); + threswav->setDefault(defSpot->threswav); chromalev->setDefault(defSpot->chromalev); chromablu->setDefault(defSpot->chromablu); fatdet->setDefault(defSpot->fatdet); @@ -9210,6 +9219,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residcomp->setDefaultEditedState(Irrelevant); sigma->setDefaultEditedState(Irrelevant); offset->setDefaultEditedState(Irrelevant); + threswav->setDefaultEditedState(Irrelevant); chromalev->setDefaultEditedState(Irrelevant); chromablu->setDefaultEditedState(Irrelevant); fatdet->setDefaultEditedState(Irrelevant); @@ -9458,6 +9468,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c residcomp->setDefaultEditedState(defSpotState->residcomp ? Edited : UnEdited); sigma->setDefaultEditedState(defSpotState->sigma ? Edited : UnEdited); offset->setDefaultEditedState(defSpotState->offset ? Edited : UnEdited); + threswav->setDefaultEditedState(defSpotState->threswav ? Edited : UnEdited); chromalev->setDefaultEditedState(defSpotState->chromalev ? Edited : UnEdited); chromablu->setDefaultEditedState(defSpotState->chromablu ? Edited : UnEdited); fatdet->setDefaultEditedState(defSpotState->fatdet ? Edited : UnEdited); @@ -10649,6 +10660,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == threswav) { + if (listener) { + listener->panelChanged(Evlocallabthreswav, threswav->getTextValue()); + } + } + if (a == chromalev) { if (listener) { listener->panelChanged(Evlocallabchromalev, chromalev->getTextValue()); @@ -11172,6 +11189,7 @@ void Locallab::setBatchMode(bool batchMode) residcomp->showEditedCB(); sigma->showEditedCB(); offset->showEditedCB(); + threswav->showEditedCB(); chromalev->showEditedCB(); chromablu->showEditedCB(); fatdet->showEditedCB(); @@ -12246,6 +12264,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con residcomp->setValue(pp->locallab.spots.at(index).residcomp); sigma->setValue(pp->locallab.spots.at(index).sigma); offset->setValue(pp->locallab.spots.at(index).offset); + threswav->setValue(pp->locallab.spots.at(index).threswav); chromalev->setValue(pp->locallab.spots.at(index).chromalev); chromablu->setValue(pp->locallab.spots.at(index).chromablu); fatdet->setValue(pp->locallab.spots.at(index).fatdet); @@ -12768,6 +12787,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con residcomp->setEditedState(spotState->residcomp ? Edited : UnEdited); sigma->setEditedState(spotState->sigma ? Edited : UnEdited); offset->setEditedState(spotState->offset ? Edited : UnEdited); + threswav->setEditedState(spotState->threswav ? Edited : UnEdited); chromalev->setEditedState(spotState->chromalev ? Edited : UnEdited); chromablu->setEditedState(spotState->chromablu ? Edited : UnEdited); fatdet->setEditedState(spotState->fatdet ? Edited : UnEdited); @@ -13300,6 +13320,7 @@ void Locallab::updateSpecificGUIState() residcomp->hide(); sigma->hide(); offset->hide(); + threswav->hide(); chromalev->hide(); chromablu->hide(); fatdet->hide(); @@ -13330,6 +13351,7 @@ void Locallab::updateSpecificGUIState() levelblur->show(); sigma->show(); offset->show(); + threswav->show(); chromalev->show(); chromablu->show(); fatdet->show(); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 4714f27a2..2f76f76c1 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -374,6 +374,7 @@ private: Adjuster* const residcomp; Adjuster* const sigma; Adjuster* const offset; + Adjuster* const threswav; Adjuster* const chromalev; Adjuster* const chromablu; Adjuster* const fatdet; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 4f1a6fa71..4a575ba66 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1265,6 +1265,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).residcomp = locallab.spots.at(j).residcomp && pSpot.residcomp == otherSpot.residcomp; locallab.spots.at(j).sigma = locallab.spots.at(j).sigma && pSpot.sigma == otherSpot.sigma; locallab.spots.at(j).offset = locallab.spots.at(j).offset && pSpot.offset == otherSpot.offset; + locallab.spots.at(j).threswav = locallab.spots.at(j).threswav && pSpot.threswav == otherSpot.threswav; locallab.spots.at(j).chromalev = locallab.spots.at(j).chromalev && pSpot.chromalev == otherSpot.chromalev; locallab.spots.at(j).chromablu = locallab.spots.at(j).chromablu && pSpot.chromablu == otherSpot.chromablu; locallab.spots.at(j).fatdet = locallab.spots.at(j).fatdet && pSpot.fatdet == otherSpot.fatdet; @@ -4043,6 +4044,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).offset = mods.locallab.spots.at(i).offset; } + if (locallab.spots.at(i).threswav) { + toEdit.locallab.spots.at(i).threswav = mods.locallab.spots.at(i).threswav; + } + if (locallab.spots.at(i).chromalev) { toEdit.locallab.spots.at(i).chromalev = mods.locallab.spots.at(i).chromalev; } @@ -5644,6 +5649,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : residcomp(v), sigma(v), offset(v), + threswav(v), chromalev(v), chromablu(v), fatdet(v), @@ -6048,6 +6054,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) residcomp = v; sigma = v; offset = v; + threswav = v; chromalev = v; chromablu = v; fatdet = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 957571d79..9d0197884 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -698,6 +698,7 @@ public: bool residcomp; bool sigma; bool offset; + bool threswav; bool chromalev; bool chromablu; bool fatdet;