Local adjustments - Denoise and Guided Filter - Recovery based on luminance mask (#6032)

* Slider recovery threshold guidedfilter

* Enable GuidedFilter recovery based on mask

* Enable inverse GF recovery

* Small changes GUI

* Recovery GUI denoise LA

* Enable recovery denoise with mask luminance

* Fixed bad compilation error

* Fixed bad behavior GUI expert - basic

* Another fixed bad behavior GUI

* First changes and verifications algo and GUI

* Others GUI modifications

* Fixed bug compilation and reset and clean code

* Some changes in algo - new tooltip

* Added calcdif to denoise - prepare GUI - change some tooltips

* Change tooltips

* Change some settings

* Small Change settings default curve denoise
This commit is contained in:
Desmis 2020-12-27 08:14:51 +01:00 committed by GitHub
parent 5a2d2dc6b4
commit 94f54b6443
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 882 additions and 32 deletions

View File

@ -1231,6 +1231,14 @@ HISTORY_MSG_983;Local - denoise threshold mask high
HISTORY_MSG_984;Local - denoise threshold mask low HISTORY_MSG_984;Local - denoise threshold mask low
HISTORY_MSG_985;Local - denoise Laplacian HISTORY_MSG_985;Local - denoise Laplacian
HISTORY_MSG_986;Local - denoise reinforce HISTORY_MSG_986;Local - denoise reinforce
HISTORY_MSG_987;Local - GF recovery threshold
HISTORY_MSG_988;Local - GF threshold mask low
HISTORY_MSG_989;Local - GF threshold mask high
HISTORY_MSG_990;Local - Denoise recovery threshold
HISTORY_MSG_991;Local - Denoise threshold mask low
HISTORY_MSG_992;Local - Denoise threshold mask high
HISTORY_MSG_993;Local - Denoise Inverse algo
HISTORY_MSG_994;Local - GF Inverse algo
HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_BLSHAPE;Blur by level
HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURCWAV;Blur chroma
HISTORY_MSG_BLURWAV;Blur luminance HISTORY_MSG_BLURWAV;Blur luminance
@ -2551,6 +2559,7 @@ TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance nois
TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors.
TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights.
TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask
TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask
TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT).
TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. “Aggressive” mode removes low frequency detail. TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. “Aggressive” mode removes low frequency detail.
TP_LOCALLAB_DENOIS;Ψ Denoise TP_LOCALLAB_DENOIS;Ψ Denoise
@ -2672,6 +2681,7 @@ TP_LOCALLAB_INVBL;Inverse
TP_LOCALLAB_INVBL_TOOLTIP;Alternative to Inverse mode: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot TP_LOCALLAB_INVBL_TOOLTIP;Alternative to Inverse mode: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot
TP_LOCALLAB_INVERS;Inverse TP_LOCALLAB_INVERS;Inverse
TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot: Excluding spot TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot: Excluding spot
TP_LOCALLAB_INVMASK;Inverse algorithm
TP_LOCALLAB_ISOGR;Coarseness (ISO) TP_LOCALLAB_ISOGR;Coarseness (ISO)
TP_LOCALLAB_LABBLURM;Blur Mask TP_LOCALLAB_LABBLURM;Blur Mask
TP_LOCALLAB_LABEL;Local Adjustments TP_LOCALLAB_LABEL;Local Adjustments
@ -2760,13 +2770,25 @@ TP_LOCALLAB_MASKCOM;Common Color Mask
TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13
TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope.
TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection
TP_LOCALLAB_MASKDDECAY;Decay strength
TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions
TP_LOCALLAB_MASKH;Hue curve TP_LOCALLAB_MASKH;Hue curve
TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications.\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n if the mask is very dark - below the threshold 'dark' - denoise will be increased if reinforce > 1.\n if the mask is clear - above the threshold 'light' - denoise will be progressively cancelled.\n between the two, denoise will be maintained at the settings without mask. TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n if the mask is very dark - below the threshold 'dark' - denoise will be increased if reinforce > 1.\n if the mask is clear - above the threshold 'light' - denoise will be progressively cancelled.\n between the two, denoise will be maintained at the settings without mask.
TP_LOCALLAB_MASKLCTHR;Light area luminance % threshold TP_LOCALLAB_MASKDE_TOOLTIP;Used to direct the Denoise based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the dark threshold, then the Denoise will be applied progressively.\n if the mask is above the light threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained.
TP_LOCALLAB_MASKLCTHRLOW; Dark area luminance % threshold TP_LOCALLAB_MASKGF_TOOLTIP;Used to direct the Guided Filter based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the dark threshold, then the GF will be applied progressively.\n if the mask is above the light threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained.
TP_LOCALLAB_MASKLNOISELOW;Reinforce denoise in dark areas TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased.
TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;Light-tone limit above which denoise will be progressively applied.\n You can use certain tools in Mask and modifications to change the gray levels: structure mask, Smooth radius, Gamma and slope, Contrast curve, Local contrast wavelet.\n Use a lockable color picker on the mask to see which areas will be affected. Be carefull in 'settings' to Background color mask = 0
TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;Light-tone limit above which 'Guided Filter' will be progressively applied.\n You can use certain tools in Mask and modifications to change the gray levels: structure mask, Smooth radius, Gamma and slope, Contrast curve, Local contrast wavelet.\n Use a lockable color picker on the mask to see which areas will be affected. Be carefull in 'settings' to Background color mask = 0
TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;Light limit above which the GuidedFilter will be applied progressively.\n You can used some tools in 'mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n You can use 'lockable color picker' on mask to see what areas will be take into account. Be carefull in 'settings' to Background color mask = 0
TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;Light limit above which the denoise will be applied progressively.\n You can used some tools in 'mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n You can use 'lockable color picker' on mask to see what areas will be take into account. Be carefull in 'settings' to Background color mask = 0
TP_LOCALLAB_MASKLCTHR;Light area luminance threshold
TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold
TP_LOCALLAB_MASKLNOISELOW;Reinforce denoise in dark and light areas
TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;Dark-tone limit below which 'Guided Filter' will be progressively applied.\n You can use certain tools in Mask and modifications to change the gray levels: structure mask, Smooth radius, Gamma and slope, Contrast curve, Local contrast wavelet.\n Use a lockable color picker on the mask to see which areas will be affected. Be carefull in 'settings' to Background color mask = 0
TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;Dark-tone limit below which denoise will be progressively applied.\n You can use certain tools in Mask and modifications to change the gray levels: structure mask, Smooth radius, Gamma and slope, Contrast curve, Local contrast wavelet.\n Use a lockable color picker on the mask to see which areas will be affected. Be carefull in 'settings' to Background color mask = 0
TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications)
TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications)
TP_LOCALLAB_MASKRECOTHRES;Recovery threshold
TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allows you to make fine adjustments. TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allows you to make fine adjustments.
TP_LOCALLAB_MED;Medium TP_LOCALLAB_MED;Medium
TP_LOCALLAB_MEDIAN;Median Low TP_LOCALLAB_MEDIAN;Median Low

View File

