Improvment mask color - structure as tool

This commit is contained in:
Desmis 2019-11-12 12:32:06 +01:00
parent 61e2e1c4a1
commit a1d17b3090
11 changed files with 110 additions and 34 deletions

View File

@ -1043,6 +1043,7 @@ HISTORY_MSG_802;Local - Contrast threshold
HISTORY_MSG_803;Local - Color Merge HISTORY_MSG_803;Local - Color Merge
HISTORY_MSG_804;Local - Color mask Structure HISTORY_MSG_804;Local - Color mask Structure
HISTORY_MSG_805;Local - Blur Noise 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_CLAMPOOG;Clip out-of-gamut colors
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
HISTORY_MSG_COLORTONING_LABREGION_AB;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_STRUMASKCOL;Structure mask
TP_LOCALLAB_HIGHMASKCOL;Highlights mask TP_LOCALLAB_HIGHMASKCOL;Highlights mask
TP_LOCALLAB_LAPMASKCOL;Laplacian threshold mask TP_LOCALLAB_LAPMASKCOL;Laplacian threshold mask
TP_LOCALLAB_TOOLMASK;Tools
TP_LOCALLAB_TOOLCOL;Structure mask as tool
TP_LOCALLAB_LUMADARKEST;Darkest TP_LOCALLAB_LUMADARKEST;Darkest
TP_LOCALLAB_LUMAWHITESEST;Whiteest TP_LOCALLAB_LUMAWHITESEST;Whiteest
TP_LOCALLAB_SH1;Shadows Highlights TP_LOCALLAB_SH1;Shadows Highlights
@ -2188,7 +2191,7 @@ TP_LOCALLAB_MERNIN;Screen
TP_LOCALLAB_MERTEN;Darken only TP_LOCALLAB_MERTEN;Darken only
TP_LOCALLAB_MERELE;Lighten only TP_LOCALLAB_MERELE;Lighten only
TP_LOCALLAB_MERTWE;Exclusion 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_WAMASKCOL;Mask Wavelet level
TP_LOCALLAB_CSTHRESHOLDBLUR;Mask Wavelet level TP_LOCALLAB_CSTHRESHOLDBLUR;Mask Wavelet level
TP_LOCALLAB_LAPLACC;Mask Laplacian solve PDE TP_LOCALLAB_LAPLACC;Mask Laplacian solve PDE

View File

@ -216,7 +216,7 @@ public:
int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/); int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/);
//locallab //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, 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 LocCCmaskCurve & locccmasCurve, bool & lcmasutili,
const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili,
const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili,

View File

