diff --git a/rtdata/languages/default b/rtdata/languages/default index e263e94f1..fff7c3b34 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -731,6 +731,7 @@ HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_METADATA_MODE;Metadata copy mode +HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1957,6 +1958,7 @@ TP_SHARPENMICRO_LABEL;Microcontrast TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformity TP_TM_FATTAL_AMOUNT;Amount +TP_TM_FATTAL_ANCHOR;Anchor TP_TM_FATTAL_LABEL;HDR Tone Mapping TP_TM_FATTAL_THRESHOLD;Threshold TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 61cfe59d3..64b7fea15 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1464,7 +1464,8 @@ bool EPDParams::operator !=(const EPDParams& other) const FattalToneMappingParams::FattalToneMappingParams() : enabled(false), threshold(0), - amount(30) + amount(30), + anchor(50) { } @@ -1473,7 +1474,8 @@ bool FattalToneMappingParams::operator ==(const FattalToneMappingParams& other) return enabled == other.enabled && threshold == other.threshold - && amount == other.amount; + && amount == other.amount + && anchor == other.anchor; } bool FattalToneMappingParams::operator !=(const FattalToneMappingParams& other) const @@ -3048,6 +3050,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->fattal.enabled, "FattalToneMapping", "Enabled", fattal.enabled, keyFile); saveToKeyfile(!pedited || pedited->fattal.threshold, "FattalToneMapping", "Threshold", fattal.threshold, keyFile); saveToKeyfile(!pedited || pedited->fattal.amount, "FattalToneMapping", "Amount", fattal.amount, keyFile); + saveToKeyfile(!pedited || pedited->fattal.anchor, "FattalToneMapping", "Anchor", fattal.anchor, keyFile); // Shadows & highlights saveToKeyfile(!pedited || pedited->sh.enabled, "Shadows & Highlights", "Enabled", sh.enabled, keyFile); @@ -3945,6 +3948,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "FattalToneMapping", "Enabled", pedited, fattal.enabled, pedited->fattal.enabled); assignFromKeyfile(keyFile, "FattalToneMapping", "Threshold", pedited, fattal.threshold, pedited->fattal.threshold); assignFromKeyfile(keyFile, "FattalToneMapping", "Amount", pedited, fattal.amount, pedited->fattal.amount); + assignFromKeyfile(keyFile, "FattalToneMapping", "Anchor", pedited, fattal.anchor, pedited->fattal.anchor); } if (keyFile.has_group ("Shadows & Highlights")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 46c29774c..14cf00581 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -728,6 +728,7 @@ struct FattalToneMappingParams { bool enabled; int threshold; int amount; + int anchor; FattalToneMappingParams(); diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 4fb11ff19..b2721b2b7 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1104,7 +1104,8 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) } float oldMedian; - findMinMaxPercentile (Yr.data(), Yr.getRows() * Yr.getCols(), 0.5f, oldMedian, 0.5f, oldMedian, multiThread); + const float percentile = float(LIM(1, params->fattal.anchor, 100)) / 100.f; + findMinMaxPercentile (Yr.data(), Yr.getRows() * Yr.getCols(), percentile, oldMedian, percentile, oldMedian, multiThread); // median filter on the deep shadows, to avoid boosting noise // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() int w2 = find_fast_dim (w) + 1; @@ -1146,7 +1147,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float wr = float(w2) / float(w); float newMedian; - findMinMaxPercentile (L.data(), L.getRows() * L.getCols(), 0.5f, newMedian, 0.5f, newMedian, multiThread); + findMinMaxPercentile (L.data(), L.getRows() * L.getCols(), percentile, newMedian, percentile, newMedian, multiThread); const float scale = (oldMedian == 0.f || newMedian == 0.f) ? 65535.f : (oldMedian / newMedian); // avoid Nan #ifdef _OPENMP diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index f94075ce4..49eefc794 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -127,12 +127,13 @@ enum { ADDSET_EPD_EDGESTOPPING, ADDSET_EPD_SCALE, ADDSET_EPD_REWEIGHTINGITERATES, - ADDSET_FATTAL_ALPHA, - ADDSET_FATTAL_BETA, + ADDSET_FATTAL_THRESHOLD, + ADDSET_FATTAL_AMOUNT, ADDSET_LOCALCONTRAST_RADIUS, ADDSET_LOCALCONTRAST_AMOUNT, ADDSET_LOCALCONTRAST_DARKNESS, ADDSET_LOCALCONTRAST_LIGHTNESS, + ADDSET_FATTAL_ANCHOR, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 413a9ce86..8f2663b0b 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -152,7 +152,7 @@ void BatchToolPanelCoordinator::initSession () sharpenMicro->setAdjusterBehavior (false, false); icm->setAdjusterBehavior (false, false); epd->setAdjusterBehavior (false, false, false, false, false); - fattal->setAdjusterBehavior (false, false); + fattal->setAdjusterBehavior (false, false, false); chmixer->setAdjusterBehavior (false); blackwhite->setAdjusterBehavior (false, false); @@ -192,7 +192,7 @@ void BatchToolPanelCoordinator::initSession () sharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); prsharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); epd->setAdjusterBehavior (options.baBehav[ADDSET_EPD_STRENGTH], options.baBehav[ADDSET_EPD_GAMMA], options.baBehav[ADDSET_EPD_EDGESTOPPING], options.baBehav[ADDSET_EPD_SCALE], options.baBehav[ADDSET_EPD_REWEIGHTINGITERATES]); - fattal->setAdjusterBehavior (options.baBehav[ADDSET_FATTAL_ALPHA], options.baBehav[ADDSET_FATTAL_BETA]); + fattal->setAdjusterBehavior (options.baBehav[ADDSET_FATTAL_AMOUNT], options.baBehav[ADDSET_FATTAL_THRESHOLD], options.baBehav[ADDSET_FATTAL_ANCHOR]); localContrast->setAdjusterBehavior(options.baBehav[ADDSET_LOCALCONTRAST_RADIUS], options.baBehav[ADDSET_LOCALCONTRAST_AMOUNT], options.baBehav[ADDSET_LOCALCONTRAST_DARKNESS], options.baBehav[ADDSET_LOCALCONTRAST_LIGHTNESS]); sharpenEdge->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT], options.baBehav[ADDSET_SHARPENEDGE_PASS]); diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 6e13cd2a5..9c23053aa 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1074,7 +1074,7 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) // normal redraw don't work, so this is the hard way // Disabled this with Issue 2435 because it seems to work fine now // if (!options.tabbedUI && iareapanel->imageArea->mainCropWindow->getZoomFitVal() == 1.0) { -// iareapanel->imageArea->mainCropWindow->cropHandler.update(); + iareapanel->imageArea->mainCropWindow->cropHandler.update(); // } } else { Gtk::Allocation alloc; diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index 5e4aa20d9..30b717db8 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -18,6 +18,7 @@ * along with RawTherapee. If not, see . */ #include "fattaltonemap.h" +#include "eventmapper.h" #include #include @@ -26,32 +27,41 @@ using namespace rtengine::procparams; FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, "fattal", M("TP_TM_FATTAL_LABEL"), true, true) { + auto m = ProcEventMapper::getInstance(); + EvTMFattalAnchor = m->newEvent(HDR, "HISTORY_MSG_TM_FATTAL_ANCHOR"); + amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 1., 30.)); threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 100., 1., 0.0)); + anchor = Gtk::manage(new Adjuster(M("TP_TM_FATTAL_ANCHOR"), 1, 100, 1, 50)); amount->setAdjusterListener(this); threshold->setAdjusterListener(this); + anchor->setAdjusterListener(this); amount->show(); threshold->show(); + anchor->show(); pack_start(*amount); pack_start(*threshold); + pack_start(*anchor); } void FattalToneMapping::read(const ProcParams *pp, const ParamsEdited *pedited) { disableListener(); - if(pedited) { + if (pedited) { threshold->setEditedState(pedited->fattal.threshold ? Edited : UnEdited); amount->setEditedState(pedited->fattal.amount ? Edited : UnEdited); + anchor->setEditedState(pedited->fattal.anchor ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->fattal.enabled); } setEnabled(pp->fattal.enabled); threshold->setValue(pp->fattal.threshold); amount->setValue(pp->fattal.amount); + anchor->setValue(pp->fattal.anchor); enableListener(); } @@ -60,11 +70,13 @@ void FattalToneMapping::write(ProcParams *pp, ParamsEdited *pedited) { pp->fattal.threshold = threshold->getValue(); pp->fattal.amount = amount->getValue(); + pp->fattal.anchor = anchor->getValue(); pp->fattal.enabled = getEnabled(); if(pedited) { pedited->fattal.threshold = threshold->getEditedState(); pedited->fattal.amount = amount->getEditedState(); + pedited->fattal.anchor = anchor->getEditedState(); pedited->fattal.enabled = !get_inconsistent(); } } @@ -73,13 +85,16 @@ void FattalToneMapping::setDefaults(const ProcParams *defParams, const ParamsEdi { threshold->setDefault(defParams->fattal.threshold); amount->setDefault(defParams->fattal.amount); + anchor->setDefault(defParams->fattal.anchor); if(pedited) { threshold->setDefaultEditedState(pedited->fattal.threshold ? Edited : UnEdited); amount->setDefaultEditedState(pedited->fattal.amount ? Edited : UnEdited); + anchor->setDefaultEditedState(pedited->fattal.anchor ? Edited : UnEdited); } else { threshold->setDefaultEditedState(Irrelevant); amount->setDefaultEditedState(Irrelevant); + anchor->setDefaultEditedState(Irrelevant); } } @@ -90,6 +105,8 @@ void FattalToneMapping::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvTMFattalThreshold, a->getTextValue()); } else if(a == amount) { listener->panelChanged(EvTMFattalAmount, a->getTextValue()); + } else if(a == anchor) { + listener->panelChanged(EvTMFattalAnchor, a->getTextValue()); } } } @@ -113,11 +130,13 @@ void FattalToneMapping::setBatchMode(bool batchMode) threshold->showEditedCB(); amount->showEditedCB(); + anchor->showEditedCB(); } -void FattalToneMapping::setAdjusterBehavior (bool alphaAdd, bool betaAdd) +void FattalToneMapping::setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd) { - threshold->setAddMode(alphaAdd); - amount->setAddMode(betaAdd); + amount->setAddMode(amountAdd); + threshold->setAddMode(thresholdAdd); + anchor->setAddMode(anchorAdd); } diff --git a/rtgui/fattaltonemap.h b/rtgui/fattaltonemap.h index 2398970ce..90f92a965 100644 --- a/rtgui/fattaltonemap.h +++ b/rtgui/fattaltonemap.h @@ -28,7 +28,10 @@ class FattalToneMapping: public ToolParamBlock, public AdjusterListener, public protected: Adjuster *threshold; Adjuster *amount; + Adjuster *anchor; + rtengine::ProcEvent EvTMFattalAnchor; + public: FattalToneMapping(); @@ -40,7 +43,6 @@ public: void adjusterChanged (Adjuster* a, double newval); void enabledChanged (); - void setAdjusterBehavior (bool alphaAdd, bool betaAdd); - + void setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd); }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 13afc6faa..a13274d67 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -280,6 +280,7 @@ void ParamsEdited::set (bool v) fattal.enabled = v; fattal.threshold = v; fattal.amount = v; + fattal.anchor = v; sh.enabled = v; sh.hq = v; sh.highlights = v; @@ -841,6 +842,7 @@ void ParamsEdited::initFrom (const std::vector fattal.enabled = fattal.enabled && p.fattal.enabled == other.fattal.enabled; fattal.threshold = fattal.threshold && p.fattal.threshold == other.fattal.threshold; fattal.amount = fattal.amount && p.fattal.amount == other.fattal.amount; + fattal.anchor = fattal.anchor && p.fattal.anchor == other.fattal.anchor; sh.enabled = sh.enabled && p.sh.enabled == other.sh.enabled; sh.hq = sh.hq && p.sh.hq == other.sh.hq; @@ -2067,6 +2069,9 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (fattal.amount) { toEdit.fattal.amount = mods.fattal.amount; } + if (fattal.anchor) { + toEdit.fattal.anchor = mods.fattal.anchor; + } if (sh.enabled) { toEdit.sh.enabled = mods.sh.enabled; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index dfb85d54b..ad0b15e8c 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -387,6 +387,7 @@ public: bool enabled; bool threshold; bool amount; + bool anchor; }; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index bb60aba90..5171984ed 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -205,8 +205,9 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_TM_FATTAL_LABEL")); - appendBehavList (mi, M ("TP_TM_FATTAL_THRESHOLD"), ADDSET_FATTAL_ALPHA, false); - appendBehavList (mi, M ("TP_TM_FATTAL_AMOUNT"), ADDSET_FATTAL_BETA, false); + appendBehavList (mi, M ("TP_TM_FATTAL_AMOUNT"), ADDSET_FATTAL_AMOUNT, false); + appendBehavList (mi, M ("TP_TM_FATTAL_THRESHOLD"), ADDSET_FATTAL_THRESHOLD, false); + appendBehavList (mi, M ("TP_TM_FATTAL_ANCHOR"), ADDSET_FATTAL_ANCHOR, false); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_RETINEX_LABEL"));