@ -150,6 +150,26 @@ constexpr float exclusion(float a, float b)
return a + b - 2.f * a * b; return a + b - 2.f * a * b;
} }
void calcdif(float lmr, float &lmrc)
{ //approximative change between gamma sRGB g=2.4 s=12.92 and gamma LAB g=3.0 s=9.03
//useful to calculate action with dark and light area mask
//differences in 3 parts linear...very small diffrences with real...
float a0 = 7.6f / 11.6f;//11.6 sRGB - 7.6 Lab...11.6 max difference
float a01 = 62.f - 7.6f; //60 sRGB 62 Lab 60 max difference
float a11 = 60.f - 11.6f;
float a1 = a01 / a11;
float b1 = 62.f - a1 * 60.f;
float a2 = (100.f - 62.f) / (100.f - 60.f);
float b2 = 100.f - a2 * 100.f;
if(lmr < 11.6f) {
lmrc = a0 * lmr;
} else if (lmr < 60.) {
lmrc = a1 * lmr + b1;
} else {
lmrc = a2 * lmr + b2;
}
}
void calcGammaLut(double gamma, double ts, LUTf &gammaLut) void calcGammaLut(double gamma, double ts, LUTf &gammaLut)
{ {
double pwr = 1.0 / gamma; double pwr = 1.0 / gamma;
@ -546,6 +566,8 @@ struct local_params {
int softmet; int softmet;
int blurmet; int blurmet;
int blmet; int blmet;
bool invmaskd;
bool invmask;
int smasktyp; int smasktyp;
int chromet; int chromet;
int quamet; int quamet;
@ -557,6 +579,13 @@ struct local_params {
float noiself2; float noiself2;
float noiseldetail; float noiseldetail;
int detailthr; int detailthr;
float recothr;
float lowthr;
float higthr;
float recothrd;
float lowthrd;
float higthrd;
float decayd;
int noiselequal; int noiselequal;
float noisechrodetail; float noisechrodetail;
float bilat; float bilat;
@ -846,6 +875,19 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
lp.blurmet = 1; lp.blurmet = 1;
} }
if (locallab.spots.at(sp).invmask == false) {
lp.invmask = false;
} else if (locallab.spots.at(sp).invmask == true) {
lp.invmask = true;
}
if (locallab.spots.at(sp).invmaskd == false) {
lp.invmaskd = false;
} else if (locallab.spots.at(sp).invmaskd == true) {
lp.invmaskd = true;
}
if (locallab.spots.at(sp).showmaskblMethodtyp == "blur") { if (locallab.spots.at(sp).showmaskblMethodtyp == "blur") {
lp.smasktyp = 0; lp.smasktyp = 0;
} else if (locallab.spots.at(sp).showmaskblMethodtyp == "nois") { } else if (locallab.spots.at(sp).showmaskblMethodtyp == "nois") {
@ -982,7 +1024,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
if (lp.denoiena) { if (lp.denoiena) {
local_noiself0 = 250.f * locwavCurveden[0]; local_noiself0 = 250.f * locwavCurveden[0];
local_noiself = 250.f * locwavCurveden[166]; local_noiself = 250.f * locwavCurveden[166];
local_noiself2 = 250.f * locwavCurveden[323]; local_noiself2 = 250.f * locwavCurveden[333];
local_noiselc = 200.f * locwavCurveden[500]; local_noiselc = 200.f * locwavCurveden[500];
} }
} }
@ -992,6 +1034,13 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
float local_noisechrodetail = (float)locallab.spots.at(sp).noisechrodetail; float local_noisechrodetail = (float)locallab.spots.at(sp).noisechrodetail;
int local_sensiden = locallab.spots.at(sp).sensiden; int local_sensiden = locallab.spots.at(sp).sensiden;
float local_detailthr = (float)locallab.spots.at(sp).detailthr; float local_detailthr = (float)locallab.spots.at(sp).detailthr;
float local_recothr = (float)locallab.spots.at(sp).recothres;
float local_lowthr = (float)locallab.spots.at(sp).lowthres;
float local_higthr = (float)locallab.spots.at(sp).higthres;
float local_recothrd = (float)locallab.spots.at(sp).recothresd;
float local_lowthrd = (float)locallab.spots.at(sp).lowthresd;
float local_higthrd = (float)locallab.spots.at(sp).higthresd;
float local_decayd = (float)locallab.spots.at(sp).decayd;
float local_noisecf = ((float)locallab.spots.at(sp).noisechrof) / 10.f; float local_noisecf = ((float)locallab.spots.at(sp).noisechrof) / 10.f;
float local_noisecc = ((float)locallab.spots.at(sp).noisechroc) / 10.f; float local_noisecc = ((float)locallab.spots.at(sp).noisechroc) / 10.f;
@ -1339,6 +1388,13 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
lp.noiself2 = local_noiself2; lp.noiself2 = local_noiself2;
lp.noiseldetail = local_noiseldetail; lp.noiseldetail = local_noiseldetail;
lp.detailthr = local_detailthr; lp.detailthr = local_detailthr;
lp.recothr = local_recothr;
lp.lowthr = local_lowthr;
lp.higthr = local_higthr;
lp.recothrd = local_recothrd;
lp.lowthrd = local_lowthrd;
lp.higthrd = local_higthrd;
lp.decayd = local_decayd;
lp.noiselequal = local_noiselequal; lp.noiselequal = local_noiselequal;
lp.noisechrodetail = local_noisechrodetail; lp.noisechrodetail = local_noisechrodetail;
lp.noiselc = local_noiselc; lp.noiselc = local_noiselc;
@ -8933,14 +8989,22 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
if(lp.enablMask && lp.lnoiselow !=1.f && lp.smasktyp != 0) { if(lp.enablMask && lp.lnoiselow !=1.f && lp.smasktyp != 0) {
//this code has been reviewed by Ingo in september 2020 PR5903 //this code has been reviewed by Ingo in september 2020 PR5903
float higc;
float hig = lp.thrhigh; float hig = lp.thrhigh;
if(lp.thrhigh < lp.thrlow) { calcdif(hig, higc);
hig = lp.thrlow + 0.01f; float low = lp.thrlow;
float lowc;
calcdif(low, lowc);
if(higc < lowc) {
higc = lowc + 0.01f;
} }
float alow = -(lp.lnoiselow - 1.f) / lp.thrlow;
float alow = -(lp.lnoiselow - 1.f) / lowc;
float blow = lp.lnoiselow; float blow = lp.lnoiselow;
float ahigh = 0.9999f / (hig - 100.f); float ahigh = 0.9999f / (higc - 100.f);
float bhigh = 1.f - hig * ahigh; float bhigh = 1.f - higc * ahigh;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for if (multiThread) #pragma omp parallel for if (multiThread)
#endif #endif
@ -8949,12 +9013,12 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
const float lM = bufmaskblurbl->L[ir][jr]; const float lM = bufmaskblurbl->L[ir][jr];
const float lmr = lM / 327.68f; const float lmr = lM / 327.68f;
if (lM < 327.68f * lp.thrlow) { if (lM < 327.68f * lowc) {
noisevarlum[(ir >> 1) * GW2 + (jr >> 1)] *= alow * lmr + blow; //3.f;//increase denoise noisevarlum[(ir >> 1) * GW2 + (jr >> 1)] *= alow * lmr + blow;
} else if (lM < 327.68f * hig) { } else if (lM < 327.68f * higc) {
// do nothing - denoise not change // do nothing - denoise not change
} else { } else {
noisevarlum[(ir >> 1) * GW2 + (jr >> 1)] *= ahigh * lmr + bhigh; //0.01f;//quasi suppress denoise noisevarlum[(ir >> 1) * GW2 + (jr >> 1)] *= ahigh * lmr + bhigh;
} }
} }
} }
@ -9348,8 +9412,81 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
} }
// DeNoise_Local(call, lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk);
if(lp.smasktyp != 0) { if(lp.smasktyp != 0) {
if(lp.enablMask && lp.recothrd != 1.f && lp.smasktyp != 0) {
LabImage tmp3(GW, GH);
for (int ir = 0; ir < GH; ir++){
for (int jr = 0; jr < GW; jr++) {
tmp3.L[ir][jr] = original->L[ir][jr];
tmp3.a[ir][jr] = original->a[ir][jr];
tmp3.b[ir][jr] = original->b[ir][jr];
}
}
array2D<float> masklum;
masklum(GW, GH);
for (int ir = 0; ir < GH; ir++)
for (int jr = 0; jr < GW; jr++) {
masklum[ir][jr] = 1.f;
}
float hig = lp.higthrd;
float higc;
calcdif(hig, higc);
float low = lp.lowthrd;
float lowc;
calcdif(low, lowc);
if(higc < lowc) {
higc = lowc + 0.01f;
}
float th = (lp.recothrd - 1.f);
float ahigh = th / (higc - 100.f);
float bhigh = 1.f - higc * ahigh;
float alow = th / lowc;
float blow = 1.f - th;
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int ir = 0; ir < GH; ir++)
for (int jr = 0; jr < GW; jr++) {
const float lM = bufmaskblurbl->L[ir][jr];
const float lmr = lM / 327.68f;
if (lM < 327.68f * lowc) {
masklum[ir][jr] = alow * lmr + blow;
} else if (lM < 327.68f * higc) {
} else {
masklum[ir][jr] = ahigh * lmr + bhigh;
}
float k = masklum[ir][jr];
if(lp.invmaskd == true) {
masklum[ir][jr] = 1 - pow(k, lp.decayd);
} else {
masklum[ir][jr] = pow(k, lp.decayd);
}
}
for (int i = 0; i < 3; ++i) {
boxblur(masklum, masklum, 10 / sk, GW, GH, false);
}
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int i = 0; i < GH; ++i) {
for (int j = 0; j < GW; ++j) {
tmp1.L[i][j] = (tmp3.L[i][j] - tmp1.L[i][j]) * LIM01(masklum[i][j]) + tmp1.L[i][j];
tmp1.a[i][j] = (tmp3.a[i][j] - tmp1.a[i][j]) * LIM01(masklum[i][j]) + tmp1.a[i][j];
tmp1.b[i][j] = (tmp3.b[i][j] - tmp1.b[i][j]) * LIM01(masklum[i][j]) + tmp1.b[i][j];
}
}
masklum.free();
}
DeNoise_Local(call, lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk); DeNoise_Local(call, lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk);
} else { } else {
DeNoise_Local(call, lp, original, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk); DeNoise_Local(call, lp, original, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk);
@ -9535,15 +9672,21 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
if(lp.enablMask && lp.lnoiselow != 1.f && lp.smasktyp != 0) { if(lp.enablMask && lp.lnoiselow != 1.f && lp.smasktyp != 0) {
//this code has been reviewed by Ingo in september 2020 PR5903 //this code has been reviewed by Ingo in september 2020 PR5903
//i just change parameters to better progressivity //i just change parameters to better progressivity
float higc;
float hig = lp.thrhigh; float hig = lp.thrhigh;
if(lp.thrhigh < lp.thrlow) { calcdif(hig, higc);
hig = lp.thrlow + 0.01f; float low = lp.thrlow;
float lowc;
calcdif(low, lowc);
if(higc < lowc) {
higc = lowc + 0.01f;
} }
float alow = -(lp.lnoiselow - 1.f) / lp.thrlow; float alow = -(lp.lnoiselow - 1.f) / lowc;
float blow = lp.lnoiselow; float blow = lp.lnoiselow;
float ahigh = 0.9999f / (hig - 100.f); float ahigh = 0.9999f / (higc - 100.f);
float bhigh = 1.f - hig * ahigh; float bhigh = 1.f - higc * ahigh;
#ifdef _OPENMP #ifdef _OPENMP
@ -9553,9 +9696,9 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
const float lM = bufmaskblurbl->L[ir + ystart][jr + xstart]; const float lM = bufmaskblurbl->L[ir + ystart][jr + xstart];
const float lmr = lM / 327.68f; const float lmr = lM / 327.68f;
if (lM < 327.68f * lp.thrlow) { if (lM < 327.68f * lowc) {
noisevarlum[(ir >> 1) * bfw2 + (jr >> 1)] *= alow * lmr + blow; noisevarlum[(ir >> 1) * bfw2 + (jr >> 1)] *= alow * lmr + blow;
} else if (lM < 327.68f * hig) { } else if (lM < 327.68f * higc) {
// do nothing // do nothing
} else { } else {
noisevarlum[(ir >> 1) * bfw2 + (jr >> 1)] *= ahigh * lmr + bhigh; noisevarlum[(ir >> 1) * bfw2 + (jr >> 1)] *= ahigh * lmr + bhigh;
@ -9948,6 +10091,91 @@ void ImProcFunctions::DeNoise(int call, float * slidL, float * slida, float * sl
} }
if (lp.smasktyp != 0) { if (lp.smasktyp != 0) {
if(lp.enablMask && lp.recothrd != 1.f && lp.smasktyp != 0) {
LabImage tmp3(bfw, bfh);
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif
for (int y = 0; y < transformed->H ; y++) {
for (int x = 0; x < transformed->W; x++) {
int lox = cx + x;
int loy = cy + y;
if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) {
tmp3.L[loy - begy][lox - begx] = original->L[y][x];
tmp3.a[loy - begy][lox - begx] = original->a[y][x];
tmp3.b[loy - begy][lox - begx] = original->b[y][x];
}
}
}
array2D<float> masklum;
masklum(bfw, bfh);
for (int ir = 0; ir < bfh; ir++){
for (int jr = 0; jr < bfw; jr++) {
masklum[ir][jr] = 1.f;
}
}
float hig = lp.higthrd;
float higc;
calcdif(hig, higc);
float low = lp.lowthrd;
float lowc;
calcdif(low, lowc);
if(higc < lowc) {
higc = lowc + 0.01f;
}
float th = (lp.recothrd - 1.f);
float ahigh = th / (higc - 100.f);
float bhigh = 1.f - higc * ahigh;
float alow = th / lowc;
float blow = 1.f - th;
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int y = ystart; y < yend; y++) {
for (int x = xstart, lox = cx + x; x < xend; x++, lox++) {
const float lM = bufmaskblurbl->L[y][x];
const float lmr = lM / 327.68f;
if (lM < 327.68f * lowc) {
masklum[y-ystart][x-xstart] = alow * lmr + blow;
} else if (lM < 327.68f * higc) {
} else {
masklum[y-ystart][x-xstart] = ahigh * lmr + bhigh;
}
float k = masklum[y-ystart][x-xstart];
if(lp.invmaskd == true) {
masklum[y-ystart][x-xstart] = 1 - pow(k, lp.decayd);
} else {
masklum[y-ystart][x-xstart] = pow(k, lp.decayd);
}
}
}
for (int i = 0; i < 3; ++i) {
boxblur(masklum, masklum, 10 / sk, bfw, bfh, false);
}
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int y = 0; y < bfh; y++) {
for (int x = 0; x < bfw; x++) {
bufwv.L[y][x] = (tmp3.L[y][x] - bufwv.L[y][x]) * LIM01(masklum[y][x]) + bufwv.L[y][x];
bufwv.a[y][x] = (tmp3.a[y][x] - bufwv.a[y][x]) * LIM01(masklum[y][x]) + bufwv.a[y][x];
bufwv.b[y][x] = (tmp3.b[y][x] - bufwv.b[y][x]) * LIM01(masklum[y][x]) + bufwv.b[y][x];
}
}
masklum.free();
}
DeNoise_Local2(lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk); DeNoise_Local2(lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk);
} else { } else {
DeNoise_Local2(lp, original, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk); DeNoise_Local2(lp, original, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk);
@ -10705,6 +10933,8 @@ void ImProcFunctions::Lab_Local(
// if (((radius > 1.5 * GAUSS_SKIP && lp.rad > 1.6) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 0 || lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.blurena) { // radius < GAUSS_SKIP means no gauss, just copy of original image // if (((radius > 1.5 * GAUSS_SKIP && lp.rad > 1.6) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 0 || lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.blurena) { // radius < GAUSS_SKIP means no gauss, just copy of original image
std::unique_ptr<LabImage> tmp1; std::unique_ptr<LabImage> tmp1;
std::unique_ptr<LabImage> tmp2; std::unique_ptr<LabImage> tmp2;
std::unique_ptr<LabImage> tmp3;
std::unique_ptr<LabImage> maskk;
int ystart = rtengine::max(static_cast<int>(lp.yc - lp.lyT) - cy, 0); int ystart = rtengine::max(static_cast<int>(lp.yc - lp.lyT) - cy, 0);
int yend = rtengine::min(static_cast<int>(lp.yc + lp.ly) - cy, original->H); int yend = rtengine::min(static_cast<int>(lp.yc + lp.ly) - cy, original->H);
int xstart = rtengine::max(static_cast<int>(lp.xc - lp.lxL) - cx, 0); int xstart = rtengine::max(static_cast<int>(lp.xc - lp.lxL) - cx, 0);
@ -10734,6 +10964,8 @@ void ImProcFunctions::Lab_Local(
if (lp.blurmet == 0) { if (lp.blurmet == 0) {
if (bfw > 0 && bfh > 0) { if (bfw > 0 && bfh > 0) {
tmp1.reset(new LabImage(bfw, bfh)); tmp1.reset(new LabImage(bfw, bfh));
tmp3.reset(new LabImage(bfw, bfh));
maskk.reset(new LabImage(bfw, bfh));
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) if (multiThread) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
@ -10748,12 +10980,16 @@ void ImProcFunctions::Lab_Local(
} else if (lp.blurmet == 1) { } else if (lp.blurmet == 1) {
tmp1.reset(new LabImage(transformed->W, transformed->H)); tmp1.reset(new LabImage(transformed->W, transformed->H));
tmp2.reset(new LabImage(transformed->W, transformed->H)); tmp2.reset(new LabImage(transformed->W, transformed->H));
tmp3.reset(new LabImage(transformed->W, transformed->H));
for (int y = 0; y < GH ; y++) { for (int y = 0; y < GH ; y++) {
for (int x = 0; x < GW; x++) { for (int x = 0; x < GW; x++) {
tmp2->L[y][x] = original->L[y][x]; tmp2->L[y][x] = original->L[y][x];
tmp2->a[y][x] = original->a[y][x]; tmp2->a[y][x] = original->a[y][x];
tmp2->b[y][x] = original->b[y][x]; tmp2->b[y][x] = original->b[y][x];
tmp3->L[y][x] = original->L[y][x];
tmp3->a[y][x] = original->a[y][x];
tmp3->b[y][x] = original->b[y][x];
tmp1->L[y][x] = original->L[y][x]; tmp1->L[y][x] = original->L[y][x];
tmp1->a[y][x] = original->a[y][x]; tmp1->a[y][x] = original->a[y][x];
tmp1->b[y][x] = original->b[y][x]; tmp1->b[y][x] = original->b[y][x];
@ -10968,6 +11204,9 @@ void ImProcFunctions::Lab_Local(
tmp1->L[y - ystart][x - xstart] = original->L[y][x]; tmp1->L[y - ystart][x - xstart] = original->L[y][x];
tmp1->a[y - ystart][x - xstart] = original->a[y][x]; tmp1->a[y - ystart][x - xstart] = original->a[y][x];
tmp1->b[y - ystart][x - xstart] = original->b[y][x]; tmp1->b[y - ystart][x - xstart] = original->b[y][x];
tmp3->L[y - ystart][x - xstart] = original->L[y][x];
tmp3->a[y - ystart][x - xstart] = original->a[y][x];
tmp3->b[y - ystart][x - xstart] = original->b[y][x];
bufgb->L[y - ystart][x - xstart] = original->L[y][x]; bufgb->L[y - ystart][x - xstart] = original->L[y][x];
} }
} }
@ -11044,6 +11283,67 @@ void ImProcFunctions::Lab_Local(
} }
} }
} }
if(lp.enablMask && lp.recothr != 1.f && lp.smasktyp != 1) {
array2D<float> masklum;
masklum(bfw, bfh);
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) {
masklum[ir][jr] = 1.f;
}
float hig = lp.higthr;
float higc;
calcdif(hig, higc);
float low = lp.lowthr;
float lowc;
calcdif(low, lowc);
if(higc < lowc) {
higc = lowc + 0.01f;
}
float th = (lp.recothr - 1.f);
float ahigh = th / (higc - 100.f);
float bhigh = 1.f - higc * ahigh;
float alow = th / lowc;
float blow = 1.f - th;
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) {
const float lM = bufmaskblurbl->L[ir + ystart][jr + xstart];
const float lmr = lM / 327.68f;
if (lM < 327.68f * lowc) {
masklum[ir][jr] = alow * lmr + blow;
} else if (lM < 327.68f * higc) {
} else {
masklum[ir][jr] = ahigh * lmr + bhigh;
}
if(lp.invmask == true) {
float k = masklum[ir][jr];
masklum[ir][jr] = 1 - k*k;
}
}
for (int i = 0; i < 3; ++i) {
boxblur(masklum, masklum, 10 / sk, bfw, bfh, false);
}
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int i = 0; i < bfh; ++i) {
for (int j = 0; j < bfw; ++j) {
tmp1->L[i][j] = (tmp3->L[i][j] - tmp1->L[i][j]) * LIM01(masklum[i][j]) + tmp1->L[i][j];
tmp1->a[i][j] = (tmp3->a[i][j] - tmp1->a[i][j]) * LIM01(masklum[i][j]) + tmp1->a[i][j];
tmp1->b[i][j] = (tmp3->b[i][j] - tmp1->b[i][j]) * LIM01(masklum[i][j]) + tmp1->b[i][j];
}
}
masklum.free();
}
delete tmpImage; delete tmpImage;
} }
@ -11060,6 +11360,9 @@ void ImProcFunctions::Lab_Local(
tmp1->a[y][x] = original->a[y][x]; tmp1->a[y][x] = original->a[y][x];
tmp1->b[y][x] = original->b[y][x]; tmp1->b[y][x] = original->b[y][x];
tmp2->L[y][x] = original->L[y][x]; tmp2->L[y][x] = original->L[y][x];
tmp3->L[y][x] = original->L[y][x];
tmp3->a[y][x] = original->a[y][x];
tmp3->b[y][x] = original->b[y][x];
} }
} }
@ -11135,6 +11438,66 @@ void ImProcFunctions::Lab_Local(
} }
} }
} }
if(lp.enablMask && lp.recothr != 1.f && lp.smasktyp != 1) {
array2D<float> masklum;
masklum(GW, GH);
for (int ir = 0; ir < GH; ir++)
for (int jr = 0; jr < GW; jr++) {
masklum[ir][jr] = 1.f;
}
float hig = lp.higthr;
float higc;
calcdif(hig, higc);
float low = lp.lowthr;
float lowc;
calcdif(low, lowc);
if(higc < lowc) {
higc = lowc + 0.01f;
}
float th = (lp.recothr - 1.f);
float ahigh = th / (higc - 100.f);
float bhigh = 1.f - higc * ahigh;
float alow = th / lowc;
float blow = 1.f - th;
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int ir = 0; ir < GH; ir++)
for (int jr = 0; jr < GW; jr++) {
const float lM = bufmaskblurbl->L[ir][jr];
const float lmr = lM / 327.68f;
if (lM < 327.68f * lowc) {
masklum[ir][jr] = alow * lmr + blow;
masklum[ir][jr] = alow * lmr + blow;
} else if (lM < 327.68f * higc) {
} else {
masklum[ir][jr] = (ahigh * lmr + bhigh);
}
}
for (int i = 0; i < 3; ++i) {
boxblur(masklum, masklum, 10 / sk, GW, GH, false);
}
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int i = 0; i < GH; ++i) {
for (int j = 0; j < GW; ++j) {
tmp1->L[i][j] = (tmp3->L[i][j] - tmp1->L[i][j]) * LIM01(masklum[i][j]) + tmp1->L[i][j];
tmp1->a[i][j] = (tmp3->a[i][j] - tmp1->a[i][j]) * LIM01(masklum[i][j]) + tmp1->a[i][j];
tmp1->b[i][j] = (tmp3->b[i][j] - tmp1->b[i][j]) * LIM01(masklum[i][j]) + tmp1->b[i][j];
}
}
masklum.free();
}
delete tmpImage; delete tmpImage;
} }
} }