@ -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, 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 LocCCmaskCurve & locccmasCurve, bool & lcmasutili,
const LocLLmaskCurve & locllmasCurve, bool & llmasutili, const LocLLmaskCurve & locllmasCurve, bool & llmasutili,
const LocHHmaskCurve & lochhmasCurve, bool &lhmasutili, 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 kmaskH = 0.f;
float kmasstru = 0.f; float kmasstru = 0.f;
if(strumask > 0.f){ if(strumask > 0.f && !astool){
kmasstru = bufcolorig->L[ir][jr]* blendstru[ir][jr]; 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); bufprov->CopyFrom(bufmaskblurcol);
if (rad > 0.f) { if (rad > 0.f) {
guidedFilter(guid, ble, ble, rad * 10.f / sk, 0.001, multiThread, 4); 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) { if (lmasklocalcurve && localmaskutili) {
#ifdef _OPENMP #ifdef _OPENMP
@ -7608,8 +7622,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
} }
bool blurz = false; 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; blurz = true;
} }
@ -7620,7 +7635,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o
std::unique_ptr<LabImage> bufmaskorigbl; std::unique_ptr<LabImage> bufmaskorigbl;
std::unique_ptr<LabImage> bufmaskblurbl; std::unique_ptr<LabImage> bufmaskblurbl;
std::unique_ptr<LabImage> bufgb; std::unique_ptr<LabImage> bufgb;
std::unique_ptr<LabImage> bufprov; std::unique_ptr<LabImage> bufprov(new LabImage(GW, GH));
if (denoiz || blurz || lp.denoiena || lp.blurena) { if (denoiz || blurz || lp.denoiena || lp.blurena) {
bufgb.reset(new LabImage(GW, GH)); 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) { if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) {
bufmaskorigbl.reset(new LabImage(GW, GH)); bufmaskorigbl.reset(new LabImage(GW, GH));
bufmaskblurbl.reset(new LabImage(GW, GH)); bufmaskblurbl.reset(new LabImage(GW, GH));
bufprov.reset(new LabImage(GW, GH));
originalmaskbl = 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); Color::Lab2XYZ(L, a, b, X, Y, Z);
guid[ir][jr] = Y / 32768.f; 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<LabImage> bufprov(new LabImage(GW, GH));
bufprov->CopyFrom(bufmaskblurbl.get());
if (lp.radmabl > 0.f) { 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 // 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; int sco = params->locallab.spots.at(sp).scopemask;
const int limscope = 80; const int limscope = 80;
const float mindE = 2.f + MINSCOPE * sco * lp.thr; const float mindE = 2.f + MINSCOPE * sco * lp.thr;
const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * 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 mindElim = 2.f + MINSCOPE * limscope * lp.thr;
const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * 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)) { if (delt && lp.blurmet == 0 && (lp.enablMask || lp.showmaskblmet == 3)) {
std::unique_ptr<JaggedArray<float>> rdEBuffer(new JaggedArray<float>(GW, GH)); std::unique_ptr<JaggedArray<float>> rdEBuffer(new JaggedArray<float>(GW, GH));
float** rdE = *(rdEBuffer.get()); float** rdE = *(rdEBuffer.get());
deltaEforMask(rdE, GW, GH, bufgb.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.balance); 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<LabImage> delta(new LabImage(GW, GH)); std::unique_ptr<LabImage> delta(new LabImage(GW, GH));
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #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; 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, 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, 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, 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, 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; float anchorcd = 50.f;
maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, 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, 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, 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, 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; float anchorcd = 50.f;
maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, inv, lp, 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, 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, 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, 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; 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, 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, 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, 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, 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; 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, 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, 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, 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, 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; 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, 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, 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, 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, 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; float anchorcd = 50.f;
maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, inv, lp, 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, 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, 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, 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; float pde = params->locallab.spots.at(sp).laplac;
int shado = params->locallab.spots.at(sp).shadmaskcol; int shado = params->locallab.spots.at(sp).shadmaskcol;
bool delt = params->locallab.spots.at(sp).deltae; 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 sco = params->locallab.spots.at(sp).scopemask;
int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft();
int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); 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) { // if (lp.mergemet != 2) {
maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, 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, 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, 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, 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(); int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight();
// bool delt = params->locallab.spots.at(sp).deltae; // bool delt = params->locallab.spots.at(sp).deltae;
bool delt = false; bool delt = false;
bool astool = params->locallab.spots.at(sp).toolcol;
int sco = params->locallab.spots.at(sp).scopemask; int sco = params->locallab.spots.at(sp).scopemask;
int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc;
int lumask = params->locallab.spots.at(sp).lumask; 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; float anchorcd = 50.f;
maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, inv, lp, 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, 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, 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, level_bl, level_hl, level_br, level_hr,

View File

@ -829,6 +829,7 @@ enum ProcEventCode {
EvLocallabmerMethod = 802, EvLocallabmerMethod = 802,
Evlocallabstrumaskcol = 803, Evlocallabstrumaskcol = 803,
Evlocallabstrumaskbl = 804, Evlocallabstrumaskbl = 804,
EvLocallabtoolcol = 805,
NUMOFEVENTS NUMOFEVENTS
}; };

View File

@ -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}, 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), invers(false),
special(false), special(false),
toolcol(true),
enaColorMask(false), 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 }, 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 }, 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 && HHcurve == other.HHcurve
&& invers == other.invers && invers == other.invers
&& special == other.special && special == other.special
&& toolcol == other.toolcol
&& enaColorMask == other.enaColorMask && enaColorMask == other.enaColorMask
&& CCmaskcurve == other.CCmaskcurve && CCmaskcurve == other.CCmaskcurve
&& LLmaskcurve == other.LLmaskcurve && 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).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).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).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).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).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); 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", "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", "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", "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", "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", "CCmaskCurve_" + std::to_string(i), pedited, spot.CCmaskcurve, spotEdited.CCmaskcurve);
assignFromKeyfile(keyFile, "Locallab", "LLmaskCurve_" + std::to_string(i), pedited, spot.LLmaskcurve, spotEdited.LLmaskcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskCurve_" + std::to_string(i), pedited, spot.LLmaskcurve, spotEdited.LLmaskcurve);

View File

@ -1021,6 +1021,7 @@ struct LocallabParams {
std::vector<double> HHcurve; std::vector<double> HHcurve;
bool invers; bool invers;
bool special; bool special;
bool toolcol;
bool enaColorMask; bool enaColorMask;
std::vector<double> CCmaskcurve; std::vector<double> CCmaskcurve;
std::vector<double> LLmaskcurve; std::vector<double> LLmaskcurve;

View File

@ -832,7 +832,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
LUMINANCECURVE, //EvLocallabconthrcol LUMINANCECURVE, //EvLocallabconthrcol
LUMINANCECURVE, //EvLocallabmerMethod LUMINANCECURVE, //EvLocallabmerMethod
LUMINANCECURVE, //EvLocallabstrumaskcol LUMINANCECURVE, //EvLocallabstrumaskcol
LUMINANCECURVE //EvLocallabstrumaskbl LUMINANCECURVE, //EvLocallabstrumaskbl
LUMINANCECURVE // EvLocallabtoolcol
}; };
namespace rtengine namespace rtengine

