diff --git a/rtdata/languages/default b/rtdata/languages/default index 3643bd654..4d999491a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1128,6 +1128,8 @@ HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle HISTORY_MSG_891;Local - Contrast Wavelet Graduated +HISTORY_MSG_892;Local - Encoding log Graduated Strength +HISTORY_MSG_893;Local - Encoding log Graduated angle HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2352,6 +2354,7 @@ TP_LOCALLAB_GRADANG;Gradient angle TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 TP_LOCALLAB_GRADFRA;Graduated Filter TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. +TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance TP_LOCALLAB_GRADSTR;Gradient strength TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength TP_LOCALLAB_GRADSTRCHRO;Gradient strength Chrominance diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 427c2851e..35379433b 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -236,6 +236,8 @@ struct local_params { float angvib; float angwav; float strwav; + float anglog; + float strlog; float softradiusexp; float softradiuscol; float softradiuscb; @@ -835,6 +837,8 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall float angvib = ((float) locallab.spots.at(sp).angvib); float strwav = ((float) locallab.spots.at(sp).strwav); float angwav = ((float) locallab.spots.at(sp).angwav); + float strlog = ((float) locallab.spots.at(sp).strlog); + float anglog = ((float) locallab.spots.at(sp).anglog); float softradiusexpo = ((float) locallab.spots.at(sp).softradiusexp); float softradiuscolor = ((float) locallab.spots.at(sp).softradiuscol); float softradiusreti = ((float) locallab.spots.at(sp).softradiusret); @@ -974,6 +978,8 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.angvib = angvib; lp.strwav = strwav; lp.angwav = angwav; + lp.strlog = strlog; + lp.anglog = anglog; lp.softradiusexp = softradiusexpo; lp.softradiuscol = softradiuscolor; lp.softradiusret = softradiusreti; @@ -3009,6 +3015,9 @@ void calclocalGradientParams(const struct local_params& lp, struct grad_params& } else if (indic == 10) { stops = lp.strwav; angs = lp.angwav; + } else if (indic == 11) { + stops = lp.strlog; + angs = lp.anglog; } @@ -9624,7 +9633,25 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o rgb2lab(*tmpImage, *bufexpfin, params->icm.workingProfile); delete tmpImage; + //here begin graduated filter + //first solution "easy" but we can do other with log_encode...to see the results + if (lp.strlog != 0.f) { + struct grad_params gplog; + calclocalGradientParams(lp, gplog, ystart, xstart, bfw, bfh, 11); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + double factor = 1.0; + factor = ImProcFunctions::calcGradientFactor(gplog, jr, ir); + bufexpfin->L[ir][jr] *= factor; + } + } + + + //end graduated transit_shapedetect2(call, 11, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); if (params->locallab.spots.at(sp).recurs) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index a90305c1e..8d62b6e0f 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -917,6 +917,8 @@ enum ProcEventCode { Evlocallabstrwav = 888, Evlocallabangwav = 889, Evlocallabwavgradl = 890, + Evlocallabstrlog = 891, + Evlocallabanglog = 892, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index c458df2cd..4033f4a51 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2815,7 +2815,9 @@ LocallabParams::LocallabSpot::LocallabSpot() : whiteEv(10.0), detail(0.6), sensilog(50), - baselog(2.) + baselog(2.), + strlog(0.0), + anglog(0.0) { } @@ -3241,7 +3243,9 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && whiteEv == other.whiteEv && detail == other.detail && sensilog == other.sensilog - && baselog == other.baselog; + && baselog == other.baselog + && strlog == other.strlog + && anglog == other.anglog; } @@ -4638,6 +4642,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).detail, "Locallab", "Detail_" + std::to_string(i), spot.detail, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sensilog, "Locallab", "Sensilog_" + std::to_string(i), spot.sensilog, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).baselog, "Locallab", "Baselog_" + std::to_string(i), spot.baselog, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).strlog, "Locallab", "Strlog_" + std::to_string(i), spot.strlog, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).anglog, "Locallab", "Anglog_" + std::to_string(i), spot.anglog, keyFile); } } @@ -6203,6 +6209,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Detail_" + std::to_string(i), pedited, spot.detail, spotEdited.detail); assignFromKeyfile(keyFile, "Locallab", "Sensilog_" + std::to_string(i), pedited, spot.sensilog, spotEdited.sensilog); assignFromKeyfile(keyFile, "Locallab", "Baselog_" + std::to_string(i), pedited, spot.baselog, spotEdited.baselog); + assignFromKeyfile(keyFile, "Locallab", "Strlog_" + std::to_string(i), pedited, spot.strlog, spotEdited.strlog); + assignFromKeyfile(keyFile, "Locallab", "Anglog_" + std::to_string(i), pedited, spot.anglog, spotEdited.anglog); locallab.spots.at(i) = spot; diff --git a/rtengine/procparams.h b/rtengine/procparams.h index dcc90bcee..909078d88 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1359,6 +1359,8 @@ struct LocallabParams { double detail; int sensilog; double baselog; + double strlog; + double anglog; LocallabSpot(); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 8bc79385d..3b4bca4e4 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -920,7 +920,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //Evlocallabthreswav LUMINANCECURVE, //Evlocallabstrwav LUMINANCECURVE, //Evlocallabangwav - LUMINANCECURVE //Evlocallabwavgradl + LUMINANCECURVE, //Evlocallabwavgradl + LUMINANCECURVE, //Evlocallabstrlog + LUMINANCECURVE //Evlocallabanglog }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index fe8d94554..eb771331d 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -650,6 +650,8 @@ whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0.0, 32.0, 0.1, 10.0 detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSILOG"), 0, 100, 1, 50))), baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), +strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), +anglog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), // ButtonCheck widgets // Color & Light @@ -786,6 +788,7 @@ compreFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COMPREFRA")))), grainFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRAINFRA")))), logFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA")))), logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), +gradlogFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADLOGFRA")))), // retiBox(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), retiBox(Gtk::manage(new ToolParamBlock())), maskretiBox(Gtk::manage(new ToolParamBlock())), @@ -3792,6 +3795,8 @@ pe(nullptr) blackEv->delay = options.adjusterMaxDelay; whiteEv->delay = options.adjusterMaxDelay; targetGray->delay = options.adjusterMaxDelay; + strlog->delay = options.adjusterMaxDelay; + anglog->delay = options.adjusterMaxDelay; sourceGray->setAdjusterListener(this); blackEv->setAdjusterListener(this); @@ -3800,6 +3805,8 @@ pe(nullptr) detail->setAdjusterListener(this); sensilog->setAdjusterListener(this); baselog->setAdjusterListener(this); + strlog->setAdjusterListener(this); + anglog->setAdjusterListener(this); whiteEv->setLogScale(16, 0); blackEv->setLogScale(2, -8); @@ -3822,12 +3829,20 @@ pe(nullptr) logFBox->pack_start(*sourceGray); logFrame->add(*logFBox); + gradlogFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const gradlogBox = Gtk::manage(new ToolParamBlock()); + gradlogBox->pack_start(*strlog); + gradlogBox->pack_start(*anglog); + gradlogFrame->add(*gradlogBox); + logBox->pack_start(*logPFrame); logBox->pack_start(*logFrame); logBox->pack_start(*targetGray); logBox->pack_start(*detail); logBox->pack_start(*baselog); logBox->pack_start(*sensilog); + logBox->pack_start(*gradlogFrame); + panel->pack_start(*explog, false, false); @@ -5460,6 +5475,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).detail = detail->getValue(); pp->locallab.spots.at(pp->locallab.selspot).sensilog = sensilog->getIntValue(); pp->locallab.spots.at(pp->locallab.selspot).baselog = baselog->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).strlog = strlog->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).anglog = anglog->getValue(); } @@ -5877,6 +5894,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).detail = pe->locallab.spots.at(pp->locallab.selspot).detail || detail->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).sensilog = pe->locallab.spots.at(pp->locallab.selspot).sensilog || sensilog->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).baselog = pe->locallab.spots.at(pp->locallab.selspot).baselog || baselog->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).strlog = pe->locallab.spots.at(pp->locallab.selspot).strlog || strlog->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).anglog = pe->locallab.spots.at(pp->locallab.selspot).anglog || anglog->getEditedState(); } } @@ -6295,6 +6314,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).detail = pedited->locallab.spots.at(pp->locallab.selspot).detail || detail->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).sensilog = pedited->locallab.spots.at(pp->locallab.selspot).sensilog || sensilog->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).baselog = pedited->locallab.spots.at(pp->locallab.selspot).baselog || baselog->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).strlog = pedited->locallab.spots.at(pp->locallab.selspot).strlog || strlog->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).anglog = pedited->locallab.spots.at(pp->locallab.selspot).anglog || anglog->getEditedState(); } } @@ -9087,6 +9108,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c detail->setDefault((double)defSpot->detail); sensilog->setDefault((double)defSpot->sensilog); baselog->setDefault((double)defSpot->baselog); + strlog->setDefault(defSpot->strlog); + anglog->setDefault(defSpot->anglog); // Set default edited states for adjusters and threshold adjusters if (!pedited) { @@ -9333,6 +9356,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c detail->setDefaultEditedState(Irrelevant); sensilog->setDefaultEditedState(Irrelevant); baselog->setDefaultEditedState(Irrelevant); + strlog->setDefaultEditedState(Irrelevant); + anglog->setDefaultEditedState(Irrelevant); } else { const LocallabParamsEdited::LocallabSpotEdited* defSpotState = new LocallabParamsEdited::LocallabSpotEdited(true); @@ -9585,6 +9610,8 @@ void Locallab::setDefaults(const rtengine::procparams::ProcParams * defParams, c detail->setDefaultEditedState(defSpotState->detail ? Edited : UnEdited); sensilog->setDefaultEditedState(defSpotState->sensilog ? Edited : UnEdited); baselog->setDefaultEditedState(defSpotState->baselog ? Edited : UnEdited); + strlog->setDefaultEditedState(defSpotState->strlog ? Edited : UnEdited); + anglog->setDefaultEditedState(defSpotState->anglog ? Edited : UnEdited); } } @@ -11046,6 +11073,18 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == strlog) { + if (listener) { + listener->panelChanged(Evlocallabstrlog, strlog->getTextValue()); + } + } + + if (a == anglog) { + if (listener) { + listener->panelChanged(Evlocallabanglog, anglog->getTextValue()); + } + } + } } @@ -11319,6 +11358,8 @@ void Locallab::setBatchMode(bool batchMode) detail->showEditedCB(); sensilog->showEditedCB(); baselog->showEditedCB(); + strlog->showEditedCB(); + anglog->showEditedCB(); // Set batch mode for comboBoxText @@ -12485,6 +12526,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con detail->setValue(pp->locallab.spots.at(index).detail); sensilog->setValue(pp->locallab.spots.at(index).sensilog); baselog->setValue(pp->locallab.spots.at(index).baselog); + strlog->setValue(pp->locallab.spots.at(index).strlog); + anglog->setValue(pp->locallab.spots.at(index).anglog); if (pedited) { if (index < (int)pedited->locallab.spots.size()) { @@ -12962,6 +13005,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con detail->setEditedState(spotState->detail ? Edited : UnEdited); sensilog->setEditedState(spotState->sensilog ? Edited : UnEdited); baselog->setEditedState(spotState->baselog ? Edited : UnEdited); + strlog->setEditedState(spotState->strlog ? Edited : UnEdited); + anglog->setEditedState(spotState->anglog ? Edited : UnEdited); } } diff --git a/rtgui/locallab.h b/rtgui/locallab.h index f608ca39f..a701b2a5e 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -425,6 +425,8 @@ private: Adjuster* const detail; Adjuster* const sensilog; Adjuster* const baselog; + Adjuster* const strlog; + Adjuster* const anglog; // ButtonCheck widgets // Color & Light @@ -628,6 +630,7 @@ private: Gtk::Frame* const grainFrame; Gtk::Frame* const logFrame; Gtk::Frame* const logPFrame; + Gtk::Frame* const gradlogFrame; ToolParamBlock* const retiBox; ToolParamBlock* const maskretiBox; ToolParamBlock* const mask7; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 9fd02bca9..bab6b35cc 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1359,6 +1359,8 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).detail = locallab.spots.at(j).detail && pSpot.detail == otherSpot.detail; locallab.spots.at(j).sensilog = locallab.spots.at(j).sensilog && pSpot.sensilog == otherSpot.sensilog; locallab.spots.at(j).baselog = locallab.spots.at(j).baselog && pSpot.baselog == otherSpot.baselog; + locallab.spots.at(j).strlog = locallab.spots.at(j).strlog && pSpot.strlog == otherSpot.strlog; + locallab.spots.at(j).anglog = locallab.spots.at(j).anglog && pSpot.anglog == otherSpot.anglog; } } @@ -4387,6 +4389,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).fullimage = mods.locallab.spots.at(i).fullimage; } + if (locallab.spots.at(i).strlog) { + toEdit.locallab.spots.at(i).strlog = mods.locallab.spots.at(i).strlog; + } + + if (locallab.spots.at(i).anglog) { + toEdit.locallab.spots.at(i).anglog = mods.locallab.spots.at(i).anglog; + } + } @@ -5755,7 +5765,9 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : whiteEv(v), detail(v), sensilog(v), - baselog(v) + baselog(v), + strlog(v), + anglog(v) { } @@ -6167,6 +6179,8 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) detail = v; sensilog = v; baselog = v; + strlog = v; + anglog = v; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1c6d6f23c..91ab10a3a 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -786,6 +786,8 @@ public: bool detail; bool sensilog; bool baselog; + bool strlog; + bool anglog; LocallabSpotEdited(bool v);