diff --git a/rtdata/languages/default b/rtdata/languages/default index 9f0ea686c..0e440cba7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1029,6 +1029,7 @@ HISTORY_MSG_788;Local - Equalizer detail HISTORY_MSG_789;Local - SH mask amount HISTORY_MSG_790;Local - SH mask anchor HISTORY_MSG_791;Local - Mask Short L curves +HISTORY_MSG_792;Local - Mask Luminance Background HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2326,6 +2327,7 @@ TP_LOCALLAB_SENSIBN;Scope TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. TP_LOCALLAB_SETTINGS;Settings TP_LOCALLAB_ENABLE_MASK;Enable mask +TP_LOCALLAB_LUMASK;Luminance Background Mask TP_LOCALLAB_SHORTC;Short Curves 'L' Mask TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7 TP_LOCALLAB_SHOWCB;2+ - Mask and modifications diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index d9c40be8a..36248536f 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -217,7 +217,7 @@ public: LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread, 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, float balance); + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float lumask); void filmGrain(Imagefloat *rgb, int isogr, int strengr, int scalegr, int bfw, int bfh); @@ -228,7 +228,7 @@ public: LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * transformed, bool retiMasktmap, bool retiMask, 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, float balance); + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float lumask); 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); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 541a7d6fa..8c8575fa3 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2708,7 +2708,7 @@ static void deltaEforLaplace(float *dE, const local_params& lp, int bfw, int bfh } -static void showmask(const local_params& lp, int xstart, int ystart, int cx, int cy, int bfw, int bfh, LabImage* bufexporig, LabImage* transformed, LabImage* bufmaskorigSH, int inv) +static void showmask(int lumask, const local_params& lp, int xstart, int ystart, int cx, int cy, int bfw, int bfh, LabImage* bufexporig, LabImage* transformed, LabImage* bufmaskorigSH, int inv) { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -2731,13 +2731,13 @@ static void showmask(const local_params& lp, int xstart, int ystart, int cx, int if (inv == 0) { if (zone > 0) {//normal - transformed->L[y + ystart][x + xstart] = 6000.f + CLIPLOC(bufmaskorigSH->L[y][x]); + transformed->L[y + ystart][x + xstart] = (lumask * 400.f) + CLIPLOC(bufmaskorigSH->L[y][x]); transformed->a[y + ystart][x + xstart] = bufexporig->a[y][x] * bufmaskorigSH->a[y][x]; transformed->b[y + ystart][x + xstart] = bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; } } else if (inv == 1) { //inverse if (zone == 0) { - transformed->L[y + ystart][x + xstart] = 6000.f + CLIPLOC(bufmaskorigSH->L[y][x]); + transformed->L[y + ystart][x + xstart] = (lumask * 400.f) + CLIPLOC(bufmaskorigSH->L[y][x]); transformed->a[y + ystart][x + xstart] = bufexporig->a[y][x] * bufmaskorigSH->a[y][x]; transformed->b[y + ystart][x + xstart] = bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; } @@ -7665,6 +7665,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o // float lap = params->locallab.spots.at(sp).lapmaskbl; bool pde = params->locallab.spots.at(sp).laplac; + float lumask = params->locallab.spots.at(sp).lumask; if (lap > 0.f && (lp.enablMask || lp.showmaskblmet == 3)) { float *datain = new float[GH * GW]; @@ -7726,7 +7727,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o blendmask(lp, 0, 0, cx, cy, GW, GH, bufgb.get(), original, bufmaskorigbl.get(), originalmaskbl, lp.blendmabl, invers); } else if (lp.showmaskblmet == 3) { - showmask(lp, 0, 0, cx, cy, GW, GH, bufgb.get(), transformed, bufmaskorigbl.get(), invers); + showmask(lumask, lp, 0, 0, cx, cy, GW, GH, bufgb.get(), transformed, bufmaskorigbl.get(), invers); return; } @@ -8236,6 +8237,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o LocwavCurve dummy; bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; + int lumask = params->locallab.spots.at(sp).lumask; int shado = 0; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; @@ -8255,7 +8257,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ); if (lp.showmaskcbmet == 3) { - showmask(lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); return; } @@ -8525,6 +8527,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float lap = params->locallab.spots.at(sp).lapmasktm; float pde = params->locallab.spots.at(sp).laplac; bool shortcu = params->locallab.spots.at(sp).shortc; + int lumask = params->locallab.spots.at(sp).lumask; if (!params->locallab.spots.at(sp).enatmMaskaft) { LocwavCurve dummy; @@ -8549,7 +8552,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ); if (lp.showmasktmmet == 3) { - showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); return; } @@ -8571,6 +8574,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; bool shortcu = params->locallab.spots.at(sp).shortc; + int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; @@ -8589,7 +8593,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ); if (lp.showmasktmmet == 3) {//dispaly mask - showmask(lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); return; } @@ -8769,6 +8773,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int shado = 0; float amountcd = params->locallab.spots.at(sp).fatamountSH; float anchorcd = params->locallab.spots.at(sp).fatanchorSH; + int lumask = params->locallab.spots.at(sp).lumask; 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, @@ -8778,7 +8783,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ); if (lp.showmaskSHmet == 3) { - showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); return; } @@ -8927,6 +8932,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int shado = 0; float amountcd = params->locallab.spots.at(sp).fatamountSH; float anchorcd = params->locallab.spots.at(sp).fatanchorSH; + int lumask = params->locallab.spots.at(sp).lumask; 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, @@ -8937,7 +8943,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (lp.showmaskSHmetinv == 1) { - showmask(lp, 0, 0, cx, cy, GW, GH, bufcolorig.get(), transformed, bufmaskblurcol.get(), inv); + showmask(lumask, lp, 0, 0, cx, cy, GW, GH, bufcolorig.get(), transformed, bufmaskblurcol.get(), inv); return; } @@ -9942,6 +9948,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o //for Retinex Mask are incorporated in MSR bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; + float lumask = params->locallab.spots.at(sp).lumask; + const int limscope2 = 80; const float mindE2 = 2.f + MINSCOPE * sco * lp.thr; const float maxdE2 = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); @@ -9953,7 +9961,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o lmaskretilocalcurve, localmaskretiutili, transformed, lp.enaretiMasktmap, lp.enaretiMask, delt, hueref, chromaref, lumaref, - maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance); + maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance, lumask); #ifdef _OPENMP #pragma omp parallel for #endif @@ -10086,7 +10094,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o lmaskretilocalcurve, localmaskretiutili, transformed, lp.enaretiMasktmap, lp.enaretiMask, false, 1.f, 1.f, 1.f, - 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 50, 1.f); + 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 50, 1.f, 15.f); } @@ -10464,6 +10472,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o //for Retinex Mask are incorporated in MSR bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; + float lumask = params->locallab.spots.at(sp).lumask; const int limscope2 = 80; const float mindE2 = 2.f + MINSCOPE * sco * lp.thr; @@ -10477,7 +10486,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o lmaskretilocalcurve, localmaskretiutili, transformed, lp.enaretiMasktmap, lp.enaretiMask, delt, hueref, chromaref, lumaref, - maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance); + maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance, lumask); #ifdef _OPENMP #pragma omp parallel for @@ -10624,7 +10633,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o lmaskretilocalcurve, localmaskretiutili, transformed, lp.enaretiMasktmap, lp.enaretiMask, false, 1.f, 1.f, 1.f, - 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 50, 1.f); + 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 50, 1.f, 15.f); } @@ -10939,6 +10948,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); float amountcd = 0.f; float anchorcd = 50.f; + int lumask = params->locallab.spots.at(sp).lumask; 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, @@ -10948,7 +10958,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ); if (lp.showmaskexpmet == 3) { - showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); return; } @@ -11215,6 +11225,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int sco = params->locallab.spots.at(sp).scopemask; int shado = 0; bool shortcu = params->locallab.spots.at(sp).shortc; + int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; @@ -11232,7 +11243,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ); if (lp.showmaskexpmetinv == 1) { - showmask(lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); + showmask(lumask, lp, 0, 0, cx, cy, GW, GH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); return; } @@ -11474,6 +11485,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); bool shortcu = params->locallab.spots.at(sp).shortc; + int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; @@ -11492,7 +11504,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o ); if (lp.showmaskcolmet == 3) { - showmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); return; } @@ -11698,6 +11710,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool delt = false; int sco = params->locallab.spots.at(sp).scopemask; bool shortcu = params->locallab.spots.at(sp).shortc; + int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; @@ -11717,7 +11730,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (lp.showmaskcolmetinv == 1) { - showmask(lp, 0, 0, cx, cy, GW, GH, bufcolorig.get(), transformed, bufmaskblurcol.get(), inv); + showmask(lumask, lp, 0, 0, cx, cy, GW, GH, bufcolorig.get(), transformed, bufmaskblurcol.get(), inv); return; } diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 20360b83f..f20136bd1 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -856,7 +856,7 @@ void ImProcFunctions::maskforretinex(int sp, int before, float ** luminance, flo LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread, 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, float balance) + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float lumask) { array2D loctemp(W_L, H_L); array2D ble(W_L, H_L); @@ -1123,7 +1123,7 @@ void ImProcFunctions::maskforretinex(int sp, int before, float ** luminance, flo for (int y = 0; y < H_L; y++) { for (int x = 0; x < W_L; x++) { - bufmask->L[y][x] = 6000.f + CLIPLOC(bufmaskorigreti->L[y][x]); + bufmask->L[y][x] = (lumask * 400.f) + CLIPLOC(bufmaskorigreti->L[y][x]); bufmask->a[y][x] = CLIPC(bufreti->a[y][x] * bufmaskorigreti->a[y][x]); bufmask->b[y][x] = CLIPC(bufreti->b[y][x] * bufmaskorigreti->b[y][x]); } @@ -1141,7 +1141,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, float** reducDE, LabI LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * transformed, bool retiMasktmap, bool retiMask, 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, float balance) + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float lumask) { BENCHFUN @@ -1679,7 +1679,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, float** reducDE, LabI lmaskretilocalcurve, localmaskretiutili, bufreti, bufmask, buforig, buforigmas, multiThread, delt, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance + maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance, lumask ); } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index d505eccde..14d485b17 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -818,6 +818,7 @@ enum ProcEventCode { EvlocallabfatamountSH = 788, EvlocallabfatanchorSH = 789, Evlocallabshortc = 790, + EvLocallabSpotlumask = 791, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index dedd32a62..e64dd6d44 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2436,6 +2436,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : deltae(true), shortc(false), scopemask(60), + lumask(10), // Color & Light expcolor(false), curvactiv(false), @@ -2740,6 +2741,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && deltae == other.deltae && shortc == other.shortc && scopemask == other.scopemask + && lumask == other.lumask // Color & Light && expcolor == other.expcolor && curvactiv == other.curvactiv @@ -4039,6 +4041,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).deltae, "Locallab", "Deltae_" + std::to_string(i), spot.deltae, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).shortc, "Locallab", "Shortc_" + std::to_string(i), spot.shortc, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).scopemask, "Locallab", "Scopemask_" + std::to_string(i), spot.scopemask, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lumask, "Locallab", "Lumask_" + std::to_string(i), spot.lumask, 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); @@ -5446,6 +5449,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Deltae_" + std::to_string(i), pedited, spot.deltae, spotEdited.deltae); assignFromKeyfile(keyFile, "Locallab", "Shortc_" + std::to_string(i), pedited, spot.shortc, spotEdited.shortc); assignFromKeyfile(keyFile, "Locallab", "Scopemask_" + std::to_string(i), pedited, spot.scopemask, spotEdited.scopemask); + assignFromKeyfile(keyFile, "Locallab", "Lumask_" + std::to_string(i), pedited, spot.lumask, spotEdited.lumask); // 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 c1640af2d..028df9df8 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -983,6 +983,7 @@ struct LocallabParams { bool deltae; bool shortc; int scopemask; + int lumask; // Color & Light bool expcolor; bool curvactiv; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index deac1037a..864be0054 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -817,7 +817,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // EvlocallabdetailSH LUMINANCECURVE, //EvlocallabfatamountSH LUMINANCECURVE, //EvlocallabfatanchorSH - LUMINANCECURVE //Evlocallabshortc + LUMINANCECURVE, //Evlocallabshortc + LUMINANCECURVE //EvLocallabSpotlumask }; namespace rtengine diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index 76c42dcfd..945a68fdf 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -69,6 +69,7 @@ ControlSpotPanel::ControlSpotPanel(): 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, 60))), + lumask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LUMASK"), 0, 30, 1, 10))), avoid_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AVOID")))), laplac_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LAPLACC")))), @@ -248,11 +249,13 @@ ControlSpotPanel::ControlSpotPanel(): 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")); +// if(showtooltip) lumask_->set_tooltip_text(M("TP_LOCALLAB_LUMASK_TOOLTIP")); if(showtooltip) shortc_->set_tooltip_text(M("TP_LOCALLAB_SHORTCMASK_TOOLTIP")); transit_->setAdjusterListener(this); transitweak_->setAdjusterListener(this); transitgrad_->setAdjusterListener(this); scopemask_->setAdjusterListener(this); + lumask_->setAdjusterListener(this); transitBox->pack_start(*transit_); transitBox->pack_start(*transitweak_); @@ -283,10 +286,9 @@ ControlSpotPanel::ControlSpotPanel(): 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()); - + maskBox->pack_start(*laplac_); laplacConn_ = laplac_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::laplacChanged)); - maskBox->pack_start(*laplac_); deltaeConn_ = deltae_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::deltaeChanged)); shortcConn_ = shortc_->signal_toggled().connect( @@ -294,6 +296,7 @@ ControlSpotPanel::ControlSpotPanel(): maskBox->pack_start(*deltae_); maskBox->pack_start(*scopemask_); maskBox->pack_start(*shortc_); + maskBox->pack_start(*lumask_); maskFrame->add(*maskBox); pack_start(*maskFrame); @@ -600,6 +603,7 @@ void ControlSpotPanel::load_ControlSpot_param() transitweak_->setValue((double)row[spots_.transitweak]); transitgrad_->setValue((double)row[spots_.transitgrad]); scopemask_->setValue((double)row[spots_.scopemask]); + lumask_->setValue((double)row[spots_.lumask]); avoid_->set_active(row[spots_.avoid]); laplac_->set_active(row[spots_.laplac]); deltae_->set_active(row[spots_.deltae]); @@ -1040,6 +1044,14 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } } + if (a == lumask_) { + row[spots_.lumask] = lumask_->getIntValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotlumask, lumask_->getTextValue()); + } + } + } void ControlSpotPanel::avoidChanged() @@ -1214,6 +1226,7 @@ void ControlSpotPanel::disableParamlistener(bool cond) transitweak_->block(cond); transitgrad_->block(cond); scopemask_->block(cond); + lumask_->block(cond); avoidConn_.block(cond); laplacConn_.block(cond); deltaeConn_.block(cond); @@ -1245,6 +1258,7 @@ void ControlSpotPanel::setParamEditable(bool cond) transitweak_->set_sensitive(cond); transitgrad_->set_sensitive(cond); scopemask_->set_sensitive(cond); + lumask_->set_sensitive(cond); avoid_->set_sensitive(cond); laplac_->set_sensitive(cond); deltae_->set_sensitive(cond); @@ -1882,6 +1896,7 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int id) r->transitweak = row[spots_.transitweak]; r->transitgrad = row[spots_.transitgrad]; r->scopemask = row[spots_.scopemask]; + r->lumask = row[spots_.lumask]; r->avoid = row[spots_.avoid]; r->laplac = row[spots_.laplac]; r->deltae = row[spots_.deltae]; @@ -2012,6 +2027,7 @@ void ControlSpotPanel::addControlSpot(SpotRow* newSpot) row[spots_.transitweak] = newSpot->transitweak; row[spots_.transitgrad] = newSpot->transitgrad; row[spots_.scopemask] = newSpot->scopemask; + row[spots_.lumask] = newSpot->lumask; row[spots_.avoid] = newSpot->avoid; row[spots_.laplac] = newSpot->laplac; row[spots_.deltae] = newSpot->deltae; @@ -2061,6 +2077,7 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot) row[spots_.transitweak] = spot->transitweak; row[spots_.transitgrad] = spot->transitgrad; row[spots_.scopemask] = spot->scopemask; + row[spots_.lumask] = spot->lumask; row[spots_.avoid] = spot->avoid; row[spots_.laplac] = spot->laplac; row[spots_.deltae] = spot->deltae; @@ -2156,6 +2173,7 @@ ControlSpotPanel::SpotEdited* ControlSpotPanel::getEditedStates() se->transitweak = transitweak_->getEditedState(); se->transitgrad = transitgrad_->getEditedState(); se->scopemask = scopemask_->getEditedState(); + se->lumask = lumask_->getEditedState(); se->avoid = !avoid_->get_inconsistent(); se->laplac = !laplac_->get_inconsistent(); se->deltae = !deltae_->get_inconsistent(); @@ -2229,6 +2247,7 @@ void ControlSpotPanel::setEditedStates(SpotEdited* se) transitweak_->setEditedState(se->transitweak ? Edited : UnEdited); transitgrad_->setEditedState(se->transitgrad ? Edited : UnEdited); scopemask_->setEditedState(se->scopemask ? Edited : UnEdited); + lumask_->setEditedState(se->lumask ? Edited : UnEdited); avoid_->set_inconsistent(multiImage && !se->avoid); laplac_->set_inconsistent(multiImage && !se->laplac); deltae_->set_inconsistent(multiImage && !se->deltae); @@ -2278,6 +2297,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP transitweak_->setDefault(defSpot->transitweak); transitgrad_->setDefault(defSpot->transitgrad); scopemask_->setDefault(defSpot->scopemask); + lumask_->setDefault(defSpot->lumask); // Set default edited states for adjusters if (!pedited) { @@ -2298,6 +2318,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP transitweak_->setDefaultEditedState(Irrelevant); transitgrad_->setDefaultEditedState(Irrelevant); scopemask_->setDefaultEditedState(Irrelevant); + lumask_->setDefaultEditedState(Irrelevant); } else { const LocallabParamsEdited::LocallabSpotEdited* defSpotState = new LocallabParamsEdited::LocallabSpotEdited(true); @@ -2322,6 +2343,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP transitweak_->setDefaultEditedState(defSpotState->transitweak ? Edited : UnEdited); transitgrad_->setDefaultEditedState(defSpotState->transitgrad ? Edited : UnEdited); scopemask_->setDefaultEditedState(defSpotState->scopemask ? Edited : UnEdited); + lumask_->setDefaultEditedState(defSpotState->lumask ? Edited : UnEdited); } } @@ -2347,6 +2369,7 @@ void ControlSpotPanel::setBatchMode(bool batchMode) transitweak_->showEditedCB(); transitgrad_->showEditedCB(); scopemask_->showEditedCB(); + lumask_->showEditedCB(); // Set batch mode for comboBoxText shape_->append(M("GENERAL_UNCHANGED")); @@ -2387,6 +2410,7 @@ ControlSpotPanel::ControlSpots::ControlSpots() add(transitweak); add(transitgrad); add(scopemask); + add(lumask); add(avoid); add(laplac); add(deltae); diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index 42edcf029..d21537221 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -66,6 +66,7 @@ public: double transitweak; double transitgrad; int scopemask; + int lumask; bool avoid; bool laplac; bool deltae; @@ -101,6 +102,7 @@ public: bool transitweak; bool transitgrad; bool scopemask; + bool lumask; bool avoid; bool laplac; bool deltae; @@ -321,6 +323,7 @@ private: Gtk::TreeModelColumn transitweak; Gtk::TreeModelColumn transitgrad; Gtk::TreeModelColumn scopemask; + Gtk::TreeModelColumn lumask; Gtk::TreeModelColumn avoid; Gtk::TreeModelColumn laplac; Gtk::TreeModelColumn deltae; @@ -389,6 +392,7 @@ private: Adjuster* const transitweak_; Adjuster* const transitgrad_; Adjuster* const scopemask_; + Adjuster* const lumask_; Gtk::CheckButton* const avoid_; sigc::connection avoidConn_; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 269581be0..e80014801 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -2870,6 +2870,7 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) 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->lumask = pp->locallab.spots.at(i).lumask; r->avoid = pp->locallab.spots.at(i).avoid; r->laplac = pp->locallab.spots.at(i).laplac; r->deltae = pp->locallab.spots.at(i).deltae; @@ -3001,6 +3002,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->transitweak = newSpot->transitweak; r->transitgrad = newSpot->transitgrad; r->scopemask = newSpot->scopemask; + r->lumask = newSpot->lumask; r->avoid = newSpot->avoid; r->laplac = newSpot->laplac; r->deltae = newSpot->deltae; @@ -3221,6 +3223,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->transitweak = newSpot->transitweak; r->transitgrad = newSpot->transitgrad; r->scopemask = newSpot->scopemask; + r->lumask = newSpot->lumask; r->avoid = newSpot->avoid; r->laplac = newSpot->laplac; r->deltae = newSpot->deltae; @@ -3339,6 +3342,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) 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).lumask = r->lumask; 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; @@ -3735,6 +3739,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) 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).lumask = pe->locallab.spots.at(pp->locallab.selspot).lumask || se->lumask; 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; @@ -4049,6 +4054,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) 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).lumask = pedited->locallab.spots.at(pp->locallab.selspot).lumask || se->lumask; 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; @@ -8746,6 +8752,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con se->transitweak = spotState->transitweak; se->transitgrad = spotState->transitgrad; se->scopemask = spotState->scopemask; + se->lumask = spotState->lumask; se->avoid = spotState->avoid; se->laplac = spotState->laplac; se->deltae = spotState->deltae; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 09dd743d2..52da49d30 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -977,6 +977,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).deltae = locallab.spots.at(j).deltae && pSpot.deltae == otherSpot.deltae; locallab.spots.at(j).shortc = locallab.spots.at(j).shortc && pSpot.shortc == otherSpot.shortc; locallab.spots.at(j).scopemask = locallab.spots.at(j).scopemask && pSpot.scopemask == otherSpot.scopemask; + locallab.spots.at(j).lumask = locallab.spots.at(j).lumask && pSpot.lumask == otherSpot.lumask; // 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; @@ -2807,6 +2808,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).scopemask = mods.locallab.spots.at(i).scopemask; } + if (locallab.spots.at(i).lumask) { + toEdit.locallab.spots.at(i).lumask = mods.locallab.spots.at(i).lumask; + } + if (locallab.spots.at(i).avoid) { toEdit.locallab.spots.at(i).avoid = mods.locallab.spots.at(i).avoid; } @@ -4858,6 +4863,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : deltae(v), shortc(v), scopemask(v), + lumask(v), // Color & Light expcolor(v), curvactiv(v), @@ -5159,6 +5165,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) deltae = v; shortc = v; scopemask = v; + lumask = v; // Color & Light expcolor = v; curvactiv = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index fc8417a30..bd27f5262 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -395,6 +395,7 @@ public: bool deltae; bool shortc; bool scopemask; + bool lumask; // Color & Light bool expcolor; bool curvactiv;