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"));