View File

@ -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")))), curvactiv(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_CURV")))),
invers(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), invers(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))),
special(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SPECIAL")))), 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")))), enaColorMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))),
// Exposure // Exposure
enaExpMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), 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")))), lumaneutralButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMANEUTRAL")))),
lumacontrastPlusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS")))), lumacontrastPlusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS")))),
gridFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRID")))), 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")))), mergecolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGECOLFRA")))),
merge1colFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGE1COLFRA")))), merge1colFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGE1COLFRA")))),
pdeFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PDEFRA")))), 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)); inversConn = invers->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::inversChanged));
specialConn = special->signal_toggled().connect(sigc::mem_fun(*this, &Locallab::specialChanged)); 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")); mergecolMethod->append(M("TP_LOCALLAB_MERONE"));
@ -943,17 +946,24 @@ pe(nullptr)
maskcolBox->pack_start(*enaColorMask, Gtk::PACK_SHRINK, 0); 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(*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(*strumaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*toolcol);
maskcolBox->pack_start(*separatorstru, Gtk::PACK_SHRINK, 2); 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(*blendmaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*radmaskcol, Gtk::PACK_SHRINK, 0); toolcolBox->pack_start(*radmaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*lapmaskcol, Gtk::PACK_SHRINK, 0); toolcolBox->pack_start(*lapmaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*chromaskcol, Gtk::PACK_SHRINK, 0); toolcolBox->pack_start(*chromaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*gammaskcol, Gtk::PACK_SHRINK, 0); toolcolBox->pack_start(*gammaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*slomaskcol, Gtk::PACK_SHRINK, 0); toolcolBox->pack_start(*slomaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*shadmaskcol, Gtk::PACK_SHRINK, 0); toolcolBox->pack_start(*shadmaskcol, Gtk::PACK_SHRINK, 0);
maskcolBox->pack_start(*mask2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor toolcolBox->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 toolcolBox->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(*csThresholdcol, Gtk::PACK_SHRINK, 0);
toolcolFrame->add(*toolcolBox);
maskcolBox->pack_start(*toolcolFrame);
mergecolFrame->add(*maskcolBox); mergecolFrame->add(*maskcolBox);
ToolParamBlock* const mask7Box = Gtk::manage(new ToolParamBlock()); 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).HHcurve = HHshape->getCurve();
pp->locallab.spots.at(pp->locallab.selspot).invers = invers->get_active(); 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).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).enaColorMask = enaColorMask->get_active();
pp->locallab.spots.at(pp->locallab.selspot).CCmaskcurve = CCmaskshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).CCmaskcurve = CCmaskshape->getCurve();
pp->locallab.spots.at(pp->locallab.selspot).LLmaskcurve = LLmaskshape->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).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).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).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).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).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(); 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).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).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).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).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).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(); 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() void Locallab::enaColorMaskChanged()
{ {
// printf("enaColorMaskChanged\n"); // printf("enaColorMaskChanged\n");
@ -8681,6 +8717,7 @@ void Locallab::enableListener()
mergecolMethodConn.block(false); mergecolMethodConn.block(false);
inversConn.block(false); inversConn.block(false);
specialConn.block(false); specialConn.block(false);
toolcolConn.block(false);
showmaskcolMethodConn.block(false); showmaskcolMethodConn.block(false);
showmaskcolMethodConninv.block(false); showmaskcolMethodConninv.block(false);
enaColorMaskConn.block(false); enaColorMaskConn.block(false);
@ -8765,6 +8802,7 @@ void Locallab::disableListener()
mergecolMethodConn.block(true); mergecolMethodConn.block(true);
inversConn.block(true); inversConn.block(true);
specialConn.block(true); specialConn.block(true);
toolcolConn.block(true);
showmaskcolMethodConn.block(true); showmaskcolMethodConn.block(true);
showmaskcolMethodConninv.block(true); showmaskcolMethodConninv.block(true);
enaColorMaskConn.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); HHshape->setCurve(pp->locallab.spots.at(index).HHcurve);
invers->set_active(pp->locallab.spots.at(index).invers); invers->set_active(pp->locallab.spots.at(index).invers);
special->set_active(pp->locallab.spots.at(index).special); 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); enaColorMask->set_active(pp->locallab.spots.at(index).enaColorMask);
CCmaskshape->setCurve(pp->locallab.spots.at(index).CCmaskcurve); CCmaskshape->setCurve(pp->locallab.spots.at(index).CCmaskcurve);
LLmaskshape->setCurve(pp->locallab.spots.at(index).LLmaskcurve); 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); HHshape->setUnChanged(!spotState->HHcurve);
invers->set_inconsistent(multiImage && !spotState->invers); invers->set_inconsistent(multiImage && !spotState->invers);
special->set_inconsistent(multiImage && !spotState->special); special->set_inconsistent(multiImage && !spotState->special);
toolcol->set_inconsistent(multiImage && !spotState->toolcol);
enaColorMask->set_inconsistent(multiImage && !spotState->enaColorMask); enaColorMask->set_inconsistent(multiImage && !spotState->enaColorMask);
CCmaskshape->setUnChanged(!spotState->CCmaskcurve); CCmaskshape->setUnChanged(!spotState->CCmaskcurve);
LLmaskshape->setUnChanged(!spotState->LLmaskcurve); LLmaskshape->setUnChanged(!spotState->LLmaskcurve);

