From d766ae4f8205f49a40117aa6eb4ce075387773ee Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 19 Feb 2019 11:34:37 +0100 Subject: [PATCH] Add strength to color correction grid --- rtdata/languages/default | 2 ++ rtengine/iplocallab.cc | 11 +++++++---- rtengine/procevents.h | 1 + rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 11 +++++------ rtengine/refreshmap.cc | 3 ++- rtgui/locallab.cc | 20 ++++++++++++++++++++ rtgui/locallab.h | 1 + rtgui/paramsedited.cc | 7 +++++++ rtgui/paramsedited.h | 9 +++++---- 10 files changed, 54 insertions(+), 15 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 6d5c4d325..a9f19778f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -877,6 +877,7 @@ HISTORY_MSG_621;Local - Exp inverse HISTORY_MSG_622;Local - Exclude structure HISTORY_MSG_623;Local - Exp Chroma compensation HISTORY_MSG_624;Local - Color correction grid +HISTORY_MSG_625;Local - Color correction strength HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2026,6 +2027,7 @@ TP_LOCALLAB_RADIUS;Radius TP_LOCALLAB_RETI;Retinex TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain TP_LOCALLAB_STREN;Strength +TP_LOCALLAB_STRGRID;Strength TP_LOCALLAB_TM;Tone Mapping TP_LOCALLAB_STR;Strength TP_LOCALLAB_NEIGH;Radius diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 7f4ad4618..b7cbb9dca 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -160,6 +160,7 @@ struct local_params { int prox; int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu, sensden, senslc, senssf; float struco; + float strengrid; float struexc; float blendmacol; float blendmaexp; @@ -465,6 +466,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float labgridBLowloc = locallab.spots.at(sp).labgridBLow; float labgridBHighloc = locallab.spots.at(sp).labgridBHigh; float labgridAHighloc = locallab.spots.at(sp).labgridAHigh; + float strengthgrid = (float) locallab.spots.at(sp).strengthgrid; float structcolor = (float) locallab.spots.at(sp).structcol; float blendmaskcolor = ((float) locallab.spots.at(sp).blendmaskcol) / 100.f ; @@ -507,6 +509,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.lyT = h * local_yT; lp.chro = local_chroma; lp.struco = structcolor; + lp.strengrid = strengthgrid; lp.blendmacol = blendmaskcolor; lp.struexc = structexclude; lp.blendmaexp = blendmaskexpo; @@ -3958,8 +3961,8 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L flib = (100.f + realstrbdE + 100.f * realstrchdE) / 100.f; } else if (senstype == 0) { // printf("rdE=%f chdE=%f", realstradE, realstrchdE); - flia = (100.f + 10.f * realstradE + realstrchdE) / 100.f; - flib = (100.f + 10.f * realstrbdE + realstrchdE) / 100.f; + flia = (100.f + 0.3f * lp.strengrid * realstradE + realstrchdE) / 100.f; + flib = (100.f + 0.3f * lp.strengrid * realstrbdE + realstrchdE) / 100.f; } difa = chra * flia - original->a[y][x]; @@ -4049,8 +4052,8 @@ void ImProcFunctions::transit_shapedetect(int senstype, LabImage * bufexporig, L flia = (100.f + realstradE + 100.f * realstrchdE) / 100.f; flib = (100.f + realstrbdE + 100.f * realstrchdE) / 100.f; } else if (senstype == 0) { - flia = (100.f + 10.f * realstradE + realstrchdE) / 100.f; - flib = (100.f + 10.f * realstrbdE + realstrchdE) / 100.f; + flia = (100.f + 0.3f * lp.strengrid * realstradE + realstrchdE) / 100.f; + flib = (100.f + 0.3f * lp.strengrid * realstrbdE + realstrchdE) / 100.f; } difa = chra * flia - original->a[y][x]; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index c72de9e7d..c66b884ea 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -651,6 +651,7 @@ enum ProcEventCode { Evlocallabstructexlu = 621, Evlocallabexpchroma = 622, EvLocallabLabGridValue = 623, + EvLocallabLabstrengthgrid = 624, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 5f7d4a116..f0ebaba66 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2366,6 +2366,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : labgridBLow(0.0), labgridAHigh(0.0), labgridBHigh(0.0), + strengthgrid(20), sensi(15), structcol(0), blurcolde(5), @@ -2515,6 +2516,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && labgridBLow == other.labgridBLow && labgridAHigh == other.labgridAHigh && labgridBHigh == other.labgridBHigh + && strengthgrid == other.strengthgrid && sensi == other.sensi && structcol == other.structcol && blendmaskcol == other.blendmaskcol @@ -3618,6 +3620,7 @@ 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).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); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).blurcolde, "Locallab", "Blurcolde_" + std::to_string(i), spot.blurcolde, keyFile); @@ -4852,6 +4855,7 @@ 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", "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); assignFromKeyfile(keyFile, "Locallab", "Blurcolde_" + std::to_string(i), pedited, spot.blurcolde, spotEdited.blurcolde); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 35a55e88e..c43259a10 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -962,12 +962,11 @@ struct LocallabParams { int lightness; int contrast; int chroma; - double labgridALow; - double labgridBLow; - double labgridAHigh; - double labgridBHigh; - static const double LABGRID_CORR_MAX; - static const double LABGRID_CORR_SCALE; + double labgridALow; + double labgridBLow; + double labgridAHigh; + double labgridBHigh; + int strengthgrid; int sensi; int structcol; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index bdf55fed3..f516bae4d 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -650,7 +650,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabinversex LUMINANCECURVE, // Evlocallabstructexclu LUMINANCECURVE, // Evlocallabexpchroma - LUMINANCECURVE //EvLocallabLabGridValue + LUMINANCECURVE, //EvLocallabLabGridValue + LUMINANCECURVE //EvLocallabLabstrengthgrid }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 921371370..ed5a42400 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -76,6 +76,7 @@ Locallab::Locallab(): lightness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTNESS"), -100, 100, 1, 0))), contrast(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTRAST"), -100, 100, 1, 0))), chroma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMA"), -100, 150, 1, 0))), + strengthgrid(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRGRID"), 0, 100, 1, 20))), sensi(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 15))), structcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL"), 0, 100, 1, 0))), blurcolde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), @@ -232,6 +233,7 @@ Locallab::Locallab(): sensi->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); sensi->setAdjusterListener(this); + strengthgrid->setAdjusterListener(this); structcol->setAdjusterListener(this); blurcolde->setAdjusterListener(this); @@ -351,6 +353,7 @@ Locallab::Locallab(): gridFrame->set_label_align(0.025, 0.5); ToolParamBlock* const gridBox = Gtk::manage(new ToolParamBlock()); gridBox->pack_start(*labgrid); + gridBox->pack_start(*strengthgrid); gridFrame->add(*gridBox); superBox->pack_start(*gridFrame); @@ -1505,6 +1508,7 @@ void Locallab::write(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); + pp->locallab.spots.at(pp->locallab.selspot).strengthgrid = strengthgrid->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).labgridALow *= ColorToningParams::LABGRID_CORR_MAX; pp->locallab.spots.at(pp->locallab.selspot).labgridAHigh *= ColorToningParams::LABGRID_CORR_MAX; pp->locallab.spots.at(pp->locallab.selspot).labgridBLow *= ColorToningParams::LABGRID_CORR_MAX; @@ -1676,6 +1680,8 @@ void Locallab::write(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).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(); pe->locallab.spots.at(pp->locallab.selspot).structcol = pe->locallab.spots.at(pp->locallab.selspot).structcol || structcol->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod = pe->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod || qualitycurveMethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -1824,6 +1830,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).lightness = pedited->locallab.spots.at(pp->locallab.selspot).lightness || lightness->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).contrast = pedited->locallab.spots.at(pp->locallab.selspot).contrast || contrast->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).chroma = pedited->locallab.spots.at(pp->locallab.selspot).chroma || chroma->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).strengthgrid = pedited->locallab.spots.at(pp->locallab.selspot).strengthgrid || strengthgrid->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).sensi = pedited->locallab.spots.at(pp->locallab.selspot).sensi || sensi->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).structcol = pedited->locallab.spots.at(pp->locallab.selspot).structcol || structcol->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod = pedited->locallab.spots.at(pp->locallab.selspot).qualitycurveMethod || qualitycurveMethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -2297,6 +2304,7 @@ void Locallab::inversChanged() labqualcurv->show(); maskcolFrame->show(); structcol->show(); + strengthgrid->hide(); blurcolde->show(); showmaskcolMethod->hide(); // Being able to change Color & Light mask visibility is useless in batch mode gridFrame->hide(); @@ -2311,6 +2319,7 @@ void Locallab::inversChanged() structcol->hide(); blurcolde->show(); gridFrame->hide(); + strengthgrid->hide(); } else { sensi->show(); @@ -2670,6 +2679,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe labgrid->setEdited(Edited); sensi->setDefaultEditedState(Irrelevant); structcol->setDefaultEditedState(Irrelevant); + strengthgrid->setDefault((double)defSpot->strengthgrid); blurcolde->setDefaultEditedState(Irrelevant); blendmaskcol->setDefaultEditedState(Irrelevant); // Exposure @@ -2758,6 +2768,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe labgrid->setEdited((defSpotState->labgridALow || defSpotState->labgridBLow || defSpotState->labgridAHigh || defSpotState->labgridBHigh) ? Edited : UnEdited); sensi->setDefaultEditedState(defSpotState->sensi ? Edited : UnEdited); structcol->setDefaultEditedState(defSpotState->structcol ? Edited : UnEdited); + strengthgrid->setDefaultEditedState(defSpotState->strengthgrid ? Edited : UnEdited); blurcolde->setDefaultEditedState(defSpotState->blurcolde ? Edited : UnEdited); blendmaskcol->setDefaultEditedState(defSpotState->blendmaskcol ? Edited : UnEdited); // Exposure @@ -2894,6 +2905,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == strengthgrid) { + if (listener) { + listener->panelChanged(EvLocallabLabstrengthgrid, strengthgrid->getTextValue()); + } + } + if (a == sensi) { if (listener) { listener->panelChanged(Evlocallabsensi, sensi->getTextValue()); @@ -3372,6 +3389,7 @@ void Locallab::setBatchMode(bool batchMode) chroma->showEditedCB(); sensi->showEditedCB(); structcol->showEditedCB(); + strengthgrid->showEditedCB(); blurcolde->showEditedCB(); blendmaskcol->showEditedCB(); // Exposure @@ -3691,6 +3709,7 @@ 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 / ColorToningParams::LABGRID_CORR_MAX, pp->locallab.spots.at(index).labgridBLow / ColorToningParams::LABGRID_CORR_MAX, pp->locallab.spots.at(index).labgridAHigh / ColorToningParams::LABGRID_CORR_MAX, pp->locallab.spots.at(index).labgridBHigh / ColorToningParams::LABGRID_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); @@ -3884,6 +3903,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); + strengthgrid->setEditedState(spotState->strengthgrid ? Edited : UnEdited); if (!spotState->qualitycurveMethod) { qualitycurveMethod->set_active_text(M("GENERAL_UNCHANGED")); diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 140a62135..7ba076b11 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -92,6 +92,7 @@ private: Adjuster* const lightness; Adjuster* const contrast; Adjuster* const chroma; + Adjuster* const strengthgrid; Adjuster* const sensi; Adjuster* const structcol; Adjuster* const blurcolde; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index ae71c4778..978dc5323 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -952,6 +952,7 @@ 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).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; locallab.spots.at(j).blurcolde = locallab.spots.at(j).blurcolde && pSpot.blurcolde == otherSpot.blurcolde; @@ -2602,6 +2603,10 @@ 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).strengthgrid) { + toEdit.locallab.spots.at(i).strengthgrid = mods.locallab.spots.at(i).strengthgrid; + } + if (locallab.spots.at(i).sensi) { toEdit.locallab.spots.at(i).sensi = mods.locallab.spots.at(i).sensi; } @@ -3982,6 +3987,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : labgridBLow(v), labgridAHigh(v), labgridBHigh(v), + strengthgrid(v), sensi(v), structcol(v), blurcolde(v), @@ -4128,6 +4134,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) labgridBLow = v; labgridAHigh = v; labgridBHigh = v; + strengthgrid = v; sensi = v; structcol = v; blurcolde = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 713603bb3..84ab9c55d 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -487,10 +487,11 @@ public: bool lightness; bool contrast; bool chroma; - bool labgridALow; - bool labgridBLow; - bool labgridAHigh; - bool labgridBHigh; + bool labgridALow; + bool labgridBLow; + bool labgridAHigh; + bool labgridBHigh; + bool strengthgrid; bool sensi; bool structcol; bool blurcolde;