View File

@ -1007,8 +1007,17 @@ enum ProcEventCode {
EvlocallabwavCurvehue = 981, EvlocallabwavCurvehue = 981,
Evlocallablevelthr = 982, Evlocallablevelthr = 982,
Evlocallablevelthrlow = 983, Evlocallablevelthrlow = 983,
Evlocallabusemask1 = 984, Evlocallabusemask1 = 984,
Evlocallablnoiselow = 985, Evlocallablnoiselow = 985,
Evlocallabrecothres = 986,
Evlocallablowthres = 987,
Evlocallabhigthres = 988,
Evlocallabrecothresd = 989,
Evlocallablowthresd = 990,
Evlocallabhigthresd = 991,
Evlocallabinvmaskd = 992,
Evlocallabinvmask = 993,
Evlocallabdecayd = 994,
NUMOFEVENTS NUMOFEVENTS
}; };

View File

@ -3298,6 +3298,13 @@ LocallabParams::LocallabSpot::LocallabSpot() :
itera(1), itera(1),
guidbl(0), guidbl(0),
strbl(50), strbl(50),
recothres(1.),
lowthres(12.),
higthres(85.),
recothresd(1.),
lowthresd(12.),
higthresd(85.),
decayd(2.),
isogr(400), isogr(400),
strengr(0), strengr(0),
scalegr(100), scalegr(100),
@ -3308,7 +3315,9 @@ LocallabParams::LocallabSpot::LocallabSpot() :
blurMethod("norm"), blurMethod("norm"),
medMethod("33"), medMethod("33"),
usemask(false), usemask(false),
levelthr(40.), invmaskd(false),
invmask(false),
levelthr(85.),
lnoiselow(1.), lnoiselow(1.),
levelthrlow(12.), levelthrlow(12.),
activlum(true), activlum(true),
@ -3331,7 +3340,7 @@ LocallabParams::LocallabSpot::LocallabSpot() :
0.0, 0.0,
0.0, 0.0,
0.35, 0.35,
0.5, 0.66,
0., 0.,
0.35, 0.35,
0.35, 0.35,
@ -4342,6 +4351,13 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
&& itera == other.itera && itera == other.itera
&& guidbl == other.guidbl && guidbl == other.guidbl
&& strbl == other.strbl && strbl == other.strbl
&& recothres == other.recothres
&& lowthres == other.lowthres
&& higthres == other.higthres
&& recothresd == other.recothresd
&& lowthresd == other.lowthresd
&& higthresd == other.higthresd
&& decayd == other.decayd
&& isogr == other.isogr && isogr == other.isogr
&& strengr == other.strengr && strengr == other.strengr
&& scalegr == other.scalegr && scalegr == other.scalegr
@ -4351,6 +4367,8 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
&& quamethod == other.quamethod && quamethod == other.quamethod
&& blurMethod == other.blurMethod && blurMethod == other.blurMethod
&& usemask == other.usemask && usemask == other.usemask
&& invmaskd == other.invmaskd
&& invmask == other.invmask
&& levelthr == other.levelthr && levelthr == other.levelthr
&& lnoiselow == other.lnoiselow && lnoiselow == other.lnoiselow
&& levelthrlow == other.levelthrlow && levelthrlow == other.levelthrlow
@ -5928,6 +5946,13 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || spot_edited->itera, "Locallab", "Iteramed_" + index_str, spot.itera, keyFile); saveToKeyfile(!pedited || spot_edited->itera, "Locallab", "Iteramed_" + index_str, spot.itera, keyFile);
saveToKeyfile(!pedited || spot_edited->guidbl, "Locallab", "Guidbl_" + index_str, spot.guidbl, keyFile); saveToKeyfile(!pedited || spot_edited->guidbl, "Locallab", "Guidbl_" + index_str, spot.guidbl, keyFile);
saveToKeyfile(!pedited || spot_edited->strbl, "Locallab", "Strbl_" + index_str, spot.strbl, keyFile); saveToKeyfile(!pedited || spot_edited->strbl, "Locallab", "Strbl_" + index_str, spot.strbl, keyFile);
saveToKeyfile(!pedited || spot_edited->recothres, "Locallab", "Recothres_" + index_str, spot.recothres, keyFile);
saveToKeyfile(!pedited || spot_edited->lowthres, "Locallab", "Lowthres_" + index_str, spot.lowthres, keyFile);
saveToKeyfile(!pedited || spot_edited->higthres, "Locallab", "Higthres_" + index_str, spot.higthres, keyFile);
saveToKeyfile(!pedited || spot_edited->recothresd, "Locallab", "Recothresd_" + index_str, spot.recothresd, keyFile);
saveToKeyfile(!pedited || spot_edited->lowthresd, "Locallab", "Lowthresd_" + index_str, spot.lowthresd, keyFile);
saveToKeyfile(!pedited || spot_edited->higthresd, "Locallab", "Higthresd_" + index_str, spot.higthresd, keyFile);
saveToKeyfile(!pedited || spot_edited->decayd, "Locallab", "Decayd_" + index_str, spot.decayd, keyFile);
saveToKeyfile(!pedited || spot_edited->isogr, "Locallab", "Isogr_" + index_str, spot.isogr, keyFile); saveToKeyfile(!pedited || spot_edited->isogr, "Locallab", "Isogr_" + index_str, spot.isogr, keyFile);
saveToKeyfile(!pedited || spot_edited->strengr, "Locallab", "Strengr_" + index_str, spot.strengr, keyFile); saveToKeyfile(!pedited || spot_edited->strengr, "Locallab", "Strengr_" + index_str, spot.strengr, keyFile);
saveToKeyfile(!pedited || spot_edited->scalegr, "Locallab", "Scalegr_" + index_str, spot.scalegr, keyFile); saveToKeyfile(!pedited || spot_edited->scalegr, "Locallab", "Scalegr_" + index_str, spot.scalegr, keyFile);
@ -5937,6 +5962,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || spot_edited->quamethod, "Locallab", "QuaMethod_" + index_str, spot.quamethod, keyFile); saveToKeyfile(!pedited || spot_edited->quamethod, "Locallab", "QuaMethod_" + index_str, spot.quamethod, keyFile);
saveToKeyfile(!pedited || spot_edited->blurMethod, "Locallab", "BlurMethod_" + index_str, spot.blurMethod, keyFile); saveToKeyfile(!pedited || spot_edited->blurMethod, "Locallab", "BlurMethod_" + index_str, spot.blurMethod, keyFile);
saveToKeyfile(!pedited || spot_edited->usemask, "Locallab", "Usemaskb_" + index_str, spot.usemask, keyFile); saveToKeyfile(!pedited || spot_edited->usemask, "Locallab", "Usemaskb_" + index_str, spot.usemask, keyFile);
saveToKeyfile(!pedited || spot_edited->invmaskd, "Locallab", "Invmaskd_" + index_str, spot.invmaskd, keyFile);
saveToKeyfile(!pedited || spot_edited->invmask, "Locallab", "Invmask_" + index_str, spot.invmask, keyFile);
saveToKeyfile(!pedited || spot_edited->levelthr, "Locallab", "Levelthr_" + index_str, spot.levelthr, keyFile); saveToKeyfile(!pedited || spot_edited->levelthr, "Locallab", "Levelthr_" + index_str, spot.levelthr, keyFile);
saveToKeyfile(!pedited || spot_edited->lnoiselow, "Locallab", "Lnoiselow_" + index_str, spot.lnoiselow, keyFile); saveToKeyfile(!pedited || spot_edited->lnoiselow, "Locallab", "Lnoiselow_" + index_str, spot.lnoiselow, keyFile);
saveToKeyfile(!pedited || spot_edited->levelthrlow, "Locallab", "Levelthrlow_" + index_str, spot.levelthrlow, keyFile); saveToKeyfile(!pedited || spot_edited->levelthrlow, "Locallab", "Levelthrlow_" + index_str, spot.levelthrlow, keyFile);
@ -7730,6 +7757,13 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Locallab", "Iteramed_" + index_str, pedited, spot.itera, spotEdited.itera); assignFromKeyfile(keyFile, "Locallab", "Iteramed_" + index_str, pedited, spot.itera, spotEdited.itera);
assignFromKeyfile(keyFile, "Locallab", "Guidbl_" + index_str, pedited, spot.guidbl, spotEdited.guidbl); assignFromKeyfile(keyFile, "Locallab", "Guidbl_" + index_str, pedited, spot.guidbl, spotEdited.guidbl);
assignFromKeyfile(keyFile, "Locallab", "Strbl_" + index_str, pedited, spot.strbl, spotEdited.strbl); assignFromKeyfile(keyFile, "Locallab", "Strbl_" + index_str, pedited, spot.strbl, spotEdited.strbl);
assignFromKeyfile(keyFile, "Locallab", "Recothres_" + index_str, pedited, spot.recothres, spotEdited.recothres);
assignFromKeyfile(keyFile, "Locallab", "Lowthres_" + index_str, pedited, spot.lowthres, spotEdited.lowthres);
assignFromKeyfile(keyFile, "Locallab", "Higthres_" + index_str, pedited, spot.higthres, spotEdited.higthres);
assignFromKeyfile(keyFile, "Locallab", "Recothresd_" + index_str, pedited, spot.recothresd, spotEdited.recothresd);
assignFromKeyfile(keyFile, "Locallab", "Lowthresd_" + index_str, pedited, spot.lowthresd, spotEdited.lowthresd);
assignFromKeyfile(keyFile, "Locallab", "Higthresd_" + index_str, pedited, spot.higthresd, spotEdited.higthresd);
assignFromKeyfile(keyFile, "Locallab", "Decayd_" + index_str, pedited, spot.decayd, spotEdited.decayd);
assignFromKeyfile(keyFile, "Locallab", "Isogr_" + index_str, pedited, spot.isogr, spotEdited.isogr); assignFromKeyfile(keyFile, "Locallab", "Isogr_" + index_str, pedited, spot.isogr, spotEdited.isogr);
assignFromKeyfile(keyFile, "Locallab", "Strengr_" + index_str, pedited, spot.strengr, spotEdited.strengr); assignFromKeyfile(keyFile, "Locallab", "Strengr_" + index_str, pedited, spot.strengr, spotEdited.strengr);
assignFromKeyfile(keyFile, "Locallab", "Scalegr_" + index_str, pedited, spot.scalegr, spotEdited.scalegr); assignFromKeyfile(keyFile, "Locallab", "Scalegr_" + index_str, pedited, spot.scalegr, spotEdited.scalegr);
@ -7739,6 +7773,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
assignFromKeyfile(keyFile, "Locallab", "QuaMethod_" + index_str, pedited, spot.quamethod, spotEdited.quamethod); assignFromKeyfile(keyFile, "Locallab", "QuaMethod_" + index_str, pedited, spot.quamethod, spotEdited.quamethod);
assignFromKeyfile(keyFile, "Locallab", "BlurMethod_" + index_str, pedited, spot.blurMethod, spotEdited.blurMethod); assignFromKeyfile(keyFile, "Locallab", "BlurMethod_" + index_str, pedited, spot.blurMethod, spotEdited.blurMethod);
assignFromKeyfile(keyFile, "Locallab", "Usemaskb_" + index_str, pedited, spot.usemask, spotEdited.usemask); assignFromKeyfile(keyFile, "Locallab", "Usemaskb_" + index_str, pedited, spot.usemask, spotEdited.usemask);
assignFromKeyfile(keyFile, "Locallab", "Invmaskd_" + index_str, pedited, spot.invmaskd, spotEdited.invmaskd);
assignFromKeyfile(keyFile, "Locallab", "Invmask_" + index_str, pedited, spot.invmask, spotEdited.invmask);
assignFromKeyfile(keyFile, "Locallab", "Levelthr_" + index_str, pedited, spot.levelthr, spotEdited.levelthr); assignFromKeyfile(keyFile, "Locallab", "Levelthr_" + index_str, pedited, spot.levelthr, spotEdited.levelthr);
assignFromKeyfile(keyFile, "Locallab", "Lnoiselow_" + index_str, pedited, spot.lnoiselow, spotEdited.lnoiselow); assignFromKeyfile(keyFile, "Locallab", "Lnoiselow_" + index_str, pedited, spot.lnoiselow, spotEdited.lnoiselow);
assignFromKeyfile(keyFile, "Locallab", "Levelthrlow_" + index_str, pedited, spot.levelthrlow, spotEdited.levelthrlow); assignFromKeyfile(keyFile, "Locallab", "Levelthrlow_" + index_str, pedited, spot.levelthrlow, spotEdited.levelthrlow);

