diff --git a/rtdata/languages/default b/rtdata/languages/default index 96582515d..d6a4f86ad 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1020,6 +1020,7 @@ HISTORY_MSG_779;Local - Color Mask local contrast curve HISTORY_MSG_780;Local - Color Mask Wavelet level HISTORY_MSG_781;Local - Local contrast Wavelet level HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +HISTORY_MSG_783;Local - Color Mask Wavelet levels HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 058f5d30e..3bf053e40 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -193,7 +193,7 @@ public: const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, LUTf & lmasklocalcurve, bool & localmaskutili, - const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int wavlevel + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr ); void discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t); void rex_poisson_dct(float * data, size_t nx, size_t ny, double m); @@ -255,7 +255,7 @@ public: void BlurNoise_Local(LabImage* tmp1, LabImage * originalmask, float **bufchro, const float hueref, const float chromaref, const float lumaref, const local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy, int sk); 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 wavcontrast(float ** tmp, float contrast, int bfw, int bfh, int wavelet_level, int sk, bool numThreads, const LocwavCurve & locwavCurve, bool & locwavutili, int & maxlvl); + void wavcontrast4(float ** tmp, float contrast, 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, int & maxlvl); void transit_shapedetect_retinex(int call, int senstype, LabImage * bufexporig, LabImage * bufmask, LabImage * buforigmas, float **buflight, float **bufchro, const float hueref, const float chromaref, const float lumaref, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 37da58669..b5bf834b0 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2845,7 +2845,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, LUTf & lmasklocalcurve, bool & localmaskutili, - const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int wavlevel + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr ) { array2D ble(bfw, bfh); @@ -2984,7 +2984,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } - int wavelet_level = wavlevel; + int wavelet_level = level_br; int minwin = min(bfw, bfh); int maxlevelspot = 9; @@ -3013,8 +3013,8 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int const int numThreads = 1; #endif + wavcontrast4(bufmaskblurcol->L, contrast, bfw, bfh, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, maxlvl); - wavcontrast(bufmaskblurcol->L, contrast, bfw, bfh, wavelet_level, sk, numThreads, loclmasCurvecolwav, lmasutilicolwav, maxlvl); } @@ -5450,122 +5450,6 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, int bfw, int bf } -void ImProcFunctions::wavcontrast(float ** tmp, float contrast, int bfw, int bfh, int wavelet_level, int sk, bool numThreads, const LocwavCurve & locwavCurve, bool & locwavutili, int & maxlvl) -{ - wavelet_decomposition *wdspot = new wavelet_decomposition(tmp[0], bfw, bfh, wavelet_level, 1, sk, numThreads, 6); - - if (wdspot->memoryAllocationFailed) { - return; - } - - maxlvl = wdspot->maxlevel(); - - if (contrast != 0) { - int W_L = wdspot->level_W(0); - int H_L = wdspot->level_H(0); - float *wav_L0 = wdspot->coeff0; - - double avedbl = 0.0; // use double precision for large summations - -#ifdef _OPENMP - #pragma omp parallel for reduction(+:avedbl) if (multiThread) -#endif - - for (int i = 0; i < W_L * H_L; i++) { - avedbl += wav_L0[i]; - } - - float ave = avedbl / double(W_L * H_L); - - float avg = ave / 32768.f; - avg = LIM01(avg); - double contreal = 0.6 * contrast; - DiagonalCurve resid_contrast({ - DCT_NURBS, - 0, 0, - avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), - avg + (1. - avg) * (0.6 - contreal / 250.0), avg + (1. - avg) * (0.6 + contreal / 250.0), - 1, 1 - }); -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - - for (int i = 0; i < W_L * H_L; i++) { - float buf = LIM01(wav_L0[i] / 32768.f); - buf = resid_contrast.getVal(buf); - buf *= 32768.f; - wav_L0[i] = buf; - } - - } - - - 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); - - if (locwavCurve && locwavutili) { - for (int dir = 1; dir < 4; dir++) { - for (int level = 0; level < maxlvl; ++level) { - int W_L = wdspot->level_W(level); - int H_L = wdspot->level_H(level); - float **wav_L = wdspot->level_coeffs(level); - - if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { - float insigma = 0.666f; //SD - float logmax = log(MaxP[level]); //log Max - float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max - float inx = log(insigma); - float iny = log(rapX); - float rap = inx / iny; //koef - float asig = 0.166f / sigma[level]; - float bsig = 0.5f - asig * mean[level]; - float amean = 0.5f / mean[level]; - -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - - for (int i = 0; i < W_L * H_L; i++) { - if (locwavCurve && locwavutili) { - float absciss; - float &val = wav_L[dir][i]; - - if (fabsf(val) >= (mean[level] + sigma[level])) { //for max - float valcour = xlogf(fabsf(val)); - float valc = valcour - logmax; - float vald = valc * rap; - absciss = xexpf(vald); - } else if (fabsf(val) >= mean[level]) { - absciss = asig * fabsf(val) + bsig; - } else { - absciss = amean * fabsf(val); - } - - float kc = locwavCurve[absciss * 500.f] - 0.5f; - float reduceeffect = kc <= 0.f ? 1.f : 1.5f; - - float kinterm = 1.f + reduceeffect * kc; - kinterm = kinterm <= 0.f ? 0.01f : kinterm; - - val *= kinterm; - } - } - } - } - } - } - - wdspot->reconstruct(tmp[0], 1.f); - delete wdspot; -} - - void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_numblox_W, float **tmp1, array2D *Lin, int numThreads, const struct local_params & lp, int chrom) { BENCHFUN @@ -7900,7 +7784,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool lmasutilicolwav = false; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, inv, lp, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 1, 1, 5, 5); if (lp.showmaskcbmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); @@ -8179,7 +8063,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5); if (lp.showmasktmmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); @@ -8204,7 +8088,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5); if (lp.showmasktmmet == 3) {//dispaly mask showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); @@ -8373,7 +8257,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigSH.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5); if (lp.showmaskSHmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); @@ -8470,7 +8354,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskSH.get(), original, inv, lp, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5); if (lp.showmaskSHmetinv == 1) { @@ -8987,7 +8871,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int level_br = params->locallab.spots.at(sp).csthreshold.getBottomRight(); int level_hr = params->locallab.spots.at(sp).csthreshold.getTopRight(); - // wavcontrast(tmp1->L, contrast, tmp1->W, tmp1->H, wavelet_level, sk, numThreads, locwavCurve, locwavutili, maxlvl); wavcontrast4(tmp1->L, contrast, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, maxlvl); const float satur = params->locallab.spots.at(sp).residchro; @@ -10443,7 +10326,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5); if (lp.showmaskexpmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); @@ -10710,7 +10593,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5); if (lp.showmaskexpmetinv == 1) { showmask(lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); @@ -10947,11 +10830,17 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacol; float lap = params->locallab.spots.at(sp).lapmaskcol; float pde = params->locallab.spots.at(sp).laplac; - int wavlevel = params->locallab.spots.at(sp).wavmaskcol; +// int wavlevel = params->locallab.spots.at(sp).wavmaskcol; + + int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); + int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); + int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); + int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, wavlevel); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + level_bl, level_hl, level_br, level_hr); if (lp.showmaskcolmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); @@ -11151,11 +11040,16 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacol; float lap = params->locallab.spots.at(sp).lapmaskcol; float pde = params->locallab.spots.at(sp).laplac; - int wavlevel = params->locallab.spots.at(sp).wavmaskcol; +// int wavlevel = params->locallab.spots.at(sp).wavmaskcol; + int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); + int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); + int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); + int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, wavlevel); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + level_bl, level_hl, level_br, level_hr); if (lp.showmaskcolmetinv == 1) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 40f3f7c6e..6462f754b 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -809,6 +809,7 @@ enum ProcEventCode { Evlocallabwavmaskcol = 779, EvlocallabcsThreshold = 780, EvlocallabcsThresholdblur = 781, + EvlocallabcsThresholdcol = 782, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index a9b07bbc8..d9ed7c48d 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2468,6 +2468,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : softradiuscol(0.0), Lmaskcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, LLmaskcolcurvewav{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, + csthresholdcol(1, 1, 6, 5, false), // Exposure expexpose(false), expcomp(0.0), @@ -2572,7 +2573,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : wavmaskbl(5), Lmaskblcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, LLmaskblcurvewav{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, - csthresholdblur(1, 1, 5, 5, false), + csthresholdblur(1, 1, 6, 5, false), // Tone Mapping exptonemap(false), stren(0.5), @@ -2763,6 +2764,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && softradiuscol == other.softradiuscol && Lmaskcurve == other.Lmaskcurve && LLmaskcolcurvewav == other.LLmaskcolcurvewav + && csthresholdcol == other.csthresholdcol // Exposure && expexpose == other.expexpose && expcomp == other.expcomp @@ -2867,7 +2869,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && wavmaskbl == other.wavmaskbl && Lmaskblcurve == other.Lmaskblcurve && LLmaskblcurvewav == other.LLmaskblcurvewav - && csthresholdblur == other.csthresholdblur + && csthresholdblur == other.csthresholdblur // Tone Mapping && exptonemap == other.exptonemap && stren == other.stren @@ -4044,6 +4046,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).softradiuscol, "Locallab", "Softradiuscol_" + std::to_string(i), spot.softradiuscol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).Lmaskcurve, "Locallab", "LmaskCurve_" + std::to_string(i), spot.Lmaskcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmaskcolcurvewav, "Locallab", "LLmaskcolCurvewav_" + std::to_string(i), spot.LLmaskcolcurvewav, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).csthresholdcol, "Locallab", "CSThresholdcol_" + std::to_string(i), spot.csthresholdcol.toVector(), keyFile); // Exposure saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expexpose, "Locallab", "Expexpose_" + std::to_string(i), spot.expexpose, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expcomp, "Locallab", "Expcomp_" + std::to_string(i), spot.expcomp, keyFile); @@ -5440,6 +5443,18 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Softradiuscol_" + std::to_string(i), pedited, spot.softradiuscol, spotEdited.softradiuscol); assignFromKeyfile(keyFile, "Locallab", "LmaskCurve_" + std::to_string(i), pedited, spot.Lmaskcurve, spotEdited.Lmaskcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskcolCurvewav_" + std::to_string(i), pedited, spot.LLmaskcolcurvewav, spotEdited.LLmaskcolcurvewav); + if (keyFile.has_key("Locallab", "CSThresholdcol_" + std::to_string(i))) { + + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThresholdcol_" + std::to_string(i)); + + if (thresh.size() >= 4) { + spot.csthresholdcol.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + if (pedited) { + spotEdited.csthresholdcol = true; + } + } // Exposure assignFromKeyfile(keyFile, "Locallab", "Expexpose_" + std::to_string(i), pedited, spot.expexpose, spotEdited.expexpose); assignFromKeyfile(keyFile, "Locallab", "Expcomp_" + std::to_string(i), pedited, spot.expcomp, spotEdited.expcomp); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 1d4fa4609..213f3ccb5 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1015,6 +1015,7 @@ struct LocallabParams { double softradiuscol; std::vector Lmaskcurve; std::vector LLmaskcolcurvewav; + Threshold csthresholdcol; // Exposure bool expexpose; // int expcomp; @@ -1022,7 +1023,6 @@ struct LocallabParams { int hlcompr; int hlcomprthresh; int black; - int shadex; int shcompr; int expchroma; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index f8a233a1c..56833d8e5 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -808,7 +808,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabLLmaskcolshapewav LUMINANCECURVE, //Evlocallabwavmaskcol LUMINANCECURVE, //EvlocallabcsThreshold - LUMINANCECURVE //EvlocallabcsThresholdblur + LUMINANCECURVE, //EvlocallabcsThresholdblur + LUMINANCECURVE //EvlocallabcsThresholdcol }; namespace rtengine diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 64f42bedc..4a29f5996 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -400,6 +400,7 @@ Locallab::Locallab(): gridMethod(Gtk::manage(new MyComboBoxText())), showmaskcolMethod(Gtk::manage(new MyComboBoxText())), showmaskcolMethodinv(Gtk::manage(new MyComboBoxText())), + csThresholdcol(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 1, 9, 1, 1, 6, 5, 0, false))), //Exposure showmaskexpMethod(Gtk::manage(new MyComboBoxText())), showmaskexpMethodinv(Gtk::manage(new MyComboBoxText())), @@ -417,7 +418,7 @@ Locallab::Locallab(): blMethod(Gtk::manage(new MyComboBoxText())), medMethod(Gtk::manage(new MyComboBoxText())), showmaskblMethod(Gtk::manage(new MyComboBoxText())), - csThresholdblur(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 1, 9, 1, 1, 5, 5, 0, false))), + csThresholdblur(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 1, 9, 1, 1, 6, 5, 0, false))), //TM showmasktmMethod(Gtk::manage(new MyComboBoxText())), // Retinex @@ -709,6 +710,7 @@ Locallab::Locallab(): mask2CurveEditorGwav->curveListComplete(); + csThresholdcol->setAdjusterListener(this); labgrid = Gtk::manage(new LabGrid(EvLocallabLabGridValue, M("TP_LOCALLAB_LABGRID_VALUES"))); @@ -755,7 +757,8 @@ Locallab::Locallab(): maskcolBox->pack_start(*slomaskcol, Gtk::PACK_SHRINK, 0); maskcolBox->pack_start(*mask2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor maskcolBox->pack_start(*mask2CurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor - maskcolBox->pack_start(*wavmaskcol, Gtk::PACK_SHRINK, 0); +// maskcolBox->pack_start(*wavmaskcol, Gtk::PACK_SHRINK, 0); + maskcolBox->pack_start(*csThresholdcol, Gtk::PACK_SHRINK, 0); expmaskcol->add(*maskcolBox, false); colorBox->pack_start(*expmaskcol); @@ -3310,6 +3313,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).softradiuscol = softradiuscol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = Lmaskshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = LLmaskcolshapewav->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).csthresholdcol = csThresholdcol->getValue(); // Exposure pp->locallab.spots.at(pp->locallab.selspot).expexpose = expexpose->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).expcomp = expcomp->getValue(); @@ -3674,6 +3678,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).softradiuscol = pe->locallab.spots.at(pp->locallab.selspot).softradiuscol || softradiuscol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = pe->locallab.spots.at(pp->locallab.selspot).Lmaskcurve || !Lmaskshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = pe->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav || !LLmaskcolshapewav->isUnChanged(); + pe->locallab.spots.at(pp->locallab.selspot).csthresholdcol = pe->locallab.spots.at(pp->locallab.selspot).csthresholdcol || csThresholdcol->getEditedState(); // Exposure pe->locallab.spots.at(pp->locallab.selspot).expexpose = pe->locallab.spots.at(pp->locallab.selspot).expexpose || !expexpose->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).expcomp = pe->locallab.spots.at(pp->locallab.selspot).expcomp || expcomp->getEditedState(); @@ -3973,6 +3978,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).softradiuscol = pedited->locallab.spots.at(pp->locallab.selspot).softradiuscol || softradiuscol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcurve || !Lmaskshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav || !LLmaskcolshapewav->isUnChanged(); + pedited->locallab.spots.at(pp->locallab.selspot).csthresholdcol = pedited->locallab.spots.at(pp->locallab.selspot).csthresholdcol || csThresholdcol->getEditedState(); // Exposure pedited->locallab.spots.at(pp->locallab.selspot).expexpose = pedited->locallab.spots.at(pp->locallab.selspot).expexpose || !expexpose->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).expcomp = pedited->locallab.spots.at(pp->locallab.selspot).expcomp || expcomp->getEditedState(); @@ -5946,6 +5952,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe wavmaskcol->setDefault(defSpot->wavmaskcol); lapmaskcol->setDefault(defSpot->lapmaskcol); softradiuscol->setDefault(defSpot->softradiuscol); + csThresholdcol->setDefault(defSpot->csthresholdcol); // Exposure expcomp->setDefault(defSpot->expcomp); hlcompr->setDefault((double)defSpot->hlcompr); @@ -6126,6 +6133,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe wavmaskcol->setDefaultEditedState(Irrelevant); lapmaskcol->setDefaultEditedState(Irrelevant); softradiuscol->setDefaultEditedState(Irrelevant); + csThresholdcol->setDefaultEditedState(Irrelevant); // Exposure expcomp->setDefaultEditedState(Irrelevant); hlcompr->setDefaultEditedState(Irrelevant); @@ -6310,6 +6318,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe wavmaskcol->setDefaultEditedState(defSpotState->wavmaskcol ? Edited : UnEdited); lapmaskcol->setDefaultEditedState(defSpotState->lapmaskcol ? Edited : UnEdited); softradiuscol->setDefaultEditedState(defSpotState->softradiuscol ? Edited : UnEdited); + csThresholdcol->setDefaultEditedState(defSpotState->csthresholdcol ? Edited : UnEdited); // Exposure expcomp->setDefaultEditedState(defSpotState->expcomp ? Edited : UnEdited); hlcompr->setDefaultEditedState(defSpotState->hlcompr ? Edited : UnEdited); @@ -6507,6 +6516,12 @@ void Locallab::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTop } } + if (getEnabled() && expcolor->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabcsThresholdcol, csThresholdcol->getHistoryString()); + } + } + } void Locallab::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) @@ -7605,6 +7620,7 @@ void Locallab::setBatchMode(bool batchMode) wavmaskcol->showEditedCB(); lapmaskcol->showEditedCB(); softradiuscol->showEditedCB(); + csThresholdcol->showEditedCB(); // Exposure expcomp->showEditedCB(); hlcompr->showEditedCB(); @@ -8145,6 +8161,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con softradiuscol->setValue(pp->locallab.spots.at(index).softradiuscol); Lmaskshape->setCurve(pp->locallab.spots.at(index).Lmaskcurve); LLmaskcolshapewav->setCurve(pp->locallab.spots.at(index).LLmaskcolcurvewav); + csThresholdcol->setValue(pp->locallab.spots.at(index).csthresholdcol); // Exposure expexpose->setEnabled(pp->locallab.spots.at(index).expexpose); @@ -8533,6 +8550,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con softradiuscol->setEditedState(spotState->softradiuscol ? Edited : UnEdited); Lmaskshape->setUnChanged(!spotState->Lmaskcurve); LLmaskcolshapewav->setUnChanged(!spotState->LLmaskcolcurvewav); + csThresholdcol->setEditedState(spotState->csthresholdcol ? Edited : UnEdited); // Exposure expexpose->set_inconsistent(!spotState->expexpose); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index e6e13904c..417a816e9 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -389,6 +389,7 @@ private: sigc::connection showmaskcolMethodConn; MyComboBoxText* const showmaskcolMethodinv; sigc::connection showmaskcolMethodConninv; + ThresholdAdjuster* const csThresholdcol; //Exposure MyComboBoxText* const showmaskexpMethod; sigc::connection showmaskexpMethodConn; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 862004674..828ab9420 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1009,6 +1009,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).softradiuscol = locallab.spots.at(j).softradiuscol && pSpot.softradiuscol == otherSpot.softradiuscol; locallab.spots.at(j).Lmaskcurve = locallab.spots.at(j).Lmaskcurve && pSpot.Lmaskcurve == otherSpot.Lmaskcurve; locallab.spots.at(j).LLmaskcolcurvewav = locallab.spots.at(j).LLmaskcolcurvewav && pSpot.LLmaskcolcurvewav == otherSpot.LLmaskcolcurvewav; + locallab.spots.at(j).csthresholdcol = locallab.spots.at(j).csthresholdcol && pSpot.csthresholdcol == otherSpot.csthresholdcol; // Exposure locallab.spots.at(j).expexpose = locallab.spots.at(j).expexpose && pSpot.expexpose == otherSpot.expexpose; locallab.spots.at(j).expcomp = locallab.spots.at(j).expcomp && pSpot.expcomp == otherSpot.expcomp; @@ -2937,6 +2938,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).LLmaskcolcurvewav = mods.locallab.spots.at(i).LLmaskcolcurvewav; } + if (locallab.spots.at(i).csthresholdcol) { + toEdit.locallab.spots.at(i).csthresholdcol = mods.locallab.spots.at(i).csthresholdcol; + } + // Exposure if (locallab.spots.at(i).expexpose) { toEdit.locallab.spots.at(i).expexpose = mods.locallab.spots.at(i).expexpose; @@ -4841,6 +4846,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : softradiuscol(v), Lmaskcurve(v), LLmaskcolcurvewav(v), + csthresholdcol(v), // Exposure expexpose(v), expcomp(v), @@ -5133,6 +5139,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) softradiuscol = v; Lmaskcurve = v; LLmaskcolcurvewav = v; + csthresholdcol = v; // Exposure expexpose = v; expcomp = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 5cc35ff67..b51f7162d 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -427,6 +427,7 @@ public: bool softradiuscol; bool Lmaskcurve; bool LLmaskcolcurvewav; + bool csthresholdcol; // Exposure bool expexpose; bool expcomp;