View File

@ -337,8 +337,9 @@ private:
Gtk::CheckButton* const curvactiv; Gtk::CheckButton* const curvactiv;
Gtk::CheckButton* const invers; Gtk::CheckButton* const invers;
Gtk::CheckButton* const special; Gtk::CheckButton* const special;
Gtk::CheckButton* const toolcol;
Gtk::CheckButton* const enaColorMask; Gtk::CheckButton* const enaColorMask;
sigc::connection curvactivConn, inversConn, enaColorMaskConn, specialConn; sigc::connection curvactivConn, inversConn, enaColorMaskConn, specialConn, toolcolConn;
// Exposure // Exposure
Gtk::CheckButton* const enaExpMask; Gtk::CheckButton* const enaExpMask;
sigc::connection enaExpMaskConn; sigc::connection enaExpMaskConn;
@ -472,6 +473,7 @@ private:
Gtk::Button* const lumacontrastPlusButton; Gtk::Button* const lumacontrastPlusButton;
sigc::connection lumacontrastMinusPressedConn, lumaneutralPressedConn, lumacontrastPlusPressedConn; sigc::connection lumacontrastMinusPressedConn, lumaneutralPressedConn, lumacontrastPlusPressedConn;
Gtk::Frame* const gridFrame; Gtk::Frame* const gridFrame;
Gtk::Frame* const toolcolFrame;
Gtk::Frame* const mergecolFrame; Gtk::Frame* const mergecolFrame;
Gtk::Frame* const merge1colFrame; Gtk::Frame* const merge1colFrame;
Gtk::Frame* const pdeFrame; Gtk::Frame* const pdeFrame;
@ -527,6 +529,7 @@ private:
void curvactivChanged(); void curvactivChanged();
void inversChanged(); void inversChanged();
void specialChanged(); void specialChanged();
void toolcolChanged();
void enaColorMaskChanged(); void enaColorMaskChanged();
// Exposure // Exposure
void enaExpMaskChanged(); void enaExpMaskChanged();

View File

@ -1013,6 +1013,7 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
locallab.spots.at(j).HHcurve = locallab.spots.at(j).HHcurve && pSpot.HHcurve == otherSpot.HHcurve; 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).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).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).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).CCmaskcurve = locallab.spots.at(j).CCmaskcurve && pSpot.CCmaskcurve == otherSpot.CCmaskcurve;
locallab.spots.at(j).LLmaskcurve = locallab.spots.at(j).LLmaskcurve && pSpot.LLmaskcurve == otherSpot.LLmaskcurve; 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; 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) { if (locallab.spots.at(i).enaColorMask) {
toEdit.locallab.spots.at(i).enaColorMask = mods.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), HHcurve(v),
invers(v), invers(v),
special(v), special(v),
toolcol(v),
enaColorMask(v), enaColorMask(v),
CCmaskcurve(v), CCmaskcurve(v),
LLmaskcurve(v), LLmaskcurve(v),
@ -5282,6 +5288,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v)
HHcurve = v; HHcurve = v;
invers = v; invers = v;
special = v; special = v;
toolcol = v;
enaColorMask = v; enaColorMask = v;
CCmaskcurve = v; CCmaskcurve = v;
LLmaskcurve = v; LLmaskcurve = v;

View File

@ -444,6 +444,7 @@ public:
bool HHcurve; bool HHcurve;
bool invers; bool invers;
bool special; bool special;
bool toolcol;
bool enaColorMask; bool enaColorMask;
bool CCmaskcurve; bool CCmaskcurve;
bool LLmaskcurve; bool LLmaskcurve;