Local adjustments - Color and light - Recovery based on luminance mask (#6035)

* Init GUI color mask recovery

* Enable recovery Color and Light with mask

* Disabled invmaskd in color and light

* Hide decay in standard - added tooltips

* Change tooltips

* Change normal to simple for all defaults mask
This commit is contained in:
Desmis 2020-12-29 10:27:57 +01:00 committed by GitHub
parent d2cd5f21c9
commit bad08bfe1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 345 additions and 64 deletions

View File

@ -1239,6 +1239,11 @@ 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_995;Local - Denoise decay
HISTORY_MSG_996;Local - Color recovery threshold
HISTORY_MSG_997;Local - Color threshold mask low
HISTORY_MSG_998;Local - Color threshold mask high
HISTORY_MSG_999;Local - Color decay
HISTORY_MSG_BLSHAPE;Blur by level
HISTORY_MSG_BLURCWAV;Blur chroma
HISTORY_MSG_BLURWAV;Blur luminance
@ -2776,16 +2781,17 @@ 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_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_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_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings 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 The dark and light areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied
TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased.
TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Light-tone limit above which Color and Light will be restored progressively to their original values prior to being modified by the Color and Light settings .\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_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_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which Color and Light will be restored progressively to their original values prior to being modified by the Color and Light settings.\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_MASKUNUSABLE;Mask disabled (Mask & modifications)
TP_LOCALLAB_MASKRECOTHRES;Recovery threshold

View File

@ -586,6 +586,10 @@ struct local_params {
float lowthrd;
float higthrd;
float decayd;
float recothrc;
float lowthrc;
float higthrc;
float decayc;
int noiselequal;
float noisechrodetail;
float bilat;
@ -1041,6 +1045,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
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_recothrc = (float)locallab.spots.at(sp).recothresc;
float local_lowthrc = (float)locallab.spots.at(sp).lowthresc;
float local_higthrc = (float)locallab.spots.at(sp).higthresc;
float local_decayc = (float)locallab.spots.at(sp).decayc;
float local_noisecf = ((float)locallab.spots.at(sp).noisechrof) / 10.f;
float local_noisecc = ((float)locallab.spots.at(sp).noisechroc) / 10.f;
@ -1395,6 +1403,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall
lp.lowthrd = local_lowthrd;
lp.higthrd = local_higthrd;
lp.decayd = local_decayd;
lp.recothrc = local_recothrc;
lp.lowthrc = local_lowthrc;
lp.higthrc = local_higthrc;
lp.decayc = local_decayc;
lp.noiselequal = local_noiselequal;
lp.noisechrodetail = local_noisechrodetail;
lp.noiselc = local_noiselc;
@ -15345,6 +15357,82 @@ void ImProcFunctions::Lab_Local(
if (lp.softradiuscol > 0.f) {
softproc(bufcolorig.get(), bufcolfin.get(), lp.softradiuscol, bfh, bfw, 0.001, 0.00001, 0.5f, sk, multiThread, 1);
}
//mask recovery
if(lp.enaColorMask && lp.recothrc != 1.f) {
LabImage tmp3(bfw, bfh);
for (int y = 0; y < bfh; y++){
for (int x = 0; x < bfw; x++) {
tmp3.L[y][x] = original->L[y + ystart][x + xstart];
tmp3.a[y][x] = original->a[y + ystart][x + xstart];
tmp3.b[y][x] = original->b[y + ystart][x + xstart];
}
}
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.higthrc;
float higc;
calcdif(hig, higc);
float low = lp.lowthrc;
float lowc;
calcdif(low, lowc);
if(higc < lowc) {
higc = lowc + 0.01f;
}
float th = (lp.recothrc - 1.f);
float ahigh = th / (higc - 100.f);
float bhigh = 1.f - higc * ahigh;
float alow = th / lowc;
float blow = 1.f - th;
bool invmaskc = false;
#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 = bufmaskblurcol->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(invmaskc == false) {
masklum[ir][jr] = 1 - pow(k, lp.decayc);
} else {
masklum[ir][jr] = pow(k, lp.decayc);
}
}
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) {
bufcolfin->L[i][j] = (tmp3.L[i][j] - bufcolfin->L[i][j]) * LIM01(masklum[i][j]) + bufcolfin->L[i][j];
bufcolfin->a[i][j] = (tmp3.a[i][j] - bufcolfin->a[i][j]) * LIM01(masklum[i][j]) + bufcolfin->a[i][j];
bufcolfin->b[i][j] = (tmp3.b[i][j] - bufcolfin->b[i][j]) * LIM01(masklum[i][j]) + bufcolfin->b[i][j];
}
}
masklum.free();
}
float meansob = 0.f;
transit_shapedetect2(call, 0, bufcolorig.get(), bufcolfin.get(), originalmaskcol.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk);
}