View File

@ -1205,6 +1205,13 @@ struct LocallabParams {
int itera; int itera;
int guidbl; int guidbl;
int strbl; int strbl;
double recothres;
double lowthres;
double higthres;
double recothresd;
double lowthresd;
double higthresd;
double decayd;
int isogr; int isogr;
int strengr; int strengr;
int scalegr; int scalegr;
@ -1215,6 +1222,8 @@ struct LocallabParams {
Glib::ustring blurMethod; // norm, inv Glib::ustring blurMethod; // norm, inv
Glib::ustring medMethod; // none, 33, 55, 77, 99 Glib::ustring medMethod; // none, 33, 55, 77, 99
bool usemask; bool usemask;
bool invmaskd;
bool invmask;
double levelthr; double levelthr;
double lnoiselow; double lnoiselow;
double levelthrlow; double levelthrlow;

View File

@ -1012,7 +1012,17 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
LUMINANCECURVE, // Evlocallablevelthr LUMINANCECURVE, // Evlocallablevelthr
LUMINANCECURVE, // Evlocallablevelthrlow LUMINANCECURVE, // Evlocallablevelthrlow
LUMINANCECURVE, //Evlocallabusemask1 LUMINANCECURVE, //Evlocallabusemask1
LUMINANCECURVE // Evlocallablnoiselow LUMINANCECURVE, // Evlocallablnoiselow
LUMINANCECURVE, // Evlocallabrecothres
LUMINANCECURVE, // Evlocallablowthres
LUMINANCECURVE, // Evlocallabhigthres
LUMINANCECURVE, // Evlocallabrecothresd
LUMINANCECURVE, // Evlocallablowthresd
LUMINANCECURVE, // Evlocallabhigthresd
LUMINANCECURVE, // Evlocallabinvmaskd
LUMINANCECURVE, // Evlocallabinvmask
LUMINANCECURVE // Evlocallabdecayd
}; };

