Add tone equalizer to batch editor
This commit is contained in:
parent
bd3bd809b5
commit
3e2337bfae
@ -3848,6 +3848,7 @@ TP_TONE_EQUALIZER_BAND_1;Shadows
|
||||
TP_TONE_EQUALIZER_BAND_2;Midtones
|
||||
TP_TONE_EQUALIZER_BAND_3;Highlights
|
||||
TP_TONE_EQUALIZER_BAND_4;Whites
|
||||
TP_TONE_EQUALIZER_BANDS;Bands
|
||||
TP_TONE_EQUALIZER_DETAIL;Regularization
|
||||
TP_TONE_EQUALIZER_LABEL;Tone Equalizer
|
||||
TP_TONE_EQUALIZER_PIVOT;Pivot (Ev)
|
||||
|
@ -6270,7 +6270,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
|
||||
// Tone equalizer
|
||||
saveToKeyfile(!pedited || pedited->toneEqualizer.enabled, "ToneEqualizer", "Enabled", toneEqualizer.enabled, keyFile);
|
||||
for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) {
|
||||
saveToKeyfile(!pedited || pedited->toneEqualizer.bands, "ToneEqualizer", "Band" + std::to_string(i), toneEqualizer.bands[i], keyFile);
|
||||
saveToKeyfile(!pedited || pedited->toneEqualizer.bands[i], "ToneEqualizer", "Band" + std::to_string(i), toneEqualizer.bands[i], keyFile);
|
||||
}
|
||||
saveToKeyfile(!pedited || pedited->toneEqualizer.regularization, "ToneEqualizer", "Regularization", toneEqualizer.regularization, keyFile);
|
||||
saveToKeyfile(!pedited || pedited->toneEqualizer.pivot, "ToneEqualizer", "Pivot", toneEqualizer.pivot, keyFile);
|
||||
@ -8263,7 +8263,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
|
||||
if (keyFile.has_group("ToneEqualizer")) {
|
||||
assignFromKeyfile(keyFile, "ToneEqualizer", "Enabled", pedited, toneEqualizer.enabled, pedited->toneEqualizer.enabled);
|
||||
for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) {
|
||||
assignFromKeyfile(keyFile, "ToneEqualizer", "Band" + std::to_string(i), pedited, toneEqualizer.bands[i], pedited->toneEqualizer.bands);
|
||||
assignFromKeyfile(keyFile, "ToneEqualizer", "Band" + std::to_string(i), pedited, toneEqualizer.bands[i], pedited->toneEqualizer.bands[i]);
|
||||
}
|
||||
assignFromKeyfile(keyFile, "ToneEqualizer", "Regularization", pedited, toneEqualizer.regularization, pedited->toneEqualizer.regularization);
|
||||
assignFromKeyfile(keyFile, "ToneEqualizer", "Pivot", pedited, toneEqualizer.pivot, pedited->toneEqualizer.pivot);
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <map>
|
||||
|
@ -10,6 +10,9 @@ enum {
|
||||
ADDSET_SH_HIGHLIGHTS,
|
||||
ADDSET_SH_SHADOWS,
|
||||
ADDSET_SH_LOCALCONTRAST, // not used anymore
|
||||
ADDSET_TONE_EQUALIZER_BANDS,
|
||||
ADDSET_TONE_EQUALIZER_PIVOT,
|
||||
ADDSET_TONE_EQUALIZER_REGULARIZATION,
|
||||
ADDSET_LC_BRIGHTNESS,
|
||||
ADDSET_LC_CONTRAST,
|
||||
ADDSET_SHARP_AMOUNT,
|
||||
|
@ -689,8 +689,10 @@ void Adjuster::showIcons(bool yes)
|
||||
{
|
||||
if (imageIcon1) {
|
||||
imageIcon1->set_visible(yes);
|
||||
imageIcon1->set_no_show_all(!yes);
|
||||
}
|
||||
if (imageIcon2) {
|
||||
imageIcon2->set_visible(yes);
|
||||
imageIcon2->set_no_show_all(!yes);
|
||||
}
|
||||
}
|
||||
|
@ -219,6 +219,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]);
|
||||
toneEqualizer->setAdjusterBehavior(options.baBehav[ADDSET_TONE_EQUALIZER_BANDS], options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION], options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT]);
|
||||
dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD], options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]);
|
||||
wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_EDGS], options.baBehav[ADDSET_WA_SCALE], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_RADIUS], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]);
|
||||
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], options.baBehav[ADDSET_DIRPYRDN_PASSES]);
|
||||
@ -242,6 +243,9 @@ void BatchToolPanelCoordinator::initSession ()
|
||||
if (options.baBehav[ADDSET_TC_SATURATION]) { pparams.toneCurve.saturation = 0;}
|
||||
if (options.baBehav[ADDSET_SH_HIGHLIGHTS]) { pparams.sh.highlights = 0; }
|
||||
if (options.baBehav[ADDSET_SH_SHADOWS]) { pparams.sh.shadows = 0; }
|
||||
if (options.baBehav[ADDSET_TONE_EQUALIZER_BANDS]) { pparams.toneEqualizer.bands = {}; }
|
||||
if (options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT]) { pparams.toneEqualizer.pivot = 0; }
|
||||
if (options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION]) { pparams.toneEqualizer.regularization = 0; }
|
||||
if (options.baBehav[ADDSET_LC_BRIGHTNESS]) { pparams.labCurve.brightness = 0; }
|
||||
if (options.baBehav[ADDSET_LC_CONTRAST]) { pparams.labCurve.contrast = 0; }
|
||||
if (options.baBehav[ADDSET_LC_CHROMATICITY]) { pparams.labCurve.chromaticity = 0; }
|
||||
|
@ -318,7 +318,7 @@ void ParamsEdited::set(bool v)
|
||||
sh.radius = v;
|
||||
sh.lab = v;
|
||||
toneEqualizer.enabled = v;
|
||||
toneEqualizer.bands = v;
|
||||
toneEqualizer.bands.fill(v);
|
||||
toneEqualizer.regularization = v;
|
||||
toneEqualizer.show_colormap = v;
|
||||
toneEqualizer.pivot = v;
|
||||
@ -1037,7 +1037,9 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
|
||||
crop.orientation = crop.orientation && p.crop.orientation == other.crop.orientation;
|
||||
crop.guide = crop.guide && p.crop.guide == other.crop.guide;
|
||||
toneEqualizer.enabled = toneEqualizer.enabled && p.toneEqualizer.enabled == other.toneEqualizer.enabled;
|
||||
toneEqualizer.bands = toneEqualizer.bands && p.toneEqualizer.bands == other.toneEqualizer.bands;
|
||||
for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) {
|
||||
toneEqualizer.bands[i] = toneEqualizer.bands[i] && p.toneEqualizer.bands[i] == other.toneEqualizer.bands[i];
|
||||
}
|
||||
toneEqualizer.regularization = toneEqualizer.regularization && p.toneEqualizer.regularization == other.toneEqualizer.regularization;
|
||||
toneEqualizer.show_colormap = toneEqualizer.show_colormap && p.toneEqualizer.show_colormap == other.toneEqualizer.show_colormap;
|
||||
toneEqualizer.pivot = toneEqualizer.pivot && p.toneEqualizer.pivot == other.toneEqualizer.pivot;
|
||||
@ -3208,12 +3210,20 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
|
||||
toEdit.toneEqualizer.enabled = mods.toneEqualizer.enabled;
|
||||
}
|
||||
|
||||
if (toneEqualizer.bands) {
|
||||
toEdit.toneEqualizer.bands = mods.toneEqualizer.bands;
|
||||
for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) {
|
||||
if (toneEqualizer.bands[i]) {
|
||||
toEdit.toneEqualizer.bands[i] =
|
||||
dontforceSet && options.baBehav[ADDSET_TONE_EQUALIZER_BANDS]
|
||||
? toEdit.toneEqualizer.bands[i] + mods.toneEqualizer.bands[i]
|
||||
: mods.toneEqualizer.bands[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (toneEqualizer.regularization) {
|
||||
toEdit.toneEqualizer.regularization = mods.toneEqualizer.regularization;
|
||||
toEdit.toneEqualizer.regularization =
|
||||
dontforceSet && options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION]
|
||||
? toEdit.toneEqualizer.regularization + mods.toneEqualizer.regularization
|
||||
: mods.toneEqualizer.regularization;
|
||||
}
|
||||
|
||||
if (toneEqualizer.show_colormap) {
|
||||
@ -3221,7 +3231,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
|
||||
}
|
||||
|
||||
if (toneEqualizer.pivot) {
|
||||
toEdit.toneEqualizer.pivot = mods.toneEqualizer.pivot;
|
||||
toEdit.toneEqualizer.pivot =
|
||||
dontforceSet && options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT]
|
||||
? toEdit.toneEqualizer.pivot + mods.toneEqualizer.pivot
|
||||
: mods.toneEqualizer.pivot;
|
||||
}
|
||||
|
||||
if (crop.enabled) {
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <vector>
|
||||
|
||||
namespace rtengine
|
||||
@ -360,7 +361,7 @@ struct SHParamsEdited {
|
||||
|
||||
struct ToneEqualizerParamsEdited {
|
||||
bool enabled;
|
||||
bool bands;
|
||||
std::array<bool, 5> bands;
|
||||
bool regularization;
|
||||
bool show_colormap;
|
||||
bool pivot;
|
||||
|
@ -227,6 +227,12 @@ Gtk::Widget* Preferences::getBatchProcPanel()
|
||||
appendBehavList(mi, M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false);
|
||||
appendBehavList(mi, M("TP_SHADOWSHLIGHTS_SHADOWS"), ADDSET_SH_SHADOWS, false);
|
||||
|
||||
mi = behModel->append();
|
||||
mi->set_value(behavColumns.label, M("TP_TONE_EQUALIZER_LABEL"));
|
||||
appendBehavList(mi, M("TP_TONE_EQUALIZER_BANDS"), ADDSET_TONE_EQUALIZER_BANDS, false);
|
||||
appendBehavList(mi, M("TP_TONE_EQUALIZER_PIVOT"), ADDSET_TONE_EQUALIZER_PIVOT, false);
|
||||
appendBehavList(mi, M("TP_TONE_EQUALIZER_DETAIL"), ADDSET_TONE_EQUALIZER_REGULARIZATION, false);
|
||||
|
||||
mi = behModel->append();
|
||||
mi->set_value(behavColumns.label, M("TP_LABCURVE_LABEL"));
|
||||
appendBehavList(mi, M("TP_LABCURVE_BRIGHTNESS"), ADDSET_LC_BRIGHTNESS, false);
|
||||
|
@ -59,9 +59,9 @@ ToneEqualizer::ToneEqualizer(): FoldableToolPanel(this, "toneequalizer", M("TP_T
|
||||
regularization->setAdjusterListener(this);
|
||||
pack_start(*regularization);
|
||||
|
||||
show_colormap = Gtk::manage(new Gtk::CheckButton(M("TP_TONE_EQUALIZER_SHOW_COLOR_MAP")));
|
||||
show_colormap = Gtk::manage(new CheckBox(M("TP_TONE_EQUALIZER_SHOW_COLOR_MAP"), multiImage));
|
||||
pack_start(*show_colormap);
|
||||
show_colormap->signal_toggled().connect(sigc::mem_fun(this, &ToneEqualizer::colormapToggled));
|
||||
show_colormap->setCheckBoxListener(this);
|
||||
|
||||
show_all_children ();
|
||||
}
|
||||
@ -71,6 +71,16 @@ void ToneEqualizer::read(const ProcParams *pp, const ParamsEdited* pedited)
|
||||
{
|
||||
disableListener();
|
||||
|
||||
if (pedited) {
|
||||
set_inconsistent(multiImage && !pedited->toneEqualizer.enabled);
|
||||
for (size_t i = 0; i < bands.size(); ++i) {
|
||||
bands[i]->setEditedState(pedited->toneEqualizer.bands[i] ? Edited : UnEdited);
|
||||
}
|
||||
regularization->setEditedState(pedited->toneEqualizer.regularization ? Edited : UnEdited);
|
||||
pivot->setEditedState(pedited->toneEqualizer.pivot ? Edited : UnEdited);
|
||||
show_colormap->setEdited(pedited->toneEqualizer.show_colormap ? Edited : UnEdited);
|
||||
}
|
||||
|
||||
setEnabled(pp->toneEqualizer.enabled);
|
||||
|
||||
for (size_t i = 0; i < bands.size(); ++i) {
|
||||
@ -80,7 +90,7 @@ void ToneEqualizer::read(const ProcParams *pp, const ParamsEdited* pedited)
|
||||
regularization->setValue(pp->toneEqualizer.regularization);
|
||||
|
||||
pivot->setValue(pp->toneEqualizer.pivot);
|
||||
show_colormap->set_active(pp->toneEqualizer.show_colormap);
|
||||
show_colormap->setValue(pp->toneEqualizer.show_colormap);
|
||||
|
||||
enableListener();
|
||||
}
|
||||
@ -93,8 +103,19 @@ void ToneEqualizer::write(ProcParams *pp, ParamsEdited* pedited)
|
||||
}
|
||||
pp->toneEqualizer.enabled = getEnabled();
|
||||
pp->toneEqualizer.regularization = regularization->getValue();
|
||||
pp->toneEqualizer.show_colormap = show_colormap->get_active();
|
||||
pp->toneEqualizer.show_colormap = show_colormap->getLastActive();
|
||||
pp->toneEqualizer.pivot = pivot->getValue();
|
||||
|
||||
if (pedited) {
|
||||
auto &edited = pedited->toneEqualizer;
|
||||
edited.enabled = !get_inconsistent();
|
||||
for (size_t i = 0; i < bands.size(); ++i) {
|
||||
edited.bands[i] = bands[i]->getEditedState();
|
||||
}
|
||||
edited.regularization = regularization->getEditedState();
|
||||
edited.pivot = pivot->getEditedState();
|
||||
edited.show_colormap = show_colormap->getEdited();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -107,6 +128,21 @@ void ToneEqualizer::setDefaults(const ProcParams *defParams, const ParamsEdited*
|
||||
|
||||
pivot->setDefault(defParams->toneEqualizer.pivot);
|
||||
inital_params = defParams->toneEqualizer;
|
||||
|
||||
if (pedited) {
|
||||
auto &edited = pedited->toneEqualizer;
|
||||
for (size_t i = 0; i < bands.size(); ++i) {
|
||||
bands[i]->setDefaultEditedState(edited.bands[i] ? Edited : UnEdited);
|
||||
}
|
||||
regularization->setDefaultEditedState(edited.regularization ? Edited : UnEdited);
|
||||
pivot->setDefaultEditedState(edited.pivot ? Edited : UnEdited);
|
||||
} else {
|
||||
for (auto band : bands) {
|
||||
band->setDefaultEditedState(Irrelevant);
|
||||
}
|
||||
regularization->setDefaultEditedState(Irrelevant);
|
||||
pivot->setDefaultEditedState(Irrelevant);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -147,13 +183,44 @@ void ToneEqualizer::enabledChanged()
|
||||
}
|
||||
|
||||
|
||||
void ToneEqualizer::setBatchMode(bool batchMode)
|
||||
{
|
||||
ToolPanel::setBatchMode(batchMode);
|
||||
if (batchMode) {
|
||||
for (auto band : bands) {
|
||||
band->showEditedCB();
|
||||
}
|
||||
regularization->showEditedCB();
|
||||
pivot->showEditedCB();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ToneEqualizer::setAdjusterBehavior(bool bands_add, bool regularization_add, bool pivot_add)
|
||||
{
|
||||
for (auto band : bands) {
|
||||
band->setAddMode(bands_add);
|
||||
}
|
||||
regularization->setAddMode(regularization_add);
|
||||
pivot->setAddMode(pivot_add);
|
||||
}
|
||||
|
||||
|
||||
void ToneEqualizer::checkBoxToggled(CheckBox *c, CheckValue newval)
|
||||
{
|
||||
if (c == show_colormap) {
|
||||
colormapToggled();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ToneEqualizer::colormapToggled()
|
||||
{
|
||||
for (size_t i = 0; i < bands.size(); ++i) {
|
||||
bands[i]->showIcons(show_colormap->get_active());
|
||||
bands[i]->showIcons(show_colormap->getLastActive());
|
||||
}
|
||||
if (listener && getEnabled()) {
|
||||
listener->panelChanged(EvColormap, show_colormap->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
|
||||
listener->panelChanged(EvColormap, show_colormap->getLastActive() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,9 +23,10 @@
|
||||
|
||||
#include <gtkmm.h>
|
||||
#include "adjuster.h"
|
||||
#include "checkbox.h"
|
||||
#include "toolpanel.h"
|
||||
|
||||
class ToneEqualizer: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel {
|
||||
class ToneEqualizer: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public CheckBoxListener {
|
||||
public:
|
||||
ToneEqualizer();
|
||||
|
||||
@ -35,6 +36,9 @@ public:
|
||||
void adjusterChanged(Adjuster *a, double newval) override;
|
||||
void adjusterAutoToggled(Adjuster *a) override;
|
||||
void enabledChanged() override;
|
||||
void setBatchMode(bool batchMode) override;
|
||||
void setAdjusterBehavior(bool bands_add, bool regularization_add, bool pivot_add);
|
||||
void checkBoxToggled(CheckBox* c, CheckValue newval) override;
|
||||
|
||||
void trimValues(rtengine::procparams::ProcParams *pp) override;
|
||||
|
||||
@ -44,7 +48,7 @@ private:
|
||||
std::array<Adjuster *, 5> bands;
|
||||
Adjuster *regularization;
|
||||
Adjuster *pivot;
|
||||
Gtk::CheckButton *show_colormap;
|
||||
CheckBox *show_colormap;
|
||||
|
||||
rtengine::ProcEvent EvEnabled;
|
||||
rtengine::ProcEvent EvBands;
|
||||
|
Loading…
x
Reference in New Issue
Block a user