diff --git a/rtdata/languages/default b/rtdata/languages/default index 80e8db64f..a75272638 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -853,6 +853,9 @@ HISTORY_MSG_596;Local - Local contrast darkness HISTORY_MSG_597;Local - Local contrast lightness HISTORY_MSG_598;Local - Local contrast scope HISTORY_MSG_599;Local - Retinex dehaze +HISTORY_MSG_600;Local - Soft Light enable +HISTORY_MSG_601;Local - Soft Light strength +HISTORY_MSG_602;Local - Soft Light scope HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2013,6 +2016,8 @@ TP_LOCALLAB_SENSICB;Scope TP_LOCALLAB_SENSIBN;Scope TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. TP_LOCALLAB_SETTINGS;Settings +TP_LOCALLAB_SOFT;Soft Light +TP_LOCALLAB_STRENG;Strength TP_LOCALLAB_STRENGTH;Noise TP_LOCALLAB_STYPE;Shape method TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 00c26a633..64dd6197a 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -404,6 +404,7 @@ public: void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); void shadowsHighlights(LabImage *lab); void softLight(LabImage *lab); + void softLightloc(LabImage *lab, LabImage *dst, float blend); void labColorCorrectionRegions(LabImage *lab); Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 1198415ce..8fc79a81f 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -155,9 +155,10 @@ struct local_params { int cir; float thr; int prox; - int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu, sensden, senslc; + int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu, sensden, senslc, senssf; float ligh; int shamo, shdamp, shiter, senssha, sensv; + float strng; float lcamount; double shrad; double rad; @@ -196,6 +197,7 @@ struct local_params { bool retiena; bool sharpena; bool lcena; + bool sfena; bool cbdlena; bool denoiena; bool expvib; @@ -340,7 +342,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float est = ((float)locallab.estop.at(sp)) / 100.f; float scal_tm = ((float)locallab.scaltm.at(sp)) / 10.f; float rewe = ((float)locallab.rewei.at(sp)); - + float strlight = ((float)locallab.streng.at(sp)) / 100.f; float thre = locallab.thresh.at(sp) / 100.f; double local_x = locallab.locX.at(sp) / 2000.0; double local_y = locallab.locY.at(sp) / 2000.0; @@ -445,6 +447,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall bool curvacti = locallab.curvactiv.at(sp); bool acti = locallab.activlum.at(sp); bool cupas = false; // Provision + int local_sensisf = locallab.sensisf.at(sp); bool inverserad = false; // Provision bool inverseret = locallab.inversret.at(sp); @@ -470,6 +473,8 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.senscb = local_sensicb; lp.cont = local_contrast; lp.ligh = local_lightness; + lp.senssf = local_sensisf; + lp.strng = strlight; if (lp.ligh >= -2.f && lp.ligh <= 2.f) { lp.ligh /= 5.f; @@ -526,6 +531,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.retiena = locallab.expreti.at(sp); lp.sharpena = locallab.expsharp.at(sp); lp.lcena = locallab.expcontrast.at(sp); + lp.sfena = locallab.expsoft.at(sp); lp.cbdlena = locallab.expcbdl.at(sp); lp.denoiena = locallab.expdenoi.at(sp); lp.expvib = locallab.expvibrance.at(sp); @@ -6184,6 +6190,11 @@ void ImProcFunctions::Expo_vibr_Local(float moddE, float powdE, int senstype, fl varsens = lp.sensv; } + if (senstype == 3) //soft light + { + varsens = lp.senssf; + } + //chroma constexpr float amplchsens = 2.5f; constexpr float achsens = (amplchsens - 1.f) / (100.f - 20.f); //20. default locallab.sensih @@ -8619,6 +8630,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, LUTf & sobelrefs, float** shbu float dhuelc = ared * lp.senslc + bred; //delta hue local contrast + float dhuesf = ared * lp.senssf + bred; //delta hue soft light + float dhuecb = ared * lp.senscb + bred; //delta hue cbdl float dhueexclu = ared * lp.sensexclu + bred; //delta hue exclude @@ -9818,7 +9831,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, LUTf & sobelrefs, float** shbu bool execdenoi = false ; bool execcolor = (lp.chro != 0.f || lp.ligh != 0.f || lp.cont != 0.f); // only if one slider ore more is engaged bool execbdl = (lp.mulloc[0] != 1.f || lp.mulloc[1] != 1.f || lp.mulloc[2] != 1.f || lp.mulloc[3] != 1.f || lp.mulloc[4] != 1.f) ;//only if user want cbdl - execdenoi = noiscfactiv && ((lp.colorena && execcolor) || (lp.tonemapena && lp.strengt != 0.f) || (lp.cbdlena && execbdl) || (lp.lcena && lp.lcamount > 0.f) || (lp.sharpena && lp.shrad > 0.42) || (lp.retiena && lp.str > 0.f) || (lp.exposena && lp.expcomp != 0.f) || (lp.expvib && lp.past != 0.f)); + execdenoi = noiscfactiv && ((lp.colorena && execcolor) || (lp.tonemapena && lp.strengt != 0.f) || (lp.cbdlena && execbdl) || (lp.sfena && lp.strng > 0.f) || (lp.lcena && lp.lcamount > 0.f) || (lp.sharpena && lp.shrad > 0.42) || (lp.retiena && lp.str > 0.f) || (lp.exposena && lp.expcomp != 0.f) || (lp.expvib && lp.past != 0.f)); if (((lp.noiself > 0.f || lp.noiselc > 0.f || lp.noisecf > 0.f || lp.noisecc > 0.f) && lp.denoiena) || execdenoi) { // sk == 1 ?? StopWatch Stop1("locallab Denoise called"); @@ -11980,7 +11993,124 @@ void ImProcFunctions::Lab_Local(int call, int sp, LUTf & sobelrefs, float** shbu } -//end cbdl +//end cbdl_Local + +// soft light + if (lp.strng > 0.f && call < 3 && lp.sfena) { //interior ellipse for sharpening, call = 1 and 2 only with Dcrop and simpleprocess + float hueplus = hueref + dhuesf; + float huemoins = hueref - dhuesf; + + + if (hueplus > rtengine::RT_PI) { + hueplus = hueref + dhuesf - 2.f * rtengine::RT_PI; + } + + if (huemoins < -rtengine::RT_PI) { + huemoins = hueref - dhuesf + 2.f * rtengine::RT_PI; + } + + LabImage *bufexporig = nullptr; + LabImage *bufexpfin = nullptr; + + int bfh = int (lp.ly + lp.lyT) + del; //bfw bfh real size of square zone + int bfw = int (lp.lx + lp.lxL) + del; + + JaggedArray buflight(bfw, bfh); + JaggedArray bufl_ab(bfw, bfh); + + + if (call <= 3) { //simpleprocess, dcrop, improccoordinator + + + bufexporig = new LabImage(bfw, bfh); //buffer for data in zone limit + bufexpfin = new LabImage(bfw, bfh); //buffer for data in zone limit + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { + bufexporig->L[ir][jr] = 0.f; + bufexporig->a[ir][jr] = 0.f; + bufexporig->b[ir][jr] = 0.f; + bufexpfin->L[ir][jr] = 0.f; + bufexpfin->a[ir][jr] = 0.f; + bufexpfin->b[ir][jr] = 0.f; + buflight[ir][jr] = 0.f; + bufl_ab[ir][jr] = 0.f; + + + } + + int begy = lp.yc - lp.lyT; + int begx = lp.xc - lp.lxL; + int yEn = lp.yc + lp.ly; + int xEn = lp.xc + lp.lx; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#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) { + + bufexporig->L[loy - begy][lox - begx] = original->L[y][x];//fill square buffer with datas + bufexporig->a[loy - begy][lox - begx] = original->a[y][x];//fill square buffer with datas + bufexporig->b[loy - begy][lox - begx] = original->b[y][x];//fill square buffer with datas + + } + } + + + ImProcFunctions::softLightloc(bufexporig, bufexpfin, lp.strng); + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#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) { + + float rL; + rL = CLIPRET((bufexpfin->L[loy - begy][lox - begx] - bufexporig->L[loy - begy][lox - begx]) / 328.f); + + buflight[loy - begy][lox - begx] = rL; + + + float chp; + chp = CLIPRET((sqrt(SQR(bufexpfin->a[loy - begy][lox - begx]) + SQR(bufexpfin->b[loy - begy][lox - begx])) - sqrt(SQR(bufexporig->a[loy - begy][lox - begx]) + SQR(bufexporig->b[loy - begy][lox - begx]))) / 250.f); + + bufl_ab[loy - begy][lox - begx] = chp; + + } + } + + Expo_vibr_Local(moddE, powdE, 3, buflight, bufl_ab, hueplus, huemoins, hueref, dhuesf, chromaref, lumaref, lp, original, transformed, bufexpfin, cx, cy, sk); + + } + + if (call <= 3) { + + delete bufexporig; + delete bufexpfin; + + + } + + + } + + //local contrast if (lp.lcamount > 0.f && call < 3 && lp.lcena) { //interior ellipse for sharpening, call = 1 and 2 only with Dcrop and simpleprocess int bfh = call == 2 ? int (lp.ly + lp.lyT) + del : original->H; //bfw bfh real size of square zone diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index 74fb543aa..03566c3aa 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -71,4 +71,30 @@ void ImProcFunctions::softLight(LabImage *lab) rgb2lab(working, *lab, params->icm.workingProfile); } +void ImProcFunctions::softLightloc(LabImage *lab, LabImage *dst, float blend) +{ + // if (!params->softlight.enabled || !params->softlight.strength) { + // return; + // } + + Imagefloat working(lab->W, lab->H); + lab2rgb(*lab, working, params->icm.workingProfile); + + // const float blend = stre / 100.f; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < working.getHeight(); ++y) { + for (int x = 0; x < working.getWidth(); ++x) { + working.r(y, x) = sl(blend, working.r(y, x)); + working.g(y, x) = sl(blend, working.g(y, x)); + working.b(y, x) = sl(blend, working.b(y, x)); + } + } + + rgb2lab(working, *dst, params->icm.workingProfile); +} + + } // namespace rtengine diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 808daef05..e41ac4418 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -626,6 +626,9 @@ enum ProcEventCode { Evlocallablclightness = 596, Evlocallabsensilc = 597, Evlocallabdehaz = 598, + EvLocenasoft = 599, + Evlocallabstreng = 600, + Evlocallabsensisf = 601, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ea1152e24..9fa8317be 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2389,6 +2389,10 @@ LocallabParams::LocallabParams() : pastsattog(), sensiv(), skintonescurve(), + //Soft Light + expsoft(), + streng(), + sensisf(), // Blur & Noise expblur(), radius(), @@ -2514,6 +2518,10 @@ bool LocallabParams::operator ==(const LocallabParams& other) const && pastsattog == other.pastsattog && sensiv == other.sensiv && skintonescurve == other.skintonescurve + //Soft Light + && expsoft == other.expsoft + && streng == other.streng + && sensisf == other.sensisf // Blur & Noise && expblur == other.expblur && radius == other.radius @@ -3567,6 +3575,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.pastsattog, "Locallab", "PastSatTog_" + std::to_string(i), locallab.pastsattog.at(i), keyFile); saveToKeyfile(!pedited || pedited->locallab.sensiv, "Locallab", "Sensiv_" + std::to_string(i), locallab.sensiv.at(i), keyFile); saveToKeyfile(!pedited || pedited->locallab.skintonescurve, "Locallab", "SkinTonesCurve_" + std::to_string(i), locallab.skintonescurve.at(i), keyFile); + //Soft Light + saveToKeyfile(!pedited || pedited->locallab.expsoft, "Locallab", "Expsoft_" + std::to_string(i), locallab.expsoft.at(i), keyFile); + saveToKeyfile(!pedited || pedited->locallab.streng, "Locallab", "Streng_" + std::to_string(i), locallab.streng.at(i), keyFile); + saveToKeyfile(!pedited || pedited->locallab.sensisf, "Locallab", "Sensisf_" + std::to_string(i), locallab.sensisf.at(i), keyFile); // Blur & Noise saveToKeyfile(!pedited || pedited->locallab.expblur, "Locallab", "Expblur_" + std::to_string(i), locallab.expblur.at(i), keyFile); saveToKeyfile(!pedited || pedited->locallab.radius, "Locallab", "Radius_" + std::to_string(i), locallab.radius.at(i), keyFile); @@ -4755,6 +4767,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) locallab.pastsattog.resize(locallab.nbspot); locallab.sensiv.resize(locallab.nbspot); locallab.skintonescurve.resize(locallab.nbspot); + //Soft Light + locallab.expsoft.resize(locallab.nbspot); + locallab.streng.resize(locallab.nbspot); + locallab.sensisf.resize(locallab.nbspot); // Blur & Noise locallab.expblur.resize(locallab.nbspot); locallab.radius.resize(locallab.nbspot); @@ -4889,6 +4905,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "PastSatTog_" + std::to_string(i), pedited, locallab.pastsattog.at(i), pedited->locallab.pastsattog); assignFromKeyfile(keyFile, "Locallab", "Sensiv_" + std::to_string(i), pedited, locallab.sensiv.at(i), pedited->locallab.sensiv); assignFromKeyfile(keyFile, "Locallab", "SkinTonesCurve_" + std::to_string(i), pedited, locallab.skintonescurve.at(i), pedited->locallab.skintonescurve); + //Soft Light + assignFromKeyfile(keyFile, "Locallab", "Expsoft_" + std::to_string(i), pedited, locallab.expsoft.at(i), pedited->locallab.expsoft); + assignFromKeyfile(keyFile, "Locallab", "Streng_" + std::to_string(i), pedited, locallab.streng.at(i), pedited->locallab.streng); + assignFromKeyfile(keyFile, "Locallab", "Sensisf_" + std::to_string(i), pedited, locallab.sensisf.at(i), pedited->locallab.sensisf); // Blur & Noise assignFromKeyfile(keyFile, "Locallab", "Expblur_" + std::to_string(i), pedited, locallab.expblur.at(i), pedited->locallab.expblur); assignFromKeyfile(keyFile, "Locallab", "Radius_" + std::to_string(i), pedited, locallab.radius.at(i), pedited->locallab.radius); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index b3394e0a0..7c0644359 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -977,6 +977,10 @@ struct LocallabParams { std::vector pastsattog; std::vector sensiv; std::vector> skintonescurve; + //Soft Light + std::vector expsoft; + std::vector streng; + std::vector sensisf; // Blur & Noise std::vector expblur; std::vector radius; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 937b56f14..c129c9dff 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -625,7 +625,10 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallablcdarkness LUMINANCECURVE, //Evlocallablclightness LUMINANCECURVE, //Evlocallabsensilc - LUMINANCECURVE //Evlocallabdehaz + LUMINANCECURVE, //Evlocallabdehaz + LUMINANCECURVE, //EvLocenasoft + LUMINANCECURVE, //EvLocallabstreng + LUMINANCECURVE //EvLocallabsensisf }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 52d0052bb..ade3f1f42 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -48,6 +48,7 @@ Locallab::Locallab(): expcolor(new MyExpander(true, M("TP_LOCALLAB_COFR"))), expexpose(new MyExpander(true, M("TP_LOCALLAB_EXPOSE"))), expvibrance(new MyExpander(true, M("TP_LOCALLAB_VIBRANCE"))), + expsoft(new MyExpander(true, M("TP_LOCALLAB_SOFT"))), expblur(new MyExpander(true, M("TP_LOCALLAB_BLUFR"))), exptonemap(new MyExpander(true, M("TP_LOCALLAB_TM"))), expreti(new MyExpander(true, M("TP_LOCALLAB_RETI"))), @@ -84,6 +85,9 @@ Locallab::Locallab(): saturated(Gtk::manage(new Adjuster(M("TP_VIBRANCE_SATURATED"), -100., 100., 1., 0.))), pastels(Gtk::manage(new Adjuster(M("TP_VIBRANCE_PASTELS"), -100., 100., 1., 0.))), sensiv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 19))), + //Soft Light + streng(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRENG"), 1, 100, 1, 1))), + sensisf(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 1, 100, 1, 19))), // Blur & Noise radius(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADIUS"), 1, 100, 1, 1))), strength(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRENGTH"), 0, 100, 1, 0))), @@ -383,6 +387,20 @@ Locallab::Locallab(): panel->pack_start(*expvibrance, false, false); + // Soft Light + expsoft->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expsoft)); + enablesoftConn = expsoft->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expsoft)); + streng->setAdjusterListener(this); + sensisf->setAdjusterListener(this); + + ToolParamBlock* const softBox = Gtk::manage(new ToolParamBlock()); + softBox->pack_start(*streng); + softBox->pack_start(*sensisf); + expsoft->add(*softBox); + expsoft->setLevel(2); + + panel->pack_start(*expsoft, false, false); + // Blur & Noise expblur->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Locallab::foldAllButMe), expblur)); enableblurConn = expblur->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Locallab::enableToggled), expblur)); @@ -662,6 +680,7 @@ void Locallab::foldAllButMe(GdkEventButton* event, MyExpander *expander) expcolor->set_expanded(expcolor == expander); expexpose->set_expanded(expexpose == expander); expvibrance->set_expanded(expvibrance == expander); + expsoft->set_expanded(expsoft == expander); expblur->set_expanded(expblur == expander); exptonemap->set_expanded(exptonemap == expander); expreti->set_expanded(expreti == expander); @@ -687,6 +706,8 @@ void Locallab::enableToggled(MyExpander *expander) event = EvLocenaexpose; } else if (expander == expvibrance) { event = EvLocenavibrance; + } else if (expander == expsoft) { + event = EvLocenasoft; } else if (expander == expblur) { event = EvLocenablur; } else if (expander == exptonemap) { @@ -722,6 +743,7 @@ void Locallab::writeOptions(std::vector &tpOpen) tpOpen.push_back(expcolor->get_expanded()); tpOpen.push_back(expexpose->get_expanded()); tpOpen.push_back(expvibrance->get_expanded()); + tpOpen.push_back(expsoft->get_expanded()); tpOpen.push_back(expblur->get_expanded()); tpOpen.push_back(exptonemap->get_expanded()); tpOpen.push_back(expreti->get_expanded()); @@ -734,18 +756,19 @@ void Locallab::writeOptions(std::vector &tpOpen) void Locallab::updateToolState(std::vector &tpOpen) { - if (tpOpen.size() >= 11) { + if (tpOpen.size() >= 12) { expsettings->setExpanded(tpOpen.at(0)); expcolor->set_expanded(tpOpen.at(1)); expexpose->set_expanded(tpOpen.at(2)); expvibrance->set_expanded(tpOpen.at(3)); - expblur->set_expanded(tpOpen.at(4)); - exptonemap->set_expanded(tpOpen.at(5)); - expreti->set_expanded(tpOpen.at(6)); - expsharp->set_expanded(tpOpen.at(7)); - expcontrast->set_expanded(tpOpen.at(8)); - expcbdl->set_expanded(tpOpen.at(9)); - expdenoi->set_expanded(tpOpen.at(10)); + expsoft->set_expanded(tpOpen.at(4)); + expblur->set_expanded(tpOpen.at(5)); + exptonemap->set_expanded(tpOpen.at(6)); + expreti->set_expanded(tpOpen.at(7)); + expsharp->set_expanded(tpOpen.at(8)); + expcontrast->set_expanded(tpOpen.at(9)); + expcbdl->set_expanded(tpOpen.at(10)); + expdenoi->set_expanded(tpOpen.at(11)); } } @@ -872,6 +895,11 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) sensiv->setEditedState(pedited->locallab.sensiv ? Edited : UnEdited); skinTonesCurve->setUnChanged(!pedited->locallab.skintonescurve); + //Soft ligh + expsoft->set_inconsistent(!pedited->locallab.expsoft); + streng->setEditedState(pedited->locallab.streng ? Edited : UnEdited); + sensisf->setEditedState(pedited->locallab.sensisf ? Edited : UnEdited); + // Blur & Noise expblur->set_inconsistent(!pedited->locallab.expblur); radius->setEditedState(pedited->locallab.radius ? Edited : UnEdited); @@ -1138,6 +1166,10 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.pastsattog.push_back(1); pp->locallab.sensiv.push_back(19); pp->locallab.skintonescurve.push_back({(double)DCT_Linear}); + //Soft Light + pp->locallab.expsoft.push_back(0); + pp->locallab.streng.push_back(0); + pp->locallab.sensisf.push_back(19); // Blur & Noise pp->locallab.expblur.push_back(0); pp->locallab.radius.push_back(1); @@ -1278,6 +1310,10 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.pastsattog.erase(pp->locallab.pastsattog.begin() + i); pp->locallab.sensiv.erase(pp->locallab.sensiv.begin() + i); pp->locallab.skintonescurve.erase(pp->locallab.skintonescurve.begin() + i); + //Soft Light + pp->locallab.expsoft.erase(pp->locallab.expsoft.begin() + i); + pp->locallab.streng.erase(pp->locallab.streng.begin() + i); + pp->locallab.sensisf.erase(pp->locallab.sensisf.begin() + i); // Blur & Noise pp->locallab.expblur.erase(pp->locallab.expblur.begin() + i); pp->locallab.radius.erase(pp->locallab.radius.begin() + i); @@ -1479,6 +1515,10 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.pastsattog.at(pp->locallab.selspot) = (int)pastSatTog->get_active(); pp->locallab.sensiv.at(pp->locallab.selspot) = sensiv->getIntValue(); pp->locallab.skintonescurve.at(pp->locallab.selspot) = skinTonesCurve->getCurve(); + //Soft Light + pp->locallab.expsoft.at(pp->locallab.selspot) = (int)expsoft->getEnabled(); + pp->locallab.streng.at(pp->locallab.selspot) = streng->getIntValue(); + pp->locallab.sensisf.at(pp->locallab.selspot) = sensisf->getIntValue(); // Blur & Noise pp->locallab.expblur.at(pp->locallab.selspot) = (int)expblur->getEnabled(); pp->locallab.radius.at(pp->locallab.selspot) = radius->getIntValue(); @@ -1627,6 +1667,10 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.pastsattog = !pastSatTog->get_inconsistent(); pedited->locallab.sensiv = sensiv->getEditedState(); pedited->locallab.skintonescurve = !skinTonesCurve->isUnChanged(); + //Soft Light + pedited->locallab.expsoft = !expsoft->get_inconsistent(); + pedited->locallab.streng = streng->getEditedState(); + pedited->locallab.sensisf = sensisf->getEditedState(); // Blur & Noise pedited->locallab.expblur = !expblur->get_inconsistent(); pedited->locallab.radius = radius->getEditedState(); @@ -1911,6 +1955,8 @@ void Locallab::blurMethodChanged() } } + + void Locallab::qualitycurveMethodChanged() { printf("qualitycurveMethodChanged\n"); @@ -2445,6 +2491,20 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + // Soft Light + if (getEnabled() && expsoft->getEnabled()) { + if (a == streng) { + if (listener) { + listener->panelChanged(Evlocallabstreng, streng->getTextValue()); + } + } + + if (a == sensisf) { + if (listener) { + listener->panelChanged(Evlocallabsensisf, sensisf->getTextValue()); + } + } + } // Blur & Noise if (getEnabled() && expblur->getEnabled()) { if (a == radius) { @@ -2870,6 +2930,7 @@ void Locallab::setBatchMode(bool batchMode) sensibn->showEditedCB(); sensitm->showEditedCB(); radius->showEditedCB(); + streng->showEditedCB(); strength->showEditedCB(); stren->showEditedCB(); gamma->showEditedCB(); @@ -3148,7 +3209,10 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, int pastSatTog->set_active((bool)pp->locallab.pastsattog.at(index)); sensiv->setValue(pp->locallab.sensiv.at(index)); skinTonesCurve->setCurve(pp->locallab.skintonescurve.at(index)); - + //Soft Light + expsoft->setEnabled((bool)pp->locallab.expsoft.at(index)); + streng->setValue(pp->locallab.streng.at(index)); + sensisf->setValue(pp->locallab.sensisf.at(index)); // Blur & Noise expblur->setEnabled((bool)pp->locallab.expblur.at(index)); radius->setValue(pp->locallab.radius.at(index)); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 18e278444..3215b31b8 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -47,6 +47,7 @@ private: MyExpander* const expcolor; MyExpander* const expexpose; MyExpander* const expvibrance; + MyExpander* const expsoft; MyExpander* const expblur; MyExpander* const exptonemap; MyExpander* const expreti; @@ -54,7 +55,7 @@ private: MyExpander* const expcontrast; MyExpander* const expcbdl; MyExpander* const expdenoi; - sigc::connection enablecolorConn, enableexposeConn, enablevibranceConn, enableblurConn, enabletonemapConn, enableretiConn, enablesharpConn, enablecontrastConn, enablecbdlConn, enabledenoiConn; + sigc::connection enablecolorConn, enableexposeConn, enablevibranceConn, enablesoftConn, enableblurConn, enabletonemapConn, enableretiConn, enablesharpConn, enablecontrastConn, enablecbdlConn, enabledenoiConn; // Curve widgets // Color & Light @@ -91,6 +92,9 @@ private: Adjuster* const saturated; Adjuster* const pastels; Adjuster* const sensiv; + //Soft Light + Adjuster* const streng; + Adjuster* const sensisf; // Blur & Noise Adjuster* const radius; Adjuster* const strength; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 1f6158e62..7ec1a7443 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -385,6 +385,10 @@ void ParamsEdited::set(bool v) locallab.pastsattog = v; locallab.sensiv = v; locallab.skintonescurve = v; + //Soft Light + locallab.expsoft = v; + locallab.streng = v; + locallab.sensisf = v; // Blur & Noise locallab.expblur = v; locallab.radius = v; @@ -1077,6 +1081,10 @@ void ParamsEdited::initFrom(const std::vector& locallab.pastsattog = locallab.pastsattog && p.locallab.pastsattog == other.locallab.pastsattog; locallab.sensiv = locallab.sensiv && p.locallab.sensiv == other.locallab.sensiv; locallab.skintonescurve = locallab.skintonescurve && p.locallab.skintonescurve == other.locallab.skintonescurve; + //Soft Light + locallab.expsoft = locallab.expsoft && p.locallab.expsoft == other.locallab.expsoft; + locallab.streng = locallab.streng && p.locallab.streng == other.locallab.streng; + locallab.sensisf = locallab.sensisf && p.locallab.sensisf == other.locallab.sensisf; // Blur & Noise locallab.expblur = locallab.expblur && p.locallab.expblur == other.locallab.expblur; locallab.radius = locallab.radius && p.locallab.radius == other.locallab.radius; @@ -2731,6 +2739,19 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.skintonescurve = mods.locallab.skintonescurve; } + //Soft Light + if (locallab.expsoft) { + toEdit.locallab.expsoft = mods.locallab.expsoft; + } + + if (locallab.streng) { + toEdit.locallab.streng = mods.locallab.streng; + } + + if (locallab.sensisf) { + toEdit.locallab.sensisf = mods.locallab.sensisf; + } + // Blur & Noise if (locallab.expblur) { toEdit.locallab.expblur = mods.locallab.expblur; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 13f8ecf84..061df5101 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -515,6 +515,10 @@ public: bool pastsattog; bool sensiv; bool skintonescurve; + //Soft Light + bool expsoft; + bool streng; + bool sensisf; // Blur & Noise bool expblur; bool radius;