diff --git a/rtdata/languages/default b/rtdata/languages/default index 9cba8aba1..90cc0ff77 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -866,6 +866,8 @@ HISTORY_MSG_610;Local - Exp Mask L HISTORY_MSG_611;Local - Color Mask H HISTORY_MSG_612;Local - Color Structure HISTORY_MSG_613;Local - Exp Structure +HISTORY_MSG_614;Local - Exp Mask H +HISTORY_MSG_615;Local - Blend color HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1934,6 +1936,7 @@ TP_LOCALLAB_ARTIF;Reduce artifacts - Improve algoritm TP_LOCALLAB_ARTIF_TOOLTIP;Only active for Color-light, Exposure, Retinex, Vibrance, ToneMapping, CBDL. TP_LOCALLAB_AVOID;Avoid color shift TP_LOCALLAB_BILATERAL;Bilateral filter +TP_LOCALLAB_BLENDMASKCOL;Blend TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\nInverse - Inverse blur and noise without scope and whithout enhanced algorithm.\nSymmetric - inverse blur and noise with all settings. Be careful some results may be curious TP_LOCALLAB_BLUFR;Blur & Noise TP_LOCALLAB_BLNORM;Normal diff --git a/rtengine/curves.cc b/rtengine/curves.cc index dbd07db70..ba6683806 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1570,6 +1570,56 @@ void LocretigainCurverab::Set(const std::vector &curvePoints) } } +LocHHmaskexpCurve::LocHHmaskexpCurve() : sum(0.f) {}; + +void LocHHmaskexpCurve::Reset() +{ + lutLocHHmaskexpCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskexpCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskexpCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskexpCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskexpCurve[i] < 0.02f) { + lutLocHHmaskexpCurve[i] = 0.02f; + } + + sum += lutLocHHmaskexpCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocHHmaskexpCurve::Set(const std::vector &curvePoints) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + Set(ttcurve); + } else { + Reset(); + } +} + + + + + LocLLmaskexpCurve::LocLLmaskexpCurve() : sum(0.f) {}; void LocLLmaskexpCurve::Reset() diff --git a/rtengine/curves.h b/rtengine/curves.h index b078d4e68..2ff10434d 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -632,6 +632,35 @@ public: } }; +class LocHHmaskexpCurve +{ +private: + LUTf lutLocHHmaskexpCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskexpCurve() {}; + LocHHmaskexpCurve(); + void Reset(); + void Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskexpCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskexpCurve; + } +}; + + class LocCCmaskexpCurve { private: diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index b8afd3c7a..80b0aead8 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -905,6 +905,7 @@ void Crop::update(int todo) LocHHmaskCurve lochhmasCurve; LocCCmaskexpCurve locccmasexpCurve; LocLLmaskexpCurve locllmasexpCurve; + LocHHmaskexpCurve lochhmasexpCurve; LocretigainCurverab locRETgainCurverab; locallutili = false; @@ -923,6 +924,7 @@ void Crop::update(int todo) lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); locccmasexpCurve.Set(params.locallab.spots.at(sp).CCmaskexpcurve); locllmasexpCurve.Set(params.locallab.spots.at(sp).LLmaskexpcurve); + lochhmasexpCurve.Set(params.locallab.spots.at(sp).HHmaskexpcurve); locallutili = false; CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve2, sca); localcutili = false; @@ -952,7 +954,7 @@ void Crop::update(int todo) sca); 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, lllocalcurve2, - loclhCurve, lochhCurve, locccmasCurve, locllmasCurve, lochhmasCurve, locccmasexpCurve, locllmasexpCurve, LHutili, HHutili, cclocalcurve2, localskutili, sklocalcurve2, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, huere, chromare, lumare, sobelre); + loclhCurve, lochhCurve, locccmasCurve, locllmasCurve, lochhmasCurve, locccmasexpCurve, locllmasexpCurve, lochhmasexpCurve, LHutili, HHutili, cclocalcurve2, localskutili, sklocalcurve2, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, huere, chromare, lumare, sobelre); lllocalcurve2.clear(); cclocalcurve2.clear(); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 3d238ea42..339bc0cf9 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -791,6 +791,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); locllmasexpCurve.Set(params.locallab.spots.at(sp).LLmaskexpcurve); locccmasexpCurve.Set(params.locallab.spots.at(sp).CCmaskexpcurve); + lochhmasexpCurve.Set(params.locallab.spots.at(sp).HHmaskexpcurve); CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve, sca); CurveFactory::curveCCLocal(localcutili, params.locallab.spots.at(sp).cccurve, cclocalcurve, sca); CurveFactory::curveskLocal(localskutili, params.locallab.spots.at(sp).skintonescurve, sklocalcurve, sca); @@ -811,6 +812,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } else { ipf.calc_ref(sp, nprevl, nprevl, 0, 0, pW, pH, scale, huerefblu, huere, chromare, lumare, sobelre, lhist16loc); } + CurveFactory::complexCurvelocal(ecomp, black / 65535., hlcompr, hlcomprthresh, shcompr, br, cont, lhist16loc, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, sca); @@ -832,9 +834,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) * - maxspot, huerefs, centerx and centery aren't used in Lab_Local (only for printf) so values aren't important * - shbuffer is used as nullptr */ - ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, lllocalcurve, loclhCurve, lochhCurve, locccmasCurve, locllmasCurve, lochhmasCurve, locccmasexpCurve, locllmasexpCurve, + ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv, 0, 0, pW, pH, scale, locRETgainCurve, lllocalcurve, loclhCurve, lochhCurve, locccmasCurve, locllmasCurve, lochhmasCurve, locccmasexpCurve, locllmasexpCurve, lochhmasexpCurve, LHutili, HHutili, cclocalcurve, localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerblu, huer, chromar, lumar, sobeler); + + /* if (params.locallab.spots.at(sp).spotMethod == "exc") { ipf.calc_ref(sp, reserv, reserv, 0, 0, pW, pH, scale, huerefblu, huere, chromare, lumare, sobelre, lhist16loc); } else { @@ -846,6 +850,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) cclocalcurve.clear(); sklocalcurve.clear(); exlocalcurve.clear(); + */ } for (int sp = 0; sp < params.locallab.nbspot && sp < (int)params.locallab.spots.size(); sp++) { @@ -861,6 +866,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lumar = lumarefs[sp] = lumare ; sobeler = sobelrefs[sp] = sobelre; } + } //************************************************************* diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index d835e5100..9eafc28f1 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -240,6 +240,7 @@ protected: LocHHmaskCurve lochhmasCurve; LocCCmaskexpCurve locccmasexpCurve; LocLLmaskexpCurve locllmasexpCurve; + LocHHmaskexpCurve lochhmasexpCurve; ProcParams nextParams2; bool locallutili; bool localcutili; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index eb0d62a54..263576fab 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -289,7 +289,7 @@ public: void calc_ref(int sp, LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &huere, double &chromare, double &lumare, double &sobelref, LUTu & histogram); 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, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const LocCCmaskCurve & locccmasCurve, const LocLLmaskCurve & locllmasCurve, const LocHHmaskCurve & lochhmasCurve, const LocCCmaskexpCurve & locccmasexpCurve, const LocLLmaskexpCurve & locllmasexpCurve, bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localskutili, LUTf & sklocalcurve, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, LUTf & lightCurveloc, double & huerefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref); + 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, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const LocCCmaskCurve & locccmasCurve, const LocLLmaskCurve & locllmasCurve, const LocHHmaskCurve & lochhmasCurve, const LocCCmaskexpCurve & locccmasexpCurve, const LocLLmaskexpCurve & locllmasexpCurve, const LocHHmaskexpCurve & lochhmasexpCurve, bool &LHutili, bool &HHutili, LUTf & cclocalcurve, bool & localskutili, LUTf & sklocalcurve, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, LUTf & lightCurveloc, double & huerefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref); void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk); void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); void InverseBlurNoise_Local(const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 818ef5b64..1b84b867c 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -157,7 +157,8 @@ struct local_params { float thr; int prox; int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu, sensden, senslc, senssf; - float struco; + float struco; + float blendmacol; float struexp; float ligh; int shamo, shdamp, shiter, senssha, sensv; @@ -473,6 +474,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall int local_contrast = locallab.spots.at(sp).contrast; float local_lightness = (float) locallab.spots.at(sp).lightness; float structcolor = (float) locallab.spots.at(sp).structcol; + float blendmaskcolor = ((float) locallab.spots.at(sp).blendmaskcol) / 100.f ; float structexpo = (float) locallab.spots.at(sp).structexp; int local_transit = locallab.spots.at(sp).transit; double radius = (double) locallab.spots.at(sp).radius; @@ -509,6 +511,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.lyT = h * local_yT; lp.chro = local_chroma; lp.struco = structcolor; + lp.blendmacol = blendmaskcolor; lp.struexp = structexpo; lp.sens = local_sensi; lp.sensh = local_sensih; @@ -7102,6 +7105,10 @@ void ImProcFunctions::calc_ref(int sp, LabImage * original, LabImage * transform int begx = lp.xc - lp.lxL; int yEn = lp.yc + lp.ly; int xEn = lp.xc + lp.lx; + begx /= sk; + begy /= sk; + yEn /= sk; + xEn /= sk; //claculate histogram for area selected #ifdef _OPENMP const int numThreads = min(max(transformed->W * transformed->H / (int)histogram.getSize(), 1), omp_get_max_threads()); @@ -7118,7 +7125,8 @@ void ImProcFunctions::calc_ref(int sp, LabImage * original, LabImage * transform for (int x = 0; x < transformed->W; x++) { int lox = cx + x; int loy = cy + y; - + lox /= sk; + loy /= sk; if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { int pos = (int)(original->L[y][x]); lhist16thrloc[pos]++; @@ -7621,7 +7629,7 @@ void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_nu 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, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const LocCCmaskCurve & locccmasCurve, const LocLLmaskCurve & locllmasCurve, const LocHHmaskCurve & lochhmasCurve, const LocCCmaskexpCurve & locccmasexpCurve, const LocLLmaskexpCurve & locllmasexpCurve, + const LocretigainCurve & locRETgainCcurve, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, const LocCCmaskCurve & locccmasCurve, const LocLLmaskCurve & locllmasCurve, const LocHHmaskCurve & lochhmasCurve, const LocCCmaskexpCurve & locccmasexpCurve, const LocLLmaskexpCurve & locllmasexpCurve, const LocHHmaskexpCurve & lochhmasexpCurve, bool & LHutili, bool & HHutili, LUTf & cclocalcurve, bool & localskutili, LUTf & sklocalcurve, bool & localexutili, LUTf & exlocalcurve, LUTf & hltonecurveloc, LUTf & shtonecurveloc, LUTf & tonecurveloc, LUTf & lightCurveloc, double & huerefblur, double & hueref, double & chromaref, double & lumaref, double & sobelref) { //general call of others functions : important return hueref, chromaref, lumaref @@ -10127,7 +10135,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o huemoins = hueref - dhue + 2.f * rtengine::RT_PI; } - +//provisory fixe for contrast slider does not work at all + lp.cont = 0; LabImage *bufcolorig = nullptr; LabImage *bufmaskorig = nullptr; @@ -10413,12 +10422,22 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { if(zone > 0) { + bufcolorig->L[loy - begy][lox - begx] += lp.blendmacol * bufmaskorig->L[loy - begy][lox - begx]; + bufcolorig->a[loy - begy][lox - begx] += lp.blendmacol * bufmaskorig->a[loy - begy][lox - begx]; + bufcolorig->b[loy - begy][lox - begx] += lp.blendmacol * bufmaskorig->b[loy - begy][lox - begx]; + + originalmask->L[y][x] = bufcolorig->L[loy - begy][lox - begx]- (lp.blendmacol + 1.f) * bufmaskorig->L[loy - begy][lox - begx]; + originalmask->a[y][x] = bufcolorig->a[loy - begy][lox - begx]- (lp.blendmacol + 1.f) * bufmaskorig->a[loy - begy][lox - begx]; + originalmask->b[y][x] = bufcolorig->L[loy - begy][lox - begx]- (lp.blendmacol + 1.f) * bufmaskorig->b[loy - begy][lox - begx]; +/* bufcolorig->L[loy - begy][lox - begx] -= bufmaskorig->L[loy - begy][lox - begx]; bufcolorig->a[loy - begy][lox - begx] -= bufmaskorig->a[loy - begy][lox - begx]; bufcolorig->b[loy - begy][lox - begx] -= bufmaskorig->b[loy - begy][lox - begx]; + originalmask->L[y][x] = bufcolorig->L[loy - begy][lox - begx]; originalmask->a[y][x] = bufcolorig->a[loy - begy][lox - begx]; originalmask->b[y][x] = bufcolorig->L[loy - begy][lox - begx]; + */ } } } @@ -10785,11 +10804,66 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bufmaskblur->a[loy - begy][lox - begx] = original->a[y][x]; bufmaskblur->b[loy - begy][lox - begx] = original->b[y][x]; + // float valLL = 0.f; + // float valCC = 0.f; + // float2 sincosval; float valLL = 0.f; float valCC = 0.f; + float valHH = 0.f; float2 sincosval; + float kmaskL = 0; + float kmaskCa = 0; + float kmaskCb = 0; + + float kmaskHL = 0; + float kmaskHa = 0; + float kmaskHb = 0; + if (lp.showmaskexpmet == 2 || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 4) { + + if (locllmasexpCurve) { + valLL = (float)(locllmasexpCurve[500.f * (bufexporig->L[loy - begy][lox - begx]) / 32768.f]); + valLL = 1.f - valLL; + kmaskL = 32768.f * valLL; + } + + if (locccmasexpCurve) { + float chromask = (sqrt(SQR(bufexporig->a[loy - begy][lox - begx]) + SQR(bufexporig->b[loy - begy][lox - begx]))); + float chromaskr = chromask / 45000.f; + valCC = float (locccmasexpCurve[500.f * chromaskr]); + valCC = 1.f - valCC; + sincosval.y = (bufexporig->a[loy - begy][lox - begx]) / chromask; + sincosval.x = (bufexporig->b[loy - begy][lox - begx]) / chromask; + kmaskCa = 45000.f * valCC * sincosval.y; + kmaskCb = 45000.f * valCC * sincosval.x; + } + + if (lochhmasexpCurve) { + float huema= xatan2f(bufexporig->b[loy - begy][lox - begx], bufexporig->a[loy - begy][lox - begx]); + float h = Color::huelab_to_huehsv2(huema); + h += 1.f/6.f; + if (h > 1.f) { + h -= 1.f; + } + float chromask = (sqrt(SQR(bufexporig->a[loy - begy][lox - begx]) + SQR(bufexporig->b[loy - begy][lox - begx]))); + valHH = float (lochhmasexpCurve[500.f * h]); + valHH = 1.f - valHH; + sincosval.y = (bufexporig->a[loy - begy][lox - begx]) / chromask; + sincosval.x = (bufexporig->b[loy - begy][lox - begx]) / chromask; + kmaskHa = 45000.f * valHH * sincosval.y; + kmaskHb = 45000.f * valHH * sincosval.x; + kmaskHL = 32768.f * valHH; + } + + bufmaskblur->L[loy - begy][lox - begx] = kmaskL + kmaskHL; + bufmaskblur->a[loy - begy][lox - begx] = kmaskCa + kmaskHa; + bufmaskblur->b[loy - begy][lox - begx] = kmaskCb + kmaskHb; + + + } + + /* if (locllmasexpCurve) { valLL = (float)(locllmasexpCurve[500.f * (bufexporig->L[loy - begy][lox - begx]) / 32768.f]); valLL = 1.f - valLL; @@ -10807,6 +10881,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bufmaskblur->b[loy - begy][lox - begx] = 45000.f * valCC * sincosval.x; } } + */ } } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 2df20710d..f92362e97 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -640,6 +640,8 @@ enum ProcEventCode { EvlocallabHHmaskshape = 610, Evlocallabstructcol = 611, Evlocallabstructexp = 612, + EvlocallabHHmaskexpshape = 613, + Evlocallabblendmaskcol = 614, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1aaee5735..e42e76c95 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2363,6 +2363,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : chroma(0), sensi(19), structcol(0), + blendmaskcol(-100), qualitycurveMethod("none"), showmaskcolMethod("none"), llcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, @@ -2387,6 +2388,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : showmaskexpMethod("none"), CCmaskexpcurve{(double)FCT_MinMaxCPoints, 0., 1., 0.35, 0.35, 1., 1., 0.35, 0.35}, LLmaskexpcurve{(double)FCT_MinMaxCPoints, 0., 1., 0.35, 0.35, 1., 1., 0.35, 0.35}, + HHmaskexpcurve{(double)FCT_MinMaxCPoints, 0., 1., 0.35, 0.35, 1., 1., 0.35, 0.35}, // Vibrance expvibrance(false), @@ -2501,6 +2503,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && chroma == other.chroma && sensi == other.sensi && structcol == other.structcol + && blendmaskcol == other.blendmaskcol && qualitycurveMethod == other.qualitycurveMethod && showmaskcolMethod == other.showmaskcolMethod && llcurve == other.llcurve @@ -2525,6 +2528,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && showmaskexpMethod == other.showmaskexpMethod && CCmaskexpcurve == other.CCmaskexpcurve && LLmaskexpcurve == other.LLmaskexpcurve + && HHmaskexpcurve == other.HHmaskexpcurve // Vibrance && expvibrance == other.expvibrance && saturated == other.saturated @@ -3591,6 +3595,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).chroma, "Locallab", "Chroma_" + std::to_string(i), spot.chroma, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sensi, "Locallab", "Sensi_" + std::to_string(i), spot.sensi, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).structcol, "Locallab", "Structcol_" + std::to_string(i), spot.structcol, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).blendmaskcol, "Locallab", "Blendmaskcol_" + std::to_string(i), spot.blendmaskcol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).qualitycurveMethod, "Locallab", "QualityCurveMethod_" + std::to_string(i), spot.qualitycurveMethod, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).showmaskcolMethod, "Locallab", "ShowmaskcolMethod_" + std::to_string(i), spot.showmaskcolMethod, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).llcurve, "Locallab", "LLCurve_" + std::to_string(i), spot.llcurve, keyFile); @@ -3615,6 +3620,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).showmaskexpMethod, "Locallab", "ShowmaskexpMethod_" + std::to_string(i), spot.showmaskexpMethod, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).CCmaskexpcurve, "Locallab", "CCmaskexpCurve_" + std::to_string(i), spot.CCmaskexpcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmaskexpcurve, "Locallab", "LLmaskexpCurve_" + std::to_string(i), spot.LLmaskexpcurve, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).HHmaskexpcurve, "Locallab", "HHmaskexpCurve_" + std::to_string(i), spot.HHmaskexpcurve, keyFile); // Vibrance saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expvibrance, "Locallab", "Expvibrance_" + std::to_string(i), spot.expvibrance, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).saturated, "Locallab", "Saturated_" + std::to_string(i), spot.saturated, keyFile); @@ -4808,6 +4814,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Chroma_" + std::to_string(i), pedited, spot.chroma, spotEdited.chroma); assignFromKeyfile(keyFile, "Locallab", "Sensi_" + std::to_string(i), pedited, spot.sensi, spotEdited.sensi); assignFromKeyfile(keyFile, "Locallab", "Structcol_" + std::to_string(i), pedited, spot.structcol, spotEdited.structcol); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskcol_" + std::to_string(i), pedited, spot.blendmaskcol, spotEdited.blendmaskcol); assignFromKeyfile(keyFile, "Locallab", "QualityCurveMethod_" + std::to_string(i), pedited, spot.qualitycurveMethod, spotEdited.qualitycurveMethod); assignFromKeyfile(keyFile, "Locallab", "ShowmaskcolMethod_" + std::to_string(i), pedited, spot.showmaskcolMethod, spotEdited.showmaskcolMethod); assignFromKeyfile(keyFile, "Locallab", "LLCurve_" + std::to_string(i), pedited, spot.llcurve, spotEdited.llcurve); @@ -4832,6 +4839,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "ShowmaskexpMethod_" + std::to_string(i), pedited, spot.showmaskexpMethod, spotEdited.showmaskexpMethod); assignFromKeyfile(keyFile, "Locallab", "CCmaskexpCurve_" + std::to_string(i), pedited, spot.CCmaskexpcurve, spotEdited.CCmaskexpcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskexpCurve_" + std::to_string(i), pedited, spot.LLmaskexpcurve, spotEdited.LLmaskexpcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskexpCurve_" + std::to_string(i), pedited, spot.HHmaskexpcurve, spotEdited.HHmaskexpcurve); // Vibrance assignFromKeyfile(keyFile, "Locallab", "Expvibrance_" + std::to_string(i), pedited, spot.expvibrance, spotEdited.expvibrance); assignFromKeyfile(keyFile, "Locallab", "Saturated_" + std::to_string(i), pedited, spot.saturated, spotEdited.saturated); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index b0444edb1..d4e061a76 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -960,6 +960,7 @@ struct LocallabParams { int chroma; int sensi; int structcol; + int blendmaskcol; Glib::ustring qualitycurveMethod; Glib::ustring showmaskcolMethod; std::vector llcurve; @@ -984,6 +985,7 @@ struct LocallabParams { Glib::ustring showmaskexpMethod; std::vector CCmaskexpcurve; std::vector LLmaskexpcurve; + std::vector HHmaskexpcurve; // Vibrance bool expvibrance; int saturated; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d4c0cbdf3..a3da742f4 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -639,7 +639,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabLLmaskexpshape LUMINANCECURVE, //EvlocallabHHmaskshape LUMINANCECURVE, //Evlocallabstructcol - LUMINANCECURVE //Evlocallabstructexp + LUMINANCECURVE, //Evlocallabstructexp + LUMINANCECURVE, //EvlocallabHHmaskexpshape + LUMINANCECURVE //Evlocallabblendmaskcol }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 0c210ce3f..b17536fc2 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1080,6 +1080,7 @@ private: LocHHmaskCurve lochhmasCurve; LocCCmaskexpCurve locccmasexpCurve; LocLLmaskexpCurve locllmasexpCurve; + LocHHmaskexpCurve lochhmasexpCurve; LUTf lllocalcurve(65536, 0); LUTf cclocalcurve(65536, 0); LUTf sklocalcurve(65536, 0); @@ -1118,6 +1119,7 @@ private: lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); locccmasexpCurve.Set(params.locallab.spots.at(sp).CCmaskexpcurve); locllmasexpCurve.Set(params.locallab.spots.at(sp).LLmaskexpcurve); + lochhmasexpCurve.Set(params.locallab.spots.at(sp).HHmaskexpcurve); CurveFactory::curveLocal(locallutili, params.locallab.spots.at(sp).llcurve, lllocalcurve, 1); CurveFactory::curveCCLocal(localcutili, params.locallab.spots.at(sp).cccurve, cclocalcurve, 1); CurveFactory::curveskLocal(localskutili, params.locallab.spots.at(sp).skintonescurve, sklocalcurve, 1); @@ -1143,7 +1145,7 @@ private: hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, 1); - ipf.Lab_Local(2, sp, (float**)shbuffer, labView, labView, reservView, 0, 0, fw, fh, 1, locRETgainCurve, lllocalcurve, loclhCurve, lochhCurve, locccmasCurve, locllmasCurve, lochhmasCurve, locccmasexpCurve, locllmasexpCurve, + ipf.Lab_Local(2, sp, (float**)shbuffer, labView, labView, reservView, 0, 0, fw, fh, 1, locRETgainCurve, lllocalcurve, loclhCurve, lochhCurve, locccmasCurve, locllmasCurve, lochhmasCurve, locccmasexpCurve, locllmasexpCurve, lochhmasexpCurve, LHutili, HHutili, cclocalcurve, localskutili, sklocalcurve, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerefblu, huere, chromare, lumare, sobelre); // Clear local curves diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index ef5e21b7c..2cb0887f7 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -77,6 +77,7 @@ Locallab::Locallab(): chroma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMA"), -100, 150, 1, 0))), sensi(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 19))), structcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL"), 0, 100, 1, 0))), + blendmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -150, 100, 1, -100))), // Exposure expcomp(Gtk::manage(new Adjuster(M("TP_EXPOSURE_EXPCOMP"), -200, 200, 5, 0))), hlcompr(Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 500, 1, 60))), @@ -107,7 +108,7 @@ Locallab::Locallab(): // Retinex str(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STR"), 0, 100, 1, 0))), chrrt(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHRRT"), 0, 100, 1, 0))), - neigh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NEIGH"), 14, 150, 1, 50))), + neigh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NEIGH"), -100, 150, 1, 100))),//14, 150, 1, 50))), vart(Gtk::manage(new Adjuster(M("TP_LOCALLAB_VART"), 50, 500, 1, 200))), dehaz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZ"), 0, 100, 1, 0))), sensih(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIH"), 0, 100, 1, 19))), @@ -217,6 +218,7 @@ Locallab::Locallab(): sensi->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); sensi->setAdjusterListener(this); structcol->setAdjusterListener(this); + blendmaskcol->setAdjusterListener(this); qualitycurveMethod->append(M("TP_LOCALLAB_CURVNONE")); qualitycurveMethod->append(M("TP_LOCALLAB_CURVCURR")); @@ -314,7 +316,7 @@ Locallab::Locallab(): HHmaskshape = static_cast(maskCurveEditorG->addCurve(CT_Flat, "LC(H)", nullptr, false, true)); HHmaskshape->setIdentityValue(0.); - HHmaskshape->setResetCurve(FlatCurveType(defSpot.LLmaskcurve.at(0)), defSpot.LLmaskcurve); + HHmaskshape->setResetCurve(FlatCurveType(defSpot.HHmaskcurve.at(0)), defSpot.HHmaskcurve); HHmaskshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); HHmaskshape->setCurveColorProvider(this, 6); HHmaskshape->setBottomBarColorProvider(this, 6); @@ -327,7 +329,7 @@ Locallab::Locallab(): superFrame->set_label_widget(*curvactiv); ToolParamBlock* const superBox = Gtk::manage(new ToolParamBlock()); superBox->pack_start(*lightness); - superBox->pack_start(*contrast); +// superBox->pack_start(*contrast); superBox->pack_start(*chroma); superFrame->add(*superBox); colorBox->pack_start(*superFrame); @@ -345,6 +347,7 @@ Locallab::Locallab(): maskcolBox->pack_start(*transLabels, Gtk::PACK_SHRINK, 4); maskcolBox->pack_start(*showmaskcolMethod, Gtk::PACK_SHRINK, 0); maskcolBox->pack_start(*maskCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskcolBox->pack_start(*blendmaskcol, Gtk::PACK_SHRINK, 0); maskcolFrame->add(*maskcolBox); colorBox->pack_start(*maskcolFrame); @@ -413,6 +416,14 @@ Locallab::Locallab(): LLmaskexpshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); LLmaskexpshape->setBottomBarBgGradient(mllshape); + HHmaskexpshape = static_cast(maskexpCurveEditorG->addCurve(CT_Flat, "LC(H)", nullptr, false, true)); + HHmaskexpshape->setIdentityValue(0.); + HHmaskexpshape->setResetCurve(FlatCurveType(defSpot.HHmaskexpcurve.at(0)), defSpot.HHmaskexpcurve); + HHmaskexpshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskexpshape->setCurveColorProvider(this, 6); + HHmaskexpshape->setBottomBarColorProvider(this, 6); + + maskexpCurveEditorG->curveListComplete(); @@ -1484,6 +1495,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).chroma = chroma->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).sensi = sensi->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).structcol = structcol->getIntValue(); + pp->locallab.spots.at(pp->locallab.selspot).blendmaskcol = blendmaskcol->getIntValue(); if (qualitycurveMethod->get_active_row_number() == 0) { pp->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod = "none"; @@ -1541,6 +1553,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) } pp->locallab.spots.at(pp->locallab.selspot).LLmaskexpcurve = LLmaskexpshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).CCmaskexpcurve = CCmaskexpshape->getCurve(); + pp->locallab.spots.at(pp->locallab.selspot).HHmaskexpcurve = HHmaskexpshape->getCurve(); // Vibrance pp->locallab.spots.at(pp->locallab.selspot).expvibrance = expvibrance->getEnabled(); @@ -1673,6 +1686,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).chroma = pe->locallab.spots.at(pp->locallab.selspot).chroma || chroma->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).sensi = pe->locallab.spots.at(pp->locallab.selspot).sensi || sensi->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).structcol = pe->locallab.spots.at(pp->locallab.selspot).structcol || structcol->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).blendmaskcol = pe->locallab.spots.at(pp->locallab.selspot).blendmaskcol || blendmaskcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod = pe->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod || qualitycurveMethod->get_active_text() != M("GENERAL_UNCHANGED"); pe->locallab.spots.at(pp->locallab.selspot).showmaskcolMethod = pe->locallab.spots.at(pp->locallab.selspot).showmaskcolMethod || showmaskcolMethod->get_active_text() != M("GENERAL_UNCHANGED"); pe->locallab.spots.at(pp->locallab.selspot).llcurve = pe->locallab.spots.at(pp->locallab.selspot).llcurve || !llshape->isUnChanged(); @@ -1697,6 +1711,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).showmaskexpMethod = pe->locallab.spots.at(pp->locallab.selspot).showmaskexpMethod || showmaskexpMethod->get_active_text() != M("GENERAL_UNCHANGED"); pe->locallab.spots.at(pp->locallab.selspot).CCmaskexpcurve = pe->locallab.spots.at(pp->locallab.selspot).CCmaskexpcurve || !CCmaskexpshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).LLmaskexpcurve = pe->locallab.spots.at(pp->locallab.selspot).LLmaskexpcurve || !LLmaskexpshape->isUnChanged(); + pe->locallab.spots.at(pp->locallab.selspot).HHmaskexpcurve = pe->locallab.spots.at(pp->locallab.selspot).HHmaskexpcurve || !HHmaskexpshape->isUnChanged(); // Vibrance pe->locallab.spots.at(pp->locallab.selspot).expvibrance = pe->locallab.spots.at(pp->locallab.selspot).expvibrance || !expvibrance->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).saturated = pe->locallab.spots.at(pp->locallab.selspot).saturated || saturated->getEditedState(); @@ -1815,6 +1830,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).chroma = pedited->locallab.spots.at(pp->locallab.selspot).chroma || chroma->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).sensi = pedited->locallab.spots.at(pp->locallab.selspot).sensi || sensi->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).structcol = pedited->locallab.spots.at(pp->locallab.selspot).structcol || structcol->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).blendmaskcol = pedited->locallab.spots.at(pp->locallab.selspot).blendmaskcol || blendmaskcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod = pedited->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod || qualitycurveMethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->locallab.spots.at(pp->locallab.selspot).showmaskcolMethod = pedited->locallab.spots.at(pp->locallab.selspot).showmaskcolMethod || showmaskcolMethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->locallab.spots.at(pp->locallab.selspot).llcurve = pedited->locallab.spots.at(pp->locallab.selspot).llcurve || !llshape->isUnChanged(); @@ -1839,6 +1855,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).showmaskexpMethod = pedited->locallab.spots.at(pp->locallab.selspot).showmaskexpMethod || showmaskexpMethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->locallab.spots.at(pp->locallab.selspot).CCmaskexpcurve = pedited->locallab.spots.at(pp->locallab.selspot).CCmaskexpcurve || !CCmaskexpshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).LLmaskexpcurve = pedited->locallab.spots.at(pp->locallab.selspot).LLmaskexpcurve || !LLmaskexpshape->isUnChanged(); + pedited->locallab.spots.at(pp->locallab.selspot).HHmaskexpcurve = pedited->locallab.spots.at(pp->locallab.selspot).HHmaskexpcurve || !HHmaskexpshape->isUnChanged(); // Vibrance pedited->locallab.spots.at(pp->locallab.selspot).expvibrance = pedited->locallab.spots.at(pp->locallab.selspot).expvibrance || !expvibrance->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).saturated = pedited->locallab.spots.at(pp->locallab.selspot).saturated || saturated->getEditedState(); @@ -2088,7 +2105,12 @@ void Locallab::curveChanged(CurveEditor* ce) listener->panelChanged(EvlocallabLLmaskexpshape, M("HISTORY_CUSTOMCURVE")); } } - + + if (ce == HHmaskexpshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskexpshape, M("HISTORY_CUSTOMCURVE")); + } + } } // Vibrance @@ -2431,6 +2453,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chroma->setDefault((double)defSpot->chroma); sensi->setDefault((double)defSpot->sensi); structcol->setDefault((double)defSpot->structcol); + blendmaskcol->setDefault((double)defSpot->blendmaskcol); // Exposure expcomp->setDefault((double)defSpot->expcomp); hlcompr->setDefault((double)defSpot->hlcompr); @@ -2507,6 +2530,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chroma->setDefaultEditedState(Irrelevant); sensi->setDefaultEditedState(Irrelevant); structcol->setDefaultEditedState(Irrelevant); + blendmaskcol->setDefaultEditedState(Irrelevant); // Exposure expcomp->setDefaultEditedState(Irrelevant); hlcompr->setDefaultEditedState(Irrelevant); @@ -2587,6 +2611,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe chroma->setDefaultEditedState(defSpotState->chroma ? Edited : UnEdited); sensi->setDefaultEditedState(defSpotState->sensi ? Edited : UnEdited); structcol->setDefaultEditedState(defSpotState->structcol ? Edited : UnEdited); + blendmaskcol->setDefaultEditedState(defSpotState->blendmaskcol ? Edited : UnEdited); // Exposure expcomp->setDefaultEditedState(defSpotState->expcomp ? Edited : UnEdited); hlcompr->setDefaultEditedState(defSpotState->hlcompr ? Edited : UnEdited); @@ -2727,6 +2752,13 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) listener->panelChanged(Evlocallabstructcol, structcol->getTextValue()); } } + + if (a == blendmaskcol) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskcol, blendmaskcol->getTextValue()); + } + } + } // Exposure @@ -3174,6 +3206,7 @@ void Locallab::setBatchMode(bool batchMode) chroma->showEditedCB(); sensi->showEditedCB(); structcol->showEditedCB(); + blendmaskcol->showEditedCB(); // Exposure expcomp->showEditedCB(); hlcompr->showEditedCB(); @@ -3481,6 +3514,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chroma->setValue(pp->locallab.spots.at(index).chroma); sensi->setValue(pp->locallab.spots.at(index).sensi); structcol->setValue(pp->locallab.spots.at(index).structcol); + blendmaskcol->setValue(pp->locallab.spots.at(index).blendmaskcol); if (pp->locallab.spots.at(index).qualitycurveMethod == "none") { qualitycurveMethod->set_active(0); @@ -3544,6 +3578,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con } CCmaskexpshape->setCurve(pp->locallab.spots.at(index).CCmaskexpcurve); LLmaskexpshape->setCurve(pp->locallab.spots.at(index).LLmaskexpcurve); + HHmaskexpshape->setCurve(pp->locallab.spots.at(index).HHmaskexpcurve); // Vibrance expvibrance->setEnabled(pp->locallab.spots.at(index).expvibrance); @@ -3697,6 +3732,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con chroma->setEditedState(spotState->chroma ? Edited : UnEdited); sensi->setEditedState(spotState->sensi ? Edited : UnEdited); structcol->setEditedState(spotState->structcol ? Edited : UnEdited); + blendmaskcol->setEditedState(spotState->blendmaskcol ? Edited : UnEdited); if (!spotState->qualitycurveMethod) { qualitycurveMethod->set_active_text(M("GENERAL_UNCHANGED")); @@ -3730,6 +3766,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con } CCmaskexpshape->setUnChanged(!spotState->CCmaskexpcurve); LLmaskexpshape->setUnChanged(!spotState->LLmaskexpcurve); + HHmaskexpshape->setUnChanged(!spotState->HHmaskexpcurve); // Vibrance expvibrance->set_inconsistent(!spotState->expvibrance); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 134c55fff..9605464ee 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -79,6 +79,7 @@ private: DiagonalCurveEditor* shapeexpos; FlatCurveEditor* CCmaskexpshape; FlatCurveEditor* LLmaskexpshape; + FlatCurveEditor* HHmaskexpshape; // Vibrance CurveEditorGroup* const curveEditorGG; DiagonalCurveEditor* skinTonesCurve; @@ -93,6 +94,7 @@ private: Adjuster* const chroma; Adjuster* const sensi; Adjuster* const structcol; + Adjuster* const blendmaskcol; // Exposure Adjuster* const expcomp; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index d1c8dc4f5..00b05864f 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -949,6 +949,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).chroma = locallab.spots.at(j).chroma && pSpot.chroma == otherSpot.chroma; locallab.spots.at(j).sensi = locallab.spots.at(j).sensi && pSpot.sensi == otherSpot.sensi; locallab.spots.at(j).structcol = locallab.spots.at(j).structcol && pSpot.structcol == otherSpot.structcol; + locallab.spots.at(j).blendmaskcol = locallab.spots.at(j).blendmaskcol && pSpot.blendmaskcol == otherSpot.blendmaskcol; locallab.spots.at(j).qualitycurveMethod = locallab.spots.at(j).qualitycurveMethod && pSpot.qualitycurveMethod == otherSpot.qualitycurveMethod; locallab.spots.at(j).showmaskcolMethod = locallab.spots.at(j).showmaskcolMethod && pSpot.showmaskcolMethod == otherSpot.showmaskcolMethod; locallab.spots.at(j).llcurve = locallab.spots.at(j).llcurve && pSpot.llcurve == otherSpot.llcurve; @@ -973,6 +974,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).showmaskexpMethod = locallab.spots.at(j).showmaskexpMethod && pSpot.showmaskexpMethod == otherSpot.showmaskexpMethod; locallab.spots.at(j).CCmaskexpcurve = locallab.spots.at(j).CCmaskexpcurve && pSpot.CCmaskexpcurve == otherSpot.CCmaskexpcurve; locallab.spots.at(j).LLmaskexpcurve = locallab.spots.at(j).LLmaskexpcurve && pSpot.LLmaskexpcurve == otherSpot.LLmaskexpcurve; + locallab.spots.at(j).HHmaskexpcurve = locallab.spots.at(j).HHmaskexpcurve && pSpot.HHmaskexpcurve == otherSpot.HHmaskexpcurve; // Vibrance locallab.spots.at(j).expvibrance = locallab.spots.at(j).expvibrance && pSpot.expvibrance == otherSpot.expvibrance; locallab.spots.at(j).saturated = locallab.spots.at(j).saturated && pSpot.saturated == otherSpot.saturated; @@ -2581,6 +2583,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).structcol = mods.locallab.spots.at(i).structcol; } + if (locallab.spots.at(i).blendmaskcol) { + toEdit.locallab.spots.at(i).blendmaskcol = mods.locallab.spots.at(i).blendmaskcol; + } + if (locallab.spots.at(i).qualitycurveMethod) { toEdit.locallab.spots.at(i).qualitycurveMethod = mods.locallab.spots.at(i).qualitycurveMethod; } @@ -2674,6 +2680,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).LLmaskexpcurve = mods.locallab.spots.at(i).LLmaskexpcurve; } + if (locallab.spots.at(i).HHmaskexpcurve) { + toEdit.locallab.spots.at(i).HHmaskexpcurve = mods.locallab.spots.at(i).HHmaskexpcurve; + } + // Vibrance if (locallab.spots.at(i).expvibrance) { toEdit.locallab.spots.at(i).expvibrance = mods.locallab.spots.at(i).expvibrance; @@ -3926,6 +3936,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : chroma(v), sensi(v), structcol(v), + blendmaskcol(v), qualitycurveMethod(v), showmaskcolMethod(v), llcurve(v), @@ -3950,6 +3961,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : showmaskexpMethod(v), CCmaskexpcurve(v), LLmaskexpcurve(v), + HHmaskexpcurve(v), // Vibrance expvibrance(v), saturated(v), @@ -4060,6 +4072,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) chroma = v; sensi = v; structcol = v; + blendmaskcol = v; qualitycurveMethod = v; showmaskcolMethod = v; llcurve = v; @@ -4084,6 +4097,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) showmaskexpMethod = v; CCmaskexpcurve = v; LLmaskexpcurve = v; + HHmaskexpcurve = v; // Vibrance expvibrance = v; saturated = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 02a6302eb..126059cd7 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -488,6 +488,7 @@ public: bool chroma; bool sensi; bool structcol; + bool blendmaskcol; bool qualitycurveMethod; bool showmaskcolMethod; bool llcurve; @@ -512,6 +513,7 @@ public: bool showmaskexpMethod; bool CCmaskexpcurve; bool LLmaskexpcurve; + bool HHmaskexpcurve; // Vibrance bool expvibrance; bool saturated;