diff --git a/rtdata/languages/default b/rtdata/languages/default
index e4f6a5912..0e532f149 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -723,6 +723,7 @@ HISTORY_MSG_488;HDR Tone Mapping
HISTORY_MSG_489;HDR TM - Threshold
HISTORY_MSG_490;HDR TM - Amount
HISTORY_MSG_491;White Balance
+HISTORY_MSG_492;RGB Curves
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index ad7e4260d..7552cf523 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -3146,7 +3146,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
{wprof[2][0], wprof[2][1], wprof[2][2]}
};
- bool mixchannels = (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 ||
+ bool mixchannels = params->chmixer.enabled &&
+ (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 ||
params->chmixer.green[0] != 0 || params->chmixer.green[1] != 100 || params->chmixer.green[2] != 0 ||
params->chmixer.blue[0] != 0 || params->chmixer.blue[1] != 0 || params->chmixer.blue[2] != 100);
@@ -3159,9 +3160,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
FlatCurveType sCurveType = (FlatCurveType)params->hsvequalizer.scurve.at (0);
FlatCurveType vCurveType = (FlatCurveType)params->hsvequalizer.vcurve.at (0);
FlatCurveType bwlCurveType = (FlatCurveType)params->blackwhite.luminanceCurve.at (0);
- bool hCurveEnabled = hCurveType > FCT_Linear;
- bool sCurveEnabled = sCurveType > FCT_Linear;
- bool vCurveEnabled = vCurveType > FCT_Linear;
+ bool hCurveEnabled = params->hsvequalizer.enabled && hCurveType > FCT_Linear;
+ bool sCurveEnabled = params->hsvequalizer.enabled && sCurveType > FCT_Linear;
+ bool vCurveEnabled = params->hsvequalizer.enabled && vCurveType > FCT_Linear;
bool bwlCurveEnabled = bwlCurveType > FCT_Linear;
// TODO: We should create a 'skip' value like for CurveFactory::complexsgnCurve (rtengine/curves.cc)
@@ -3760,7 +3761,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
}
}
- if (rCurve || gCurve || bCurve) { // if any of the RGB curves is engaged
+ if (params->rgbCurves.enabled && (rCurve || gCurve || bCurve)) { // if any of the RGB curves is engaged
if (!params->rgbCurves.lumamode) { // normal RGB mode
for (int i = istart, ti = 0; i < tH; i++, ti++) {
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 169b22584..bde32f92f 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -518,6 +518,7 @@ enum ProcEvent {
EvTMFattalThreshold = 488,
EvTMFattalAmount = 489,
EvWBEnabled = 490,
+ EvRGBEnabled = 491,
NUMOFEVENTS
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index ff5f0b386..82e47769f 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -559,6 +559,7 @@ bool LCurveParams::operator !=(const LCurveParams& other) const
}
RGBCurvesParams::RGBCurvesParams() :
+ enabled(false),
lumamode(false),
rcurve{
DCT_Linear
@@ -575,7 +576,8 @@ RGBCurvesParams::RGBCurvesParams() :
bool RGBCurvesParams::operator ==(const RGBCurvesParams& other) const
{
return
- lumamode == other.lumamode
+ enabled == other.enabled
+ && lumamode == other.lumamode
&& rcurve == other.rcurve
&& gcurve == other.gcurve
&& bcurve == other.bcurve;
@@ -1753,6 +1755,7 @@ bool VignettingParams::operator !=(const VignettingParams& other) const
}
ChannelMixerParams::ChannelMixerParams() :
+ enabled(false),
red{
100,
0,
@@ -1773,6 +1776,9 @@ ChannelMixerParams::ChannelMixerParams() :
bool ChannelMixerParams::operator ==(const ChannelMixerParams& other) const
{
+ if (enabled != other.enabled) {
+ return false;
+ }
for (unsigned int i = 0; i < 3; ++i) {
if (
red[i] != other.red[i]
@@ -2261,6 +2267,7 @@ bool DirPyrEqualizerParams::operator !=(const DirPyrEqualizerParams& other) cons
}
HSVEqualizerParams::HSVEqualizerParams() :
+ enabled(false),
hcurve{
FCT_Linear
},
@@ -2276,7 +2283,8 @@ HSVEqualizerParams::HSVEqualizerParams() :
bool HSVEqualizerParams::operator ==(const HSVEqualizerParams& other) const
{
return
- hcurve == other.hcurve
+ enabled == other.enabled
+ && hcurve == other.hcurve
&& scurve == other.scurve
&& vcurve == other.vcurve;
}
@@ -2746,6 +2754,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->retinex.gaintransmissionCurve, "Retinex", "GainTransmissionCurve", retinex.gaintransmissionCurve, keyFile);
// Channel mixer
+ saveToKeyfile(!pedited || pedited->chmixer.enabled, "Channel Mixer", "Enabled", chmixer.enabled, keyFile);
if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) {
Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE);
keyFile.set_integer_list ("Channel Mixer", "Red", rmix);
@@ -3226,6 +3235,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->dirpyrequalizer.hueskin, "Directional Pyramid Equalizer", "Hueskin", dirpyrequalizer.hueskin.toVector(), keyFile);
// HSV Equalizer
+ saveToKeyfile(!pedited || pedited->hsvequalizer.enabled, "HSV Equalizer", "Enabled", hsvequalizer.enabled, keyFile);
saveToKeyfile(!pedited || pedited->hsvequalizer.hcurve, "HSV Equalizer", "HCurve", hsvequalizer.hcurve, keyFile);
saveToKeyfile(!pedited || pedited->hsvequalizer.scurve, "HSV Equalizer", "SCurve", hsvequalizer.scurve, keyFile);
saveToKeyfile(!pedited || pedited->hsvequalizer.vcurve, "HSV Equalizer", "VCurve", hsvequalizer.vcurve, keyFile);
@@ -3235,6 +3245,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
saveToKeyfile(!pedited || pedited->filmSimulation.clutFilename, "Film Simulation", "ClutFilename", filmSimulation.clutFilename, keyFile);
saveToKeyfile(!pedited || pedited->filmSimulation.strength, "Film Simulation", "Strength", filmSimulation.strength, keyFile);
+ saveToKeyfile(!pedited || pedited->rgbCurves.enabled, "RGB Curves", "Enabled", rgbCurves.enabled, keyFile);
saveToKeyfile(!pedited || pedited->rgbCurves.lumamode, "RGB Curves", "LumaMode", rgbCurves.lumamode, keyFile);
saveToKeyfile(!pedited || pedited->rgbCurves.rcurve, "RGB Curves", "rCurve", rgbCurves.rcurve, keyFile);
saveToKeyfile(!pedited || pedited->rgbCurves.gcurve, "RGB Curves", "gCurve", rgbCurves.gcurve, keyFile);
@@ -3454,6 +3465,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
}
if (keyFile.has_group ("Channel Mixer")) {
+ if (ppVersion >= 329) {
+ assignFromKeyfile(keyFile, "Channel Mixer", "Enabled", pedited, chmixer.enabled, pedited->chmixer.enabled);
+ } else {
+ chmixer.enabled = true;
+ if (pedited) {
+ pedited->chmixer.enabled = true;
+ }
+ }
if (keyFile.has_key ("Channel Mixer", "Red") && keyFile.has_key ("Channel Mixer", "Green") && keyFile.has_key ("Channel Mixer", "Blue")) {
const std::vector rmix = keyFile.get_integer_list ("Channel Mixer", "Red");
const std::vector gmix = keyFile.get_integer_list ("Channel Mixer", "Green");
@@ -4392,6 +4411,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
}
if (keyFile.has_group ("HSV Equalizer")) {
+ if (ppVersion >= 329) {
+ assignFromKeyfile(keyFile, "HSV Equalizer", "Enabled", pedited, hsvequalizer.enabled, pedited->hsvequalizer.enabled);
+ } else {
+ hsvequalizer.enabled = true;
+ if (pedited) {
+ pedited->hsvequalizer.enabled = true;
+ }
+ }
if (ppVersion >= 300) {
assignFromKeyfile(keyFile, "HSV Equalizer", "HCurve", pedited, hsvequalizer.hcurve, pedited->hsvequalizer.hcurve);
assignFromKeyfile(keyFile, "HSV Equalizer", "SCurve", pedited, hsvequalizer.scurve, pedited->hsvequalizer.scurve);
@@ -4400,6 +4427,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
}
if (keyFile.has_group ("RGB Curves")) {
+ if (ppVersion >= 329) {
+ assignFromKeyfile(keyFile, "RGB Curves", "Enabled", pedited, rgbCurves.enabled, pedited->rgbCurves.enabled);
+ } else {
+ rgbCurves.enabled = true;
+ if (pedited) {
+ pedited->rgbCurves.enabled = true;
+ }
+ }
assignFromKeyfile(keyFile, "RGB Curves", "LumaMode", pedited, rgbCurves.lumamode, pedited->rgbCurves.lumamode);
assignFromKeyfile(keyFile, "RGB Curves", "rCurve", pedited, rgbCurves.rcurve, pedited->rgbCurves.rcurve);
assignFromKeyfile(keyFile, "RGB Curves", "gCurve", pedited, rgbCurves.gcurve, pedited->rgbCurves.gcurve);
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 35f7b79f9..f7e23771a 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -367,6 +367,7 @@ struct LCurveParams
* Parameters of the RGB curves
*/
struct RGBCurvesParams {
+ bool enabled;
bool lumamode;
std::vector rcurve;
std::vector gcurve;
@@ -896,6 +897,7 @@ struct VignettingParams {
* Parameters of the color mixer
*/
struct ChannelMixerParams {
+ bool enabled;
int red[3];
int green[3];
int blue[3];
@@ -1138,6 +1140,7 @@ struct DirPyrEqualizerParams {
* HSV equalizer params
*/
struct HSVEqualizerParams {
+ bool enabled;
std::vector hcurve;
std::vector scurve;
std::vector vcurve;
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 676c1efbf..86b602562 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -517,6 +517,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
ALLNORAW, // EvTMFattalEnabled
HDR, // EvTMFattalThreshold
HDR, // EvTMFattalAmount
- ALLNORAW // EvWBEnabled
+ ALLNORAW, // EvWBEnabled
+ RGBCURVE // EvRGBEnabled
};
diff --git a/rtgui/chmixer.cc b/rtgui/chmixer.cc
index 7d71da9a9..c6c098883 100644
--- a/rtgui/chmixer.cc
+++ b/rtgui/chmixer.cc
@@ -22,7 +22,7 @@
using namespace rtengine;
using namespace rtengine::procparams;
-ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"))
+ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), false, true)
{
imgIcon[0] = Gtk::manage (new RTImage ("Chanmixer-RR.png"));
@@ -99,12 +99,16 @@ void ChMixer::read (const ProcParams* pp, const ParamsEdited* pedited)
disableListener ();
- if (pedited)
+ setEnabled(pp->chmixer.enabled);
+
+ if (pedited) {
for (int i = 0; i < 3; i++) {
red[i]->setEditedState (pedited->chmixer.red[i] ? Edited : UnEdited);
green[i]->setEditedState (pedited->chmixer.green[i] ? Edited : UnEdited);
blue[i]->setEditedState (pedited->chmixer.blue[i] ? Edited : UnEdited);
}
+ set_inconsistent(multiImage && !pedited->chmixer.enabled);
+ }
for (int i = 0; i < 3; i++) {
red[i]->setValue (pp->chmixer.red[i]);
@@ -123,13 +127,16 @@ void ChMixer::write (ProcParams* pp, ParamsEdited* pedited)
pp->chmixer.green[i] = (int) green[i]->getValue ();
pp->chmixer.blue[i] = (int) blue[i]->getValue ();
}
+ pp->chmixer.enabled = getEnabled();
- if (pedited)
+ if (pedited) {
for (int i = 0; i < 3; i++) {
pedited->chmixer.red[i] = red[i]->getEditedState ();
pedited->chmixer.green[i] = green[i]->getEditedState ();
pedited->chmixer.blue[i] = blue[i]->getEditedState ();
}
+ pedited->chmixer.enabled = !get_inconsistent();
+ }
}
void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited)
@@ -158,7 +165,7 @@ void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi
void ChMixer::adjusterChanged (Adjuster* a, double newval)
{
- if (listener) {
+ if (listener && getEnabled()) {
Glib::ustring descr = Glib::ustring::compose ("R=%1,%2,%3\nG=%4,%5,%6\nB=%7,%8,%9",
(int)red[0]->getValue(), (int)red[1]->getValue(), (int)red[2]->getValue(),
(int)green[0]->getValue(), (int)green[1]->getValue(), (int)green[2]->getValue(),
@@ -167,6 +174,21 @@ void ChMixer::adjusterChanged (Adjuster* a, double newval)
}
}
+
+void ChMixer::enabledChanged()
+{
+ if (listener) {
+ if (get_inconsistent()) {
+ listener->panelChanged(EvChMixer, M("GENERAL_UNCHANGED"));
+ } else if (getEnabled()) {
+ listener->panelChanged(EvChMixer, M("GENERAL_ENABLED"));
+ } else {
+ listener->panelChanged(EvChMixer, M("GENERAL_DISABLED"));
+ }
+ }
+}
+
+
void ChMixer::setBatchMode (bool batchMode)
{
diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h
index bd85517de..410ac0d16 100644
--- a/rtgui/chmixer.h
+++ b/rtgui/chmixer.h
@@ -44,6 +44,7 @@ public:
void adjusterChanged (Adjuster* a, double newval);
void setAdjusterBehavior (bool rgbadd);
void trimValues (rtengine::procparams::ProcParams* pp);
+ void enabledChanged();
};
#endif
diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc
index e74848cf3..1dfb017a7 100644
--- a/rtgui/hsvequalizer.cc
+++ b/rtgui/hsvequalizer.cc
@@ -25,7 +25,7 @@ using namespace rtengine::procparams;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL"))
+HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL"), false, true)
{
std::vector bottomMilestones;
@@ -84,11 +84,13 @@ void HSVEqualizer::read (const ProcParams* pp, const ParamsEdited* pedited)
hshape->setUnChanged (!pedited->hsvequalizer.hcurve);
sshape->setUnChanged (!pedited->hsvequalizer.scurve);
vshape->setUnChanged (!pedited->hsvequalizer.vcurve);
+ set_inconsistent(multiImage && !pedited->hsvequalizer.enabled);
}
hshape->setCurve (pp->hsvequalizer.hcurve);
sshape->setCurve (pp->hsvequalizer.scurve);
vshape->setCurve (pp->hsvequalizer.vcurve);
+ setEnabled(pp->hsvequalizer.enabled);
enableListener ();
}
@@ -116,7 +118,7 @@ void HSVEqualizer::autoOpenCurve ()
void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited)
{
-
+ pp->hsvequalizer.enabled = getEnabled();
pp->hsvequalizer.hcurve = hshape->getCurve ();
pp->hsvequalizer.scurve = sshape->getCurve ();
pp->hsvequalizer.vcurve = vshape->getCurve ();
@@ -126,6 +128,7 @@ void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited)
pedited->hsvequalizer.hcurve = !hshape->isUnChanged ();
pedited->hsvequalizer.scurve = !sshape->isUnChanged ();
pedited->hsvequalizer.vcurve = !vshape->isUnChanged ();
+ pedited->hsvequalizer.enabled = !get_inconsistent();
}
}
@@ -138,7 +141,7 @@ void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited)
void HSVEqualizer::curveChanged (CurveEditor* ce)
{
- if (listener) {
+ if (listener && getEnabled()) {
if (ce == hshape) {
listener->panelChanged (EvHSVEqualizerH, M("HISTORY_CUSTOMCURVE"));
}
@@ -199,3 +202,17 @@ void HSVEqualizer::setBatchMode (bool batchMode)
curveEditorG->setBatchMode (batchMode);
}
+
+
+void HSVEqualizer::enabledChanged()
+{
+ if (listener) {
+ if (get_inconsistent()) {
+ listener->panelChanged (EvHSVEqEnabled, M("GENERAL_UNCHANGED"));
+ } else if (getEnabled()) {
+ listener->panelChanged (EvHSVEqEnabled, M("GENERAL_ENABLED"));
+ } else {
+ listener->panelChanged (EvHSVEqEnabled, M("GENERAL_DISABLED"));
+ }
+ }
+}
diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h
index d02cc378c..fc3d22984 100644
--- a/rtgui/hsvequalizer.h
+++ b/rtgui/hsvequalizer.h
@@ -54,6 +54,7 @@ public:
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
//void adjusterChanged (Adjuster* a, double newval);
+ void enabledChanged();
};
#endif
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index b649272db..57fd7646f 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -97,6 +97,7 @@ void ParamsEdited::set (bool v)
labCurve.avoidcolorshift = v;
labCurve.rstprotection = v;
labCurve.lcredsk = v;
+ rgbCurves.enabled = v;
rgbCurves.lumamode = v;
rgbCurves.rcurve = v;
rgbCurves.gcurve = v;
@@ -320,6 +321,7 @@ void ParamsEdited::set (bool v)
vignetting.strength = v;
vignetting.centerX = v;
vignetting.centerY = v;
+ chmixer.enabled = v;
chmixer.red[0] = v;
chmixer.red[1] = v;
chmixer.red[2] = v;
@@ -548,6 +550,7 @@ void ParamsEdited::set (bool v)
dirpyrequalizer.skinprotect = v;
dirpyrequalizer.hueskin = v;
//dirpyrequalizer.algo = v;
+ hsvequalizer.enabled = v;
hsvequalizer.hcurve = v;
hsvequalizer.scurve = v;
hsvequalizer.vcurve = v;
@@ -638,6 +641,7 @@ void ParamsEdited::initFrom (const std::vector
labCurve.avoidcolorshift = labCurve.avoidcolorshift && p.labCurve.avoidcolorshift == other.labCurve.avoidcolorshift;
labCurve.rstprotection = labCurve.rstprotection && p.labCurve.rstprotection == other.labCurve.rstprotection;
labCurve.lcredsk = labCurve.lcredsk && p.labCurve.lcredsk == other.labCurve.lcredsk;
+ rgbCurves.enabled = rgbCurves.enabled && p.rgbCurves.enabled == other.rgbCurves.enabled;
rgbCurves.lumamode = rgbCurves.lumamode && p.rgbCurves.lumamode == other.rgbCurves.lumamode;
rgbCurves.rcurve = rgbCurves.rcurve && p.rgbCurves.rcurve == other.rgbCurves.rcurve;
rgbCurves.gcurve = rgbCurves.gcurve && p.rgbCurves.gcurve == other.rgbCurves.gcurve;
@@ -865,6 +869,7 @@ void ParamsEdited::initFrom (const std::vector
vignetting.strength = vignetting.strength && p.vignetting.strength == other.vignetting.strength;
vignetting.centerX = vignetting.centerX && p.vignetting.centerX == other.vignetting.centerX;
vignetting.centerY = vignetting.centerY && p.vignetting.centerY == other.vignetting.centerY;
+ chmixer.enabled = chmixer.enabled && p.chmixer.enabled == other.chmixer.enabled;
chmixer.red[0] = chmixer.red[0] && p.chmixer.red[0] == other.chmixer.red[0];
chmixer.red[1] = chmixer.red[1] && p.chmixer.red[1] == other.chmixer.red[1];
chmixer.red[2] = chmixer.red[2] && p.chmixer.red[2] == other.chmixer.red[2];
@@ -1086,6 +1091,7 @@ void ParamsEdited::initFrom (const std::vector
dirpyrequalizer.skinprotect = dirpyrequalizer.skinprotect && p.dirpyrequalizer.skinprotect == other.dirpyrequalizer.skinprotect;
// dirpyrequalizer.algo = dirpyrequalizer.algo && p.dirpyrequalizer.algo == other.dirpyrequalizer.algo;
dirpyrequalizer.hueskin = dirpyrequalizer.hueskin && p.dirpyrequalizer.hueskin == other.dirpyrequalizer.hueskin;
+ hsvequalizer.enabled = hsvequalizer.enabled && p.hsvequalizer.enabled == other.hsvequalizer.enabled;
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;
@@ -1358,6 +1364,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.labCurve.lcredsk = mods.labCurve.lcredsk;
}
+ if (rgbCurves.enabled) {
+ toEdit.rgbCurves.enabled = mods.rgbCurves.enabled;
+ }
+
if (rgbCurves.lumamode) {
toEdit.rgbCurves.lumamode = mods.rgbCurves.lumamode;
}
@@ -2195,6 +2205,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.vignetting.centerY = dontforceSet && options.baBehav[ADDSET_VIGN_CENTER] ? toEdit.vignetting.centerY + mods.vignetting.centerY : mods.vignetting.centerY;
}
+ if (chmixer.enabled) {
+ toEdit.chmixer.enabled = mods.chmixer.enabled;
+ }
+
for (int i = 0; i < 3; i++) {
if (chmixer.red[i]) {
toEdit.chmixer.red[i] = dontforceSet && options.baBehav[ADDSET_CHMIXER] ? toEdit.chmixer.red[i] + mods.chmixer.red[i] : mods.chmixer.red[i];
@@ -3014,6 +3028,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
}
// if (dirpyrequalizer.algo) toEdit.dirpyrequalizer.algo = mods.dirpyrequalizer.algo;
+ if (hsvequalizer.enabled) {
+ toEdit.hsvequalizer.enabled = mods.hsvequalizer.enabled;
+ }
+
if (hsvequalizer.hcurve) {
toEdit.hsvequalizer.hcurve = mods.hsvequalizer.hcurve;
}
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index f8f76f036..62fd8c9f4 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -123,6 +123,7 @@ class RGBCurvesParamsEdited
{
public:
+ bool enabled;
bool lumamode;
bool rcurve;
bool gcurve;
@@ -488,6 +489,7 @@ class ChannelMixerParamsEdited
{
public:
+ bool enabled;
bool red[3];
bool green[3];
bool blue[3];
@@ -678,6 +680,7 @@ class HSVEqualizerParamsEdited
{
public:
+ bool enabled;
bool hcurve;
bool scurve;
bool vcurve;
diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h
index d799be406..c6f2598b0 100644
--- a/rtgui/ppversion.h
+++ b/rtgui/ppversion.h
@@ -1,11 +1,13 @@
#pragma once
// This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes
-#define PPVERSION 328
+#define PPVERSION 329
#define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified
/*
Log of version changes
+ 329 2017-12-09
+ Added 'Enabled' flag for Channel Mixer, RGB Curves and HSV Equalizer
328 2017-11-22
Fix wrong type of ff_clipControl
327 2017-09-15
diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc
index d9c970f7a..d32633bf4 100644
--- a/rtgui/rgbcurves.cc
+++ b/rtgui/rgbcurves.cc
@@ -21,7 +21,7 @@
using namespace rtengine;
using namespace rtengine::procparams;
-RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL"))
+RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL"), false, true)
{
lumamode = Gtk::manage (new Gtk::CheckButton (M("TP_RGBCURVES_LUMAMODE")));
@@ -84,6 +84,7 @@ void RGBCurves::read (const ProcParams* pp, const ParamsEdited* pedited)
Gshape->setUnChanged (!pedited->rgbCurves.gcurve);
Bshape->setUnChanged (!pedited->rgbCurves.bcurve);
lumamode->set_inconsistent (!pedited->rgbCurves.lumamode);
+ set_inconsistent(multiImage && !pedited->rgbCurves.enabled);
}
lumamodeConn.block (true);
@@ -96,6 +97,8 @@ void RGBCurves::read (const ProcParams* pp, const ParamsEdited* pedited)
Gshape->setCurve (pp->rgbCurves.gcurve);
Bshape->setCurve (pp->rgbCurves.bcurve);
+ setEnabled(pp->rgbCurves.enabled);
+
enableListener ();
}
@@ -122,13 +125,14 @@ void RGBCurves::autoOpenCurve ()
void RGBCurves::write (ProcParams* pp, ParamsEdited* pedited)
{
-
+ pp->rgbCurves.enabled = getEnabled();
pp->rgbCurves.rcurve = Rshape->getCurve ();
pp->rgbCurves.gcurve = Gshape->getCurve ();
pp->rgbCurves.bcurve = Bshape->getCurve ();
pp->rgbCurves.lumamode = lumamode->get_active();
if (pedited) {
+ pedited->rgbCurves.enabled = !get_inconsistent();
pedited->rgbCurves.rcurve = !Rshape->isUnChanged ();
pedited->rgbCurves.gcurve = !Gshape->isUnChanged ();
pedited->rgbCurves.bcurve = !Bshape->isUnChanged ();
@@ -146,7 +150,7 @@ void RGBCurves::write (ProcParams* pp, ParamsEdited* pedited)
void RGBCurves::curveChanged (CurveEditor* ce)
{
- if (listener) {
+ if (listener && getEnabled()) {
if (ce == Rshape) {
listener->panelChanged (EvRGBrCurve, M("HISTORY_CUSTOMCURVE"));
}
@@ -177,7 +181,7 @@ void RGBCurves::lumamodeChanged ()
lastLumamode = lumamode->get_active ();
}
- if (listener) {
+ if (listener && getEnabled()) {
if (lumamode->get_active ()) {
listener->panelChanged (EvRGBrCurveLumamode, M("GENERAL_ENABLED"));
} else {
@@ -202,3 +206,16 @@ void RGBCurves::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & his
// Bshape->updateBackgroundHistogram (histBlue);
}
+
+void RGBCurves::enabledChanged()
+{
+ if (listener) {
+ if (get_inconsistent()) {
+ listener->panelChanged(EvRGBEnabled, M("GENERAL_UNCHANGED"));
+ } else if (getEnabled()) {
+ listener->panelChanged(EvRGBEnabled, M("GENERAL_ENABLED"));
+ } else {
+ listener->panelChanged(EvRGBEnabled, M("GENERAL_DISABLED"));
+ }
+ }
+}
diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h
index efca76422..dfcba71f9 100644
--- a/rtgui/rgbcurves.h
+++ b/rtgui/rgbcurves.h
@@ -53,6 +53,7 @@ public:
void curveChanged (CurveEditor* ce);
void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI);
void lumamodeChanged ();
+ void enabledChanged();
};
#endif