View File

@ -5751,6 +5751,10 @@ LocallabBlur::LocallabBlur():
guidbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GUIDBL"), 0, 1000, 1, 0))), guidbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GUIDBL"), 0, 1000, 1, 0))),
strbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRBL"), 0, 100, 1, 50))), strbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRBL"), 0, 100, 1, 50))),
epsbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EPSBL"), -10, 10, 1, 0))), epsbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EPSBL"), -10, 10, 1, 0))),
expdenoise2(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))),
recothres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))),
lowthres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))),
higthres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))),
sensibn(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 40))), sensibn(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 40))),
blurMethod(Gtk::manage(new MyComboBoxText())), blurMethod(Gtk::manage(new MyComboBoxText())),
invbl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVBL")))), invbl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVBL")))),
@ -5763,10 +5767,14 @@ LocallabBlur::LocallabBlur():
expdenoise1(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI1_EXP")))), expdenoise1(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI1_EXP")))),
maskusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), maskusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))),
maskunusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), maskunusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))),
maskusable2(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))),
maskunusable2(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))),
maskusable3(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))),
maskunusable3(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))),
usemask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_USEMASK")))), usemask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_USEMASK")))),
lnoiselow(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLNOISELOW"), 0.7, 2., 0.01, 1.))), lnoiselow(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLNOISELOW"), 0.7, 2., 0.01, 1.))),
levelthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 10., 100., 1., 40.))), levelthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))),
levelthrlow(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 100., 1., 12.))), levelthrlow(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))),
noiselumf0(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINEZERO"), MINCHRO, MAXCHRO, 0.01, 0.))), noiselumf0(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINEZERO"), MINCHRO, MAXCHRO, 0.01, 0.))),
noiselumf(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINE"), MINCHRO, MAXCHRO, 0.01, 0.))), noiselumf(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINE"), MINCHRO, MAXCHRO, 0.01, 0.))),
noiselumf2(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINETWO"), MINCHRO, MAXCHRO, 0.01, 0.))), noiselumf2(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINETWO"), MINCHRO, MAXCHRO, 0.01, 0.))),
@ -5781,6 +5789,13 @@ LocallabBlur::LocallabBlur():
detailFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DETAILFRA")))), detailFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DETAILFRA")))),
detailthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILTHR"), 0, 100, 1, 50))), detailthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILTHR"), 0, 100, 1, 50))),
adjblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ADJ"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-yellow-small.png")), Gtk::manage(new RTImage("circle-red-green-small.png"))))), adjblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ADJ"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-yellow-small.png")), Gtk::manage(new RTImage("circle-red-green-small.png"))))),
expdenoise3(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))),
recothresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))),
lowthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))),
higthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))),
decayd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))),
invmaskd(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVMASK")))),
invmask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVMASK")))),
bilateral(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BILATERAL"), 0, 100, 1, 0))), bilateral(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BILATERAL"), 0, 100, 1, 0))),
sensiden(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), sensiden(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))),
neutral(Gtk::manage (new Gtk::Button (M ("TP_RETINEX_NEUTRAL")))), neutral(Gtk::manage (new Gtk::Button (M ("TP_RETINEX_NEUTRAL")))),
@ -5832,6 +5847,8 @@ LocallabBlur::LocallabBlur():
fftwblConn = fftwbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::fftwblChanged)); fftwblConn = fftwbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::fftwblChanged));
usemaskConn = usemask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::usemaskChanged)); usemaskConn = usemask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::usemaskChanged));
invblConn = invbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invblChanged)); invblConn = invbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invblChanged));
invmaskdConn = invmaskd->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invmaskdChanged));
invmaskConn = invmask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invmaskChanged));
radius->setAdjusterListener(this); radius->setAdjusterListener(this);
@ -5861,6 +5878,10 @@ LocallabBlur::LocallabBlur():
strbl->setAdjusterListener(this); strbl->setAdjusterListener(this);
epsbl->setAdjusterListener(this); epsbl->setAdjusterListener(this);
setExpandAlignProperties(expdenoise2, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
recothres->setAdjusterListener(this);
lowthres->setAdjusterListener(this);
higthres->setAdjusterListener(this);
sensibn->setAdjusterListener(this); sensibn->setAdjusterListener(this);
@ -5936,6 +5957,11 @@ LocallabBlur::LocallabBlur():
detailthr->setAdjusterListener(this); detailthr->setAdjusterListener(this);
adjblur->setAdjusterListener(this); adjblur->setAdjusterListener(this);
setExpandAlignProperties(expdenoise3, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
recothresd->setAdjusterListener(this);
lowthresd->setAdjusterListener(this);
higthresd->setAdjusterListener(this);
decayd->setAdjusterListener(this);
bilateral->setAdjusterListener(this); bilateral->setAdjusterListener(this);
@ -6039,6 +6065,15 @@ LocallabBlur::LocallabBlur():
blnoisebox->pack_start(*guidbl); blnoisebox->pack_start(*guidbl);
blnoisebox->pack_start(*strbl); blnoisebox->pack_start(*strbl);
blnoisebox->pack_start(*epsbl); blnoisebox->pack_start(*epsbl);
ToolParamBlock* const wavBox2 = Gtk::manage(new ToolParamBlock());
wavBox2->pack_start(*maskusable2, Gtk::PACK_SHRINK, 0);
wavBox2->pack_start(*maskunusable2, Gtk::PACK_SHRINK, 0);
wavBox2->pack_start(*recothres);
wavBox2->pack_start(*lowthres);
wavBox2->pack_start(*higthres);
wavBox2->pack_start(*invmask);
expdenoise2->add(*wavBox2, false);
blnoisebox->pack_start(*expdenoise2);
blnoisebox->pack_start(*sensibn); blnoisebox->pack_start(*sensibn);
// blnoisebox->pack_start(*blurMethod); // blnoisebox->pack_start(*blurMethod);
blnoisebox->pack_start(*invbl); blnoisebox->pack_start(*invbl);
@ -6077,6 +6112,16 @@ LocallabBlur::LocallabBlur():
wavBox->pack_start(*detailFrame); wavBox->pack_start(*detailFrame);
wavFrame->add(*wavBox); wavFrame->add(*wavBox);
denoisebox->pack_start(*wavFrame); denoisebox->pack_start(*wavFrame);
ToolParamBlock* const wavBox3 = Gtk::manage(new ToolParamBlock());
wavBox3->pack_start(*maskusable3, Gtk::PACK_SHRINK, 0);
wavBox3->pack_start(*maskunusable3, Gtk::PACK_SHRINK, 0);
wavBox3->pack_start(*recothresd);
wavBox3->pack_start(*lowthresd);
wavBox3->pack_start(*higthresd);
wavBox3->pack_start(*decayd);
wavBox3->pack_start(*invmaskd);
expdenoise3->add(*wavBox3, false);
denoisebox->pack_start(*expdenoise3);
denoisebox->pack_start(*bilateral); denoisebox->pack_start(*bilateral);
denoisebox->pack_start(*sensiden); denoisebox->pack_start(*sensiden);
denoisebox->pack_start(*neutral); denoisebox->pack_start(*neutral);
@ -6158,6 +6203,10 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
wavshapeden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); wavshapeden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP"));
wavhue->setTooltip(M("TP_LOCALLAB_WAVHUE_TOOLTIP")); wavhue->setTooltip(M("TP_LOCALLAB_WAVHUE_TOOLTIP"));
expdenoise1->set_tooltip_markup(M("TP_LOCALLAB_MASKLC_TOOLTIP")); expdenoise1->set_tooltip_markup(M("TP_LOCALLAB_MASKLC_TOOLTIP"));
expdenoise2->set_tooltip_markup(M("TP_LOCALLAB_MASKGF_TOOLTIP"));
expdenoise3->set_tooltip_markup(M("TP_LOCALLAB_MASKDE_TOOLTIP"));
invmask->set_tooltip_text(M("TP_LOCALLAB_MASKDEINV_TOOLTIP"));
invmaskd->set_tooltip_text(M("TP_LOCALLAB_MASKDEINV_TOOLTIP"));
LocalcurveEditorwavden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); LocalcurveEditorwavden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP"));
noiselequal->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUAL_TOOLTIP")); noiselequal->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUAL_TOOLTIP"));
noiselumdetail->set_tooltip_text(M("TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP")); noiselumdetail->set_tooltip_text(M("TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP"));
@ -6190,6 +6239,11 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP"));
csThresholdblur->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); csThresholdblur->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP"));
sensiden->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); sensiden->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP"));
lowthres->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRES_TOOLTIP"));
lowthresd->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP"));
higthresd->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP"));
higthres->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRES_TOOLTIP"));
decayd->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP"));
} else { } else {
expblnoise->set_tooltip_markup(""); expblnoise->set_tooltip_markup("");
@ -6207,6 +6261,10 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
quamethod->set_tooltip_markup(""); quamethod->set_tooltip_markup("");
wavhue->setTooltip(""); wavhue->setTooltip("");
expdenoise1->set_tooltip_markup(""); expdenoise1->set_tooltip_markup("");
expdenoise2->set_tooltip_markup("");
expdenoise3->set_tooltip_markup("");
invmask->set_tooltip_text("");
invmaskd->set_tooltip_text("");
LocalcurveEditorwavden->setTooltip(""); LocalcurveEditorwavden->setTooltip("");
noiselequal->set_tooltip_text(""); noiselequal->set_tooltip_text("");
noiselumdetail->set_tooltip_text(""); noiselumdetail->set_tooltip_text("");
@ -6242,6 +6300,11 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips)
shadmaskblsha->set_tooltip_text(""); shadmaskblsha->set_tooltip_text("");
csThresholdblur->set_tooltip_text(""); csThresholdblur->set_tooltip_text("");
sensiden->set_tooltip_text(""); sensiden->set_tooltip_text("");
lowthres->set_tooltip_text("");
lowthresd->set_tooltip_text("");
higthresd->set_tooltip_text("");
higthres->set_tooltip_text("");
decayd->set_tooltip_text("");
} }
} }
@ -6266,6 +6329,17 @@ void LocallabBlur::neutral_pressed ()
wavshapeden->setCurve(defSpot.locwavcurveden); wavshapeden->setCurve(defSpot.locwavcurveden);
wavhue->setCurve(defSpot.locwavcurvehue); wavhue->setCurve(defSpot.locwavcurvehue);
usemask->set_active(defSpot.usemask); usemask->set_active(defSpot.usemask);
invmaskd->set_active(defSpot.invmaskd);
invmask->set_active(defSpot.invmask);
recothresd->setValue(defSpot.recothresd);
lowthresd->setValue(defSpot.lowthresd);
higthresd->setValue(defSpot.higthresd);
decayd->setValue(defSpot.decayd);
recothres->setValue(defSpot.recothres);
lowthres->setValue(defSpot.lowthres);
higthres->setValue(defSpot.higthres);
} }
void LocallabBlur::setDefaultExpanderVisibility() void LocallabBlur::setDefaultExpanderVisibility()
@ -6273,6 +6347,8 @@ void LocallabBlur::setDefaultExpanderVisibility()
expblnoise->set_expanded(false); expblnoise->set_expanded(false);
expdenoise->set_expanded(false); expdenoise->set_expanded(false);
expdenoise1->set_expanded(false); expdenoise1->set_expanded(false);
expdenoise2->set_expanded(false);
expdenoise3->set_expanded(false);
expmaskbl->set_expanded(false); expmaskbl->set_expanded(false);
} }
@ -6283,6 +6359,8 @@ void LocallabBlur::disableListener()
blMethodConn.block(true); blMethodConn.block(true);
fftwblConn.block(true); fftwblConn.block(true);
usemaskConn.block(true); usemaskConn.block(true);
invmaskdConn.block(true);
invmaskConn.block(true);
invblConn.block(true); invblConn.block(true);
medMethodConn.block(true); medMethodConn.block(true);
blurMethodConn.block(true); blurMethodConn.block(true);
@ -6302,6 +6380,8 @@ void LocallabBlur::enableListener()
blMethodConn.block(false); blMethodConn.block(false);
fftwblConn.block(false); fftwblConn.block(false);
usemaskConn.block(false); usemaskConn.block(false);
invmaskdConn.block(false);
invmaskConn.block(false);
invblConn.block(false); invblConn.block(false);
medMethodConn.block(false); medMethodConn.block(false);
blurMethodConn.block(false); blurMethodConn.block(false);
@ -6341,6 +6421,8 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params
fftwbl->set_active(spot.fftwbl); fftwbl->set_active(spot.fftwbl);
usemask->set_active(spot.usemask); usemask->set_active(spot.usemask);
invmaskd->set_active(spot.invmaskd);
invmask->set_active(spot.invmask);
invbl->set_active(spot.invbl); invbl->set_active(spot.invbl);
radius->setValue(spot.radius); radius->setValue(spot.radius);
strength->setValue(spot.strength); strength->setValue(spot.strength);
@ -6363,8 +6445,15 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params
itera->setValue((double)spot.itera); itera->setValue((double)spot.itera);
guidbl->setValue((double)spot.guidbl); guidbl->setValue((double)spot.guidbl);
strbl->setValue((double)spot.strbl); strbl->setValue((double)spot.strbl);
recothres->setValue((double)spot.recothres);
lowthres->setValue((double)spot.lowthres);
higthres->setValue((double)spot.higthres);
epsbl->setValue((double)spot.epsbl); epsbl->setValue((double)spot.epsbl);
sensibn->setValue((double)spot.sensibn); sensibn->setValue((double)spot.sensibn);
recothresd->setValue((double)spot.recothresd);
lowthresd->setValue((double)spot.lowthresd);
higthresd->setValue((double)spot.higthresd);
decayd->setValue((double)spot.decayd);
if (spot.blurMethod == "norm") { if (spot.blurMethod == "norm") {
blurMethod->set_active(0); blurMethod->set_active(0);
@ -6466,6 +6555,8 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped
spot.fftwbl = fftwbl->get_active(); spot.fftwbl = fftwbl->get_active();
spot.usemask = usemask->get_active(); spot.usemask = usemask->get_active();
spot.invmaskd = invmaskd->get_active();
spot.invmask = invmask->get_active();
spot.invbl = invbl->get_active(); spot.invbl = invbl->get_active();
spot.radius = radius->getValue(); spot.radius = radius->getValue();
spot.strength = strength->getIntValue(); spot.strength = strength->getIntValue();
@ -6488,8 +6579,15 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped
spot.itera = itera->getIntValue(); spot.itera = itera->getIntValue();
spot.guidbl = guidbl->getIntValue(); spot.guidbl = guidbl->getIntValue();
spot.strbl = strbl->getIntValue(); spot.strbl = strbl->getIntValue();
spot.recothres = recothres->getValue();
spot.lowthres = lowthres->getValue();
spot.higthres = higthres->getValue();
spot.epsbl = epsbl->getIntValue(); spot.epsbl = epsbl->getIntValue();
spot.sensibn = sensibn->getIntValue(); spot.sensibn = sensibn->getIntValue();
spot.recothresd = recothresd->getValue();
spot.lowthresd = lowthresd->getValue();
spot.higthresd = higthresd->getValue();
spot.decayd = decayd->getValue();
if (blurMethod->get_active_row_number() == 0) { if (blurMethod->get_active_row_number() == 0) {
spot.blurMethod = "norm"; spot.blurMethod = "norm";
@ -6578,8 +6676,15 @@ void LocallabBlur::setDefaults(const rtengine::procparams::ProcParams* defParams
itera->setDefault((double)defSpot.itera); itera->setDefault((double)defSpot.itera);
guidbl->setDefault((double)defSpot.guidbl); guidbl->setDefault((double)defSpot.guidbl);
strbl->setDefault((double)defSpot.strbl); strbl->setDefault((double)defSpot.strbl);
recothres->setDefault((double)defSpot.recothres);
lowthres->setDefault((double)defSpot.lowthres);
higthres->setDefault((double)defSpot.higthres);
epsbl->setDefault((double)defSpot.epsbl); epsbl->setDefault((double)defSpot.epsbl);
sensibn->setDefault((double)defSpot.sensibn); sensibn->setDefault((double)defSpot.sensibn);
recothresd->setDefault((double)defSpot.recothresd);
lowthresd->setDefault((double)defSpot.lowthresd);
higthresd->setDefault((double)defSpot.higthresd);
decayd->setDefault((double)defSpot.decayd);
noiselumf0->setDefault(defSpot.noiselumf0); noiselumf0->setDefault(defSpot.noiselumf0);
noiselumf->setDefault(defSpot.noiselumf); noiselumf->setDefault(defSpot.noiselumf);
noiselumf2->setDefault(defSpot.noiselumf2); noiselumf2->setDefault(defSpot.noiselumf2);
@ -6670,6 +6775,67 @@ void LocallabBlur::adjusterChanged(Adjuster* a, double newval)
} }
} }
if (a == recothres) {
if(recothres->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 1) {
showmaskblMethodtyp->set_active(2);
}
}
if (listener) {
listener->panelChanged(Evlocallabrecothres,
recothres->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == lowthres) {
if (listener) {
listener->panelChanged(Evlocallablowthres,
lowthres->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == higthres) {
if (listener) {
listener->panelChanged(Evlocallabhigthres,
higthres->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == recothresd) {
if(recothresd->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 0) {
showmaskblMethodtyp->set_active(2);
}
}
if (listener) {
listener->panelChanged(Evlocallabrecothresd,
recothresd->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == lowthresd) {
if (listener) {
listener->panelChanged(Evlocallablowthresd,
lowthresd->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == higthresd) {
if (listener) {
listener->panelChanged(Evlocallabhigthresd,
higthresd->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == decayd) {
if (listener) {
listener->panelChanged(Evlocallabdecayd,
decayd->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == epsbl) { if (a == epsbl) {
if (listener) { if (listener) {
listener->panelChanged(Evlocallabepsbl, listener->panelChanged(Evlocallabepsbl,
@ -6954,11 +7120,13 @@ void LocallabBlur::convertParamToNormal()
// Disable all listeners // Disable all listeners
disableListener(); disableListener();
invmask->set_active(defSpot.invmask);
invmaskd->set_active(defSpot.invmaskd);
// Set hidden GUI widgets in Normal mode to default spot values // Set hidden GUI widgets in Normal mode to default spot values
fftwbl->set_active(defSpot.fftwbl); fftwbl->set_active(defSpot.fftwbl);
strumaskbl->setValue(defSpot.strumaskbl); strumaskbl->setValue(defSpot.strumaskbl);
toolbl->set_active(defSpot.toolbl); toolbl->set_active(defSpot.toolbl);
decayd->setValue(defSpot.decayd);
lapmaskbl->setValue(defSpot.lapmaskbl); lapmaskbl->setValue(defSpot.lapmaskbl);
shadmaskbl->setValue((double)defSpot.shadmaskbl); shadmaskbl->setValue((double)defSpot.shadmaskbl);
shadmaskblsha->setValue((double)defSpot.shadmaskblsha); shadmaskblsha->setValue((double)defSpot.shadmaskblsha);
@ -6975,6 +7143,8 @@ void LocallabBlur::convertParamToSimple()
// Disable all listeners // Disable all listeners
disableListener(); disableListener();
invmask->set_active(defSpot.invmask);
invmaskd->set_active(defSpot.invmaskd);
// Set hidden specific GUI widgets in Simple mode to default spot values // Set hidden specific GUI widgets in Simple mode to default spot values
showmaskblMethod->set_active(0); showmaskblMethod->set_active(0);
@ -7001,6 +7171,15 @@ void LocallabBlur::convertParamToSimple()
lnoiselow->setValue(defSpot.lnoiselow); lnoiselow->setValue(defSpot.lnoiselow);
levelthrlow->setValue(defSpot.levelthrlow); levelthrlow->setValue(defSpot.levelthrlow);
usemask->set_active(defSpot.usemask); usemask->set_active(defSpot.usemask);
invmaskd->set_active(defSpot.invmaskd);
invmask->set_active(defSpot.invmask);
recothresd->setValue(defSpot.recothresd);
lowthresd->setValue(defSpot.lowthresd);
higthresd->setValue(defSpot.higthresd);
decayd->setValue(defSpot.decayd);
recothres->setValue(defSpot.recothres);
lowthres->setValue(defSpot.lowthres);
higthres->setValue(defSpot.higthres);
// Enable all listeners // Enable all listeners
enableListener(); enableListener();
@ -7014,9 +7193,17 @@ void LocallabBlur::updateGUIToMode(const modeType new_type)
fftwbl->hide(); fftwbl->hide();
expmaskbl->hide(); expmaskbl->hide();
expdenoise1->hide(); expdenoise1->hide();
expdenoise2->hide();
expdenoise3->hide();
maskusable->hide(); maskusable->hide();
maskunusable->hide(); maskunusable->hide();
maskusable2->hide();
maskunusable2->hide();
maskusable3->hide();
maskunusable3->hide();
decayd->hide();
invmask->hide();
invmaskd->hide();
break; break;
case Normal: case Normal:
@ -7032,17 +7219,46 @@ void LocallabBlur::updateGUIToMode(const modeType new_type)
// Specific Simple mode widgets are shown in Normal mode // Specific Simple mode widgets are shown in Normal mode
expmaskbl->show(); expmaskbl->show();
expdenoise1->show(); expdenoise1->show();
expdenoise2->hide();
expdenoise3->show();
if (blMethod->get_active_row_number() == 2) {
expdenoise2->show();
}
decayd->hide();
invmask->hide();
invmaskd->hide();
if(lnoiselow->getValue()!= 1.) { if(lnoiselow->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 0) { if (showmaskblMethodtyp->get_active_row_number() == 0) {
showmaskblMethodtyp->set_active(2); showmaskblMethodtyp->set_active(2);
} }
} }
if(recothres->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 1) {
showmaskblMethodtyp->set_active(2);
}
}
if(recothresd->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 0) {
showmaskblMethodtyp->set_active(2);
}
}
if (enablMask->get_active()) { if (enablMask->get_active()) {
maskusable->show(); maskusable->show();
maskunusable->hide(); maskunusable->hide();
maskusable2->show();
maskunusable2->hide();
maskusable3->show();
maskunusable3->hide();
} else { } else {
maskusable->hide(); maskusable->hide();
maskunusable->show(); maskunusable->show();
maskusable2->hide();
maskunusable2->show();
maskusable3->hide();
maskunusable3->show();
} }
break; break;
@ -7052,8 +7268,20 @@ void LocallabBlur::updateGUIToMode(const modeType new_type)
// Show widgets hidden in Normal and Simple mode // Show widgets hidden in Normal and Simple mode
if (blMethod->get_active_row_number() == 0) { // Keep widget hidden when blMethod is > 0 if (blMethod->get_active_row_number() == 0) { // Keep widget hidden when blMethod is > 0
fftwbl->show(); fftwbl->show();
expdenoise2->hide();
} }
if (blMethod->get_active_row_number() == 1) {
expdenoise2->hide();
}
if (blMethod->get_active_row_number() == 2) {
expdenoise2->show();
}
expdenoise1->show(); expdenoise1->show();
expdenoise3->show();
decayd->show();
invmask->show();
invmaskd->show();
expmaskbl->show(); expmaskbl->show();
strumaskbl->show(); strumaskbl->show();
@ -7068,12 +7296,31 @@ void LocallabBlur::updateGUIToMode(const modeType new_type)
showmaskblMethodtyp->set_active(2); showmaskblMethodtyp->set_active(2);
} }
} }
if(recothres->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 1) {
showmaskblMethodtyp->set_active(2);
}
}
if(recothresd->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 0) {
showmaskblMethodtyp->set_active(2);
}
}
if (enablMask->get_active()) { if (enablMask->get_active()) {
maskusable->show(); maskusable->show();
maskunusable->hide(); maskunusable->hide();
maskusable2->show();
maskunusable2->hide();
maskusable3->show();
maskunusable3->hide();
} else { } else {
maskusable->hide(); maskusable->hide();
maskunusable->show(); maskunusable->show();
maskusable2->hide();
maskunusable2->show();
maskusable3->show();
maskunusable3->hide();
} }
} }
@ -7152,6 +7399,37 @@ void LocallabBlur::usemaskChanged()
} }
} }
void LocallabBlur::invmaskdChanged()
{
if (isLocActivated && exp->getEnabled()) {
if (listener) {
if (invmaskd->get_active()) {
listener->panelChanged(Evlocallabinvmaskd,
M("GENERAL_ENABLED") + " (" + escapeHtmlChars(spotName) + ")");
} else {
listener->panelChanged(Evlocallabinvmaskd,
M("GENERAL_DISABLED") + " (" + escapeHtmlChars(spotName) + ")");
}
}
}
}
void LocallabBlur::invmaskChanged()
{
if (isLocActivated && exp->getEnabled()) {
if (listener) {
if (invmask->get_active()) {
listener->panelChanged(Evlocallabinvmask,
M("GENERAL_ENABLED") + " (" + escapeHtmlChars(spotName) + ")");
} else {
listener->panelChanged(Evlocallabinvmask,
M("GENERAL_DISABLED") + " (" + escapeHtmlChars(spotName) + ")");
}
}
}
}
void LocallabBlur::invblChanged() void LocallabBlur::invblChanged()
{ {
const LocallabParams::LocallabSpot defSpot; const LocallabParams::LocallabSpot defSpot;
@ -7257,6 +7535,16 @@ void LocallabBlur::showmaskblMethodtypChanged()
showmaskblMethodtyp->set_active(2); showmaskblMethodtyp->set_active(2);
} }
} }
if(recothres->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 1) {
showmaskblMethodtyp->set_active(2);
}
}
if(recothresd->getValue()!= 1.) {
if (showmaskblMethodtyp->get_active_row_number() == 0) {
showmaskblMethodtyp->set_active(2);
}
}
// If mask preview is activated, deactivate all other tool mask preview // If mask preview is activated, deactivate all other tool mask preview
if (locToolListener) { if (locToolListener) {
@ -7274,9 +7562,17 @@ void LocallabBlur::enablMaskChanged()
if (enablMask->get_active()) { if (enablMask->get_active()) {
maskusable->show(); maskusable->show();
maskunusable->hide(); maskunusable->hide();
maskusable2->show();
maskunusable2->hide();
maskusable3->show();
maskunusable3->hide();
} else { } else {
maskusable->hide(); maskusable->hide();
maskunusable->show(); maskunusable->show();
maskusable2->hide();
maskunusable2->show();
maskusable3->hide();
maskunusable3->show();
} }
if (isLocActivated && exp->getEnabled()) { if (isLocActivated && exp->getEnabled()) {
@ -7329,7 +7625,7 @@ void LocallabBlur::updateBlurGUI()
if (mode == Expert) { // Keep widget hidden in Normal and Simple mode if (mode == Expert) { // Keep widget hidden in Normal and Simple mode
fftwbl->show(); fftwbl->show();
} }
expdenoise2->hide();
radius->show(); radius->show();
strength->show(); strength->show();
grainFrame->show(); grainFrame->show();
@ -7337,6 +7633,9 @@ void LocallabBlur::updateBlurGUI()
itera->hide(); itera->hide();
guidbl->hide(); guidbl->hide();
strbl->hide(); strbl->hide();
recothres->hide();
lowthres->hide();
higthres->hide();
epsbl->hide(); epsbl->hide();
activlum->show(); activlum->show();
} else if (blMethod->get_active_row_number() == 1) { } else if (blMethod->get_active_row_number() == 1) {
@ -7348,6 +7647,10 @@ void LocallabBlur::updateBlurGUI()
itera->show(); itera->show();
guidbl->hide(); guidbl->hide();
strbl->hide(); strbl->hide();
expdenoise2->hide();
recothres->hide();
lowthres->hide();
higthres->hide();
epsbl->hide(); epsbl->hide();
activlum->show(); activlum->show();
} else if (blMethod->get_active_row_number() == 2) { } else if (blMethod->get_active_row_number() == 2) {
@ -7359,6 +7662,13 @@ void LocallabBlur::updateBlurGUI()
itera->hide(); itera->hide();
guidbl->show(); guidbl->show();
strbl->show(); strbl->show();
expdenoise2->hide();
if (mode == Expert || mode == Normal){
expdenoise2->show();
recothres->show();
lowthres->show();
higthres->show();
}
epsbl->show(); epsbl->show();
activlum->hide(); activlum->hide();
} }

View File

@ -654,6 +654,10 @@ private:
Adjuster* const guidbl; Adjuster* const guidbl;
Adjuster* const strbl; Adjuster* const strbl;
Adjuster* const epsbl; Adjuster* const epsbl;
MyExpander* const expdenoise2;
Adjuster* const recothres;
Adjuster* const lowthres;
Adjuster* const higthres;
Adjuster* const sensibn; Adjuster* const sensibn;
MyComboBoxText* const blurMethod; MyComboBoxText* const blurMethod;
Gtk::CheckButton* const invbl; Gtk::CheckButton* const invbl;
@ -666,6 +670,10 @@ private:
MyExpander* const expdenoise1; MyExpander* const expdenoise1;
Gtk::Label* const maskusable; Gtk::Label* const maskusable;
Gtk::Label* const maskunusable; Gtk::Label* const maskunusable;
Gtk::Label* const maskusable2;
Gtk::Label* const maskunusable2;
Gtk::Label* const maskusable3;
Gtk::Label* const maskunusable3;
Gtk::CheckButton* const usemask; Gtk::CheckButton* const usemask;
Adjuster* const lnoiselow; Adjuster* const lnoiselow;
@ -685,6 +693,15 @@ private:
Gtk::Frame* const detailFrame; Gtk::Frame* const detailFrame;
Adjuster* const detailthr; Adjuster* const detailthr;
Adjuster* const adjblur; Adjuster* const adjblur;
MyExpander* const expdenoise3;
Adjuster* const recothresd;
Adjuster* const lowthresd;
Adjuster* const higthresd;
Adjuster* const decayd;
Gtk::CheckButton* const invmaskd;
Gtk::CheckButton* const invmask;
Adjuster* const bilateral; Adjuster* const bilateral;
Adjuster* const sensiden; Adjuster* const sensiden;
Gtk::Button* neutral; Gtk::Button* neutral;
@ -715,7 +732,7 @@ private:
ThresholdAdjuster* const csThresholdblur; ThresholdAdjuster* const csThresholdblur;
sigc::connection blMethodConn, fftwblConn, invblConn, medMethodConn, blurMethodConn, chroMethodConn, activlumConn, showmaskblMethodConn, showmaskblMethodtypConn, enablMaskConn, toolblConn; sigc::connection blMethodConn, fftwblConn, invblConn, medMethodConn, blurMethodConn, chroMethodConn, activlumConn, showmaskblMethodConn, showmaskblMethodtypConn, enablMaskConn, toolblConn;
sigc::connection quamethodconn, usemaskConn, neutralconn; sigc::connection quamethodconn, usemaskConn, invmaskdConn, invmaskConn, neutralconn;
public: public:
LocallabBlur(); LocallabBlur();
~LocallabBlur(); ~LocallabBlur();
@ -753,6 +770,8 @@ private:
void blMethodChanged(); void blMethodChanged();
void fftwblChanged(); void fftwblChanged();
void usemaskChanged(); void usemaskChanged();
void invmaskdChanged();
void invmaskChanged();
void invblChanged(); void invblChanged();
void medMethodChanged(); void medMethodChanged();
void blurMethodChanged(); void blurMethodChanged();

View File

@ -1276,6 +1276,13 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
locallab.spots.at(j).itera = locallab.spots.at(j).itera && pSpot.itera == otherSpot.itera; locallab.spots.at(j).itera = locallab.spots.at(j).itera && pSpot.itera == otherSpot.itera;
locallab.spots.at(j).guidbl = locallab.spots.at(j).guidbl && pSpot.guidbl == otherSpot.guidbl; locallab.spots.at(j).guidbl = locallab.spots.at(j).guidbl && pSpot.guidbl == otherSpot.guidbl;
locallab.spots.at(j).strbl = locallab.spots.at(j).strbl && pSpot.strbl == otherSpot.strbl; locallab.spots.at(j).strbl = locallab.spots.at(j).strbl && pSpot.strbl == otherSpot.strbl;
locallab.spots.at(j).recothres = locallab.spots.at(j).recothres && pSpot.recothres == otherSpot.recothres;
locallab.spots.at(j).lowthres = locallab.spots.at(j).lowthres && pSpot.lowthres == otherSpot.lowthres;
locallab.spots.at(j).higthres = locallab.spots.at(j).higthres && pSpot.higthres == otherSpot.higthres;
locallab.spots.at(j).recothresd = locallab.spots.at(j).recothresd && pSpot.recothresd == otherSpot.recothresd;
locallab.spots.at(j).lowthresd = locallab.spots.at(j).lowthresd && pSpot.lowthresd == otherSpot.lowthresd;
locallab.spots.at(j).higthresd = locallab.spots.at(j).higthresd && pSpot.higthresd == otherSpot.higthresd;
locallab.spots.at(j).decayd = locallab.spots.at(j).decayd && pSpot.decayd == otherSpot.decayd;
locallab.spots.at(j).isogr = locallab.spots.at(j).isogr && pSpot.isogr == otherSpot.isogr; locallab.spots.at(j).isogr = locallab.spots.at(j).isogr && pSpot.isogr == otherSpot.isogr;
locallab.spots.at(j).strengr = locallab.spots.at(j).strengr && pSpot.strengr == otherSpot.strengr; locallab.spots.at(j).strengr = locallab.spots.at(j).strengr && pSpot.strengr == otherSpot.strengr;
locallab.spots.at(j).scalegr = locallab.spots.at(j).scalegr && pSpot.scalegr == otherSpot.scalegr; locallab.spots.at(j).scalegr = locallab.spots.at(j).scalegr && pSpot.scalegr == otherSpot.scalegr;
@ -1285,6 +1292,8 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
locallab.spots.at(j).quamethod = locallab.spots.at(j).quamethod && pSpot.quamethod == otherSpot.quamethod; locallab.spots.at(j).quamethod = locallab.spots.at(j).quamethod && pSpot.quamethod == otherSpot.quamethod;
locallab.spots.at(j).blurMethod = locallab.spots.at(j).blurMethod && pSpot.blurMethod == otherSpot.blurMethod; locallab.spots.at(j).blurMethod = locallab.spots.at(j).blurMethod && pSpot.blurMethod == otherSpot.blurMethod;
locallab.spots.at(j).usemask = locallab.spots.at(j).usemask && pSpot.usemask == otherSpot.usemask; locallab.spots.at(j).usemask = locallab.spots.at(j).usemask && pSpot.usemask == otherSpot.usemask;
locallab.spots.at(j).invmaskd = locallab.spots.at(j).invmaskd && pSpot.invmaskd == otherSpot.invmaskd;
locallab.spots.at(j).invmask = locallab.spots.at(j).invmask && pSpot.invmask == otherSpot.invmask;
locallab.spots.at(j).levelthr = locallab.spots.at(j).levelthr && pSpot.levelthr == otherSpot.levelthr; locallab.spots.at(j).levelthr = locallab.spots.at(j).levelthr && pSpot.levelthr == otherSpot.levelthr;
locallab.spots.at(j).lnoiselow = locallab.spots.at(j).lnoiselow && pSpot.lnoiselow == otherSpot.lnoiselow; locallab.spots.at(j).lnoiselow = locallab.spots.at(j).lnoiselow && pSpot.lnoiselow == otherSpot.lnoiselow;
locallab.spots.at(j).levelthrlow = locallab.spots.at(j).levelthrlow && pSpot.levelthrlow == otherSpot.levelthrlow; locallab.spots.at(j).levelthrlow = locallab.spots.at(j).levelthrlow && pSpot.levelthrlow == otherSpot.levelthrlow;
@ -4024,6 +4033,34 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.locallab.spots.at(i).strbl = mods.locallab.spots.at(i).strbl; toEdit.locallab.spots.at(i).strbl = mods.locallab.spots.at(i).strbl;
} }
if (locallab.spots.at(i).recothres) {
toEdit.locallab.spots.at(i).recothres = mods.locallab.spots.at(i).recothres;
}
if (locallab.spots.at(i).lowthres) {
toEdit.locallab.spots.at(i).lowthres = mods.locallab.spots.at(i).lowthres;
}
if (locallab.spots.at(i).higthres) {
toEdit.locallab.spots.at(i).higthres = mods.locallab.spots.at(i).higthres;
}
if (locallab.spots.at(i).recothresd) {
toEdit.locallab.spots.at(i).recothresd = mods.locallab.spots.at(i).recothresd;
}
if (locallab.spots.at(i).lowthresd) {
toEdit.locallab.spots.at(i).lowthresd = mods.locallab.spots.at(i).lowthresd;
}
if (locallab.spots.at(i).higthresd) {
toEdit.locallab.spots.at(i).higthresd = mods.locallab.spots.at(i).higthresd;
}
if (locallab.spots.at(i).decayd) {
toEdit.locallab.spots.at(i).decayd = mods.locallab.spots.at(i).decayd;
}
if (locallab.spots.at(i).isogr) { if (locallab.spots.at(i).isogr) {
toEdit.locallab.spots.at(i).isogr = mods.locallab.spots.at(i).isogr; toEdit.locallab.spots.at(i).isogr = mods.locallab.spots.at(i).isogr;
} }
@ -4060,6 +4097,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.locallab.spots.at(i).usemask = mods.locallab.spots.at(i).usemask; toEdit.locallab.spots.at(i).usemask = mods.locallab.spots.at(i).usemask;
} }
if (locallab.spots.at(i).invmaskd) {
toEdit.locallab.spots.at(i).invmaskd = mods.locallab.spots.at(i).invmaskd;
}
if (locallab.spots.at(i).invmask) {
toEdit.locallab.spots.at(i).invmask = mods.locallab.spots.at(i).invmask;
}
if (locallab.spots.at(i).levelthr) { if (locallab.spots.at(i).levelthr) {
toEdit.locallab.spots.at(i).levelthr = mods.locallab.spots.at(i).levelthr; toEdit.locallab.spots.at(i).levelthr = mods.locallab.spots.at(i).levelthr;
} }
@ -6580,6 +6625,13 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) :
itera(v), itera(v),
guidbl(v), guidbl(v),
strbl(v), strbl(v),
recothres(v),
lowthres(v),
higthres(v),
recothresd(v),
lowthresd(v),
higthresd(v),
decayd(v),
isogr(v), isogr(v),
strengr(v), strengr(v),
scalegr(v), scalegr(v),
@ -6588,6 +6640,8 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) :
chroMethod(v), chroMethod(v),
quamethod(v), quamethod(v),
usemask(v), usemask(v),
invmaskd(v),
invmask(v),
levelthr(v), levelthr(v),
lnoiselow(v), lnoiselow(v),
levelthrlow(v), levelthrlow(v),
@ -7099,6 +7153,13 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v)
itera = v; itera = v;
guidbl = v; guidbl = v;
strbl = v; strbl = v;
recothres = v;
lowthres = v;
higthres = v;
recothresd = v;
lowthresd = v;
higthresd = v;
decayd = v;
isogr = v; isogr = v;
strengr = v; strengr = v;
scalegr = v; scalegr = v;
@ -7107,6 +7168,8 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v)
chroMethod = v; chroMethod = v;
quamethod = v; quamethod = v;
usemask = v; usemask = v;
invmaskd = v;
invmask = v;
levelthr = v; levelthr = v;
lnoiselow = v; lnoiselow = v;
levelthrlow = v; levelthrlow = v;

View File

@ -613,6 +613,13 @@ public:
bool itera; bool itera;
bool guidbl; bool guidbl;
bool strbl; bool strbl;
bool recothres;
bool lowthres;
bool higthres;
bool recothresd;
bool lowthresd;
bool higthresd;
bool decayd;
bool isogr; bool isogr;
bool strengr; bool strengr;
bool scalegr; bool scalegr;
@ -621,6 +628,8 @@ public:
bool chroMethod; bool chroMethod;
bool quamethod; bool quamethod;
bool usemask; bool usemask;
bool invmaskd;
bool invmask;
bool levelthr; bool levelthr;
bool lnoiselow; bool lnoiselow;
bool levelthrlow; bool levelthrlow;