diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais
index d472a2249..07eeb0fff 100644
--- a/rtdata/languages/Francais
+++ b/rtdata/languages/Francais
@@ -328,7 +328,7 @@ HISTORY_MSG_89;Réd. du bruit
HISTORY_MSG_90;Réd. de bruit Luminance
HISTORY_MSG_91;Réd. de bruit Chrominance
HISTORY_MSG_92;Réd. de bruit Gamma
-HISTORY_MSG_93;Param. de contraste
+HISTORY_MSG_93;Param. de contraste par niv. de détail
HISTORY_MSG_94;Contraste par niveau de détail
HISTORY_MSG_95;Chromaticité
HISTORY_MSG_96;Courbe 'a'
@@ -480,6 +480,7 @@ HISTORY_MSG_242;Effet Vignettage - Circularité
HISTORY_MSG_243;Vignettage - Rayon
HISTORY_MSG_244;Vignettage - Force
HISTORY_MSG_245;Vignettage - Centre
+HISTORY_MSG_249;Seuil du contraste par niv. de détail
HISTORY_NEWSNAPSHOTAS;Sous...
HISTORY_NEWSNAPSHOT;Ajouter
HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s
diff --git a/rtdata/languages/default b/rtdata/languages/default
index 84416cb17..080af5c38 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -482,6 +482,7 @@ HISTORY_MSG_245;Vignetting - Center
HISTORY_MSG_246;"CL" curve
HISTORY_MSG_247;"LH" curve
HISTORY_MSG_248;"HH" curve
+HISTORY_MSG_249;Contrast by Detail Levels Threshold
HISTORY_NEWSNAPSHOTAS;As...
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc
index e33ce87a1..b86807b1b 100644
--- a/rtengine/dirpyr_equalizer.cc
+++ b/rtengine/dirpyr_equalizer.cc
@@ -40,7 +40,7 @@
namespace rtengine {
- static const int maxlevel = 4;
+ static const int maxlevel = 5;
static const float noise = 2000;
static const float thresh = 1000;
@@ -52,7 +52,7 @@ namespace rtengine {
//scale is spacing of directional averaging weights
- void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidth, int srcheight, const double * mult)
+ void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidth, int srcheight, const double * mult, const double dirpyrThreshold )
{
int lastlevel=maxlevel;
@@ -72,7 +72,7 @@ namespace rtengine {
int scale = scales[level];
//int thresh = 100 * mult[5];
- dirpyr_channel(src, dirpyrlo[0], srcwidth, srcheight, 0, scale, mult );
+ dirpyr_channel(src, dirpyrlo[0], srcwidth, srcheight, 0, scale );
level = 1;
@@ -80,7 +80,7 @@ namespace rtengine {
{
scale = scales[level];
- dirpyr_channel(dirpyrlo[level-1], dirpyrlo[level], srcwidth, srcheight, level, scale, mult );
+ dirpyr_channel(dirpyrlo[level-1], dirpyrlo[level], srcwidth, srcheight, level, scale );
level ++;
}
@@ -99,13 +99,13 @@ namespace rtengine {
for(int level = lastlevel - 1; level > 0; level--)
{
- idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level-1], buffer, srcwidth, srcheight, level, mult );
+ idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level-1], buffer, srcwidth, srcheight, level, mult, dirpyrThreshold );
}
scale = scales[0];
- idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, mult );
+ idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, mult, dirpyrThreshold );
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -125,7 +125,7 @@ namespace rtengine {
- void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float ** dst, int srcwidth, int srcheight, const double * mult, bool execdir )
+ void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float ** dst, int srcwidth, int srcheight, const double * mult, const double dirpyrThreshold, bool execdir )
{
int lastlevel=maxlevel;
@@ -145,7 +145,7 @@ namespace rtengine {
int scale = scales[level];
//int thresh = 100 * mult[5];
- dirpyr_channel(src, dirpyrlo[0], srcwidth, srcheight, 0, scale, mult );
+ dirpyr_channel(src, dirpyrlo[0], srcwidth, srcheight, 0, scale );
level = 1;
@@ -153,7 +153,7 @@ namespace rtengine {
{
scale = scales[level];
- dirpyr_channel(dirpyrlo[level-1], dirpyrlo[level], srcwidth, srcheight, level, scale, mult );
+ dirpyr_channel(dirpyrlo[level-1], dirpyrlo[level], srcwidth, srcheight, level, scale );
level ++;
}
@@ -172,13 +172,13 @@ namespace rtengine {
for(int level = lastlevel - 1; level > 0; level--)
{
- idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level-1], buffer, srcwidth, srcheight, level, mult );
+ idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level-1], buffer, srcwidth, srcheight, level, mult, dirpyrThreshold );
}
scale = scales[0];
- idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, mult );
+ idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, mult, dirpyrThreshold );
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -188,8 +188,10 @@ namespace rtengine {
#endif
for (int i=0; iJ_p[i][j] > 8.f && ncie->J_p[i][j] < 92.f) dst[i][j] = CLIP((int)( buffer[i][j] )); // TODO: Really a clip necessary?
- else dst[i][j]=src[i][j];
+ if(ncie->J_p[i][j] > 8.f && ncie->J_p[i][j] < 92.f)
+ dst[i][j] = CLIP((int)( buffer[i][j] )); // TODO: Really a clip necessary?
+ else
+ dst[i][j]=src[i][j];
}
else
for (int i=0; isharpenMicro.enabled)if(execsharp) ImProcFunctions::MLmicrocontrastc
if(params->sharpening.enabled) if(execsharp) {ImProcFunctions::sharpeningcam (ncie, (float**)buffer);} //sharpening adapted to CIECAM
-if(params->dirpyrequalizer.enabled) if(execsharp) dirpyr_equalizercam(ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, params->dirpyrequalizer.mult, true);//contrast by detail adapted to CIECAM
+if(params->dirpyrequalizer.enabled) if(execsharp) dirpyr_equalizercam(ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, true);//contrast by detail adapted to CIECAM
float Qredi= ( 4.0 / c_) * ( a_w + 4.0 );
float co_e=(pow(f_l,0.25f));
@@ -1734,7 +1734,7 @@ if (params->sharpenMicro.enabled)if(execsharp) ImProcFunctions::MLmicrocontrastc
if(params->sharpening.enabled) if(execsharp) {ImProcFunctions::sharpeningcam (ncie, (float**)buffer);} //sharpening adapted to CIECAM
-if(params->dirpyrequalizer.enabled) if(execsharp) dirpyr_equalizercam(ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, params->dirpyrequalizer.mult, true);//contrast by detail adapted to CIECAM
+if(params->dirpyrequalizer.enabled) if(execsharp) dirpyr_equalizercam(ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, true);//contrast by detail adapted to CIECAM
float Qredi= ( 4.0f / c_) * ( a_w + 4.0f );
float co_e=(pow_F(f_l,0.25f));
@@ -3513,7 +3513,7 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) {
if (params->dirpyrequalizer.enabled && lab->W>=8 && lab->H>=8) {
//dirpyrLab_equalizer(lab, lab, params->dirpyrequalizer.mult);
- dirpyr_equalizer(lab->L, lab->L, lab->W, lab->H, params->dirpyrequalizer.mult);
+ dirpyr_equalizer(lab->L, lab->L, lab->W, lab->H, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold);
}
}
void ImProcFunctions::EPDToneMapCIE(CieImage *ncie, float a_w, float c_, float w_h, int Wid, int Hei, int begh, int endh, float minQ, float maxQ, unsigned int Iterates, int skip){
diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h
index 43ec1531b..f900df52a 100644
--- a/rtengine/improcfun.h
+++ b/rtengine/improcfun.h
@@ -271,10 +271,10 @@ class ImProcFunctions {
float MadMax(float * HH_Coeffs, int &max, int datalen);
// pyramid equalizer
- void dirpyr_equalizer (float ** src, float ** dst, int srcwidth, int srcheight, const double * mult);//Emil's directional pyramid equalizer
- void dirpyr_equalizercam (CieImage* ncie, float ** src, float ** dst, int srcwidth, int srcheight, const double * mult, bool execdir );//Emil's directional pyramid equalizer
- void dirpyr_channel (float ** data_fine, float ** data_coarse, int width, int height, int level, int scale, const double * mult );
- void idirpyr_eq_channel (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, const double * mult );
+ void dirpyr_equalizer (float ** src, float ** dst, int srcwidth, int srcheight, const double * mult, const double dirpyrThreshold);//Emil's directional pyramid equalizer
+ void dirpyr_equalizercam (CieImage* ncie, float ** src, float ** dst, int srcwidth, int srcheight, const double * mult, const double dirpyrThreshold, bool execdir );//Emil's directional pyramid equalizer
+ void dirpyr_channel (float ** data_fine, float ** data_coarse, int width, int height, int level, int scale );
+ void idirpyr_eq_channel (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, const double * mult, const double dirpyrThreshold );
void defringe (LabImage* lab);
void defringecam (CieImage* ncie);
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 05ca9c958..3e991cde9 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -271,8 +271,9 @@ enum ProcEvent {
EvLCLCurve=245,
EvLLHCurve=246,
EvLHHCurve=247,
+ EvDirPyrEqualizerThreshold=248,
- NUMOFEVENTS=248
+ NUMOFEVENTS=249
};
}
#endif
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 6ea9ceb1a..1ea58f41c 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -420,11 +420,11 @@ void ProcParams::setDefaults () {
icm.freegamma = false;
dirpyrequalizer.enabled = false;
- for(int i = 0; i < 4; i ++)
+ for(int i = 0; i < 5; i ++)
{
dirpyrequalizer.mult[i] = 1.0;
}
- dirpyrequalizer.mult[4] = 0.2;
+ dirpyrequalizer.threshold = 0.2;
hsvequalizer.hcurve.clear ();
hsvequalizer.hcurve.push_back (FCT_Linear);
hsvequalizer.scurve.clear ();
@@ -953,10 +953,10 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
if (!pedited || pedited->gradient.centerY) keyFile.set_integer ("Gradient", "CenterY", gradient.centerY);
// save post-crop vignette
- if (!pedited || pedited->pcvignette.enabled) keyFile.set_boolean ("PCVignette", "Enabled", pcvignette.enabled);
- if (!pedited || pedited->pcvignette.strength) keyFile.set_double ("PCVignette", "Strength", pcvignette.strength);
- if (!pedited || pedited->pcvignette.feather) keyFile.set_integer ("PCVignette", "Feather", pcvignette.feather);
- if (!pedited || pedited->pcvignette.roundness) keyFile.set_integer ("PCVignette", "Roundness", pcvignette.roundness);
+ if (!pedited || pedited->pcvignette.enabled) keyFile.set_boolean ("PCVignette", "Enabled", pcvignette.enabled);
+ if (!pedited || pedited->pcvignette.strength) keyFile.set_double ("PCVignette", "Strength", pcvignette.strength);
+ if (!pedited || pedited->pcvignette.feather) keyFile.set_integer ("PCVignette", "Feather", pcvignette.feather);
+ if (!pedited || pedited->pcvignette.roundness) keyFile.set_integer ("PCVignette", "Roundness", pcvignette.roundness);
// save C/A correction
if (!pedited || pedited->cacorrection.red) keyFile.set_double ("CACorrection", "Red", cacorrection.red);
@@ -982,11 +982,11 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
if (!pedited || pedited->icm.input) keyFile.set_string ("Color Management", "InputProfile", relativePathIfInside(fname, fnameAbsolute, icm.input));
if (!pedited || pedited->icm.toneCurve) keyFile.set_boolean ("Color Management", "ToneCurve", icm.toneCurve);
if (!pedited || pedited->icm.blendCMSMatrix) keyFile.set_boolean ("Color Management", "BlendCMSMatrix", icm.blendCMSMatrix);
- if (!pedited || pedited->icm.dcpIlluminant) keyFile.set_integer ("Color Management", "DCPIlluminant", icm.dcpIlluminant);
+ if (!pedited || pedited->icm.dcpIlluminant) keyFile.set_integer ("Color Management", "DCPIlluminant", icm.dcpIlluminant);
if (!pedited || pedited->icm.working) keyFile.set_string ("Color Management", "WorkingProfile", icm.working);
if (!pedited || pedited->icm.output) keyFile.set_string ("Color Management", "OutputProfile", icm.output);
if (!pedited || pedited->icm.gamma) keyFile.set_string ("Color Management", "Gammafree", icm.gamma);
- if (!pedited || pedited->icm.freegamma) keyFile.set_boolean ("Color Management", "Freegamma", icm.freegamma);
+ if (!pedited || pedited->icm.freegamma) keyFile.set_boolean ("Color Management", "Freegamma", icm.freegamma);
if (!pedited || pedited->icm.gampos) keyFile.set_double ("Color Management", "GammaValue", icm.gampos);
if (!pedited || pedited->icm.slpos) keyFile.set_double ("Color Management", "GammaSlope", icm.slpos);
@@ -998,6 +998,7 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
ss << "Mult" << i;
if (!pedited || pedited->dirpyrequalizer.mult[i]) keyFile.set_double("Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i]);
}
+ if (!pedited || pedited->dirpyrequalizer.threshold) keyFile.set_double ("Directional Pyramid Equalizer", "Threshold", dirpyrequalizer.threshold);
// save hsv equalizer parameters
if (!pedited || pedited->hsvequalizer.hcurve) {
@@ -1617,10 +1618,25 @@ if (keyFile.has_group ("Color Management")) {
// load directional pyramid equalizer parameters
if (keyFile.has_group ("Directional Pyramid Equalizer")) {
if (keyFile.has_key ("Directional Pyramid Equalizer", "Enabled")) { dirpyrequalizer.enabled = keyFile.get_boolean ("Directional Pyramid Equalizer", "Enabled"); if (pedited) pedited->dirpyrequalizer.enabled = true; }
- for(int i = 0; i < 5; i ++) {
- std::stringstream ss;
- ss << "Mult" << i;
- if(keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); if (pedited) pedited->dirpyrequalizer.mult[i] = true; }
+ if (ppVersion < 316) {
+ for(int i = 0; i < 5; i ++) {
+ std::stringstream ss;
+ ss << "Mult" << i;
+ if(keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) {
+ if(i==4) { dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); if (pedited) pedited->dirpyrequalizer.threshold = true; }
+ else { dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); if (pedited) pedited->dirpyrequalizer.mult[i] = true; }
+ }
+ }
+ dirpyrequalizer.mult[4] = 1.0;
+ }
+ else {
+ // 5 level equalizer + dedicated threshold parameter
+ for(int i = 0; i < 5; i ++) {
+ std::stringstream ss;
+ ss << "Mult" << i;
+ if(keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); if (pedited) pedited->dirpyrequalizer.mult[i] = true; }
+ }
+ if(keyFile.has_key ("Directional Pyramid Equalizer", "Threshold")) { dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", "Threshold"); if (pedited) pedited->dirpyrequalizer.threshold = true; }
}
}
@@ -1743,6 +1759,9 @@ bool operator==(const DirPyrEqualizerParams & a, const DirPyrEqualizerParams & b
if(a.mult[i] != b.mult[i])
return false;
}
+ if (a.threshold != b.threshold)
+ return false;
+
return true;
}
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index da4294e87..0d5ac7841 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -740,7 +740,8 @@ class DirPyrEqualizerParams {
public:
bool enabled;
- double mult[8];
+ double mult[5];
+ double threshold;
};
/**
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 5b3cebcf1..4d3390913 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -267,7 +267,8 @@ TRANSFORM, // EvVignettingStrength
TRANSFORM, // EvVignettingCenter
LUMINANCECURVE, // EvLCLCurve
LUMINANCECURVE, // EvLLHCurve
-LUMINANCECURVE // EvLHHCurve
+LUMINANCECURVE, // EvLHHCurve
+DIRPYREQUALIZER // EvDirPyrEqualizerThreshold
//LUMINANCECURVE // EvCATsharpcie
diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h
index b522374d1..7cb649bf9 100644
--- a/rtgui/addsetids.h
+++ b/rtgui/addsetids.h
@@ -75,8 +75,9 @@
#define ADDSET_PCVIGNETTE_ROUNDNESS 67
#define ADDSET_BLACKWHITE_HUES 68
#define ADDSET_BLACKWHITE_GAMMA 69
+#define ADDSET_DIRPYREQ_THRESHOLD 70
// When adding items, make sure to update ADDSET_PARAM_NUM
-#define ADDSET_PARAM_NUM 70 // THIS IS USED AS A DELIMITER!!
+#define ADDSET_PARAM_NUM 71 // THIS IS USED AS A DELIMITER!!
#endif
diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc
index 1fc9ec143..422b35ee7 100644
--- a/rtgui/batchtoolpanelcoord.cc
+++ b/rtgui/batchtoolpanelcoord.cc
@@ -145,7 +145,7 @@ void BatchToolPanelCoordinator::initSession () {
blackwhite->setAdjusterBehavior (false,false);
shadowshighlights->setAdjusterBehavior (false, false, false);
- dirpyrequalizer->setAdjusterBehavior (false);
+ dirpyrequalizer->setAdjusterBehavior (false, false);
dirpyrdenoise->setAdjusterBehavior (false, false,false,false,false,false);
preprocess->setAdjusterBehavior (false, false);
rawcacorrection->setAdjusterBehavior (false);
@@ -176,7 +176,7 @@ void BatchToolPanelCoordinator::initSession () {
chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] );
blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES],options.baBehav[ADDSET_BLACKWHITE_GAMMA]);
shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS], options.baBehav[ADDSET_SH_LOCALCONTRAST]);
- dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ]);
+ dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD]);
dirpyrdenoise->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYRDN_LUMA],options.baBehav[ADDSET_DIRPYRDN_LUMDET],options.baBehav[ADDSET_DIRPYRDN_CHROMA],options.baBehav[ADDSET_DIRPYRDN_CHROMARED],options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE], options.baBehav[ADDSET_DIRPYRDN_GAMMA]);
preprocess->setAdjusterBehavior (options.baBehav[ADDSET_PREPROCESS_LINEDENOISE], options.baBehav[ADDSET_PREPROCESS_GREENEQUIL]);
rawcacorrection->setAdjusterBehavior (options.baBehav[ADDSET_RAWCACORR]);
@@ -261,6 +261,8 @@ void BatchToolPanelCoordinator::initSession () {
if (options.baBehav[ADDSET_VIGN_CENTER]) pparams.vignetting.centerY = 0;
if (options.baBehav[ADDSET_DIRPYREQ]) for (int i=0; i<5; i++) pparams.dirpyrequalizer.mult[i] = 0;
+ if (options.baBehav[ADDSET_DIRPYREQ_THRESHOLD]) pparams.dirpyrequalizer.threshold = 0;
+
if (options.baBehav[ADDSET_DIRPYRDN_LUMA]) pparams.dirpyrDenoise.luma = 0;
if (options.baBehav[ADDSET_DIRPYRDN_CHROMA]) pparams.dirpyrDenoise.chroma = 0;
diff --git a/rtgui/dirpyrequalizer.cc b/rtgui/dirpyrequalizer.cc
index edfb1fcd7..36a7e18c9 100644
--- a/rtgui/dirpyrequalizer.cc
+++ b/rtgui/dirpyrequalizer.cc
@@ -30,7 +30,7 @@ DirPyrEqualizer::DirPyrEqualizer () : Gtk::VBox(), FoldableToolPanel(this) {
enabled->set_active (true);
pack_start(*enabled);
enaConn = enabled->signal_toggled().connect( sigc::mem_fun(*this, &DirPyrEqualizer::enabledToggled) );
- enabled->set_tooltip_markup (M("TP_SHARPENING_TOOLTIP"));
+ enabled->set_tooltip_markup (M("TP_SHARPENING_TOOLTIP"));
Gtk::HSeparator *separator1 = Gtk::manage (new Gtk::HSeparator());
pack_start(*separator1, Gtk::PACK_SHRINK, 2);
@@ -55,32 +55,27 @@ DirPyrEqualizer::DirPyrEqualizer () : Gtk::VBox(), FoldableToolPanel(this) {
Gtk::HSeparator *separator2 = Gtk::manage (new Gtk::HSeparator());
pack_start(*separator2, Gtk::PACK_SHRINK, 2);
- for(int i = 0; i < 4; i++)
+ for(int i = 0; i < 5; i++)
{
Glib::ustring ss;
ss = Glib::ustring::format(i);
- if(i == 0) {
- ss += Glib::ustring::compose(" (%1)", M("TP_DIRPYREQUALIZER_LUMAFINEST"));
- multiplier[i] = Gtk::manage ( new Adjuster (ss, 0, 4, 0.01, 1.0) );
- } else {
- if(i == 3)
- ss += Glib::ustring::compose(" (%1)", M("TP_DIRPYREQUALIZER_LUMACOARSEST"));
- multiplier[i] = Gtk::manage ( new Adjuster (ss, 0, 4, 0.01, 1.0) );
- }
+ if (i == 0) ss += Glib::ustring::compose(" (%1)", M("TP_DIRPYREQUALIZER_LUMAFINEST"));
+ else if(i == 4) ss += Glib::ustring::compose(" (%1)", M("TP_DIRPYREQUALIZER_LUMACOARSEST"));
+ multiplier[i] = Gtk::manage ( new Adjuster (ss, 0, 4, 0.01, 1.0) );
multiplier[i]->setAdjusterListener(this);
pack_start(*multiplier[i]);
}
-
- Gtk::HSeparator *separator3 = Gtk::manage (new Gtk::HSeparator());
+
+ Gtk::HSeparator *separator3 = Gtk::manage (new Gtk::HSeparator());
pack_start(*separator3, Gtk::PACK_SHRINK, 2);
-
- multiplier[4] = Gtk::manage ( new Adjuster (M("TP_DIRPYREQUALIZER_THRESHOLD"), 0, 1, 0.01, 0.2) );
- multiplier[4]->setAdjusterListener(this);
- pack_start(*multiplier[4]);
+
+ threshold = Gtk::manage ( new Adjuster (M("TP_DIRPYREQUALIZER_THRESHOLD"), 0, 1, 0.01, 0.2) );
+ threshold->setAdjusterListener(this);
+ pack_start(*threshold);
show_all_children ();
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}
DirPyrEqualizer::~DirPyrEqualizer () {
@@ -98,6 +93,7 @@ void DirPyrEqualizer::read (const ProcParams* pp, const ParamsEdited* pedited) {
for(int i = 0; i < 5; i++) {
multiplier[i]->setEditedState (pedited->dirpyrequalizer.mult[i] ? Edited : UnEdited);
}
+ threshold->setEditedState (pedited->dirpyrequalizer.threshold ? Edited : UnEdited);
}
enaConn.block (true);
@@ -108,6 +104,7 @@ void DirPyrEqualizer::read (const ProcParams* pp, const ParamsEdited* pedited) {
for (int i = 0; i < 5; i++) {
multiplier[i]->setValue(pp->dirpyrequalizer.mult[i]);
}
+ threshold->setValue(pp->dirpyrequalizer.threshold);
enableListener ();
}
@@ -119,6 +116,7 @@ void DirPyrEqualizer::write (ProcParams* pp, ParamsEdited* pedited) {
for (int i = 0; i < 5; i++) {
pp->dirpyrequalizer.mult[i] = multiplier[i]->getValue();
}
+ pp->dirpyrequalizer.threshold = threshold->getValue();
if (pedited) {
@@ -127,6 +125,7 @@ void DirPyrEqualizer::write (ProcParams* pp, ParamsEdited* pedited) {
for(int i = 0; i < 5; i++) {
pedited->dirpyrequalizer.mult[i] = multiplier[i]->getEditedState();
}
+ pedited->dirpyrequalizer.threshold = threshold->getEditedState();
}
}
@@ -135,42 +134,51 @@ void DirPyrEqualizer::setDefaults (const ProcParams* defParams, const ParamsEdit
for (int i = 0; i < 5; i++) {
multiplier[i]->setDefault(defParams->dirpyrequalizer.mult[i]);
}
+ threshold->setDefault(defParams->dirpyrequalizer.threshold);
if (pedited) {
for (int i = 0; i < 5; i++) {
multiplier[i]->setDefaultEditedState(pedited->dirpyrequalizer.mult[i] ? Edited : UnEdited);
}
+ threshold->setDefaultEditedState(pedited->dirpyrequalizer.threshold ? Edited : UnEdited);
}
else {
for (int i = 0; i < 5; i++) {
multiplier[i]->setDefaultEditedState(Irrelevant);
}
+ threshold->setDefaultEditedState(Irrelevant);
}
}
void DirPyrEqualizer::setBatchMode (bool batchMode) {
ToolPanel::setBatchMode (batchMode);
-
+
for (int i = 0; i < 5; i++) {
multiplier[i]->showEditedCB();
}
+ threshold->showEditedCB();
}
void DirPyrEqualizer::adjusterChanged (Adjuster* a, double newval) {
-
+
if (listener && enabled->get_active()) {
- std::stringstream ss;
- ss << "(";
- int i;
- for (i = 0; i < 5; i++) {
- if (i > 0) {
- ss << ", ";
- }
- ss << static_cast(multiplier[i]->getValue());
+ if (a == threshold) {
+ listener->panelChanged (EvDirPyrEqualizerThreshold,
+ Glib::ustring::compose("%1",
+ Glib::ustring::format(std::fixed, std::setprecision(2), threshold->getValue()))
+ );
+ }
+ else {
+ listener->panelChanged (EvDirPyrEqualizer,
+ Glib::ustring::compose("%1, %2, %3, %4, %5",
+ Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[0]->getValue()),
+ Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[1]->getValue()),
+ Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[2]->getValue()),
+ Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[3]->getValue()),
+ Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[4]->getValue()))
+ );
}
- ss << ")";
- listener->panelChanged (EvDirPyrEqualizer, ss.str());
}
}
@@ -200,7 +208,7 @@ void DirPyrEqualizer::enabledToggled () {
void DirPyrEqualizer::lumaneutralPressed () {
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < 5; i++) {
multiplier[i]->setValue(1.0);
adjusterChanged(multiplier[i], 1.0);
}
@@ -209,7 +217,7 @@ void DirPyrEqualizer::lumaneutralPressed () {
void DirPyrEqualizer::lumacontrastPlusPressed () {
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < 5; i++) {
float inc = 0.05 * (4 - i);
multiplier[i]->setValue(multiplier[i]->getValue() + inc);
adjusterChanged(multiplier[i], multiplier[i]->getValue());
@@ -219,21 +227,23 @@ void DirPyrEqualizer::lumacontrastPlusPressed () {
void DirPyrEqualizer::lumacontrastMinusPressed () {
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < 5; i++) {
float inc = -0.05 * (4 - i);
multiplier[i]->setValue(multiplier[i]->getValue() + inc);
adjusterChanged(multiplier[i], multiplier[i]->getValue());
}
}
-void DirPyrEqualizer::setAdjusterBehavior (bool multiplieradd) {
+void DirPyrEqualizer::setAdjusterBehavior (bool multiplieradd, bool thresholdadd) {
for (int i=0; i<5; i++)
multiplier[i]->setAddMode(multiplieradd);
+ threshold->setAddMode(thresholdadd);
}
void DirPyrEqualizer::trimValues (rtengine::procparams::ProcParams* pp) {
for (int i=0; i<5; i++)
multiplier[i]->trimValue(pp->dirpyrequalizer.mult[i]);
+ threshold->trimValue(pp->dirpyrequalizer.threshold);
}
diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h
index 78a0e660c..60783f92f 100644
--- a/rtgui/dirpyrequalizer.h
+++ b/rtgui/dirpyrequalizer.h
@@ -31,6 +31,7 @@ protected:
Gtk::CheckButton * enabled;
Adjuster* multiplier[5];
+ Adjuster* threshold;
sigc::connection enaConn;
sigc::connection lumaneutralPressedConn;
@@ -48,7 +49,7 @@ public:
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited=NULL);
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL);
void setBatchMode (bool batchMode);
- void setAdjusterBehavior (bool multiplieradd);
+ void setAdjusterBehavior (bool multiplieradd, bool thresholdadd);
void trimValues (rtengine::procparams::ProcParams* pp);
void adjusterChanged (Adjuster* a, double newval);
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index 2da73947f..c25527051 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -570,9 +570,10 @@ void ParamsEdited::initFrom (const std::vector
raw.exTwoGreen = p.raw.twogreen == other.raw.twogreen;
dirpyrequalizer.enabled = dirpyrequalizer.enabled && p.dirpyrequalizer.enabled == other.dirpyrequalizer.enabled;
- for(int i = 0; i < 8; i++) {
+ for(int i = 0; i < 5; i++) {
dirpyrequalizer.mult[i] = dirpyrequalizer.mult[i] && p.dirpyrequalizer.mult[i] == other.dirpyrequalizer.mult[i];
- }
+ }
+ dirpyrequalizer.threshold = dirpyrequalizer.threshold && p.dirpyrequalizer.threshold == other.dirpyrequalizer.threshold;
hsvequalizer.hcurve = hsvequalizer.hcurve && p.hsvequalizer.hcurve == other.hsvequalizer.hcurve;
hsvequalizer.scurve = hsvequalizer.scurve && p.hsvequalizer.scurve == other.hsvequalizer.scurve;
hsvequalizer.vcurve = hsvequalizer.vcurve && p.hsvequalizer.vcurve == other.hsvequalizer.vcurve;
@@ -847,15 +848,16 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (raw.darkFrame) toEdit.raw.dark_frame = mods.raw.dark_frame;
if (raw.dfAuto) toEdit.raw.df_autoselect = mods.raw.df_autoselect;
- if (raw.ff_file) toEdit.raw.ff_file = mods.raw.ff_file;
+ if (raw.ff_file) toEdit.raw.ff_file = mods.raw.ff_file;
if (raw.ff_AutoSelect) toEdit.raw.ff_AutoSelect = mods.raw.ff_AutoSelect;
if (raw.ff_BlurRadius) toEdit.raw.ff_BlurRadius = mods.raw.ff_BlurRadius;
- if (raw.ff_BlurType) toEdit.raw.ff_BlurType = mods.raw.ff_BlurType;
+ if (raw.ff_BlurType) toEdit.raw.ff_BlurType = mods.raw.ff_BlurType;
if (dirpyrequalizer.enabled) toEdit.dirpyrequalizer.enabled = mods.dirpyrequalizer.enabled;
for(int i = 0; i < 5; i++) {
if(dirpyrequalizer.mult[i]) toEdit.dirpyrequalizer.mult[i] = dontforceSet && options.baBehav[ADDSET_DIRPYREQ] ? toEdit.dirpyrequalizer.mult[i] + mods.dirpyrequalizer.mult[i] : mods.dirpyrequalizer.mult[i];
}
+ if (dirpyrequalizer.threshold) toEdit.dirpyrequalizer.threshold= dontforceSet && options.baBehav[ADDSET_DIRPYREQ_THRESHOLD] ? toEdit.dirpyrequalizer.threshold + mods.dirpyrequalizer.threshold : mods.dirpyrequalizer.threshold;
if (hsvequalizer.hcurve) toEdit.hsvequalizer.hcurve = mods.hsvequalizer.hcurve;
if (hsvequalizer.scurve) toEdit.hsvequalizer.scurve = mods.hsvequalizer.scurve;
if (hsvequalizer.vcurve) toEdit.hsvequalizer.vcurve = mods.hsvequalizer.vcurve;
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index 8b61bf0ad..0e97562ce 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -431,7 +431,8 @@ class DirPyrEqualizerParamsEdited {
public:
bool enabled;
- bool mult[8];
+ bool mult[5];
+ bool threshold;
};
class HSVEqualizerParamsEdited {
diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h
index 486138555..7de11b392 100644
--- a/rtgui/ppversion.h
+++ b/rtgui/ppversion.h
@@ -2,7 +2,7 @@
#define _PPVERSION_
// This number have to be incremented whenever the PP3 file format is modified
-#define PPVERSION 315
+#define PPVERSION 316
#define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified
/*
diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc
index dfa635e07..92da78998 100644
--- a/rtgui/preferences.cc
+++ b/rtgui/preferences.cc
@@ -279,7 +279,8 @@ Gtk::Widget* Preferences::getBatchProcPanel () {
mi = behModel->append ();
mi->set_value (behavColumns.label, M("TP_DIRPYREQUALIZER_LABEL"));
- appendBehavList (mi, M("TP_EXPOSURE_CONTRAST")+", "+M("TP_DIRPYREQUALIZER_THRESHOLD"), ADDSET_DIRPYREQ, true);
+ appendBehavList (mi, M("TP_EXPOSURE_CONTRAST"), ADDSET_DIRPYREQ, true);
+ appendBehavList (mi, M("TP_DIRPYREQUALIZER_THRESHOLD"), ADDSET_DIRPYREQ_THRESHOLD, true);
mi = behModel->append ();
mi->set_value (behavColumns.label, M("TP_PREPROCESS_LABEL"));