diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index b92590aca..94bb8df52 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1032,11 +1032,6 @@ void Crop::update(int todo) LHutili, HHutili, cclocalcurve2, localcutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, parent->locallColorMask, parent->locallColorMaskinv, parent->locallExpMask, parent->locallExpMaskinv, parent->locallSHMask, parent->locallSHMaskinv, parent->locallcbMask, parent->locallretiMask, parent->locallsoftMask, parent->localltmMask, parent->locallblMask, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); - printf("Tmean=%f\n", Tmean); -// if (locallListener) { -// locallListener->minmaxChanged(maxCD, minCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); -// } - } else { parent->ipf.Lab_Local(1, sp, (float**)shbuffer, labnCrop, labnCrop, reservCrop, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, locRETtransCurve, lllocalcurve2,locallutili, loclhCurve, lochhCurve, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 3f3c88873..3827bc9c1 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -880,7 +880,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L if (!logli) { useHslLin = true; } - +//printf("ok 1\n"); //empirical skip evaluation : very difficult because quasi all parameters interfere //to test on several images int nei = (int)(krad * loc.spots.at(sp).neigh); @@ -960,6 +960,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L if (!useHslLin) { pond /= log(elogt); } +//printf("ok 2\n"); float *buffer = new float[W_L * H_L]; float kr = 1.f;//on FFTW @@ -1033,6 +1034,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L } } } +//printf("ok 3\n"); if (scale == 1) { //equalize last scale with darkness and lightness @@ -1236,6 +1238,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L } } +//printf("ok 4\n"); #ifdef __SSE2__ vfloat pondv = F2V(pond); @@ -1275,6 +1278,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L } } +//printf("ok 5\n"); if (scal != 1) { float mintran = luminance[0][0]; @@ -1297,6 +1301,8 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L //here add GuidFilter for transmission map array2D ble(W_L, H_L); array2D guid(W_L, H_L); + float clipt = loc.spots.at(sp).cliptm; + #ifdef _OPENMP #pragma omp parallel for #endif @@ -1304,14 +1310,14 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L for (int i = 0; i < H_L; i ++) for (int j = 0; j < W_L; j++) { guid[i][j] = src[i][j] / 32768.f; - ble[i][j] = (luminance[i][j] + mintran) / deltatran; + ble[i][j] = LIM((luminance[i][j] + mintran) / deltatran, 0.002f * clipt, 1.f - 0.002f * clipt); } - double epsilmax = 1e-5; - double epsilmin = 1e-6; + double epsilmax = 0.9; + double epsilmin = 1e-5; float radi = loc.spots.at(sp).softradiusret; - if (loc.spots.at(sp).softradiusret > 0.f) { + if (radi > 0.f) { double aepsil = (epsilmax - epsilmin) / 90.f; double bepsil = epsilmax - 100.f * aepsil; double epsil = aepsil * radi + bepsil; @@ -1333,6 +1339,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L ble(0, 0); guid(0, 0); } +//printf("ok 6\n"); if (scal == 1) { @@ -1403,7 +1410,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L } } - if (scal != 1) { + if (scal == 1) { float mintran = luminance[0][0]; float maxtran = mintran; @@ -1515,6 +1522,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L } } } +//printf("ok 7\n"); float epsil = 0.1f; @@ -1613,6 +1621,7 @@ void ImProcFunctions::MSRLocal(int sp, bool fftw, int lum, LabImage * bufreti, L luminance[i][j] = intp(str, clipretinex(cd, 0.f, maxclip), originalLuminance[i][j]); } +//printf("ok 8\n"); #ifdef _OPENMP diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 16ce4656e..b85ea063f 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -780,6 +780,7 @@ enum ProcEventCode { Evlocallablumonly = 750, Evlocallaboffs = 751, EvlocallabCTtransCurve = 752, + Evlocallabcliptm = 753, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 764b458a8..455d2c0ed 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2607,6 +2607,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : darkness(2.0), lightnessreti(1.0), limd(8.0), + cliptm(0.0), fftwreti(false), // Sharpening expsharp(false), @@ -2873,6 +2874,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && darkness == other.darkness && lightnessreti == other.lightnessreti && limd == other.limd + && cliptm == other.cliptm && fftwreti == other.fftwreti // Sharpening && expsharp == other.expsharp @@ -4125,6 +4127,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).darkness, "Locallab", "Darkness_" + std::to_string(i), spot.darkness, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).lightnessreti, "Locallab", "Lightnessreti_" + std::to_string(i), spot.lightnessreti, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).limd, "Locallab", "Limd_" + std::to_string(i), spot.limd, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).cliptm, "Locallab", "Cliptm_" + std::to_string(i), spot.cliptm, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).fftwreti, "Locallab", "Fftwreti_" + std::to_string(i), spot.fftwreti, keyFile); // Sharpening saveToKeyfile(!pedited || pedited->locallab.spots.at(i).expsharp, "Locallab", "Expsharp_" + std::to_string(i), spot.expsharp, keyFile); @@ -5504,6 +5507,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Darkness_" + std::to_string(i), pedited, spot.darkness, spotEdited.darkness); assignFromKeyfile(keyFile, "Locallab", "Lightnessreti_" + std::to_string(i), pedited, spot.lightnessreti, spotEdited.lightnessreti); assignFromKeyfile(keyFile, "Locallab", "Limd_" + std::to_string(i), pedited, spot.limd, spotEdited.limd); + assignFromKeyfile(keyFile, "Locallab", "Cliptm_" + std::to_string(i), pedited, spot.cliptm, spotEdited.cliptm); assignFromKeyfile(keyFile, "Locallab", "Fftwreti_" + std::to_string(i), pedited, spot.fftwreti, spotEdited.fftwreti); // Sharpening assignFromKeyfile(keyFile, "Locallab", "Expsharp_" + std::to_string(i), pedited, spot.expsharp, spotEdited.expsharp); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7679a9cf5..9969f2a28 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1156,6 +1156,7 @@ struct LocallabParams { double darkness; double lightnessreti; double limd; + double cliptm; bool fftwreti; // Sharpening bool expsharp; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 0ca159986..bb4950574 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -779,7 +779,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabloglin LUMINANCECURVE, // Evlocallablumonly LUMINANCECURVE, // Evlocallaboffs - LUMINANCECURVE //EvlocallabCTtransCurve + LUMINANCECURVE, //EvlocallabCTtransCurve + LUMINANCECURVE //Evlocallabcliptm }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 20e689304..aed190c4b 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -270,7 +270,7 @@ Locallab::Locallab(): chrrt(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHRRT"), 0.0, 100.0, 0.1, 0.0))), neigh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NEIGH"), MINNEIGH, MAXNEIGH, 0.5, 50., nullptr, nullptr, &retiSlider2neigh, &retiNeigh2Slider))), vart(Gtk::manage(new Adjuster(M("TP_LOCALLAB_VART"), 0.1, 500., 0.1, 150.))), - offs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFS"), -20000., 65000., 1., 0.))), + offs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFS"), -2000., 10000., 1., 0.))), dehaz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZ"), 0, 100, 1, 0))), depth(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEPTH"), 0, 100, 1, 25))), sensih(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIH"), 0, 100, 1, 30))), @@ -283,7 +283,8 @@ Locallab::Locallab(): scalereti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALERETI"), 1.0, 10.0, 1., 2.))), darkness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DARKRETI"), 0.01, 6.0, 0.01, 2.0))), lightnessreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTRETI"), 0.01, 4.0, 0.01, 1.))), - limd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESRETI"), 1.2, 100.0, 0.1, 8.))), + limd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESRETI"), 2., 100.0, 0.1, 8.))), + cliptm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLIPTM"), 0., 100.0, 0.1, 0.))), // Sharpening sharcontrast(Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 20))), sharradius(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARRADIUS"), 0.4, 2.5, 0.01, 0.75))), @@ -1480,6 +1481,7 @@ Locallab::Locallab(): darkness->setAdjusterListener(this); lightnessreti->setAdjusterListener(this); limd->setAdjusterListener(this); + cliptm->setAdjusterListener(this); maskretiBox->pack_start(*showmaskretiMethod, Gtk::PACK_SHRINK, 4); maskretiBox->pack_start(*enaretiMask, Gtk::PACK_SHRINK, 0); @@ -1523,10 +1525,11 @@ Locallab::Locallab(): retiBox->pack_start(*vart); retiBox->pack_start(*scalereti); retiBox->pack_start(*limd); +// retiBox->pack_start(*cliptm); retiBox->pack_start(*offs); retiBox->pack_start(*darkness); retiBox->pack_start(*lightnessreti); - retiBox->pack_start(*softradiusret); +// retiBox->pack_start(*softradiusret); retiBox->pack_start(*mMLabels); retiBox->pack_start(*transLabels); retiBox->pack_start(*transLabels2); @@ -3201,6 +3204,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).darkness = darkness->getValue(); pp->locallab.spots.at(pp->locallab.selspot).lightnessreti = lightnessreti->getValue(); pp->locallab.spots.at(pp->locallab.selspot).limd = limd->getValue(); + pp->locallab.spots.at(pp->locallab.selspot).cliptm = cliptm->getValue(); pp->locallab.spots.at(pp->locallab.selspot).fftwreti = fftwreti->get_active(); // Sharpening pp->locallab.spots.at(pp->locallab.selspot).expsharp = expsharp->getEnabled(); @@ -3475,6 +3479,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).darkness = pe->locallab.spots.at(pp->locallab.selspot).darkness || darkness->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).lightnessreti = pe->locallab.spots.at(pp->locallab.selspot).lightnessreti || lightnessreti->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).limd = pe->locallab.spots.at(pp->locallab.selspot).limd || limd->getEditedState(); + pe->locallab.spots.at(pp->locallab.selspot).cliptm = pe->locallab.spots.at(pp->locallab.selspot).cliptm || cliptm->getEditedState(); pe->locallab.spots.at(pp->locallab.selspot).fftwreti = pe->locallab.spots.at(pp->locallab.selspot).fftwreti || !fftwreti->get_inconsistent(); // Sharpening pe->locallab.spots.at(pp->locallab.selspot).expsharp = pe->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); @@ -3747,6 +3752,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).darkness = pedited->locallab.spots.at(pp->locallab.selspot).darkness || darkness->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).lightnessreti = pedited->locallab.spots.at(pp->locallab.selspot).lightnessreti || lightnessreti->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).limd = pedited->locallab.spots.at(pp->locallab.selspot).limd || limd->getEditedState(); + pedited->locallab.spots.at(pp->locallab.selspot).cliptm = pedited->locallab.spots.at(pp->locallab.selspot).cliptm || cliptm->getEditedState(); pedited->locallab.spots.at(pp->locallab.selspot).fftwreti = pedited->locallab.spots.at(pp->locallab.selspot).fftwreti || !fftwreti->get_inconsistent(); // Sharpening pedited->locallab.spots.at(pp->locallab.selspot).expsharp = pedited->locallab.spots.at(pp->locallab.selspot).expsharp || !expsharp->get_inconsistent(); @@ -5498,6 +5504,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe darkness->setDefault(defSpot->darkness); lightnessreti->setDefault(defSpot->lightnessreti); limd->setDefault(defSpot->limd); + cliptm->setDefault(defSpot->cliptm); // Sharpening sharcontrast->setDefault((double)defSpot->sharcontrast); sharradius->setDefault(defSpot->sharradius); @@ -5662,6 +5669,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe darkness->setDefaultEditedState(Irrelevant); lightnessreti->setDefaultEditedState(Irrelevant); limd->setDefaultEditedState(Irrelevant); + cliptm->setDefaultEditedState(Irrelevant); // Sharpening sharcontrast->setDefaultEditedState(Irrelevant); sharradius->setDefaultEditedState(Irrelevant); @@ -5830,6 +5838,7 @@ void Locallab::setDefaults(const ProcParams * defParams, const ParamsEdited * pe darkness->setDefaultEditedState(defSpotState->darkness ? Edited : UnEdited); lightnessreti->setDefaultEditedState(defSpotState->lightnessreti ? Edited : UnEdited); limd->setDefaultEditedState(defSpotState->limd ? Edited : UnEdited); + cliptm->setDefaultEditedState(defSpotState->cliptm ? Edited : UnEdited); // Sharpening sharcontrast->setDefaultEditedState(defSpotState->sharcontrast ? Edited : UnEdited); sharradius->setDefaultEditedState(defSpotState->sharradius ? Edited : UnEdited); @@ -6592,6 +6601,12 @@ void Locallab::adjusterChanged(Adjuster * a, double newval) } } + if (a == cliptm) { + if (listener) { + listener->panelChanged(Evlocallabcliptm, cliptm->getTextValue()); + } + } + } // Sharpening @@ -7014,6 +7029,7 @@ void Locallab::setBatchMode(bool batchMode) darkness->showEditedCB(); lightnessreti->showEditedCB(); limd->showEditedCB(); + cliptm->showEditedCB(); // Sharpening sharradius->showEditedCB(); sharamount->showEditedCB(); @@ -7645,6 +7661,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con darkness->setValue(pp->locallab.spots.at(index).darkness); lightnessreti->setValue(pp->locallab.spots.at(index).lightnessreti); limd->setValue(pp->locallab.spots.at(index).limd); + cliptm->setValue(pp->locallab.spots.at(index).cliptm); fftwreti->set_active(pp->locallab.spots.at(index).fftwreti); // Sharpening @@ -7969,6 +7986,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con darkness->setEditedState(spotState->darkness ? Edited : UnEdited); lightnessreti->setEditedState(spotState->lightnessreti ? Edited : UnEdited); limd->setEditedState(spotState->limd ? Edited : UnEdited); + cliptm->setEditedState(spotState->cliptm ? Edited : UnEdited); fftwreti->set_inconsistent(multiImage && !spotState->fftwreti); // Sharpening diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 1d0a1b33e..7987311f1 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -234,6 +234,7 @@ private: Adjuster* const darkness; Adjuster* const lightnessreti; Adjuster* const limd; + Adjuster* const cliptm; // Sharpening Adjuster* const sharcontrast; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index fa9104569..1e3a79d03 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1148,6 +1148,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).darkness = locallab.spots.at(j).darkness && pSpot.darkness == otherSpot.darkness; locallab.spots.at(j).lightnessreti = locallab.spots.at(j).lightnessreti && pSpot.lightnessreti == otherSpot.lightnessreti; locallab.spots.at(j).limd = locallab.spots.at(j).limd && pSpot.limd == otherSpot.limd; + locallab.spots.at(j).cliptm = locallab.spots.at(j).cliptm && pSpot.cliptm == otherSpot.cliptm; locallab.spots.at(j).fftwreti = locallab.spots.at(j).fftwreti && pSpot.fftwreti == otherSpot.fftwreti; // Sharpening locallab.spots.at(j).expsharp = locallab.spots.at(j).expsharp && pSpot.expsharp == otherSpot.expsharp; @@ -3440,6 +3441,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).limd = mods.locallab.spots.at(i).limd; } + if (locallab.spots.at(i).cliptm) { + toEdit.locallab.spots.at(i).cliptm = mods.locallab.spots.at(i).cliptm; + } + if (locallab.spots.at(i).fftwreti) { toEdit.locallab.spots.at(i).fftwreti = mods.locallab.spots.at(i).fftwreti; } @@ -4836,6 +4841,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : darkness(v), lightnessreti(v), limd(v), + cliptm(v), fftwreti(v), // Sharpening expsharp(v), @@ -5099,6 +5105,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) darkness = v; lightnessreti = v; limd = v; + cliptm = v; fftwreti = v; // Sharpening expsharp = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index db47226ca..58c1bddd6 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -566,6 +566,7 @@ public: bool darkness; bool lightnessreti; bool limd; + bool cliptm; bool fftwreti; // Sharpening bool expsharp;