View File

@ -1018,6 +1018,10 @@ enum ProcEventCode {
Evlocallabinvmaskd = 992,
Evlocallabinvmask = 993,
Evlocallabdecayd = 994,
Evlocallabrecothresc = 995,
Evlocallablowthresc = 996,
Evlocallabhigthresc = 997,
Evlocallabdecayc = 998,
NUMOFEVENTS
};

View File

@ -3026,6 +3026,10 @@ LocallabParams::LocallabSpot::LocallabSpot() :
0.35
},
csthresholdcol(0, 0, 6, 5, false),
recothresc(1.),
lowthresc(12.),
higthresc(85.),
decayc(2.),
// Exposure
visiexpose(false),
expexpose(false),
@ -4222,6 +4226,10 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const
&& Lmaskcurve == other.Lmaskcurve
&& LLmaskcolcurvewav == other.LLmaskcolcurvewav
&& csthresholdcol == other.csthresholdcol
&& recothresc == other.recothresc
&& lowthresc == other.lowthresc
&& higthresc == other.higthresc
&& decayc == other.decayc
// Exposure
&& visiexpose == other.visiexpose
&& expexpose == other.expexpose
@ -5817,6 +5825,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || spot_edited->Lmaskcurve, "Locallab", "LmaskCurve_" + index_str, spot.Lmaskcurve, keyFile);
saveToKeyfile(!pedited || spot_edited->LLmaskcolcurvewav, "Locallab", "LLmaskcolCurvewav_" + index_str, spot.LLmaskcolcurvewav, keyFile);
saveToKeyfile(!pedited || spot_edited->csthresholdcol, "Locallab", "CSThresholdcol_" + index_str, spot.csthresholdcol.toVector(), keyFile);
saveToKeyfile(!pedited || spot_edited->recothresc, "Locallab", "Recothresc_" + index_str, spot.recothresc, keyFile);
saveToKeyfile(!pedited || spot_edited->lowthresc, "Locallab", "Lowthresc_" + index_str, spot.lowthresc, keyFile);
saveToKeyfile(!pedited || spot_edited->higthresc, "Locallab", "Higthresc_" + index_str, spot.higthresc, keyFile);
saveToKeyfile(!pedited || spot_edited->decayc, "Locallab", "Decayc_" + index_str, spot.decayc, keyFile);
}
// Exposure
if ((!pedited || spot_edited->visiexpose) && spot.visiexpose) {
@ -7600,6 +7612,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
spotEdited.csthresholdcol = true;
}
assignFromKeyfile(keyFile, "Locallab", "Recothresc_" + index_str, pedited, spot.recothresc, spotEdited.recothresc);
assignFromKeyfile(keyFile, "Locallab", "Lowthresc_" + index_str, pedited, spot.lowthresc, spotEdited.lowthresc);
assignFromKeyfile(keyFile, "Locallab", "Higthresc_" + index_str, pedited, spot.higthresc, spotEdited.higthresc);
assignFromKeyfile(keyFile, "Locallab", "Decayc_" + index_str, pedited, spot.decayc, spotEdited.decayc);
// Exposure
spot.visiexpose = assignFromKeyfile(keyFile, "Locallab", "Expexpose_" + index_str, pedited, spot.expexpose, spotEdited.expexpose);

View File

