diff --git a/rtdata/languages/default b/rtdata/languages/default index f440d29cc..79b3eed4a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1022,6 +1022,7 @@ 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_784;Local - Mask DeltaE +HISTORY_MSG_785;Local - Mask Scope DeltaE HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2126,6 +2127,9 @@ TP_LOCALLAB_GAMMASKCOL;Gamma mask TP_LOCALLAB_SLOMASKCOL;Slope mask TP_LOCALLAB_SHAMASKCOL;Shadows mask TP_LOCALLAB_LAPMASKCOL;Laplacian threshold mask +TP_LOCALLAB_SCOPEMASK;Scope Mask DeltaE Image +TP_LOCALLAB_MASFRAME;Mask +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and contrast curves and levels contrasts curves are used TP_LOCALLAB_WAMASKCOL;Mask Wavelet level TP_LOCALLAB_CSTHRESHOLDBLUR;Mask Wavelet level TP_LOCALLAB_LAPLACC;Mask Laplacian solve PDE diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 3bf053e40..08eb85945 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -193,8 +193,12 @@ 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 level_bl, int level_hl, int level_br, int level_hr -); + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, + bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope); + + void deltaEforMask(float **rdE, int bfw, int bfh, LabImage* bufcolorig, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope); 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); void mean_dt(const float * data, size_t size, double * mean_p, double * dt_p); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 91cb51674..16a96b3df 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2359,6 +2359,54 @@ static void blendmask(const local_params& lp, int xstart, int ystart, int cx, in } } +void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* bufcolorig, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope) +{ + const float refa = chromaref * cos(hueref); + const float refb = chromaref * sin(hueref); + const float refL = lumaref; + + float reducdE = 1.f; +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + float tempdE = sqrt((SQR(refa - bufcolorig->a[y][x] / 327.68f) + SQR(refb - bufcolorig->b[y][x] / 327.68f)) + SQR(refL - bufcolorig->L[y][x] / 327.68f)); + + if (tempdE > maxdE) { + reducdE = 0.f; + } else if (tempdE > mindE && tempdE <= maxdE) { + const float ar = 1.f / (mindE - maxdE); + const float br = - ar * maxdE; + reducdE = pow(ar * tempdE + br, iterat); + } else { + reducdE = 1.f; + } + + if (scope > limscope) { + if (tempdE > maxdElim) { + reducdE = 0.f; + } else if (tempdE > mindElim && tempdE <= maxdElim) { + const float arlim = 1.f / (mindElim - maxdElim); + const float brlim = - arlim * maxdElim; + const float reducdElim = pow(arlim * tempdE + brlim, iterat); + const float aalim = (1.f - reducdElim) / 20.f; + const float bblim = 1.f - 100.f * aalim; + reducdE = aalim * scope + bblim; + } else { + reducdE = 1.f; + } + } + +// if(scope == 100) reducdE = 1.f; + rdE[y][x] = reducdE ; + } + } +} + + static void deltaEforLaplace(float *dE, const local_params& lp, int bfw, int bfh, LabImage* bufexporig, const float hueref, const float chromaref, const float lumaref) { @@ -2845,7 +2893,9 @@ 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 level_bl, int level_hl, int level_br, int level_hr + const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, + bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope ) { array2D ble(bfw, bfh); @@ -2953,6 +3003,9 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } } + std::unique_ptr bufprov(new LabImage(bfw, bfh)); + + bufprov->CopyFrom(bufmaskblurcol); if (rad > 0.f) { guidedFilter(guid, ble, ble, rad * 10.f / sk, 0.001, multiThread, 4); @@ -3017,6 +3070,35 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } + if (delt) { + float *rdE[bfh] ALIGNED16; + float *rdEBuffer = new float[bfh * bfw]; + + for (int i = 0; i < bfh; i++) { + rdE[i] = &rdEBuffer[i * bfw]; + } + + deltaEforMask(rdE, bfw, bfh, bufcolorig, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope); + // printf("rde1=%f rde2=%f\n", rdE[1][1], rdE[100][100]); + std::unique_ptr delta(new LabImage(bfw, bfh)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + delta->L[ir][jr] = bufmaskblurcol->L[ir][jr] - bufprov->L[ir][jr]; + delta->a[ir][jr] = bufmaskblurcol->a[ir][jr] - bufprov->a[ir][jr]; + delta->b[ir][jr] = bufmaskblurcol->b[ir][jr] - bufprov->b[ir][jr]; + + bufmaskblurcol->L[ir][jr] = bufprov->L[ir][jr] + rdE[ir][jr] * delta->L[ir][jr]; + bufmaskblurcol->a[ir][jr] = bufprov->a[ir][jr] + rdE[ir][jr] * delta->a[ir][jr]; + bufmaskblurcol->b[ir][jr] = bufprov->b[ir][jr] + rdE[ir][jr] * delta->b[ir][jr]; + } + + delete [] rdEBuffer; + + } if (lap > 0.f) { float *datain = new float[bfh * bfw]; @@ -5359,8 +5441,8 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, int bfw, int bf float blow = 0.f; if (level_hl != level_bl) { - // alow = 0.5f / (level_hl - level_bl);//to test with 0.5 - // blow = 0.5f -alow * level_bl; + // alow = 0.5f / (level_hl - level_bl);//to test with 0.5 + // blow = 0.5f -alow * level_bl; alow = 1.f / (level_hl - level_bl); blow = -alow * level_bl; } @@ -5369,8 +5451,8 @@ void ImProcFunctions::wavcontrast4(float ** tmp, float contrast, int bfw, int bf float bhigh = 0.f; if (level_hr != level_br) { - // ahigh = 0.5f / (level_hr - level_br);//to test with 0.5 - // bhigh = 0.5f -ahigh * level_br; + // ahigh = 0.5f / (level_hr - level_br);//to test with 0.5 + // bhigh = 0.5f -ahigh * level_br; ahigh = 1.f / (level_hr - level_br); bhigh = -ahigh * level_br; } @@ -7056,6 +7138,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o std::unique_ptr bufmaskorigbl; std::unique_ptr bufmaskblurbl; std::unique_ptr bufgb; + std::unique_ptr bufprov; if (denoiz || blurz || lp.denoiena || lp.blurena) { bufgb.reset(new LabImage(GW, GH)); @@ -7063,6 +7146,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { bufmaskorigbl.reset(new LabImage(GW, GH)); bufmaskblurbl.reset(new LabImage(GW, GH)); + bufprov.reset(new LabImage(GW, GH)); originalmaskbl = new LabImage(GW, GH); } @@ -7135,10 +7219,13 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o guid[ir][jr] = Y / 32768.f; - + bufprov->L[ir][jr] = bufmaskblurbl->L[ir][jr]; + bufprov->a[ir][jr] = bufmaskblurbl->a[ir][jr]; + bufprov->b[ir][jr] = bufmaskblurbl->b[ir][jr]; } } + if (lp.radmabl > 0.f) { guidedFilter(guid, ble, ble, lp.radmabl * 10.f / sk, 0.001, multiThread, 4); } @@ -7210,6 +7297,47 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o wavcontrast4(bufmaskblurbl->L, contrast, GW, GH, level_bl, level_hl, level_br, level_hr, sk, numThreads, loclmasCurveblwav, lmasutiliblwav, maxlvl); } +// deltae Mask with scope + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + + if (delt) { + float *rdE[GH] ALIGNED16; + float *rdEBuffer = new float[GH * GW]; + + for (int i = 0; i < GH; i++) { + rdE[i] = &rdEBuffer[i * GW]; + } + + deltaEforMask(rdE, GW, GH, bufgb.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco); + // printf("rde1=%f rde2=%f\n", rdE[1][1], rdE[100][100]); + std::unique_ptr delta(new LabImage(GW, GH)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + delta->L[ir][jr] = bufmaskblurbl->L[ir][jr] - bufprov->L[ir][jr]; + delta->a[ir][jr] = bufmaskblurbl->a[ir][jr] - bufprov->a[ir][jr]; + delta->b[ir][jr] = bufmaskblurbl->b[ir][jr] - bufprov->b[ir][jr]; + + bufmaskblurbl->L[ir][jr] = bufprov->L[ir][jr] + rdE[ir][jr] * delta->L[ir][jr]; + bufmaskblurbl->a[ir][jr] = bufprov->a[ir][jr] + rdE[ir][jr] * delta->a[ir][jr]; + bufmaskblurbl->b[ir][jr] = bufprov->b[ir][jr] + rdE[ir][jr] * delta->b[ir][jr]; + } + + delete [] rdEBuffer; + + } + + +// float lap = params->locallab.spots.at(sp).lapmaskbl; bool pde = params->locallab.spots.at(sp).laplac; @@ -7781,10 +7909,22 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float lap = params->locallab.spots.at(sp).lapmaskcb; float pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, 1, 1, 5, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmaskcbmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); @@ -8060,10 +8200,21 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (!params->locallab.spots.at(sp).enatmMaskaft) { LocwavCurve dummy; bool lmasutilicolwav = false; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, 1, 1, 5, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmasktmmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); @@ -8085,10 +8236,21 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o //calculate new values for original, originalmasktm, bufmaskorigtm...in function of tmp1 LocwavCurve dummy; bool lmasutilicolwav = false; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, 1, 1, 5, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmasktmmet == 3) {//dispaly mask showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); @@ -8254,10 +8416,21 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, 1, 1, 5, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmaskSHmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); @@ -8351,10 +8524,21 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, 1, 1, 5, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmaskSHmetinv == 1) { @@ -10323,10 +10507,21 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, 1, 1, 5, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmaskexpmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); @@ -10590,10 +10785,21 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; LocwavCurve dummy; bool lmasutilicolwav = false; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, 1, 1, 5, 5); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmaskexpmetinv == 1) { showmask(lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); @@ -10831,16 +11037,26 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float lap = params->locallab.spots.at(sp).lapmaskcol; float pde = params->locallab.spots.at(sp).laplac; // int wavlevel = params->locallab.spots.at(sp).shadmaskcol; - + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; 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(); + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + 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, - level_bl, level_hl, level_br, level_hr); + level_bl, level_hl, level_br, level_hr, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmaskcolmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); @@ -11045,11 +11261,22 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o 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(); + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + + const int limscope = 80; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); 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, - level_bl, level_hl, level_br, level_hr); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + level_bl, level_hl, level_br, level_hr, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco + ); if (lp.showmaskcolmetinv == 1) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index df60658dd..b9a278e2d 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -811,6 +811,7 @@ enum ProcEventCode { EvlocallabcsThresholdblur = 781, EvlocallabcsThresholdcol = 782, Evlocallabdeltae = 783, + EvLocallabSpotscopemask = 784, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ff355a689..4bceb2390 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2434,6 +2434,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : avoid(false), laplac(false), deltae(false), + scopemask(50), // Color & Light expcolor(false), curvactiv(false), @@ -2731,6 +2732,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && avoid == other.avoid && laplac == other.laplac && deltae == other.deltae + && scopemask == other.scopemask // Color & Light && expcolor == other.expcolor && curvactiv == other.curvactiv @@ -4014,6 +4016,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).avoid, "Locallab", "Avoid_" + std::to_string(i), spot.avoid, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).laplac, "Locallab", "Laplac_" + std::to_string(i), spot.laplac, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).deltae, "Locallab", "Deltae_" + std::to_string(i), spot.deltae, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).scopemask, "Locallab", "Scopemask_" + std::to_string(i), spot.scopemask, keyFile); // Color & Light saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expcolor, "Locallab", "Expcolor_" + std::to_string(i), spot.expcolor, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).curvactiv, "Locallab", "Curvactiv_" + std::to_string(i), spot.curvactiv, keyFile); @@ -5412,6 +5415,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Avoid_" + std::to_string(i), pedited, spot.avoid, spotEdited.avoid); assignFromKeyfile(keyFile, "Locallab", "Laplac_" + std::to_string(i), pedited, spot.laplac, spotEdited.laplac); assignFromKeyfile(keyFile, "Locallab", "Deltae_" + std::to_string(i), pedited, spot.deltae, spotEdited.deltae); + assignFromKeyfile(keyFile, "Locallab", "Scopemask_" + std::to_string(i), pedited, spot.scopemask, spotEdited.scopemask); // Color & Light assignFromKeyfile(keyFile, "Locallab", "Expcolor_" + std::to_string(i), pedited, spot.expcolor, spotEdited.expcolor); assignFromKeyfile(keyFile, "Locallab", "Curvactiv_" + std::to_string(i), pedited, spot.curvactiv, spotEdited.curvactiv); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index de82ab6f1..e3992dbaf 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -981,6 +981,7 @@ struct LocallabParams { bool avoid; bool laplac; bool deltae; + int scopemask; // Color & Light bool expcolor; bool curvactiv; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 7f8f92bf0..dbbcdf268 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -810,7 +810,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabcsThreshold LUMINANCECURVE, //EvlocallabcsThresholdblur LUMINANCECURVE, //EvlocallabcsThresholdcol - LUMINANCECURVE //Evlocallabdeltae + LUMINANCECURVE, //Evlocallabdeltae + LUMINANCECURVE //EvLocallabSpotscopemask }; namespace rtengine diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index fd7985efe..609415010 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -68,6 +68,7 @@ ControlSpotPanel::ControlSpotPanel(): balan_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALAN"), 0.2, 2.5, 0.1, 1.0, Gtk::manage(new RTImage("rawtherapee-logo-16.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), transitweak_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITWEAK"), 0.5, 10.0, 0.1, 1.0))), transitgrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITGRAD"), -1.0, 1.0, 0.01, 0.0))), + scopemask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCOPEMASK"), 0, 100, 1, 50))), avoid_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AVOID")))), laplac_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LAPLACC")))), @@ -245,9 +246,11 @@ ControlSpotPanel::ControlSpotPanel(): if(showtooltip) transit_->set_tooltip_text(M("TP_LOCALLAB_TRANSIT_TOOLTIP")); if(showtooltip) transitweak_->set_tooltip_text(M("TP_LOCALLAB_TRANSITWEAK_TOOLTIP")); if(showtooltip) transitgrad_->set_tooltip_text(M("TP_LOCALLAB_TRANSITGRAD_TOOLTIP")); + if(showtooltip) scopemask_->set_tooltip_text(M("TP_LOCALLAB_SCOPEMASK_TOOLTIP")); transit_->setAdjusterListener(this); transitweak_->setAdjusterListener(this); transitgrad_->setAdjusterListener(this); + scopemask_->setAdjusterListener(this); transitBox->pack_start(*transit_); transitBox->pack_start(*transitweak_); @@ -273,12 +276,21 @@ ControlSpotPanel::ControlSpotPanel(): avoidConn_ = avoid_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::avoidChanged)); pack_start(*avoid_); + + Gtk::Frame* const maskFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MASFRAME"))); + maskFrame->set_label_align(0.025, 0.5); + if(showtooltip) maskFrame->set_tooltip_text(M("TP_LOCALLAB_MASFRAME_TOOLTIP")); + ToolParamBlock* const maskBox = Gtk::manage(new ToolParamBlock()); + laplacConn_ = laplac_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::laplacChanged)); - pack_start(*laplac_); + maskBox->pack_start(*laplac_); deltaeConn_ = deltae_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::deltaeChanged)); -// pack_start(*deltae_); + maskBox->pack_start(*deltae_); + maskBox->pack_start(*scopemask_); + maskFrame->add(*maskBox); + pack_start(*maskFrame); show_all(); @@ -582,6 +594,7 @@ void ControlSpotPanel::load_ControlSpot_param() balan_->setValue((double)row[spots_.balan]); transitweak_->setValue((double)row[spots_.transitweak]); transitgrad_->setValue((double)row[spots_.transitgrad]); + scopemask_->setValue((double)row[spots_.scopemask]); avoid_->set_active(row[spots_.avoid]); laplac_->set_active(row[spots_.laplac]); deltae_->set_active(row[spots_.deltae]); @@ -1013,6 +1026,14 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } } + if (a == scopemask_) { + row[spots_.scopemask] = scopemask_->getIntValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotscopemask, scopemask_->getTextValue()); + } + } + } void ControlSpotPanel::avoidChanged() @@ -1151,6 +1172,7 @@ void ControlSpotPanel::disableParamlistener(bool cond) balan_->block(cond); transitweak_->block(cond); transitgrad_->block(cond); + scopemask_->block(cond); avoidConn_.block(cond); laplacConn_.block(cond); deltaeConn_.block(cond); @@ -1180,6 +1202,7 @@ void ControlSpotPanel::setParamEditable(bool cond) balan_->set_sensitive(cond); transitweak_->set_sensitive(cond); transitgrad_->set_sensitive(cond); + scopemask_->set_sensitive(cond); avoid_->set_sensitive(cond); laplac_->set_sensitive(cond); deltae_->set_sensitive(cond); @@ -1815,6 +1838,7 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int id) r->balan = row[spots_.balan]; r->transitweak = row[spots_.transitweak]; r->transitgrad = row[spots_.transitgrad]; + r->scopemask = row[spots_.scopemask]; r->avoid = row[spots_.avoid]; r->laplac = row[spots_.laplac]; r->deltae = row[spots_.deltae]; @@ -1943,6 +1967,7 @@ void ControlSpotPanel::addControlSpot(SpotRow* newSpot) row[spots_.balan] = newSpot->balan; row[spots_.transitweak] = newSpot->transitweak; row[spots_.transitgrad] = newSpot->transitgrad; + row[spots_.scopemask] = newSpot->scopemask; row[spots_.avoid] = newSpot->avoid; row[spots_.laplac] = newSpot->laplac; row[spots_.deltae] = newSpot->deltae; @@ -1990,6 +2015,7 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot) row[spots_.balan] = spot->balan; row[spots_.transitweak] = spot->transitweak; row[spots_.transitgrad] = spot->transitgrad; + row[spots_.scopemask] = spot->scopemask; row[spots_.avoid] = spot->avoid; row[spots_.laplac] = spot->laplac; row[spots_.deltae] = spot->deltae; @@ -2083,6 +2109,7 @@ ControlSpotPanel::SpotEdited* ControlSpotPanel::getEditedStates() se->balan = balan_->getEditedState(); se->transitweak = transitweak_->getEditedState(); se->transitgrad = transitgrad_->getEditedState(); + se->scopemask = scopemask_->getEditedState(); se->avoid = !avoid_->get_inconsistent(); se->laplac = !laplac_->get_inconsistent(); se->deltae = !deltae_->get_inconsistent(); @@ -2154,6 +2181,7 @@ void ControlSpotPanel::setEditedStates(SpotEdited* se) balan_->setEditedState(se->balan ? Edited : UnEdited); transitweak_->setEditedState(se->transitweak ? Edited : UnEdited); transitgrad_->setEditedState(se->transitgrad ? Edited : UnEdited); + scopemask_->setEditedState(se->scopemask ? Edited : UnEdited); avoid_->set_inconsistent(multiImage && !se->avoid); laplac_->set_inconsistent(multiImage && !se->laplac); deltae_->set_inconsistent(multiImage && !se->deltae); @@ -2201,6 +2229,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP balan_->setDefault(defSpot->balan); transitweak_->setDefault(defSpot->transitweak); transitgrad_->setDefault(defSpot->transitgrad); + scopemask_->setDefault(defSpot->scopemask); // Set default edited states for adjusters if (!pedited) { @@ -2220,6 +2249,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP balan_->setDefaultEditedState(Irrelevant); transitweak_->setDefaultEditedState(Irrelevant); transitgrad_->setDefaultEditedState(Irrelevant); + scopemask_->setDefaultEditedState(Irrelevant); } else { const LocallabParamsEdited::LocallabSpotEdited* defSpotState = new LocallabParamsEdited::LocallabSpotEdited(true); @@ -2243,6 +2273,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP balan_->setDefaultEditedState(defSpotState->balan ? Edited : UnEdited); transitweak_->setDefaultEditedState(defSpotState->transitweak ? Edited : UnEdited); transitgrad_->setDefaultEditedState(defSpotState->transitgrad ? Edited : UnEdited); + scopemask_->setDefaultEditedState(defSpotState->scopemask ? Edited : UnEdited); } } @@ -2267,6 +2298,7 @@ void ControlSpotPanel::setBatchMode(bool batchMode) balan_->showEditedCB(); transitweak_->showEditedCB(); transitgrad_->showEditedCB(); + scopemask_->showEditedCB(); // Set batch mode for comboBoxText shape_->append(M("GENERAL_UNCHANGED")); @@ -2306,6 +2338,7 @@ ControlSpotPanel::ControlSpots::ControlSpots() add(balan); add(transitweak); add(transitgrad); + add(scopemask); add(avoid); add(laplac); add(deltae); diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index 9c6124733..ee09e42e5 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -65,6 +65,7 @@ public: double balan; double transitweak; double transitgrad; + int scopemask; bool avoid; bool laplac; bool deltae; @@ -98,6 +99,7 @@ public: bool balan; bool transitweak; bool transitgrad; + bool scopemask; bool avoid; bool laplac; bool deltae; @@ -315,6 +317,7 @@ private: Gtk::TreeModelColumn balan; Gtk::TreeModelColumn transitweak; Gtk::TreeModelColumn transitgrad; + Gtk::TreeModelColumn scopemask; Gtk::TreeModelColumn avoid; Gtk::TreeModelColumn laplac; Gtk::TreeModelColumn deltae; @@ -381,6 +384,7 @@ private: Adjuster* const balan_; Adjuster* const transitweak_; Adjuster* const transitgrad_; + Adjuster* const scopemask_; Gtk::CheckButton* const avoid_; sigc::connection avoidConn_; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 7987659c6..62573f911 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -2804,6 +2804,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) r->balan = pp->locallab.spots.at(i).balan; r->transitweak = pp->locallab.spots.at(i).transitweak; r->transitgrad = pp->locallab.spots.at(i).transitgrad; + r->scopemask = pp->locallab.spots.at(i).scopemask; r->avoid = pp->locallab.spots.at(i).avoid; r->laplac = pp->locallab.spots.at(i).laplac; r->deltae = pp->locallab.spots.at(i).deltae; @@ -2933,6 +2934,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->balan = newSpot->balan; r->transitweak = newSpot->transitweak; r->transitgrad = newSpot->transitgrad; + r->scopemask = newSpot->scopemask; r->avoid = newSpot->avoid; r->laplac = newSpot->laplac; r->deltae = newSpot->deltae; @@ -3151,6 +3153,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->balan = newSpot->balan; r->transitweak = newSpot->transitweak; r->transitgrad = newSpot->transitgrad; + r->scopemask = newSpot->scopemask; r->avoid = newSpot->avoid; r->laplac = newSpot->laplac; r->deltae = newSpot->deltae; @@ -3267,6 +3270,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).balan = r->balan; pp->locallab.spots.at(pp->locallab.selspot).transitweak = r->transitweak; pp->locallab.spots.at(pp->locallab.selspot).transitgrad = r->transitgrad; + pp->locallab.spots.at(pp->locallab.selspot).scopemask = r->scopemask; pp->locallab.spots.at(pp->locallab.selspot).avoid = r->avoid; pp->locallab.spots.at(pp->locallab.selspot).laplac = r->laplac; pp->locallab.spots.at(pp->locallab.selspot).deltae = r->deltae; @@ -3647,6 +3651,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).iter = pe->locallab.spots.at(pp->locallab.selspot).iter || se->iter; pe->locallab.spots.at(pp->locallab.selspot).transitweak = pe->locallab.spots.at(pp->locallab.selspot).transitweak || se->transitweak; pe->locallab.spots.at(pp->locallab.selspot).transitgrad = pe->locallab.spots.at(pp->locallab.selspot).transitgrad || se->transitgrad; + pe->locallab.spots.at(pp->locallab.selspot).scopemask = pe->locallab.spots.at(pp->locallab.selspot).scopemask || se->scopemask; pe->locallab.spots.at(pp->locallab.selspot).balan = pe->locallab.spots.at(pp->locallab.selspot).balan || se->balan; pe->locallab.spots.at(pp->locallab.selspot).avoid = pe->locallab.spots.at(pp->locallab.selspot).avoid || se->avoid; pe->locallab.spots.at(pp->locallab.selspot).laplac = pe->locallab.spots.at(pp->locallab.selspot).laplac || se->laplac; @@ -3950,6 +3955,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).balan = pedited->locallab.spots.at(pp->locallab.selspot).balan || se->balan; pedited->locallab.spots.at(pp->locallab.selspot).transitweak = pedited->locallab.spots.at(pp->locallab.selspot).transitweak || se->transitweak; pedited->locallab.spots.at(pp->locallab.selspot).transitgrad = pedited->locallab.spots.at(pp->locallab.selspot).transitgrad || se->transitgrad; + pedited->locallab.spots.at(pp->locallab.selspot).scopemask = pedited->locallab.spots.at(pp->locallab.selspot).scopemask || se->scopemask; pedited->locallab.spots.at(pp->locallab.selspot).avoid = pedited->locallab.spots.at(pp->locallab.selspot).avoid || se->avoid; pedited->locallab.spots.at(pp->locallab.selspot).laplac = pedited->locallab.spots.at(pp->locallab.selspot).laplac || se->laplac; pedited->locallab.spots.at(pp->locallab.selspot).deltae = pedited->locallab.spots.at(pp->locallab.selspot).deltae || se->deltae; @@ -8513,6 +8519,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con se->balan = spotState->balan; se->transitweak = spotState->transitweak; se->transitgrad = spotState->transitgrad; + se->scopemask = spotState->scopemask; se->avoid = spotState->avoid; se->laplac = spotState->laplac; se->deltae = spotState->deltae; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index c7f01d3bd..45562e0e6 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -975,6 +975,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).avoid = locallab.spots.at(j).avoid && pSpot.avoid == otherSpot.avoid; locallab.spots.at(j).laplac = locallab.spots.at(j).laplac && pSpot.laplac == otherSpot.laplac; locallab.spots.at(j).deltae = locallab.spots.at(j).deltae && pSpot.deltae == otherSpot.deltae; + locallab.spots.at(j).scopemask = locallab.spots.at(j).scopemask && pSpot.scopemask == otherSpot.scopemask; // Color & Light locallab.spots.at(j).expcolor = locallab.spots.at(j).expcolor && pSpot.expcolor == otherSpot.expcolor; locallab.spots.at(j).curvactiv = locallab.spots.at(j).curvactiv && pSpot.curvactiv == otherSpot.curvactiv; @@ -2794,6 +2795,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).transitgrad = mods.locallab.spots.at(i).transitgrad; } + if (locallab.spots.at(i).scopemask) { + toEdit.locallab.spots.at(i).scopemask = mods.locallab.spots.at(i).scopemask; + } + if (locallab.spots.at(i).avoid) { toEdit.locallab.spots.at(i).avoid = mods.locallab.spots.at(i).avoid; } @@ -4817,6 +4822,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : avoid(v), laplac(v), deltae(v), + scopemask(v), // Color & Light expcolor(v), curvactiv(v), @@ -5111,6 +5117,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) avoid = v; laplac = v; deltae = v; + scopemask = v; // Color & Light expcolor = v; curvactiv = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1c958da6b..608470853 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -393,6 +393,7 @@ public: bool avoid; bool laplac; bool deltae; + bool scopemask; // Color & Light bool expcolor; bool curvactiv;