From ef5eebb81e218323f752eb17a3d517907655ef88 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 14 Oct 2019 16:07:22 +0200 Subject: [PATCH] Add contrast curve to mask 7 color and light --- rtdata/languages/default | 2 ++ rtengine/curves.cc | 20 ++++++++++++ rtengine/curves.h | 1 + rtengine/dcrop.cc | 8 +++-- rtengine/improccoordinator.cc | 13 ++++++-- rtengine/improccoordinator.h | 2 ++ rtengine/improcfun.h | 6 ++-- rtengine/iplocallab.cc | 60 ++++++++++++++++++++++++++--------- rtengine/procevents.h | 1 + rtengine/procparams.cc | 4 +++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 +- rtengine/simpleprocess.cc | 10 ++++-- rtgui/locallab.cc | 32 +++++++++++++++++++ rtgui/locallab.h | 2 ++ rtgui/paramsedited.cc | 7 ++++ rtgui/paramsedited.h | 1 + 17 files changed, 148 insertions(+), 25 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index cfddc51f8..ea0ca1471 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1007,6 +1007,7 @@ HISTORY_MSG_766;Local - Blur Fast Fourier HISTORY_MSG_767;Local - Grain Iso HISTORY_MSG_768;Local - Grain Strength HISTORY_MSG_769;Local - Grain Scale +HISTORY_MSG_770;Local - Color Mask contrast curve HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2223,6 +2224,7 @@ TP_LOCALLAB_PROXI;DeltaE weakening TP_LOCALLAB_THRESDELTAE;Threshold deltaE-scope TP_LOCALLAB_LIGHTNESS;Lightness TP_LOCALLAB_MASK;Mask: +TP_LOCALLAB_MASK2;Contrast curve mask TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. TP_LOCALLAB_PDE;Laplacian & PDE TP_LOCALLAB_RADIUS;Radius diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 6b5ee40c6..961445a19 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -520,6 +520,26 @@ void CurveFactory::curveexLocal(bool & localexutili, const std::vector& } +void CurveFactory::curvemaskLocal(bool & localmaskutili, const std::vector& curvePoints, LUTf & LocalmaskCurve, int skip) +{ + bool needed = false; + std::unique_ptr dCurve; + +// if (localexutili && !curvePoints.empty() && curvePoints[0] != 0) { + if (!curvePoints.empty() && curvePoints[0] != 0) { + dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); + + if (dCurve && !dCurve->isIdentity()) { + needed = true; + localmaskutili = true; + } + } + + fillCurveArray(dCurve.get(), LocalmaskCurve, skip, needed); + +} + + void CurveFactory::localLCurve(double br, double contr, /*const std::vector& curvePoints,*/ LUTu & histogram, LUTf & outCurve, diff --git a/rtengine/curves.h b/rtengine/curves.h index de30ef045..fee4ca7b6 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -381,6 +381,7 @@ public: static void curveCCLocal(bool & localcutili, const std::vector& curvePoints, LUTf & LocalCCurve, int skip); static void curveskLocal(bool & localskutili, const std::vector& curvePoints, LUTf & LocalskCurve, int skip); static void curveexLocal(bool & localexutili, const std::vector& curvePoints, LUTf & LocalexCurve, int skip); + static void curvemaskLocal(bool & localmaskutili, const std::vector& curvePoints, LUTf & LocalmaskCurve, int skip); static void complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & clcutili, const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 14c32232f..56248e4fa 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -886,6 +886,8 @@ void Crop::update(int todo) LUTf cclocalcurve2(65536, 0); bool localexutili = parent->localexutili; LUTf exlocalcurve2(65536, 0); + bool localmaskutili = parent->localmaskutili; + LUTf lmasklocalcurve2(65536, 0); LUTf hltonecurveloc2(65536, 0); //65536 LUTf shtonecurveloc2(65536, 0); LUTf tonecurveloc2(65536, 0); @@ -985,6 +987,8 @@ void Crop::update(int todo) localcutili = false; CurveFactory::curveCCLocal(localcutili, params.locallab.spots.at(sp).cccurve, cclocalcurve2, sca); CurveFactory::curveexLocal(localexutili, params.locallab.spots.at(sp).excurve, exlocalcurve2, sca); + localmaskutili = false; + CurveFactory::curvemaskLocal(localmaskutili, params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve2, sca); double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1022,7 +1026,7 @@ void Crop::update(int todo) // Locallab mask are only shown for selected spot if (sp == params.locallab.selspot) { parent->ipf.Lab_Local(1, sp, (float**)shbuffer, labnCrop, labnCrop, reservCrop, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, locRETtransCurve, lllocalcurve2,locallutili, - loclhCurve, lochhCurve, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + loclhCurve, lochhCurve, lmasklocalcurve2, localmaskutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, @@ -1037,7 +1041,7 @@ void Crop::update(int todo) } } else { parent->ipf.Lab_Local(1, sp, (float**)shbuffer, labnCrop, labnCrop, reservCrop, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, locRETtransCurve, lllocalcurve2,locallutili, - loclhCurve, lochhCurve, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + loclhCurve, lochhCurve, lmasklocalcurve2, localmaskutili, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 8dfb809c0..b112104aa 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -171,12 +171,14 @@ ImProcCoordinator::ImProcCoordinator() : shtonecurveloc(65536, 0), tonecurveloc(65536, 0), lightCurveloc(32770, 0), + lmasklocalcurve(65536, 0), locallutili(false), localcutili(false), localexutili(false), llmasutili(false), lhmasutili(false), lcmasutili(false), + localmaskutili(false), lcmasexputili(false), lhmasexputili(false), llmasexputili(false), @@ -912,9 +914,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) localexutili = false; localcutili = false; llmasutili = false; + lhmasutili = false; + lcmasutili = false; + localmaskutili = false; lcmasexputili = false; lhmasexputili = false; llmasexputili = false; + localmaskutili = false; lcmasSHutili = false; lhmasSHutili = false; llmasSHutili = false; @@ -962,6 +968,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) CurveFactory::curveLocal(locallutili, params->locallab.spots.at(sp).llcurve, lllocalcurve, sca); CurveFactory::curveCCLocal(localcutili, params->locallab.spots.at(sp).cccurve, cclocalcurve, sca); CurveFactory::curveexLocal(localexutili, params->locallab.spots.at(sp).excurve, exlocalcurve, sca); + CurveFactory::curvemaskLocal(localmaskutili, params->locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, sca); double ecomp = params->locallab.spots.at(sp).expcomp; double black = params->locallab.spots.at(sp).black; double hlcompr = params->locallab.spots.at(sp).hlcompr; @@ -1014,7 +1021,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float Tmax; if (sp == params->locallab.selspot) { - ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, lmasklocalcurve, localmaskutili, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, @@ -1028,7 +1036,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locallListener->minmaxChanged(maxCD, minCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); } } else { - ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, lmasklocalcurve, localmaskutili, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c40340d1c..cc8da2127 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -233,6 +233,7 @@ protected: LUTf shtonecurveloc; LUTf tonecurveloc; LUTf lightCurveloc; + LUTf lmasklocalcurve; // LUTu lhist16loc; LocretigainCurve locRETgainCurve; LocretitransCurve locRETtransCurve; @@ -268,6 +269,7 @@ protected: bool llmasutili; bool lhmasutili; bool lcmasutili; + bool localmaskutili; bool lcmasexputili; bool lhmasexputili; bool llmasexputili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 737ca125f..ae4746481 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -189,7 +189,8 @@ public: //locallab void maskcalccol(bool invmask, bool pde, int bfw, int bfh, int xstart, int ystart, int sk, int cx, int cy, LabImage* bufcolorig, LabImage* bufmaskblurcol, LabImage* originalmaskcol, LabImage* original, /*LabImage * transformed, */int inv, const struct local_params & lp, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, 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); + 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 +); 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); @@ -210,7 +211,8 @@ public: void calc_ref(int sp, LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &chromarefblur, double &lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, float &avg); void copy_ref(LabImage* spotbuffer, LabImage* original, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp, double &huerefspot, double &chromarefspot, double &lumarefspot); void paste_ref(LabImage* spotbuffer, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp); - void Lab_Local(int call, int sp, float** shbuffer, LabImage* original, LabImage* transformed, LabImage* reserved, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve & locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, LUTf & lllocalcurve, bool & locallutili, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, + void Lab_Local(int call, int sp, float** shbuffer, LabImage* original, LabImage* transformed, LabImage* reserved, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve & locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, LUTf & lllocalcurve, bool & locallutili, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, LUTf & lmasklocalcurve, bool & localmaskutili, + const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocCCmaskCurve & locccmasexpCurve, bool &lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool &llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili, const LocCCmaskCurve & locccmasSHCurve, bool &lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool &llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili, const LocCCmaskCurve & locccmascbCurve, bool &lcmascbutili, const LocLLmaskCurve & locllmascbCurve, bool &llmascbutili, const LocHHmaskCurve & lochhmascbCurve, bool & lhmascbutili, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index b0ac0e2ea..8dcf30291 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2841,7 +2841,8 @@ void ImProcFunctions::retinex_pde(float * datain, float * dataout, int bfw, int void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int xstart, int ystart, int sk, int cx, int cy, LabImage* bufcolorig, LabImage* bufmaskblurcol, LabImage* originalmaskcol, LabImage* original, /*LabImage * transformed, */int inv, const struct local_params & lp, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, 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) + 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 + ) { array2D ble(bfw, bfh); array2D guid(bfw, bfh); @@ -2967,6 +2968,18 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } +//curve actually only for color and light + if (lmasklocalcurve && localmaskutili) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + bufmaskblurcol->L[ir][jr] = 0.5f * lmasklocalcurve[2.f * bufmaskblurcol->L[ir][jr]]; + } + } + if (lap > 0.f) { float *datain = new float[bfh * bfw]; @@ -6695,7 +6708,8 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * original, LabImage * transformed, LabImage * reserved, int cx, int cy, int oW, int oH, int sk, - const LocretigainCurve & locRETgainCcurve, const LocretitransCurve & locRETtransCcurve, LUTf & lllocalcurve, bool & locallutili, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, + const LocretigainCurve & locRETgainCcurve, const LocretitransCurve & locRETtransCcurve, LUTf & lllocalcurve, bool & locallutili, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, LUTf & lmasklocalcurve, bool & localmaskutili, + const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool & lhmasutili, const LocCCmaskCurve & locccmasexpCurve, bool & lcmasexputili, const LocLLmaskCurve & locllmasexpCurve, bool & llmasexputili, const LocHHmaskCurve & lochhmasexpCurve, bool & lhmasexputili, const LocCCmaskCurve & locccmasSHCurve, bool & lcmasSHutili, const LocLLmaskCurve & locllmasSHCurve, bool & llmasSHutili, const LocHHmaskCurve & lochhmasSHCurve, bool & lhmasSHutili, const LocCCmaskCurve & locccmascbCurve, bool & lcmascbutili, const LocLLmaskCurve & locllmascbCurve, bool & llmascbutili, const LocHHmaskCurve & lochhmascbCurve, bool & lhmascbutili, @@ -7095,7 +7109,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ImProcFunctions::fftw_convol_blur2(tmp1->b, tmp1->b, bfw, bfh, radius, 0, 0); } else { - gaussianBlur(tmp1->L, tmp1->L, bfw, bfh, radius); + gaussianBlur(tmp1->L, tmp1->L, bfw, bfh, radius); gaussianBlur(tmp1->a, tmp1->a, bfw, bfh, radius); gaussianBlur(tmp1->b, tmp1->b, bfw, bfh, radius); } @@ -7519,10 +7533,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmacb; float lap = params->locallab.spots.at(sp).lapmaskcb; float pde = params->locallab.spots.at(sp).laplac; - + LUTf dummy; + bool uti; 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmaskcbmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); @@ -7795,9 +7810,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; if (!params->locallab.spots.at(sp).enatmMaskaft) { + LUTf dummy; + bool uti; + 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmasktmmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); @@ -7817,9 +7835,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (enatmMasktmap) { //calculate new values for original, originalmasktm, bufmaskorigtm...in function of tmp1 + LUTf dummy; + bool uti; + 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmasktmmet == 3) {//dispaly mask showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); @@ -7983,10 +8004,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; float pde = params->locallab.spots.at(sp).laplac; + LUTf dummy; + bool uti; 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmaskSHmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); @@ -8078,10 +8101,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaSH; float lap = params->locallab.spots.at(sp).lapmaskSH; float pde = params->locallab.spots.at(sp).laplac; + LUTf dummy; + bool uti; 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmaskSHmetinv == 1) { @@ -10178,10 +10203,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaexp; float lap = params->locallab.spots.at(sp).lapmaskexp; float pde = params->locallab.spots.at(sp).laplac; + LUTf dummy; + bool uti; 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmaskexpmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); @@ -10443,10 +10470,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmaexp; float lap = params->locallab.spots.at(sp).lapmaskexp; float pde = params->locallab.spots.at(sp).laplac; + LUTf dummy; + bool uti; 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmaskexpmetinv == 1) { showmask(lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); @@ -10683,10 +10712,10 @@ 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; - +//LUTf & lmasklocalcurve, bool & localmaskutili 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, lmasklocalcurve, localmaskutili); if (lp.showmaskcolmet == 3) { showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); @@ -10886,10 +10915,11 @@ 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; - + LUTf dummy; + bool uti; 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); + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, dummy, uti); if (lp.showmaskcolmetinv == 1) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 123a27adc..4e119e69d 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -796,6 +796,7 @@ enum ProcEventCode { Evlocallabisogr = 766, Evlocallabstrengr = 767, Evlocallabscalegr = 768, + EvlocallabLmaskshape = 769, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 6f5bf8ea7..f64c20224 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2465,6 +2465,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : LLmaskcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.00, 1.0, 0.35, 0.35 }, HHmaskcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.00, 1.0, 0.35, 0.35 }, softradiuscol(0.0), + Lmaskcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, // Exposure expexpose(false), expcomp(0.0), @@ -2747,6 +2748,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && HHmaskcurve == other.HHmaskcurve && blurcolde == other.blurcolde && softradiuscol == other.softradiuscol + && Lmaskcurve == other.Lmaskcurve // Exposure && expexpose == other.expexpose && expcomp == other.expcomp @@ -4015,6 +4017,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmaskcurve, "Locallab", "LLmaskCurve_" + std::to_string(i), spot.LLmaskcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).HHmaskcurve, "Locallab", "HHmaskCurve_" + std::to_string(i), spot.HHmaskcurve, keyFile); 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); // 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); @@ -5398,6 +5401,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "LLmaskCurve_" + std::to_string(i), pedited, spot.LLmaskcurve, spotEdited.LLmaskcurve); assignFromKeyfile(keyFile, "Locallab", "HHmaskCurve_" + std::to_string(i), pedited, spot.HHmaskcurve, spotEdited.HHmaskcurve); 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); // 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 631df2e37..6d96286d2 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1012,6 +1012,7 @@ struct LocallabParams { std::vector LLmaskcurve; std::vector HHmaskcurve; double softradiuscol; + std::vector Lmaskcurve; // Exposure bool expexpose; // int expcomp; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 8789b1a10..a8908b3a9 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -795,7 +795,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabfftwbl LUMINANCECURVE, //Evlocallabisogr LUMINANCECURVE, //Evlocallabstrengr - LUMINANCECURVE //Evlocallabscalegr + LUMINANCECURVE, //Evlocallabscalegr + LUMINANCECURVE //EvlocallabLmaskshape }; namespace rtengine diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 173ff48dd..e8c7ec2a2 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1124,6 +1124,7 @@ private: LUTf tonecurveloc(65536, 0); LUTf lightCurveloc(32770, 0); LUTf exlocalcurve(65536, 0); + LUTf lmasklocalcurve(65536, 0); // int maxspot = 1; float** shbuffer = nullptr; @@ -1144,6 +1145,9 @@ private: bool localcutili = false; bool localexutili = false; bool llmasutili = false; + bool lhmasutili = false; + bool lcmasutili = false; + bool localmaskutili = false; bool lcmasexputili = false; bool lhmasexputili = false; bool llmasexputili = false; @@ -1163,8 +1167,6 @@ private: bool lhmasblutili = false; bool llmasblutili = false; bool locwavutili = false; - bool lcmasutili = false; - bool lhmasutili = false; locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve); loclhCurve.Set(params.locallab.spots.at(sp).LHcurve, LHutili); @@ -1194,6 +1196,7 @@ private: CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve, 1); CurveFactory::curveCCLocal(localcutili, params.locallab.spots.at(sp).cccurve, cclocalcurve, 1); CurveFactory::curveexLocal(localexutili, params.locallab.spots.at(sp).excurve, exlocalcurve, 1); + CurveFactory::curvemaskLocal(localmaskutili, params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, 1); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; @@ -1227,7 +1230,8 @@ private: float Tmax; // No Locallab mask is shown in exported picture - ipf.Lab_Local(2, sp, (float**)shbuffer, labView, labView, reservView, 0, 0, fw, fh, 1, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + ipf.Lab_Local(2, sp, (float**)shbuffer, labView, labView, reservView, 0, 0, fw, fh, 1, locRETgainCurve, locRETtransCurve, lllocalcurve, locallutili, loclhCurve, lochhCurve, lmasklocalcurve, localmaskutili, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 91d45c8de..698412814 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -155,6 +155,7 @@ Locallab::Locallab(): llCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_LUM"))), HCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_HLH"))), maskCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + mask2CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), // Exposure curveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_CURVEEDITOR_TONES_LABEL"))), maskexpCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), @@ -666,6 +667,24 @@ Locallab::Locallab(): HHmaskshape->setBottomBarColorProvider(this, 6); maskCurveEditorG->curveListComplete(); + + mask2CurveEditorG->setCurveListener(this); + Lmaskshape = static_cast(mask2CurveEditorG->addCurve(CT_Diagonal, "L(L)")); + Lmaskshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskcurve.at(0)), defSpot.Lmaskcurve); + + if (showtooltip) { + Lmaskshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + } + + std::vector mLmaskshape; + mLmaskshape.push_back(GradientMilestone(0., 0., 0., 0.)); + mLmaskshape.push_back(GradientMilestone(1., 1., 1., 1.)); + Lmaskshape->setBottomBarBgGradient(mLmaskshape); + Lmaskshape->setLeftBarBgGradient(mLmaskshape); + mask2CurveEditorG->curveListComplete(); + + + labgrid = Gtk::manage(new LabGrid(EvLocallabLabGridValue, M("TP_LOCALLAB_LABGRID_VALUES"))); ToolParamBlock* const colorBox = Gtk::manage(new ToolParamBlock()); @@ -708,6 +727,7 @@ Locallab::Locallab(): maskcolBox->pack_start(*chromaskcol, Gtk::PACK_SHRINK, 0); maskcolBox->pack_start(*gammaskcol, Gtk::PACK_SHRINK, 0); 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 expmaskcol->add(*maskcolBox, false); colorBox->pack_start(*expmaskcol); @@ -2210,6 +2230,7 @@ Locallab::~Locallab() delete llCurveEditorG; delete HCurveEditorG; delete maskCurveEditorG; + delete mask2CurveEditorG; delete curveEditorG; delete maskexpCurveEditorG; delete maskSHCurveEditorG; @@ -3125,6 +3146,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).slomaskcol = slomaskcol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).lapmaskcol = lapmaskcol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).softradiuscol = softradiuscol->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = Lmaskshape->getCurve(); // Exposure pp->locallab.spots.at(pp->locallab.selspot).expexpose = expexpose->getEnabled(); pp->locallab.spots.at(pp->locallab.selspot).expcomp = expcomp->getValue(); @@ -3476,6 +3498,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).slomaskcol = pe->locallab.spots.at(pp->locallab.selspot).slomaskcol || slomaskcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).lapmaskcol = pe->locallab.spots.at(pp->locallab.selspot).lapmaskcol || lapmaskcol->getEditedState(); 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(); // 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(); @@ -3762,6 +3785,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).slomaskcol = pedited->locallab.spots.at(pp->locallab.selspot).slomaskcol || slomaskcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcol = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcol || lapmaskcol->getEditedState(); 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(); // 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(); @@ -4133,6 +4157,12 @@ void Locallab::curveChanged(CurveEditor* ce) } } + if (ce == Lmaskshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskshape, M("HISTORY_CUSTOMCURVE")); + } + } + } // Exposure @@ -7825,6 +7855,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con slomaskcol->setValue(pp->locallab.spots.at(index).slomaskcol); lapmaskcol->setValue(pp->locallab.spots.at(index).lapmaskcol); softradiuscol->setValue(pp->locallab.spots.at(index).softradiuscol); + Lmaskshape->setCurve(pp->locallab.spots.at(index).Lmaskcurve); // Exposure expexpose->setEnabled(pp->locallab.spots.at(index).expexpose); @@ -8200,6 +8231,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con slomaskcol->setEditedState(spotState->slomaskcol ? Edited : UnEdited); lapmaskcol->setEditedState(spotState->lapmaskcol ? Edited : UnEdited); softradiuscol->setEditedState(spotState->softradiuscol ? Edited : UnEdited); + Lmaskshape->setUnChanged(!spotState->Lmaskcurve); // Exposure expexpose->set_inconsistent(!spotState->expexpose); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index d1c6b6c0f..8b9a14e9d 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -74,6 +74,8 @@ private: CurveEditorGroup* const llCurveEditorG; CurveEditorGroup* const HCurveEditorG; CurveEditorGroup* const maskCurveEditorG; + CurveEditorGroup* const mask2CurveEditorG; + DiagonalCurveEditor* Lmaskshape; DiagonalCurveEditor* llshape; DiagonalCurveEditor* ccshape; FlatCurveEditor* LHshape; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 1bbf90146..5cb2a3ae5 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1006,6 +1006,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).LLmaskcurve = locallab.spots.at(j).LLmaskcurve && pSpot.LLmaskcurve == otherSpot.LLmaskcurve; locallab.spots.at(j).HHmaskcurve = locallab.spots.at(j).HHmaskcurve && pSpot.HHmaskcurve == otherSpot.HHmaskcurve; 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; // 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; @@ -2912,6 +2913,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).softradiuscol = mods.locallab.spots.at(i).softradiuscol; } + if (locallab.spots.at(i).Lmaskcurve) { + toEdit.locallab.spots.at(i).Lmaskcurve = mods.locallab.spots.at(i).Lmaskcurve; + } + // Exposure if (locallab.spots.at(i).expexpose) { toEdit.locallab.spots.at(i).expexpose = mods.locallab.spots.at(i).expexpose; @@ -4773,6 +4778,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : LLmaskcurve(v), HHmaskcurve(v), softradiuscol(v), + Lmaskcurve(v), // Exposure expexpose(v), expcomp(v), @@ -5052,6 +5058,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) LLmaskcurve = v; HHmaskcurve = v; softradiuscol = v; + Lmaskcurve = v; // Exposure expexpose = v; expcomp = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 2d4f52e9f..1baac2998 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -424,6 +424,7 @@ public: bool LLmaskcurve; bool HHmaskcurve; bool softradiuscol; + bool Lmaskcurve; // Exposure bool expexpose; bool expcomp;