diff --git a/rtdata/languages/default b/rtdata/languages/default index 9fe20ca7a..9f32fd4de 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1057,6 +1057,9 @@ HISTORY_MSG_817;Local - Vib mask gamma HISTORY_MSG_818;Local - Vib mask slope HISTORY_MSG_819;Local - Vib mask laplacian HISTORY_MSG_820;Local - Vib mask contrast curve +HISTORY_MSG_821;Local - color grid background +HISTORY_MSG_822;Local - color background merge +HISTORY_MSG_823;Local - color background luminance HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2179,6 +2182,11 @@ TP_LOCALLAB_MRONE;None TP_LOCALLAB_MRTWO;Short Curves 'L' Mask TP_LOCALLAB_MRTHR;Original Image TP_LOCALLAB_MRFOU;Previous Spot +TP_LOCALLAB_MRFIV;Background +TP_LOCALLAB_LABGRIDMERG;Background +TP_LOCALLAB_MERDCOL;Merge background (deltaE) +TP_LOCALLAB_GRIDFRAME_TOOLTIP;It is desirable that the spot is in a flat area.\n\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background +TP_LOCALLAB_MERLUCOL;Luminance TP_LOCALLAB_MERGETYPE;Merge image and mask TP_LOCALLAB_MERGETYPE_TOOLTIP;None, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original TP_LOCALLAB_MERGENONE;None @@ -2187,7 +2195,7 @@ TP_LOCALLAB_MERGETWO;Original(Mask 7) TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7) TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH -TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous +TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background TP_LOCALLAB_OPACOL;Opacity TP_LOCALLAB_CONTTHR;Contrast Threshold TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity merge % current Spot with original or previous Spot.\nContrast threshold : adjust result in function of Original contrast diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 04b48222b..61ec03675 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -249,6 +249,7 @@ struct local_params { float blurSH; float ligh; float lowA, lowB, highA, highB; + float lowBmerg, highBmerg, lowAmerg, highAmerg; int shamo, shdamp, shiter, senssha, sensv; float neig; float strng; @@ -607,8 +608,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.mergemet = 2; } else if (locallab.spots.at(sp).merMethod == "mfou") { lp.mergemet = 3; + } else if (locallab.spots.at(sp).merMethod == "mfiv") { + lp.mergemet = 4; } - +printf("lpmermet=%i\n",lp.mergemet); if (locallab.spots.at(sp).mergecolMethod == "one") { lp.mergecolMethod = 0; } else if (locallab.spots.at(sp).mergecolMethod == "two") { @@ -711,6 +714,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float labgridBHighloc = locallab.spots.at(sp).labgridBHigh; float labgridAHighloc = locallab.spots.at(sp).labgridAHigh; float strengthgrid = (float) locallab.spots.at(sp).strengthgrid; + float labgridBLowlocmerg = locallab.spots.at(sp).labgridBLowmerg; + float labgridBHighlocmerg = locallab.spots.at(sp).labgridBHighmerg; + float labgridALowlocmerg = locallab.spots.at(sp).labgridALowmerg; + float labgridAHighlocmerg = locallab.spots.at(sp).labgridAHighmerg; float structcolor = (float) locallab.spots.at(sp).structcol; float blendmaskcolor = ((float) locallab.spots.at(sp).blendmaskcol) / 100.f ; @@ -880,6 +887,10 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.lowB = labgridBLowloc; lp.highB = labgridBHighloc; lp.highA = labgridAHighloc; + lp.lowBmerg = labgridBLowlocmerg; + lp.highBmerg = labgridBHighlocmerg; + lp.lowAmerg = labgridALowlocmerg; + lp.highAmerg = labgridAHighlocmerg; lp.senssf = local_sensisf; lp.strng = strlight; @@ -3568,7 +3579,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int float** rdE = *(rdEBuffer.get()); deltaEforMask(rdE, bfw, bfh, bufcolorig, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, lp.balance); - // printf("rde1=%f rde2=%f\n", rdE[1][1], rdE[100][100]); +// printf("rde1=%f\n", rdE[1][1]); std::unique_ptr delta(new LabImage(bfw, bfh)); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -11909,6 +11920,12 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float b_base = lp.lowB / scaling; bool ctoning = (a_scale != 0.f || b_scale != 0.f || a_base != 0.f || b_base != 0.f); + float a_scalemerg = (lp.highAmerg - lp.lowAmerg) / factor / scaling; + float a_basemerg = lp.lowAmerg / scaling; + float b_scalemerg = (lp.highBmerg - lp.lowBmerg) / factor / scaling; + float b_basemerg = lp.lowBmerg / scaling; + bool ctoningmerg = (a_scalemerg != 0.f || b_scalemerg != 0.f || a_basemerg != 0.f || b_basemerg != 0.f); + if (!lp.inv && (lp.chro != 0 || lp.ligh != 0.f || lp.cont != 0 || ctoning || lp.mergemet > 0 || lp.qualcurvemet != 0 || lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 3 || lp.showmaskcolmet == 4 || lp.showmaskcolmet == 5) && lp.colorena) { // || lllocalcurve)) { //interior ellipse renforced lightness and chroma //locallutili /* //test for fftw blur with tiles fftw_tile_blur....not good we can see tiles - very long time @@ -12150,6 +12167,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float strumask = 0.02f * (float) params->locallab.spots.at(sp).strumaskcol; float conthr = 0.01f * params->locallab.spots.at(sp).conthrcol; int tonemod = 0; + float mercol = params->locallab.spots.at(sp).mercol; + float merlucol = params->locallab.spots.at(sp).merlucol; if (params->locallab.spots.at(sp).toneMethod == "one") { tonemod = 0; @@ -12468,7 +12487,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o if (lp.mergemet >= 2) { //merge result with original bufcolreserv.reset(new LabImage(bfw, bfh)); JaggedArray lumreserv(bfw, bfh); - + std::unique_ptr bufreser; + bufreser.reset(new LabImage(bfw, bfh)); + if(lp.mergemet == 4) { + printf("4 a=%f\n", 9.f * scaledirect * a_scalemerg); + } #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -12476,15 +12499,24 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o for (int y = 0; y < bfh ; y++) { for (int x = 0; x < bfw; x++) { lumreserv[y][x] = 32768.f - reserved->L[y + ystart][x + xstart]; + bufreser->L[y][x] = reserved->L[y + ystart][x + xstart]; + bufreser->a[y][x] = reserved->a[y + ystart][x + xstart]; + bufreser->b[y][x] = reserved->b[y + ystart][x + xstart]; if (lp.mergemet == 2) { bufcolreserv->L[y][x] = reserved->L[y + ystart][x + xstart]; bufcolreserv->a[y][x] = reserved->a[y + ystart][x + xstart]; bufcolreserv->b[y][x] = reserved->b[y + ystart][x + xstart]; - } else { + } else if (lp.mergemet == 3) { bufcolreserv->L[y][x] = lastorig->L[y + ystart][x + xstart]; bufcolreserv->a[y][x] = lastorig->a[y + ystart][x + xstart]; bufcolreserv->b[y][x] = lastorig->b[y + ystart][x + xstart]; + } else if (lp.mergemet == 4) { + if(ctoningmerg) { + bufcolreserv->L[y][x] = merlucol * 327.68f; + bufcolreserv->a[y][x] = 9.f * scaledirect * a_scalemerg; + bufcolreserv->b[y][x] = 9.f * scaledirect * b_scalemerg; + } } } } @@ -12497,6 +12529,10 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float **mb = blend; gaussianBlur(mb, mb, bfw, bfh, rm); } + std::unique_ptr> rdEBuffer(new JaggedArray(bfw, bfh)); + float** rdE = *(rdEBuffer.get()); + + deltaEforMask(rdE, bfw, bfh, bufreser.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, 0.2f * lp.iterat, limscope, mercol, lp.balance); if (lp.mergecolMethod == 0) { //normal @@ -12510,21 +12546,27 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bufcolfin->L[y][x] = lp.opacol * bufcolfin->L[y][x] + (1.f - lp.opacol) * bufcolreserv->L[y][x]; bufcolfin->a[y][x] = lp.opacol * bufcolfin->a[y][x] + (1.f - lp.opacol) * bufcolreserv->a[y][x]; bufcolfin->b[y][x] = lp.opacol * bufcolfin->b[y][x] + (1.f - lp.opacol) * bufcolreserv->b[y][x]; + + bufcolfin->L[y][x] = (1.f - rdE[y][x]) * bufcolfin->L[y][x] + (rdE[y][x]) * bufcolreserv->L[y][x]; + bufcolfin->a[y][x] = (1.f - rdE[y][x]) * bufcolfin->a[y][x] + (rdE[y][x]) * bufcolreserv->a[y][x]; + bufcolfin->b[y][x] = (1.f - rdE[y][x]) * bufcolfin->b[y][x] + (rdE[y][x]) * bufcolreserv->b[y][x]; } } - if (conthr > 0.f) { + if (conthr > 0.f && lp.mergemet != 4) { + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif for (int y = 0; y < bfh ; y++) { for (int x = 0; x < bfw; x++) { - bufcolfin->L[y][x] = intp((blend[y][x]), bufcolfin->L[y][x], bufcolreserv->L[y][x]); - bufcolfin->a[y][x] = intp((blend[y][x]), bufcolfin->a[y][x], bufcolreserv->a[y][x]); - bufcolfin->b[y][x] = intp((blend[y][x]), bufcolfin->b[y][x], bufcolreserv->b[y][x]); + bufcolfin->L[y][x] = intp((blend[y][x]), bufcolfin->L[y][x], bufreser->L[y][x]); + bufcolfin->a[y][x] = intp((blend[y][x]), bufcolfin->a[y][x], bufreser->a[y][x]); + bufcolfin->b[y][x] = intp((blend[y][x]), bufcolfin->b[y][x], bufreser->b[y][x]); } } + } @@ -12573,10 +12615,15 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bufcolfin->L[y][x] = lp.opacol * buftemp->L[y][x] + (1.f - lp.opacol) * bufcolreserv->L[y][x]; bufcolfin->a[y][x] = lp.opacol * buftemp->a[y][x] + (1.f - lp.opacol) * bufcolreserv->a[y][x]; bufcolfin->b[y][x] = lp.opacol * buftemp->b[y][x] + (1.f - lp.opacol) * bufcolreserv->b[y][x]; + + bufcolfin->L[y][x] = (1.f - rdE[y][x]) * bufcolfin->L[y][x] + (rdE[y][x]) * bufcolreserv->L[y][x]; + bufcolfin->a[y][x] = (1.f - rdE[y][x]) * bufcolfin->a[y][x] + (rdE[y][x]) * bufcolreserv->a[y][x]; + bufcolfin->b[y][x] = (1.f - rdE[y][x]) * bufcolfin->b[y][x] + (rdE[y][x]) * bufcolreserv->b[y][x]; + } } - if (conthr > 0.f) { + if (conthr > 0.f && lp.mergemet != 4) { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -13014,9 +13061,11 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o for (int ir = 0; ir < bfh; ir++) for (int jr = 0; jr < bfw; jr++) { - bufchro[ir][jr] = sqrt(SQR(bufcolfin->a[ir][jr] - bufcolorig->a[ir][jr]) + SQR(bufcolfin->b[ir][jr] - bufcolorig->b[ir][jr])) / 328.f; - buf_a[ir][jr] = ((bufcolfin->a[ir][jr] - bufcolorig->a[ir][jr]) / 328.f); - buf_b[ir][jr] = ((bufcolfin->b[ir][jr] - bufcolorig->b[ir][jr]) / 328.f); + if(lp.mergemet != 4) { + bufchro[ir][jr] = sqrt(SQR(bufcolfin->a[ir][jr] - bufcolorig->a[ir][jr]) + SQR(bufcolfin->b[ir][jr] - bufcolorig->b[ir][jr])) / 328.f; + buf_a[ir][jr] = ((bufcolfin->a[ir][jr] - bufcolorig->a[ir][jr]) / 328.f); + buf_b[ir][jr] = ((bufcolfin->b[ir][jr] - bufcolorig->b[ir][jr]) / 328.f); + } } } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 5759288fe..6121d12cf 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -844,6 +844,9 @@ enum ProcEventCode { Evlocallabslomaskvib = 817, Evlocallablapmaskvib = 818, EvlocallabLmaskvibshape = 819, + EvLocallabLabGridmergValue = 820, + Evlocallabmercol = 821, + Evlocallabmerlucol = 822, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index c9c99857f..a1c0600de 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2455,6 +2455,10 @@ LocallabParams::LocallabSpot::LocallabSpot() : labgridBLow(0.0), labgridAHigh(0.0), labgridBHigh(0.0), + labgridALowmerg(0.0), + labgridBLowmerg(0.0), + labgridAHighmerg(-3500.0), + labgridBHighmerg(-4600.0), strengthgrid(30), sensi(15), structcol(0), @@ -2487,7 +2491,9 @@ LocallabParams::LocallabSpot::LocallabSpot() : // HHhmaskcurve{(double)FCT_MinMaxCPoints, 0.0, 1.0, 0.35, 0.35, 0.50, 1.0, 0.35, 0.35, 1.00, 1.0, 0.35, 0.35 }, HHhmaskcurve{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 0.50, 0.5, 0.35, 0.35, 1.00, 0.5, 0.35, 0.35 }, softradiuscol(0.0), - opacol(40.0), + opacol(100.0), + mercol(18.0), + merlucol(32.0), conthrcol(20.0), Lmaskcurve{(double)DCT_NURBS, 0.0, 0.0, 1.0, 1.0}, LLmaskcolcurvewav{(double)FCT_MinMaxCPoints, 0.0, 0.5, 0.35, 0.35, 1., 0.5, 0.35, 0.35}, @@ -2789,6 +2795,10 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && labgridBLow == other.labgridBLow && labgridAHigh == other.labgridAHigh && labgridBHigh == other.labgridBHigh + && labgridALowmerg == other.labgridALowmerg + && labgridBLowmerg == other.labgridBLowmerg + && labgridAHighmerg == other.labgridAHighmerg + && labgridBHighmerg == other.labgridBHighmerg && strengthgrid == other.strengthgrid && sensi == other.sensi && structcol == other.structcol @@ -2821,6 +2831,8 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && blurcolde == other.blurcolde && softradiuscol == other.softradiuscol && opacol == other.opacol + && mercol == other.mercol + && merlucol == other.merlucol && conthrcol == other.conthrcol && Lmaskcurve == other.Lmaskcurve && LLmaskcolcurvewav == other.LLmaskcolcurvewav @@ -4117,6 +4129,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).labgridBLow, "Locallab", "labgridBLow_" + std::to_string(i), spot.labgridBLow, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).labgridAHigh, "Locallab", "labgridAHigh_" + std::to_string(i), spot.labgridAHigh, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).labgridBHigh, "Locallab", "labgridBHigh_" + std::to_string(i), spot.labgridBHigh, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).labgridALowmerg, "Locallab", "labgridALowmerg_" + std::to_string(i), spot.labgridALowmerg, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).labgridBLowmerg, "Locallab", "labgridBLowmerg_" + std::to_string(i), spot.labgridBLowmerg, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).labgridAHighmerg, "Locallab", "labgridAHighmerg_" + std::to_string(i), spot.labgridAHighmerg, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).labgridBHighmerg, "Locallab", "labgridBHighmerg_" + std::to_string(i), spot.labgridBHighmerg, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).strengthgrid, "Locallab", "Strengthgrid_" + std::to_string(i), spot.strengthgrid, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sensi, "Locallab", "Sensi_" + std::to_string(i), spot.sensi, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).structcol, "Locallab", "Structcol_" + std::to_string(i), spot.structcol, keyFile); @@ -4149,6 +4165,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).HHhmaskcurve, "Locallab", "HHhmaskCurve_" + std::to_string(i), spot.HHhmaskcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).softradiuscol, "Locallab", "Softradiuscol_" + std::to_string(i), spot.softradiuscol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).opacol, "Locallab", "Opacol_" + std::to_string(i), spot.opacol, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).mercol, "Locallab", "Mercol_" + std::to_string(i), spot.mercol, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).merlucol, "Locallab", "Merlucol_" + std::to_string(i), spot.merlucol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).conthrcol, "Locallab", "Conthrcol_" + std::to_string(i), spot.conthrcol, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).Lmaskcurve, "Locallab", "LmaskCurve_" + std::to_string(i), spot.Lmaskcurve, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).LLmaskcolcurvewav, "Locallab", "LLmaskcolCurvewav_" + std::to_string(i), spot.LLmaskcolcurvewav, keyFile); @@ -5553,6 +5571,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "labgridBLow_" + std::to_string(i), pedited, spot.labgridBLow, spotEdited.labgridBLow); assignFromKeyfile(keyFile, "Locallab", "labgridAHigh_" + std::to_string(i), pedited, spot.labgridAHigh, spotEdited.labgridAHigh); assignFromKeyfile(keyFile, "Locallab", "labgridBHigh_" + std::to_string(i), pedited, spot.labgridBHigh, spotEdited.labgridBHigh); + assignFromKeyfile(keyFile, "Locallab", "labgridALowmerg_" + std::to_string(i), pedited, spot.labgridALowmerg, spotEdited.labgridALowmerg); + assignFromKeyfile(keyFile, "Locallab", "labgridBLowmerg_" + std::to_string(i), pedited, spot.labgridBLowmerg, spotEdited.labgridBLowmerg); + assignFromKeyfile(keyFile, "Locallab", "labgridAHighmerg_" + std::to_string(i), pedited, spot.labgridAHighmerg, spotEdited.labgridAHighmerg); + assignFromKeyfile(keyFile, "Locallab", "labgridBHighmerg_" + std::to_string(i), pedited, spot.labgridBHighmerg, spotEdited.labgridBHighmerg); assignFromKeyfile(keyFile, "Locallab", "Strengthgrid_" + std::to_string(i), pedited, spot.strengthgrid, spotEdited.strengthgrid); assignFromKeyfile(keyFile, "Locallab", "Sensi_" + std::to_string(i), pedited, spot.sensi, spotEdited.sensi); assignFromKeyfile(keyFile, "Locallab", "Structcol_" + std::to_string(i), pedited, spot.structcol, spotEdited.structcol); @@ -5585,6 +5607,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "HHhmaskCurve_" + std::to_string(i), pedited, spot.HHhmaskcurve, spotEdited.HHhmaskcurve); assignFromKeyfile(keyFile, "Locallab", "Softradiuscol_" + std::to_string(i), pedited, spot.softradiuscol, spotEdited.softradiuscol); assignFromKeyfile(keyFile, "Locallab", "Opacol_" + std::to_string(i), pedited, spot.opacol, spotEdited.opacol); + assignFromKeyfile(keyFile, "Locallab", "Mercol_" + std::to_string(i), pedited, spot.mercol, spotEdited.mercol); + assignFromKeyfile(keyFile, "Locallab", "Merlucol_" + std::to_string(i), pedited, spot.merlucol, spotEdited.merlucol); assignFromKeyfile(keyFile, "Locallab", "Conthrcol_" + std::to_string(i), pedited, spot.conthrcol, spotEdited.conthrcol); assignFromKeyfile(keyFile, "Locallab", "LmaskCurve_" + std::to_string(i), pedited, spot.Lmaskcurve, spotEdited.Lmaskcurve); assignFromKeyfile(keyFile, "Locallab", "LLmaskcolCurvewav_" + std::to_string(i), pedited, spot.LLmaskcolcurvewav, spotEdited.LLmaskcolcurvewav); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 78b1aa5ec..5d11fba4a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -998,6 +998,10 @@ struct LocallabParams { double labgridBLow; double labgridAHigh; double labgridBHigh; + double labgridALowmerg; + double labgridBLowmerg; + double labgridAHighmerg; + double labgridBHighmerg; int strengthgrid; int sensi; int structcol; @@ -1030,6 +1034,8 @@ struct LocallabParams { std::vector HHhmaskcurve; double softradiuscol; double opacol; + double mercol; + double merlucol; double conthrcol; std::vector Lmaskcurve; std::vector LLmaskcolcurvewav; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index de6feefe8..23c231e34 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -847,7 +847,11 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabgammaskvib LUMINANCECURVE, //Evlocallabslomaskvib LUMINANCECURVE, //Evlocallablapmaskvib - LUMINANCECURVE //EvlocallabLmaskvibshape + LUMINANCECURVE, //EvlocallabLmaskvibshape + LUMINANCECURVE, //EvLocallabLabGridmergValue + LUMINANCECURVE, //EvLocallabmercol + LUMINANCECURVE //EvLocallabmerlucol + }; namespace rtengine diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 3ad5c77fa..5864c7297 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -273,9 +273,11 @@ Locallab::Locallab(): lapmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), shadmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHAMASKCOL"), 0, 100, 1, 0))), softradiuscol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), - opacol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OPACOL"), 0.0, 100.0, 0.5, 40.))), + opacol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OPACOL"), 0.0, 100.0, 0.5, 100.))), conthrcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTTHR"), 0.0, 100.0, 0.5, 20.))), strumaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUMASKCOL"), 0., 200., 0.1, 0.))), + mercol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MERDCOL"), 0.0, 100.0, 0.5, 18.))), + merlucol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MERLUCOL"), 0.0, 100.0, 0.5, 32.,Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), // Exposure expcomp(Gtk::manage(new Adjuster(M("TP_EXPOSURE_EXPCOMP"), -2.0, 3.0, 0.05, 0.0))), hlcompr(Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 500, 1, 0))), @@ -577,6 +579,7 @@ lumacontrastMinusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACO lumaneutralButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMANEUTRAL")))), lumacontrastPlusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS")))), gridFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRID")))), +gridmerFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRIDMERG")))), toolcolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), toolblFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), mergecolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGECOLFRA")))), @@ -596,6 +599,8 @@ retiBox(Gtk::manage(new ToolParamBlock())), maskretiBox(Gtk::manage(new ToolParamBlock())), mask7(Gtk::manage(new ToolParamBlock())), labgrid(Gtk::manage(new LabGrid(EvLocallabLabGridValue, M("TP_LOCALLAB_LABGRID_VALUES")))), +labgridmerg(Gtk::manage(new LabGrid(EvLocallabLabGridmergValue, M("TP_LOCALLAB_LABGRID_VALUES"), false))), + mMLabels(Gtk::manage(new Gtk::Label("---"))), transLabels(Gtk::manage(new Gtk::Label("---"))), transLabels2(Gtk::manage(new Gtk::Label("---"))), @@ -675,6 +680,8 @@ pe(nullptr) opacol->setAdjusterListener(this); conthrcol->setAdjusterListener(this); lapmaskcol->setAdjusterListener(this); + mercol->setAdjusterListener(this); + merlucol->setAdjusterListener(this); if (showtooltip) { radmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); @@ -701,6 +708,7 @@ pe(nullptr) merMethod->append(M("TP_LOCALLAB_MRTWO")); merMethod->append(M("TP_LOCALLAB_MRTHR")); merMethod->append(M("TP_LOCALLAB_MRFOU")); + merMethod->append(M("TP_LOCALLAB_MRFIV")); merMethod->set_active(0); merMethodConn = merMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallab::merMethodChanged)); @@ -974,8 +982,16 @@ pe(nullptr) colorBox->pack_start(*special); colorBox->pack_start(*invers); Gtk::HSeparator* const separatormer = Gtk::manage(new Gtk::HSeparator()); + if (showtooltip) { + gridmerFrame->set_tooltip_text(M("TP_LOCALLAB_GRIDFRAME_TOOLTIP")); + } - + ToolParamBlock* const gridmerBox = Gtk::manage(new ToolParamBlock()); + gridmerFrame->set_label_align(0.025, 0.5); + gridmerBox->pack_start(*labgridmerg); + gridmerBox->pack_start(*merlucol); + gridmerBox->pack_start(*mercol); + gridmerFrame->add(*gridmerBox); mergecolFrame->set_label_align(0.025, 0.5); merge1colFrame->set_label_align(0.025, 0.5); @@ -984,6 +1000,8 @@ pe(nullptr) mergecolBox->pack_start(*mergecolMethod); mergecolBox->pack_start(*opacol); mergecolBox->pack_start(*conthrcol); + mergecolBox->pack_start(*gridmerFrame); + merge1colFrame->add(*mergecolBox); Gtk::HSeparator* const separatorstru = Gtk::manage(new Gtk::HSeparator()); @@ -3784,11 +3802,16 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).contrast = contrast->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).chroma = chroma->getIntValue(); labgrid->getParams(pp->locallab.spots.at(pp->locallab.selspot).labgridALow, pp->locallab.spots.at(pp->locallab.selspot).labgridBLow, pp->locallab.spots.at(pp->locallab.selspot).labgridAHigh, pp->locallab.spots.at(pp->locallab.selspot).labgridBHigh); + labgridmerg->getParams(pp->locallab.spots.at(pp->locallab.selspot).labgridALowmerg, pp->locallab.spots.at(pp->locallab.selspot).labgridBLowmerg, pp->locallab.spots.at(pp->locallab.selspot).labgridAHighmerg, pp->locallab.spots.at(pp->locallab.selspot).labgridBHighmerg); pp->locallab.spots.at(pp->locallab.selspot).strengthgrid = strengthgrid->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).labgridALow *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; pp->locallab.spots.at(pp->locallab.selspot).labgridAHigh *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; pp->locallab.spots.at(pp->locallab.selspot).labgridBLow *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; pp->locallab.spots.at(pp->locallab.selspot).labgridBHigh *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; + pp->locallab.spots.at(pp->locallab.selspot).labgridALowmerg *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; + pp->locallab.spots.at(pp->locallab.selspot).labgridAHighmerg *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; + pp->locallab.spots.at(pp->locallab.selspot).labgridBLowmerg *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; + pp->locallab.spots.at(pp->locallab.selspot).labgridBHighmerg *= rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX; pp->locallab.spots.at(pp->locallab.selspot).sensi = sensi->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).structcol = structcol->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).blurcolde = blurcolde->getIntValue(); @@ -3813,6 +3836,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).merMethod = "mthr"; } else if (merMethod->get_active_row_number() == 3) { pp->locallab.spots.at(pp->locallab.selspot).merMethod = "mfou"; + } else if (merMethod->get_active_row_number() == 4) { + pp->locallab.spots.at(pp->locallab.selspot).merMethod = "mfiv"; } if (toneMethod->get_active_row_number() == 0) { @@ -3892,6 +3917,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).lapmaskcol = lapmaskcol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).softradiuscol = softradiuscol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).opacol = opacol->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).mercol = mercol->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).merlucol = merlucol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).conthrcol = conthrcol->getValue(); pp->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = Lmaskshape->getCurve(); pp->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = LLmaskcolshapewav->getCurve(); @@ -4270,6 +4297,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).lightness = pe->locallab.spots.at(pp->locallab.selspot).lightness || lightness->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).contrast = pe->locallab.spots.at(pp->locallab.selspot).contrast || contrast->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).labgridALow = pe->locallab.spots.at(pp->locallab.selspot).labgridBLow = pe->locallab.spots.at(pp->locallab.selspot).labgridAHigh = pe->locallab.spots.at(pp->locallab.selspot).labgridBHigh = labgrid->getEdited(); + pe->locallab.spots.at(pp->locallab.selspot).labgridALowmerg = pe->locallab.spots.at(pp->locallab.selspot).labgridBLowmerg = pe->locallab.spots.at(pp->locallab.selspot).labgridAHighmerg = pe->locallab.spots.at(pp->locallab.selspot).labgridBHighmerg = labgridmerg->getEdited(); pe->locallab.spots.at(pp->locallab.selspot).strengthgrid = pe->locallab.spots.at(pp->locallab.selspot).strengthgrid || strengthgrid->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).chroma = pe->locallab.spots.at(pp->locallab.selspot).chroma || chroma->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).sensi = pe->locallab.spots.at(pp->locallab.selspot).sensi || sensi->getEditedState(); @@ -4303,6 +4331,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).lapmaskcol = pe->locallab.spots.at(pp->locallab.selspot).lapmaskcol || lapmaskcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).softradiuscol = pe->locallab.spots.at(pp->locallab.selspot).softradiuscol || softradiuscol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).opacol = pe->locallab.spots.at(pp->locallab.selspot).opacol || opacol->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).mercol = pe->locallab.spots.at(pp->locallab.selspot).mercol || mercol->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).merlucol = pe->locallab.spots.at(pp->locallab.selspot).merlucol || merlucol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).conthrcol = pe->locallab.spots.at(pp->locallab.selspot).conthrcol || conthrcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = pe->locallab.spots.at(pp->locallab.selspot).Lmaskcurve || !Lmaskshape->isUnChanged(); pe->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = pe->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav || !LLmaskcolshapewav->isUnChanged(); @@ -4645,6 +4675,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcol = pedited->locallab.spots.at(pp->locallab.selspot).lapmaskcol || lapmaskcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).softradiuscol = pedited->locallab.spots.at(pp->locallab.selspot).softradiuscol || softradiuscol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).opacol = pedited->locallab.spots.at(pp->locallab.selspot).opacol || opacol->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).mercol = pedited->locallab.spots.at(pp->locallab.selspot).mercol || mercol->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).merlucol = pedited->locallab.spots.at(pp->locallab.selspot).merlucol || merlucol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).conthrcol = pedited->locallab.spots.at(pp->locallab.selspot).conthrcol || conthrcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcurve = pedited->locallab.spots.at(pp->locallab.selspot).Lmaskcurve || !Lmaskshape->isUnChanged(); pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav = pedited->locallab.spots.at(pp->locallab.selspot).LLmaskcolcurvewav || !LLmaskcolshapewav->isUnChanged(); @@ -5498,12 +5530,25 @@ void Locallab::merMethodChanged() { if (merMethod->get_active_row_number() == 0) { mask7->hide(); + conthrcol->show(); + gridmerFrame->hide(); } else if (merMethod->get_active_row_number() == 1) { mask7->hide(); + conthrcol->show(); + gridmerFrame->hide(); } else if (merMethod->get_active_row_number() == 2) { mask7->show(); + conthrcol->show(); + conthrcol->show(); + gridmerFrame->hide(); } else if (merMethod->get_active_row_number() == 3) { mask7->show(); + conthrcol->show(); + gridmerFrame->hide(); + } else if (merMethod->get_active_row_number() == 4) { + mask7->show(); + conthrcol->hide(); + gridmerFrame->show(); } if (getEnabled() && expcolor->getEnabled()) { @@ -6897,6 +6942,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c contrast->setDefault((double)defSpot->contrast); chroma->setDefault((double)defSpot->chroma); labgrid->setDefault(defSpot->labgridALow / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, defSpot->labgridBLow / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, defSpot->labgridAHigh / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, defSpot->labgridBHigh / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX); + labgridmerg->setDefault(defSpot->labgridALowmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, defSpot->labgridBLowmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, defSpot->labgridAHighmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, defSpot->labgridBHighmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX); sensi->setDefault((double)defSpot->sensi); structcol->setDefault((double)defSpot->structcol); blurcolde->setDefault((double)defSpot->blurcolde); @@ -6910,6 +6956,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c lapmaskcol->setDefault(defSpot->lapmaskcol); softradiuscol->setDefault(defSpot->softradiuscol); opacol->setDefault(defSpot->opacol); + mercol->setDefault(defSpot->mercol); + merlucol->setDefault(defSpot->merlucol); conthrcol->setDefault(defSpot->conthrcol); csThresholdcol->setDefault(defSpot->csthresholdcol); // Exposure @@ -7098,6 +7146,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c contrast->setDefaultEditedState(Irrelevant); chroma->setDefaultEditedState(Irrelevant); labgrid->setEdited(Edited); + labgridmerg->setEdited(Edited); sensi->setDefaultEditedState(Irrelevant); structcol->setDefaultEditedState(Irrelevant); strengthgrid->setDefault((double)defSpot->strengthgrid); @@ -7112,6 +7161,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c lapmaskcol->setDefaultEditedState(Irrelevant); softradiuscol->setDefaultEditedState(Irrelevant); opacol->setDefaultEditedState(Irrelevant); + mercol->setDefaultEditedState(Irrelevant); + merlucol->setDefaultEditedState(Irrelevant); conthrcol->setDefaultEditedState(Irrelevant); csThresholdcol->setDefaultEditedState(Irrelevant); // Exposure @@ -7304,6 +7355,7 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c contrast->setDefaultEditedState(defSpotState->contrast ? Edited : UnEdited); chroma->setDefaultEditedState(defSpotState->chroma ? Edited : UnEdited); labgrid->setEdited((defSpotState->labgridALow || defSpotState->labgridBLow || defSpotState->labgridAHigh || defSpotState->labgridBHigh) ? Edited : UnEdited); + labgridmerg->setEdited((defSpotState->labgridALowmerg || defSpotState->labgridBLowmerg || defSpotState->labgridAHighmerg || defSpotState->labgridBHighmerg) ? Edited : UnEdited); sensi->setDefaultEditedState(defSpotState->sensi ? Edited : UnEdited); structcol->setDefaultEditedState(defSpotState->structcol ? Edited : UnEdited); strengthgrid->setDefaultEditedState(defSpotState->strengthgrid ? Edited : UnEdited); @@ -7318,6 +7370,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c lapmaskcol->setDefaultEditedState(defSpotState->lapmaskcol ? Edited : UnEdited); softradiuscol->setDefaultEditedState(defSpotState->softradiuscol ? Edited : UnEdited); opacol->setDefaultEditedState(defSpotState->opacol ? Edited : UnEdited); + mercol->setDefaultEditedState(defSpotState->mercol ? Edited : UnEdited); + merlucol->setDefaultEditedState(defSpotState->merlucol ? Edited : UnEdited); conthrcol->setDefaultEditedState(defSpotState->conthrcol ? Edited : UnEdited); csThresholdcol->setDefaultEditedState(defSpotState->csthresholdcol ? Edited : UnEdited); // Exposure @@ -7662,6 +7716,18 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == mercol) { + if (listener) { + listener->panelChanged(Evlocallabmercol, mercol->getTextValue()); + } + } + + if (a == merlucol) { + if (listener) { + listener->panelChanged(Evlocallabmerlucol, merlucol->getTextValue()); + } + } + if (a == conthrcol) { if (listener) { listener->panelChanged(Evlocallabconthrcol, conthrcol->getTextValue()); @@ -8746,6 +8812,8 @@ void Locallab::setBatchMode(bool batchMode) lapmaskcol->showEditedCB(); softradiuscol->showEditedCB(); opacol->showEditedCB(); + mercol->showEditedCB(); + merlucol->showEditedCB(); conthrcol->showEditedCB(); csThresholdcol->showEditedCB(); // Exposure @@ -9087,6 +9155,7 @@ void Locallab::setListener(ToolPanelListener* tpl) { this->listener = tpl; labgrid->setListener(tpl); + labgridmerg->setListener(tpl); expsettings->setListener(tpl); } @@ -9279,6 +9348,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con contrast->setValue(pp->locallab.spots.at(index).contrast); chroma->setValue(pp->locallab.spots.at(index).chroma); labgrid->setParams(pp->locallab.spots.at(index).labgridALow / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, pp->locallab.spots.at(index).labgridBLow / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, pp->locallab.spots.at(index).labgridAHigh / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, pp->locallab.spots.at(index).labgridBHigh / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, false); + //labgridmerg->setParams(pp->locallab.spots.at(index).labgridALowmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, pp->locallab.spots.at(index).labgridBLowmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, pp->locallab.spots.at(index).labgridAHighmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, pp->locallab.spots.at(index).labgridBHighmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, false); + labgridmerg->setParams(0, 0, pp->locallab.spots.at(index).labgridAHighmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, pp->locallab.spots.at(index).labgridBHighmerg / rtengine::procparams::LocallabParams::LABGRIDL_CORR_MAX, false); strengthgrid->setValue(pp->locallab.spots.at(index).strengthgrid); sensi->setValue(pp->locallab.spots.at(index).sensi); structcol->setValue(pp->locallab.spots.at(index).structcol); @@ -9303,6 +9374,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con merMethod->set_active(2); } else if (pp->locallab.spots.at(index).merMethod == "mfou") { merMethod->set_active(3); + } else if (pp->locallab.spots.at(index).merMethod == "mfiv") { + merMethod->set_active(4); } if (pp->locallab.spots.at(index).toneMethod == "one") { @@ -9397,6 +9470,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con lapmaskcol->setValue(pp->locallab.spots.at(index).lapmaskcol); softradiuscol->setValue(pp->locallab.spots.at(index).softradiuscol); opacol->setValue(pp->locallab.spots.at(index).opacol); + mercol->setValue(pp->locallab.spots.at(index).mercol); + merlucol->setValue(pp->locallab.spots.at(index).merlucol); conthrcol->setValue(pp->locallab.spots.at(index).conthrcol); Lmaskshape->setCurve(pp->locallab.spots.at(index).Lmaskcurve); LLmaskcolshapewav->setCurve(pp->locallab.spots.at(index).LLmaskcolcurvewav); @@ -9795,6 +9870,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con sensi->setEditedState(spotState->sensi ? Edited : UnEdited); structcol->setEditedState(spotState->structcol ? Edited : UnEdited); labgrid->setEdited(spotState->labgridALow || spotState->labgridBLow || spotState->labgridAHigh || spotState->labgridBHigh); + labgridmerg->setEdited(spotState->labgridALowmerg || spotState->labgridBLowmerg || spotState->labgridAHighmerg || spotState->labgridBHighmerg); strengthgrid->setEditedState(spotState->strengthgrid ? Edited : UnEdited); if (!spotState->qualitycurveMethod) { @@ -9841,6 +9917,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con lapmaskcol->setEditedState(spotState->lapmaskcol ? Edited : UnEdited); softradiuscol->setEditedState(spotState->softradiuscol ? Edited : UnEdited); opacol->setEditedState(spotState->opacol ? Edited : UnEdited); + mercol->setEditedState(spotState->mercol ? Edited : UnEdited); + merlucol->setEditedState(spotState->merlucol ? Edited : UnEdited); conthrcol->setEditedState(spotState->conthrcol ? Edited : UnEdited); Lmaskshape->setUnChanged(!spotState->Lmaskcurve); LLmaskcolshapewav->setUnChanged(!spotState->LLmaskcolcurvewav); @@ -10201,12 +10279,24 @@ void Locallab::updateSpecificGUIState() if (merMethod->get_active_row_number() == 0) { mask7->hide(); + conthrcol->show(); + gridmerFrame->hide(); } else if (merMethod->get_active_row_number() == 1) { mask7->hide(); + conthrcol->show(); + gridmerFrame->hide(); } else if (merMethod->get_active_row_number() == 2) { mask7->show(); + conthrcol->show(); + gridmerFrame->hide(); + } else if (merMethod->get_active_row_number() == 3) { + conthrcol->show(); + mask7->show(); + gridmerFrame->hide(); } else if (merMethod->get_active_row_number() == 3) { mask7->show(); + conthrcol->hide(); + gridmerFrame->show(); } // Update Exposure GUI according to black adjuster state (to be compliant with adjusterChanged function) diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 63768476d..bbe72c6cb 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -179,6 +179,8 @@ private: Adjuster* const opacol; Adjuster* const conthrcol; Adjuster* const strumaskcol; + Adjuster* const mercol; + Adjuster* const merlucol; // Exposure Adjuster* const expcomp; Adjuster* const hlcompr; @@ -497,6 +499,7 @@ private: Gtk::Button* const lumacontrastPlusButton; sigc::connection lumacontrastMinusPressedConn, lumaneutralPressedConn, lumacontrastPlusPressedConn; Gtk::Frame* const gridFrame; + Gtk::Frame* const gridmerFrame; Gtk::Frame* const toolcolFrame; Gtk::Frame* const toolblFrame; Gtk::Frame* const mergecolFrame; @@ -515,6 +518,7 @@ private: ToolParamBlock* const maskretiBox; ToolParamBlock* const mask7; LabGrid* const labgrid; + LabGrid* const labgridmerg; Gtk::Label* const mMLabels; Gtk::Label* const transLabels; Gtk::Label* const transLabels2; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index a65e22005..e0ffdfaae 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -991,6 +991,10 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).labgridBLow = locallab.spots.at(j).labgridBLow && pSpot.labgridBLow == otherSpot.labgridBLow; locallab.spots.at(j).labgridAHigh = locallab.spots.at(j).labgridAHigh && pSpot.labgridAHigh == otherSpot.labgridAHigh; locallab.spots.at(j).labgridBHigh = locallab.spots.at(j).labgridBHigh && pSpot.labgridBHigh == otherSpot.labgridBHigh; + locallab.spots.at(j).labgridALowmerg = locallab.spots.at(j).labgridALowmerg && pSpot.labgridALowmerg == otherSpot.labgridALowmerg; + locallab.spots.at(j).labgridBLowmerg = locallab.spots.at(j).labgridBLowmerg && pSpot.labgridBLowmerg == otherSpot.labgridBLowmerg; + locallab.spots.at(j).labgridAHighmerg = locallab.spots.at(j).labgridAHighmerg && pSpot.labgridAHighmerg == otherSpot.labgridAHighmerg; + locallab.spots.at(j).labgridBHighmerg = locallab.spots.at(j).labgridBHighmerg && pSpot.labgridBHighmerg == otherSpot.labgridBHighmerg; locallab.spots.at(j).strengthgrid = locallab.spots.at(j).strengthgrid && pSpot.strengthgrid == otherSpot.strengthgrid; locallab.spots.at(j).sensi = locallab.spots.at(j).sensi && pSpot.sensi == otherSpot.sensi; locallab.spots.at(j).structcol = locallab.spots.at(j).structcol && pSpot.structcol == otherSpot.structcol; @@ -1023,6 +1027,8 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).HHhmaskcurve = locallab.spots.at(j).HHhmaskcurve && pSpot.HHhmaskcurve == otherSpot.HHhmaskcurve; locallab.spots.at(j).softradiuscol = locallab.spots.at(j).softradiuscol && pSpot.softradiuscol == otherSpot.softradiuscol; locallab.spots.at(j).opacol = locallab.spots.at(j).opacol && pSpot.opacol == otherSpot.opacol; + locallab.spots.at(j).mercol = locallab.spots.at(j).mercol && pSpot.mercol == otherSpot.mercol; + locallab.spots.at(j).merlucol = locallab.spots.at(j).merlucol && pSpot.merlucol == otherSpot.merlucol; locallab.spots.at(j).conthrcol = locallab.spots.at(j).conthrcol && pSpot.conthrcol == otherSpot.conthrcol; 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; @@ -2905,6 +2911,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).labgridBHigh = mods.locallab.spots.at(i).labgridBHigh; } + if (locallab.spots.at(i).labgridALowmerg) { + toEdit.locallab.spots.at(i).labgridALowmerg = mods.locallab.spots.at(i).labgridALowmerg; + } + + if (locallab.spots.at(i).labgridBLowmerg) { + toEdit.locallab.spots.at(i).labgridBLowmerg = mods.locallab.spots.at(i).labgridBLowmerg; + } + + if (locallab.spots.at(i).labgridAHighmerg) { + toEdit.locallab.spots.at(i).labgridAHighmerg = mods.locallab.spots.at(i).labgridAHighmerg; + } + + if (locallab.spots.at(i).labgridBHighmerg) { + toEdit.locallab.spots.at(i).labgridBHighmerg = mods.locallab.spots.at(i).labgridBHighmerg; + } + if (locallab.spots.at(i).strengthgrid) { toEdit.locallab.spots.at(i).strengthgrid = mods.locallab.spots.at(i).strengthgrid; } @@ -3033,6 +3055,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).opacol = mods.locallab.spots.at(i).opacol; } + if (locallab.spots.at(i).mercol) { + toEdit.locallab.spots.at(i).mercol = mods.locallab.spots.at(i).mercol; + } + + if (locallab.spots.at(i).merlucol) { + toEdit.locallab.spots.at(i).merlucol = mods.locallab.spots.at(i).merlucol; + } + if (locallab.spots.at(i).conthrcol) { toEdit.locallab.spots.at(i).conthrcol = mods.locallab.spots.at(i).conthrcol; } @@ -5019,6 +5049,10 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : labgridBLow(v), labgridAHigh(v), labgridBHigh(v), + labgridALowmerg(v), + labgridBLowmerg(v), + labgridAHighmerg(v), + labgridBHighmerg(v), strengthgrid(v), sensi(v), structcol(v), @@ -5051,6 +5085,8 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : HHhmaskcurve(v), softradiuscol(v), opacol(v), + mercol(v), + merlucol(v), conthrcol(v), Lmaskcurve(v), LLmaskcolcurvewav(v), @@ -5349,6 +5385,10 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) labgridBLow = v; labgridAHigh = v; labgridBHigh = v; + labgridALowmerg = v; + labgridBLowmerg = v; + labgridAHighmerg = v; + labgridBHighmerg = v; strengthgrid = v; sensi = v; structcol = v; @@ -5381,6 +5421,8 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) HHhmaskcurve = v; softradiuscol = v; opacol = v; + mercol = v; + merlucol = v; conthrcol = v; Lmaskcurve = v; LLmaskcolcurvewav = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index ae4bb173a..0237526c1 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -169,6 +169,10 @@ struct ColorToningEdited { bool labgridBLow; bool labgridAHigh; bool labgridBHigh; + bool labgridALowmerg; + bool labgridBLowmerg; + bool labgridAHighmerg; + bool labgridBHighmerg; bool labregions; bool labregionsShowMask; }; @@ -421,6 +425,10 @@ public: bool labgridBLow; bool labgridAHigh; bool labgridBHigh; + bool labgridALowmerg; + bool labgridBLowmerg; + bool labgridAHighmerg; + bool labgridBHighmerg; bool strengthgrid; bool sensi; bool structcol; @@ -453,6 +461,8 @@ public: bool HHhmaskcurve; bool softradiuscol; bool opacol; + bool mercol; + bool merlucol; bool conthrcol; bool Lmaskcurve; bool LLmaskcolcurvewav;