@ -1084,6 +1084,10 @@ struct LocallabParams {
std::vector<double> Lmaskcurve;
std::vector<double> LLmaskcolcurvewav;
Threshold<int> csthresholdcol;
double recothresc;
double lowthresc;
double higthresc;
double decayc;
// Exposure
bool visiexpose;
bool expexpose;

View File

@ -1021,7 +1021,11 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
LUMINANCECURVE, // Evlocallabhigthresd
LUMINANCECURVE, // Evlocallabinvmaskd
LUMINANCECURVE, // Evlocallabinvmask
LUMINANCECURVE // Evlocallabdecayd
LUMINANCECURVE, // Evlocallabdecayd
LUMINANCECURVE, // Evlocallabrecothresc
LUMINANCECURVE, // Evlocallablowthresc
LUMINANCECURVE, // Evlocallabhigthresc
LUMINANCECURVE // Evlocallabdecayc
};

View File

@ -424,6 +424,13 @@ LocallabColor::LocallabColor():
structcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL1"), 0, 100, 1, 0))),
blurcolde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))),
softradiuscol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))),
exprecov(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))),
maskusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))),
maskunusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))),
recothresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))),
lowthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))),
higthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))),
decayc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))),
invers(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))),
expgradcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))),
strcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRLUM"), -4., 4., 0.05, 0.))),
@ -531,6 +538,11 @@ LocallabColor::LocallabColor():
softradiuscol->setLogScale(10, 0);
softradiuscol->setAdjusterListener(this);
recothresc->setAdjusterListener(this);
lowthresc->setAdjusterListener(this);
higthresc->setAdjusterListener(this);
decayc->setAdjusterListener(this);
setExpandAlignProperties(exprecov, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START);
inversConn = invers->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::inversChanged));
invers->set_tooltip_text(M("TP_LOCALLAB_INVERS_TOOLTIP"));
@ -788,6 +800,18 @@ LocallabColor::LocallabColor():
pack_start(*blurcolde);
pack_start(*softradiuscol);
pack_start(*invers);
ToolParamBlock* const colBox3 = Gtk::manage(new ToolParamBlock());
colBox3->pack_start(*maskusablec, Gtk::PACK_SHRINK, 0);
colBox3->pack_start(*maskunusablec, Gtk::PACK_SHRINK, 0);
colBox3->pack_start(*recothresc);
colBox3->pack_start(*lowthresc);
colBox3->pack_start(*higthresc);
colBox3->pack_start(*decayc);
// colBox3->pack_start(*invmaskc);
exprecov->add(*colBox3, false);
pack_start(*exprecov, false, false);
ToolParamBlock* const gradcolBox = Gtk::manage(new ToolParamBlock());
gradcolBox->pack_start(*strcol);
gradcolBox->pack_start(*strcolab);
@ -923,6 +947,7 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips)
strengthgrid->set_tooltip_text(M("TP_LOCALLAB_STRENGRID_TOOLTIP"));
blurcolde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP"));
softradiuscol->set_tooltip_text(M("TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP"));
exprecov->set_tooltip_markup(M("TP_LOCALLAB_MASKRECOL_TOOLTIP"));
expgradcol->set_tooltip_text(M("TP_LOCALLAB_EXPGRADCOL_TOOLTIP"));
rgbCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_RGBCURVE_TOOLTIP"));
sensi->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP"));
@ -963,6 +988,9 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips)
blurcol->set_tooltip_text(M("TP_LOCALLAB_BLURRMASK_TOOLTIP"));
lapmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP"));
csThresholdcol->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP"));
decayc->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP"));
lowthresc->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP"));
higthresc->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP"));
} else {
lumFrame->set_tooltip_text("");
lightness->set_tooltip_text("");
@ -970,6 +998,7 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips)
strengthgrid->set_tooltip_text("");
blurcolde->set_tooltip_text("");
softradiuscol->set_tooltip_text("");
exprecov->set_tooltip_markup("");
expgradcol->set_tooltip_text("");
rgbCurveEditorG->set_tooltip_text("");
sensi->set_tooltip_text("");
@ -1010,11 +1039,15 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips)
mask2CurveEditorGwav->set_tooltip_text("");
LLmaskcolshapewav->setTooltip("");
csThresholdcol->set_tooltip_text("");
decayc->set_tooltip_text("");
lowthresc->set_tooltip_text("");
higthresc->set_tooltip_text("");
}
}
void LocallabColor::setDefaultExpanderVisibility()
{
exprecov->set_expanded(false);
expgradcol->set_expanded(false);
expcurvcol->set_expanded(false);
expmaskcol1->set_expanded(false);
@ -1142,6 +1175,11 @@ void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const Param
merMethod->set_active(3);
}
recothresc->setValue((double)spot.recothresc);
lowthresc->setValue((double)spot.lowthresc);
higthresc->setValue((double)spot.higthresc);
decayc->setValue((double)spot.decayc);
if (spot.mergecolMethod == "one") {
mergecolMethod->set_active(0);
} else if (spot.mergecolMethod == "two") {
@ -1275,6 +1313,11 @@ void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pe
spot.strcolh = strcolh->getValue();
spot.angcol = angcol->getValue();
spot.recothresc = recothresc->getValue();
spot.lowthresc = lowthresc->getValue();
spot.higthresc = higthresc->getValue();
spot.decayc = decayc->getValue();
if (qualitycurveMethod->get_active_row_number() == 0) {
spot.qualitycurveMethod = "none";
} else if (qualitycurveMethod->get_active_row_number() == 1) {
@ -1438,6 +1481,11 @@ void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParam
slomaskcol->setDefault(defSpot.slomaskcol);
shadmaskcol->setDefault((double)defSpot.shadmaskcol);
csThresholdcol->setDefault<int>(defSpot.csthresholdcol);
recothresc->setDefault((double)defSpot.recothresc);
lowthresc->setDefault((double)defSpot.lowthresc);
higthresc->setDefault((double)defSpot.higthresc);
decayc->setDefault((double)defSpot.decayc);
}
// Note: No need to manage pedited as batch mode is deactivated for Locallab
@ -1502,6 +1550,36 @@ void LocallabColor::adjusterChanged(Adjuster* a, double newval)
}
}
if (a == recothresc) {
if (listener) {
listener->panelChanged(Evlocallabrecothresc,
recothresc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == lowthresc) {
if (listener) {
listener->panelChanged(Evlocallablowthresc,
lowthresc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == higthresc) {
if (listener) {
listener->panelChanged(Evlocallabhigthresc,
higthresc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == decayc) {
if (listener) {
listener->panelChanged(Evlocallabdecayc,
decayc->getTextValue() + " (" + escapeHtmlChars(spotName) + ")");
}
}
if (a == strcol) {
if (listener) {
listener->panelChanged(Evlocallabstrcol,
@ -1867,6 +1945,7 @@ void LocallabColor::convertParamToNormal()
HHhmaskshape->setCurve(defSpot.HHhmaskcurve);
LLmaskcolshapewav->setCurve(defSpot.LLmaskcolcurvewav);
csThresholdcol->setValue<int>(defSpot.csthresholdcol);
decayc->setValue(defSpot.decayc);
// Enable all listeners
enableListener();
@ -1901,13 +1980,17 @@ void LocallabColor::convertParamToSimple()
showmaskcolMethod->set_active(0);
showmaskcolMethodinv->set_active(0);
enaColorMask->set_active(defSpot.enaColorMask);
CCmaskshape->setCurve(defSpot.CCmaskcurve);
LLmaskshape->setCurve(defSpot.LLmaskcurve);
HHmaskshape->setCurve(defSpot.HHmaskcurve);
blendmaskcol->setValue((double)defSpot.blendmaskcol);
radmaskcol->setValue(defSpot.radmaskcol);
chromaskcol->setValue(defSpot.chromaskcol);
Lmaskshape->setCurve(defSpot.Lmaskcurve);
// CCmaskshape->setCurve(defSpot.CCmaskcurve);
// LLmaskshape->setCurve(defSpot.LLmaskcurve);
// HHmaskshape->setCurve(defSpot.HHmaskcurve);
// blendmaskcol->setValue((double)defSpot.blendmaskcol);
// radmaskcol->setValue(defSpot.radmaskcol);
// chromaskcol->setValue(defSpot.chromaskcol);
// Lmaskshape->setCurve(defSpot.Lmaskcurve);
recothresc->setValue(defSpot.recothresc);
lowthresc->setValue(defSpot.lowthresc);
higthresc->setValue(defSpot.higthresc);
decayc->setValue(defSpot.decayc);
// Enable all listeners
enableListener();
@ -1925,7 +2008,10 @@ void LocallabColor::updateGUIToMode(const modeType new_type)
expcurvcol->hide();
expmaskcol1->hide();
expmaskcol->hide();
exprecov->hide();
maskusablec->hide();
maskunusablec->hide();
decayc->hide();
break;
case Normal:
@ -1940,6 +2026,7 @@ void LocallabColor::updateGUIToMode(const modeType new_type)
H2CurveEditorG->hide();
rgbCurveEditorG->hide();
special->hide();
exprecov->show();
expmaskcol1->hide();
struFrame->hide();
blurFrame->hide();
@ -1952,13 +2039,23 @@ void LocallabColor::updateGUIToMode(const modeType new_type)
csThresholdcol->hide();
// Specific Simple mode widgets are shown in Normal mode
softradiuscol->show();
if (enaColorMask->get_active()) {
maskusablec->show();
maskunusablec->hide();
} else {
maskusablec->hide();
maskunusablec->show();
}
if (!invers->get_active()) { // Keep widget hidden when invers is toggled
expgradcol->show();
exprecov->show();
}
expcurvcol->show();
expmaskcol->show();
decayc->hide();
break;
@ -1970,11 +2067,23 @@ void LocallabColor::updateGUIToMode(const modeType new_type)
if (!invers->get_active()) { // Keep widget hidden when invers is toggled
softradiuscol->show();
expgradcol->show();
exprecov->show();
}
strcolab->show();
strcolh->show();
expcurvcol->show();
if (enaColorMask->get_active()) {
maskusablec->show();
maskunusablec->hide();
} else {
maskusablec->hide();
maskunusablec->show();
}
exprecov->show();
decayc->show();
if (!invers->get_active()) { // Keep widgets hidden when invers is toggled
clCurveEditorG->show();
@ -2173,6 +2282,15 @@ void LocallabColor::showmaskcolMethodChangedinv()
void LocallabColor::enaColorMaskChanged()
{
if (enaColorMask->get_active()) {
maskusablec->show();
maskunusablec->hide();
} else {
maskusablec->hide();
maskunusablec->show();
}
if (isLocActivated && exp->getEnabled()) {
if (listener) {
if (enaColorMask->get_active()) {
@ -2227,6 +2345,7 @@ void LocallabColor::updateColorGUI1()
structcol->hide();
softradiuscol->hide();
expgradcol->hide();
exprecov->hide();
labqualcurv->hide();
qualitycurveMethod->hide();
clCurveEditorG->hide();
@ -2251,6 +2370,7 @@ void LocallabColor::updateColorGUI1()
if (mode == Expert || mode == Normal) { // Keep widget hidden in Simple mode
softradiuscol->show();
expgradcol->show();
exprecov->show();
}
labqualcurv->show();
@ -3250,13 +3370,13 @@ void LocallabExposure::convertParamToSimple()
softradiusexp->setValue(defSpot.softradiusexp);
enaExpMask->set_active(defSpot.enaExpMask);
enaExpMaskaft->set_active(defSpot.enaExpMaskaft);
CCmaskexpshape->setCurve(defSpot.CCmaskexpcurve);
LLmaskexpshape->setCurve(defSpot.CCmaskexpcurve);
HHmaskexpshape->setCurve(defSpot.HHmaskexpcurve);
blendmaskexp->setValue((double)defSpot.blendmaskexp);
radmaskexp->setValue(defSpot.radmaskexp);
chromaskexp->setValue(defSpot.chromaskexp);
Lmaskexpshape->setCurve(defSpot.Lmaskexpcurve);
// CCmaskexpshape->setCurve(defSpot.CCmaskexpcurve);
// LLmaskexpshape->setCurve(defSpot.CCmaskexpcurve);
// HHmaskexpshape->setCurve(defSpot.HHmaskexpcurve);
// blendmaskexp->setValue((double)defSpot.blendmaskexp);
// radmaskexp->setValue(defSpot.radmaskexp);
// chromaskexp->setValue(defSpot.chromaskexp);
// Lmaskexpshape->setCurve(defSpot.Lmaskexpcurve);
// Enable all listeners
enableListener();
@ -4262,13 +4382,13 @@ void LocallabShadow::convertParamToSimple()
showmaskSHMethod->set_active(0);
showmaskSHMethodinv->set_active(0);
enaSHMask->set_active(defSpot.enaSHMask);
CCmaskSHshape->setCurve(defSpot.CCmaskSHcurve);
LLmaskSHshape->setCurve(defSpot.LLmaskSHcurve);
HHmaskSHshape->setCurve(defSpot.HHmaskSHcurve);
blendmaskSH->setValue((double)defSpot.blendmaskSH);
radmaskSH->setValue(defSpot.radmaskSH);
chromaskSH->setValue(defSpot.chromaskSH);
LmaskSHshape->setCurve(defSpot.LmaskSHcurve);
// CCmaskSHshape->setCurve(defSpot.CCmaskSHcurve);
// LLmaskSHshape->setCurve(defSpot.LLmaskSHcurve);
// HHmaskSHshape->setCurve(defSpot.HHmaskSHcurve);
// blendmaskSH->setValue((double)defSpot.blendmaskSH);
// radmaskSH->setValue(defSpot.radmaskSH);
// chromaskSH->setValue(defSpot.chromaskSH);
// LmaskSHshape->setCurve(defSpot.LmaskSHcurve);
// Enable all listeners
enableListener();
@ -5169,13 +5289,13 @@ void LocallabVibrance::convertParamToSimple()
angvib->setValue(defSpot.angvib);
showmaskvibMethod->set_active(0);
enavibMask->set_active(defSpot.enavibMask);
CCmaskvibshape->setCurve(defSpot.CCmaskvibcurve);
LLmaskvibshape->setCurve(defSpot.LLmaskvibcurve);
HHmaskvibshape->setCurve(defSpot.HHmaskvibcurve);
blendmaskvib->setValue((double)defSpot.blendmaskvib);
radmaskvib->setValue(defSpot.radmaskvib);
chromaskvib->setValue(defSpot.chromaskvib);
Lmaskvibshape->setCurve(defSpot.Lmaskvibcurve);
// CCmaskvibshape->setCurve(defSpot.CCmaskvibcurve);
// LLmaskvibshape->setCurve(defSpot.LLmaskvibcurve);
// HHmaskvibshape->setCurve(defSpot.HHmaskvibcurve);
// blendmaskvib->setValue((double)defSpot.blendmaskvib);
// radmaskvib->setValue(defSpot.radmaskvib);
// chromaskvib->setValue(defSpot.chromaskvib);
// Lmaskvibshape->setCurve(defSpot.Lmaskvibcurve);
// Enable all listener
enableListener();
@ -7158,15 +7278,15 @@ void LocallabBlur::convertParamToSimple()
}
lnoiselow->setValue(defSpot.lnoiselow);
enablMask->set_active(defSpot.enablMask);
CCmaskblshape->setCurve(defSpot.CCmaskblcurve);
LLmaskblshape->setCurve(defSpot.LLmaskblcurve);
HHmaskblshape->setCurve(defSpot.HHmaskblcurve);
blendmaskbl->setValue((double)defSpot.blendmaskbl);
radmaskbl->setValue(defSpot.radmaskbl);
chromaskbl->setValue(defSpot.chromaskbl);
gammaskbl->setValue(defSpot.gammaskbl);
slomaskbl->setValue(defSpot.slomaskbl);
Lmaskblshape->setCurve(defSpot.Lmasklccurve);
// CCmaskblshape->setCurve(defSpot.CCmaskblcurve);
// LLmaskblshape->setCurve(defSpot.LLmaskblcurve);
// HHmaskblshape->setCurve(defSpot.HHmaskblcurve);
// blendmaskbl->setValue((double)defSpot.blendmaskbl);
// radmaskbl->setValue(defSpot.radmaskbl);
// chromaskbl->setValue(defSpot.chromaskbl);
// gammaskbl->setValue(defSpot.gammaskbl);
// slomaskbl->setValue(defSpot.slomaskbl);
// Lmaskblshape->setCurve(defSpot.Lmasklccurve);
levelthr->setValue(defSpot.levelthr);
lnoiselow->setValue(defSpot.lnoiselow);
levelthrlow->setValue(defSpot.levelthrlow);

View File

@ -189,6 +189,13 @@ private:
Adjuster* const structcol;
Adjuster* const blurcolde;
Adjuster* const softradiuscol;
MyExpander* const exprecov;
Gtk::Label* const maskusablec;
Gtk::Label* const maskunusablec;
Adjuster* const recothresc;
Adjuster* const lowthresc;
Adjuster* const higthresc;
Adjuster* const decayc;
Gtk::CheckButton* const invers;
MyExpander* const expgradcol;
Adjuster* const strcol;

View File

@ -555,13 +555,13 @@ void LocallabTone::convertParamToSimple()
showmasktmMethod->set_active(0);
enatmMask->set_active(defSpot.enatmMask);
enatmMaskaft->set_active(defSpot.enatmMaskaft);
CCmasktmshape->setCurve(defSpot.CCmasktmcurve);
LLmasktmshape->setCurve(defSpot.LLmasktmcurve);
HHmasktmshape->setCurve(defSpot.HHmasktmcurve);
blendmasktm->setValue((double)defSpot.blendmasktm);
radmasktm->setValue(defSpot.radmasktm);
chromasktm->setValue(defSpot.chromasktm);
Lmasktmshape->setCurve(defSpot.Lmasktmcurve);
// CCmasktmshape->setCurve(defSpot.CCmasktmcurve);
// LLmasktmshape->setCurve(defSpot.LLmasktmcurve);
// HHmasktmshape->setCurve(defSpot.HHmasktmcurve);
// blendmasktm->setValue((double)defSpot.blendmasktm);
// radmasktm->setValue(defSpot.radmasktm);
// chromasktm->setValue(defSpot.chromasktm);
// Lmasktmshape->setCurve(defSpot.Lmasktmcurve);
// Enable all listeners
enableListener();
@ -3584,13 +3584,13 @@ void LocallabContrast::convertParamToSimple()
showmasklcMethod->set_active(0);
enalcMask->set_active(defSpot.enalcMask);
CCmasklcshape->setCurve(defSpot.CCmasklccurve);
LLmasklcshape->setCurve(defSpot.LLmasklccurve);
HHmasklcshape->setCurve(defSpot.HHmasklccurve);
blendmasklc->setValue((double)defSpot.blendmasklc);
radmasklc->setValue(defSpot.radmasklc);
chromasklc->setValue(defSpot.chromasklc);
Lmasklcshape->setCurve(defSpot.Lmasklccurve);
// CCmasklcshape->setCurve(defSpot.CCmasklccurve);
// LLmasklcshape->setCurve(defSpot.LLmasklccurve);
// HHmasklcshape->setCurve(defSpot.HHmasklccurve);
// blendmasklc->setValue((double)defSpot.blendmasklc);
// radmasklc->setValue(defSpot.radmasklc);
// chromasklc->setValue(defSpot.chromasklc);
// Lmasklcshape->setCurve(defSpot.Lmasklccurve);
// Enable all listeners
enableListener();
@ -4505,15 +4505,15 @@ void LocallabCBDL::convertParamToSimple()
softradiuscb->setValue(defSpot.softradiuscb);
showmaskcbMethod->set_active(0);
enacbMask->set_active(defSpot.enacbMask);
CCmaskcbshape->setCurve(defSpot.CCmaskcbcurve);
LLmaskcbshape->setCurve(defSpot.LLmaskcbcurve);
HHmaskcbshape->setCurve(defSpot.HHmaskcbcurve);
blendmaskcb->setValue((double)defSpot.blendmaskcb);
radmaskcb->setValue(defSpot.radmaskcb);
chromaskcb->setValue(defSpot.chromaskcb);
gammaskcb->setValue(defSpot.gammaskcb);
slomaskcb->setValue(defSpot.slomaskcb);
Lmaskcbshape->setCurve(defSpot.Lmaskcbcurve);
// CCmaskcbshape->setCurve(defSpot.CCmaskcbcurve);
// LLmaskcbshape->setCurve(defSpot.LLmaskcbcurve);
// HHmaskcbshape->setCurve(defSpot.HHmaskcbcurve);
// blendmaskcb->setValue((double)defSpot.blendmaskcb);
// radmaskcb->setValue(defSpot.radmaskcb);
// chromaskcb->setValue(defSpot.chromaskcb);
// gammaskcb->setValue(defSpot.gammaskcb);
// slomaskcb->setValue(defSpot.slomaskcb);
// Lmaskcbshape->setCurve(defSpot.Lmaskcbcurve);
// Enable all listers
enableListener();

View File

@ -1151,6 +1151,10 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
locallab.spots.at(j).Lmaskcurve = locallab.spots.at(j).Lmaskcurve && pSpot.Lmaskcurve == otherSpot.Lmaskcurve;
locallab.spots.at(j).LLmaskcolcurvewav = locallab.spots.at(j).LLmaskcolcurvewav && pSpot.LLmaskcolcurvewav == otherSpot.LLmaskcolcurvewav;
locallab.spots.at(j).csthresholdcol = locallab.spots.at(j).csthresholdcol && pSpot.csthresholdcol == otherSpot.csthresholdcol;
locallab.spots.at(j).recothresc = locallab.spots.at(j).recothresc && pSpot.recothresc == otherSpot.recothresc;
locallab.spots.at(j).lowthresc = locallab.spots.at(j).lowthresc && pSpot.lowthresc == otherSpot.lowthresc;
locallab.spots.at(j).higthresc = locallab.spots.at(j).higthresc && pSpot.higthresc == otherSpot.higthresc;
locallab.spots.at(j).decayc = locallab.spots.at(j).decayc && pSpot.decayc == otherSpot.decayc;
// Exposure
locallab.spots.at(j).visiexpose = locallab.spots.at(j).visiexpose && pSpot.visiexpose == otherSpot.visiexpose;
locallab.spots.at(j).expexpose = locallab.spots.at(j).expexpose && pSpot.expexpose == otherSpot.expexpose;
@ -3562,6 +3566,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
toEdit.locallab.spots.at(i).csthresholdcol = mods.locallab.spots.at(i).csthresholdcol;
}
if (locallab.spots.at(i).recothresc) {
toEdit.locallab.spots.at(i).recothresc = mods.locallab.spots.at(i).recothresc;
}
if (locallab.spots.at(i).lowthresc) {
toEdit.locallab.spots.at(i).lowthresc = mods.locallab.spots.at(i).lowthresc;
}
if (locallab.spots.at(i).higthresc) {
toEdit.locallab.spots.at(i).higthresc = mods.locallab.spots.at(i).higthresc;
}
if (locallab.spots.at(i).decayc) {
toEdit.locallab.spots.at(i).decayc = mods.locallab.spots.at(i).decayc;
}
// Exposure
if (locallab.spots.at(i).visiexpose) {
toEdit.locallab.spots.at(i).visiexpose = mods.locallab.spots.at(i).visiexpose;
@ -6504,6 +6524,10 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) :
Lmaskcurve(v),
LLmaskcolcurvewav(v),
csthresholdcol(v),
recothresc(v),
lowthresc(v),
higthresc(v),
decayc(v),
// Exposure
visiexpose(v),
expexpose(v),
@ -7028,6 +7052,10 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v)
Lmaskcurve = v;
LLmaskcolcurvewav = v;
csthresholdcol = v;
recothresc = v;
lowthresc = v;
higthresc = v;
decayc = v;
// Exposure
visiexpose = v;
expexpose = v;

View File

@ -492,6 +492,10 @@ public:
bool Lmaskcurve;
bool LLmaskcolcurvewav;
bool csthresholdcol;
bool recothresc;
bool lowthresc;
bool higthresc;
bool decayc;
// Exposure
bool visiexpose;
bool expexpose;