diff --git a/rtdata/languages/default b/rtdata/languages/default index 73cc79a89..0d0c2bd70 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1043,6 +1043,7 @@ HISTORY_MSG_802;Local - Contrast threshold HISTORY_MSG_803;Local - Color Merge HISTORY_MSG_804;Local - Color mask Structure HISTORY_MSG_805;Local - Blur Noise mask Structure +HISTORY_MSG_806;Local - Color mask Structure as tool HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2147,6 +2148,8 @@ TP_LOCALLAB_SHAMASKCOL;Shadows mask TP_LOCALLAB_STRUMASKCOL;Structure mask TP_LOCALLAB_HIGHMASKCOL;Highlights mask TP_LOCALLAB_LAPMASKCOL;Laplacian threshold mask +TP_LOCALLAB_TOOLMASK;Tools +TP_LOCALLAB_TOOLCOL;Structure mask as tool TP_LOCALLAB_LUMADARKEST;Darkest TP_LOCALLAB_LUMAWHITESEST;Whiteest TP_LOCALLAB_SH1;Shadows Highlights @@ -2188,7 +2191,7 @@ TP_LOCALLAB_MERNIN;Screen TP_LOCALLAB_MERTEN;Darken only TP_LOCALLAB_MERELE;Lighten only TP_LOCALLAB_MERTWE;Exclusion -TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and contrast curves and levels contrasts curves are used.\nDisabled in Inverse +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and contrast curves and levels contrasts curves and structure mask (if enabled tool) are used.\nDisabled in Inverse TP_LOCALLAB_WAMASKCOL;Mask Wavelet level TP_LOCALLAB_CSTHRESHOLDBLUR;Mask Wavelet level TP_LOCALLAB_LAPLACC;Mask Laplacian solve PDE diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 12f8e1051..2c980be49 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -216,7 +216,7 @@ public: int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/); //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, int inv, const struct local_params & lp, - float strumask, + float strumask, bool astool, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 168d0df09..32fa04a94 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -3184,7 +3184,7 @@ 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, int inv, const struct local_params & lp, - float strumask, + float strumask, bool astool, const LocCCmaskCurve & locccmasCurve, bool & lcmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, @@ -3271,7 +3271,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int float kmaskH = 0.f; float kmasstru = 0.f; - if(strumask > 0.f){ + if(strumask > 0.f && !astool){ kmasstru = bufcolorig->L[ir][jr]* blendstru[ir][jr]; } @@ -3329,6 +3329,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int bufprov->CopyFrom(bufmaskblurcol); + if (rad > 0.f) { guidedFilter(guid, ble, ble, rad * 10.f / sk, 0.001, multiThread, 4); } @@ -3346,6 +3347,19 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int } } + if(strumask > 0.f && astool){ + +#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] *= blendstru[ir][jr]; + } + } + + } if (lmasklocalcurve && localmaskutili) { #ifdef _OPENMP @@ -7608,8 +7622,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } bool blurz = false; + bool delt = params->locallab.spots.at(sp).deltae; - if (((radius > 1.5 * GAUSS_SKIP) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 1 || lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.blurena) { + if (((radius > 1.5 * GAUSS_SKIP) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 1 || lp.showmaskblmet == 2 || delt || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.blurena) { blurz = true; } @@ -7620,7 +7635,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o std::unique_ptr bufmaskorigbl; std::unique_ptr bufmaskblurbl; std::unique_ptr bufgb; - std::unique_ptr bufprov; + std::unique_ptr bufprov(new LabImage(GW, GH)); if (denoiz || blurz || lp.denoiena || lp.blurena) { bufgb.reset(new LabImage(GW, GH)); @@ -7628,7 +7643,6 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { bufmaskorigbl.reset(new LabImage(GW, GH)); bufmaskblurbl.reset(new LabImage(GW, GH)); - bufprov.reset(new LabImage(GW, GH)); originalmaskbl = new LabImage(GW, GH); } @@ -7720,12 +7734,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o Color::Lab2XYZ(L, a, b, X, Y, Z); guid[ir][jr] = Y / 32768.f; - - bufprov->L[ir][jr] = bufmaskblurbl->L[ir][jr]; - bufprov->a[ir][jr] = bufmaskblurbl->a[ir][jr]; - bufprov->b[ir][jr] = bufmaskblurbl->b[ir][jr]; } } + std::unique_ptr bufprov(new LabImage(GW, GH)); + + bufprov->CopyFrom(bufmaskblurbl.get()); if (lp.radmabl > 0.f) { @@ -7806,20 +7819,20 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o } // deltae Mask with scope - bool delt = params->locallab.spots.at(sp).deltae; + // bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); - + //printf("minde=%f maxde=%f, scopee=%i huref=%f lumaref=%f chromaref=%f\n", mindE, maxdE, sco, hueref, lumaref, chromaref); if (delt && lp.blurmet == 0 && (lp.enablMask || lp.showmaskblmet == 3)) { std::unique_ptr> rdEBuffer(new JaggedArray(GW, GH)); float** rdE = *(rdEBuffer.get()); deltaEforMask(rdE, GW, GH, bufgb.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.balance); - // printf("rde1=%f rde2=%f\n", rdE[1][1], rdE[100][100]); +// printf("rde1=%f rde2=%f\n", rdE[1][1], rdE[100][100]); std::unique_ptr delta(new LabImage(GW, GH)); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -8453,7 +8466,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int shortcu = 0; //lp.mergemet; //params->locallab.spots.at(sp).shortc; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, inv, lp, - 0.f, + 0.f, false, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, @@ -8762,7 +8775,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, - 0.f, + 0.f, false, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, @@ -8804,7 +8817,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float anchorcd = 50.f; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, - 0.f, + 0.f, false, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, @@ -9007,7 +9020,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o 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, - 0.f, + 0.f, false, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, @@ -9159,7 +9172,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o 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, - 0.f, + 0.f, false, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, @@ -11233,7 +11246,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o 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, - 0.f, + 0.f, false, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, @@ -11526,7 +11539,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float anchorcd = 50.f; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, - 0.f, + 0.f, false, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, @@ -11790,6 +11803,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float pde = params->locallab.spots.at(sp).laplac; int shado = params->locallab.spots.at(sp).shadmaskcol; bool delt = params->locallab.spots.at(sp).deltae; + bool astool = params->locallab.spots.at(sp).toolcol; int sco = params->locallab.spots.at(sp).scopemask; int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); @@ -11821,7 +11835,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o // if (lp.mergemet != 2) { maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, - strumask, + strumask, astool, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, @@ -12590,6 +12604,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); // bool delt = params->locallab.spots.at(sp).deltae; bool delt = false; + bool astool = params->locallab.spots.at(sp).toolcol; int sco = params->locallab.spots.at(sp).scopemask; int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; int lumask = params->locallab.spots.at(sp).lumask; @@ -12604,7 +12619,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float anchorcd = 50.f; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, - strumask, + strumask, astool, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, multiThread, enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, shado, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, diff --git a/rtengine/procevents.h b/rtengine/procevents.h index a18087bab..8f4fef99b 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -829,6 +829,7 @@ enum ProcEventCode { EvLocallabmerMethod = 802, Evlocallabstrumaskcol = 803, Evlocallabstrumaskbl = 804, + EvLocallabtoolcol = 805, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 23ffe5cd9..37b076d72 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2477,6 +2477,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : HHcurve{(double)FCT_MinMaxCPoints, 0.0, 0.50, 0.35, 0.35, 0.166, 0.50, 0.35, 0.35, 0.333, 0.50, 0.35, 0.35, 0.50, 0.50, 0.35, 0.35, 0.666, 0.50, 0.35, 0.35, 0.833, 0.50, 0.35, 0.35}, invers(false), special(false), + toolcol(true), enaColorMask(false), CCmaskcurve{(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 }, 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 }, @@ -2795,6 +2796,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && HHcurve == other.HHcurve && invers == other.invers && special == other.special + && toolcol == other.toolcol && enaColorMask == other.enaColorMask && CCmaskcurve == other.CCmaskcurve && LLmaskcurve == other.LLmaskcurve @@ -4110,6 +4112,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).HHcurve, "Locallab", "HHCurve_" + std::to_string(i), spot.HHcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).invers, "Locallab", "Invers_" + std::to_string(i), spot.invers, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).special, "Locallab", "Special_" + std::to_string(i), spot.special, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).toolcol, "Locallab", "Toolcol_" + std::to_string(i), spot.toolcol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).enaColorMask, "Locallab", "EnaColorMask_" + std::to_string(i), spot.enaColorMask, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).CCmaskcurve, "Locallab", "CCmaskCurve_" + std::to_string(i), spot.CCmaskcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmaskcurve, "Locallab", "LLmaskCurve_" + std::to_string(i), spot.LLmaskcurve, keyFile); @@ -5531,6 +5534,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "HHCurve_" + std::to_string(i), pedited, spot.HHcurve, spotEdited.HHcurve); assignFromKeyfile(keyFile, "Locallab", "Invers_" + std::to_string(i), pedited, spot.invers, spotEdited.invers); assignFromKeyfile(keyFile, "Locallab", "Special_" + std::to_string(i), pedited, spot.special, spotEdited.special); + assignFromKeyfile(keyFile, "Locallab", "Toolcol_" + std::to_string(i), pedited, spot.toolcol, spotEdited.toolcol); assignFromKeyfile(keyFile, "Locallab", "EnaColorMask_" + std::to_string(i), pedited, spot.enaColorMask, spotEdited.enaColorMask); assignFromKeyfile(keyFile, "Locallab", "CCmaskCurve_" + std::to_string(i), pedited, spot.CCmaskcurve, spotEdited.CCmaskcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskCurve_" + std::to_string(i), pedited, spot.LLmaskcurve, spotEdited.LLmaskcurve); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index bdc40c657..a24698126 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1021,6 +1021,7 @@ struct LocallabParams { std::vector HHcurve; bool invers; bool special; + bool toolcol; bool enaColorMask; std::vector CCmaskcurve; std::vector LLmaskcurve; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 0b7245c8a..b97ff3058 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -832,7 +832,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvLocallabconthrcol LUMINANCECURVE, //EvLocallabmerMethod LUMINANCECURVE, //EvLocallabstrumaskcol - LUMINANCECURVE //EvLocallabstrumaskbl + LUMINANCECURVE, //EvLocallabstrumaskbl + LUMINANCECURVE // EvLocallabtoolcol }; namespace rtengine diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 8a9f27add..a4a2d5d04 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -471,6 +471,7 @@ detailthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILTHR"), 0, 100, 1, 0))), curvactiv(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_CURV")))), invers(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), special(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SPECIAL")))), +toolcol(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TOOLCOL")))), enaColorMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), // Exposure enaExpMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), @@ -556,6 +557,7 @@ lumacontrastMinusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACO lumaneutralButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMANEUTRAL")))), lumacontrastPlusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS")))), gridFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRID")))), +toolcolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), mergecolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGECOLFRA")))), merge1colFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGE1COLFRA")))), pdeFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PDEFRA")))), @@ -776,6 +778,7 @@ pe(nullptr) inversConn = invers->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::inversChanged)); specialConn = special->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::specialChanged)); + toolcolConn = toolcol->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::toolcolChanged)); mergecolMethod->append(M("TP_LOCALLAB_MERONE")); @@ -943,17 +946,24 @@ pe(nullptr) maskcolBox->pack_start(*enaColorMask, Gtk::PACK_SHRINK, 0); maskcolBox->pack_start(*maskCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor maskcolBox->pack_start(*strumaskcol, Gtk::PACK_SHRINK, 0); + maskcolBox->pack_start(*toolcol); + maskcolBox->pack_start(*separatorstru, Gtk::PACK_SHRINK, 2); + toolcolFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const toolcolBox = Gtk::manage(new ToolParamBlock()); + maskcolBox->pack_start(*blendmaskcol, Gtk::PACK_SHRINK, 0); - maskcolBox->pack_start(*radmaskcol, Gtk::PACK_SHRINK, 0); - maskcolBox->pack_start(*lapmaskcol, Gtk::PACK_SHRINK, 0); - 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(*shadmaskcol, Gtk::PACK_SHRINK, 0); - maskcolBox->pack_start(*mask2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor - maskcolBox->pack_start(*mask2CurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor - maskcolBox->pack_start(*csThresholdcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*radmaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*lapmaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*chromaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*gammaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*slomaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*shadmaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*mask2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolcolBox->pack_start(*mask2CurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolcolBox->pack_start(*csThresholdcol, Gtk::PACK_SHRINK, 0); + toolcolFrame->add(*toolcolBox); + maskcolBox->pack_start(*toolcolFrame); mergecolFrame->add(*maskcolBox); ToolParamBlock* const mask7Box = Gtk::manage(new ToolParamBlock()); @@ -3694,6 +3704,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).HHcurve = HHshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).invers = invers->get_active(); pp->locallab.spots.at(pp->locallab.selspot).special = special->get_active(); + pp->locallab.spots.at(pp->locallab.selspot).toolcol = toolcol->get_active(); pp->locallab.spots.at(pp->locallab.selspot).enaColorMask = enaColorMask->get_active(); pp->locallab.spots.at(pp->locallab.selspot).CCmaskcurve = CCmaskshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).LLmaskcurve = LLmaskshape->getCurve(); @@ -4090,6 +4101,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).HHcurve = pe->locallab.spots.at(pp->locallab.selspot).HHcurve || !HHshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).invers = pe->locallab.spots.at(pp->locallab.selspot).invers || !invers->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).special = pe->locallab.spots.at(pp->locallab.selspot).special || !special->get_inconsistent(); + pe->locallab.spots.at(pp->locallab.selspot).toolcol = pe->locallab.spots.at(pp->locallab.selspot).toolcol || !toolcol->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).enaColorMask = pe->locallab.spots.at(pp->locallab.selspot).enaColorMask || !enaColorMask->get_inconsistent(); pe->locallab.spots.at(pp->locallab.selspot).CCmaskcurve = pe->locallab.spots.at(pp->locallab.selspot).CCmaskcurve || !CCmaskshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).LLmaskcurve = pe->locallab.spots.at(pp->locallab.selspot).LLmaskcurve || !LLmaskshape->isUnChanged(); @@ -4418,6 +4430,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).HHcurve = pedited->locallab.spots.at(pp->locallab.selspot).HHcurve || !HHshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).invers = pedited->locallab.spots.at(pp->locallab.selspot).invers || !invers->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).special = pedited->locallab.spots.at(pp->locallab.selspot).special || !special->get_inconsistent(); + pedited->locallab.spots.at(pp->locallab.selspot).toolcol = pedited->locallab.spots.at(pp->locallab.selspot).toolcol || !toolcol->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).enaColorMask = pedited->locallab.spots.at(pp->locallab.selspot).enaColorMask || !enaColorMask->get_inconsistent(); pedited->locallab.spots.at(pp->locallab.selspot).CCmaskcurve = pedited->locallab.spots.at(pp->locallab.selspot).CCmaskcurve || !CCmaskshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcurve = pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcurve || !LLmaskshape->isUnChanged(); @@ -5684,6 +5697,29 @@ void Locallab::specialChanged() } } +void Locallab::toolcolChanged() +{ + + if (multiImage) { + if (toolcol->get_inconsistent()) { + toolcol->set_inconsistent(false); + toolcolConn.block(true); + toolcol->set_active(false); + toolcolConn.block(false); + } + } + + if (getEnabled() && expcolor->getEnabled()) { + if (listener) { + if (toolcol->get_active()) { + listener->panelChanged(EvLocallabtoolcol, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvLocallabtoolcol, M("GENERAL_DISABLED")); + } + } + } +} + void Locallab::enaColorMaskChanged() { // printf("enaColorMaskChanged\n"); @@ -8681,6 +8717,7 @@ void Locallab::enableListener() mergecolMethodConn.block(false); inversConn.block(false); specialConn.block(false); + toolcolConn.block(false); showmaskcolMethodConn.block(false); showmaskcolMethodConninv.block(false); enaColorMaskConn.block(false); @@ -8765,6 +8802,7 @@ void Locallab::disableListener() mergecolMethodConn.block(true); inversConn.block(true); specialConn.block(true); + toolcolConn.block(true); showmaskcolMethodConn.block(true); showmaskcolMethodConninv.block(true); enaColorMaskConn.block(true); @@ -8932,6 +8970,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con HHshape->setCurve(pp->locallab.spots.at(index).HHcurve); invers->set_active(pp->locallab.spots.at(index).invers); special->set_active(pp->locallab.spots.at(index).special); + toolcol->set_active(pp->locallab.spots.at(index).toolcol); enaColorMask->set_active(pp->locallab.spots.at(index).enaColorMask); CCmaskshape->setCurve(pp->locallab.spots.at(index).CCmaskcurve); LLmaskshape->setCurve(pp->locallab.spots.at(index).LLmaskcurve); @@ -9362,6 +9401,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con HHshape->setUnChanged(!spotState->HHcurve); invers->set_inconsistent(multiImage && !spotState->invers); special->set_inconsistent(multiImage && !spotState->special); + toolcol->set_inconsistent(multiImage && !spotState->toolcol); enaColorMask->set_inconsistent(multiImage && !spotState->enaColorMask); CCmaskshape->setUnChanged(!spotState->CCmaskcurve); LLmaskshape->setUnChanged(!spotState->LLmaskcurve); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 4203ce1c9..88504a0d4 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -337,8 +337,9 @@ private: Gtk::CheckButton* const curvactiv; Gtk::CheckButton* const invers; Gtk::CheckButton* const special; + Gtk::CheckButton* const toolcol; Gtk::CheckButton* const enaColorMask; - sigc::connection curvactivConn, inversConn, enaColorMaskConn, specialConn; + sigc::connection curvactivConn, inversConn, enaColorMaskConn, specialConn, toolcolConn; // Exposure Gtk::CheckButton* const enaExpMask; sigc::connection enaExpMaskConn; @@ -472,6 +473,7 @@ private: Gtk::Button* const lumacontrastPlusButton; sigc::connection lumacontrastMinusPressedConn, lumaneutralPressedConn, lumacontrastPlusPressedConn; Gtk::Frame* const gridFrame; + Gtk::Frame* const toolcolFrame; Gtk::Frame* const mergecolFrame; Gtk::Frame* const merge1colFrame; Gtk::Frame* const pdeFrame; @@ -527,6 +529,7 @@ private: void curvactivChanged(); void inversChanged(); void specialChanged(); + void toolcolChanged(); void enaColorMaskChanged(); // Exposure void enaExpMaskChanged(); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index b9db8ce52..36e584b7d 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1013,6 +1013,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).HHcurve = locallab.spots.at(j).HHcurve && pSpot.HHcurve == otherSpot.HHcurve; locallab.spots.at(j).invers = locallab.spots.at(j).invers && pSpot.invers == otherSpot.invers; locallab.spots.at(j).special = locallab.spots.at(j).special && pSpot.special == otherSpot.special; + locallab.spots.at(j).toolcol = locallab.spots.at(j).toolcol && pSpot.toolcol == otherSpot.toolcol; locallab.spots.at(j).enaColorMask = locallab.spots.at(j).enaColorMask && pSpot.enaColorMask == otherSpot.enaColorMask; locallab.spots.at(j).CCmaskcurve = locallab.spots.at(j).CCmaskcurve && pSpot.CCmaskcurve == otherSpot.CCmaskcurve; locallab.spots.at(j).LLmaskcurve = locallab.spots.at(j).LLmaskcurve && pSpot.LLmaskcurve == otherSpot.LLmaskcurve; @@ -2981,6 +2982,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).special = mods.locallab.spots.at(i).special; } + if (locallab.spots.at(i).toolcol) { + toEdit.locallab.spots.at(i).toolcol = mods.locallab.spots.at(i).toolcol; + } + if (locallab.spots.at(i).enaColorMask) { toEdit.locallab.spots.at(i).enaColorMask = mods.locallab.spots.at(i).enaColorMask; } @@ -4966,6 +4971,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : HHcurve(v), invers(v), special(v), + toolcol(v), enaColorMask(v), CCmaskcurve(v), LLmaskcurve(v), @@ -5282,6 +5288,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) HHcurve = v; invers = v; special = v; + toolcol = v; enaColorMask = v; CCmaskcurve = v; LLmaskcurve = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 86e2b64d9..bff366ba1 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -444,6 +444,7 @@ public: bool HHcurve; bool invers; bool special; + bool toolcol; bool enaColorMask; bool CCmaskcurve; bool LLmaskcurve;