/* * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * RawTherapee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ #include #include "labcurve.h" #include "curveeditor.h" #include "curveeditorgroup.h" #include "options.h" #include "../rtengine/color.h" #include "../rtengine/improcfun.h" #include "../rtengine/procparams.h" #include "editcallbacks.h" using namespace rtengine; using namespace rtengine::procparams; const Glib::ustring LCurve::TOOL_NAME = "labcurves"; LCurve::LCurve () : FoldableToolPanel(this, TOOL_NAME, M("TP_LABCURVE_LABEL"), false, true) { brightness = Gtk::manage (new Adjuster (M("TP_LABCURVE_BRIGHTNESS"), -100., 100., 1., 0.)); contrast = Gtk::manage (new Adjuster (M("TP_LABCURVE_CONTRAST"), -100., 100., 1., 0.)); chromaticity = Gtk::manage (new Adjuster (M("TP_LABCURVE_CHROMATICITY"), -100., 100., 1., 0.)); chromaticity->set_tooltip_markup(M("TP_LABCURVE_CHROMA_TOOLTIP")); pack_start (*brightness); brightness->show (); pack_start (*contrast); contrast->show (); pack_start (*chromaticity); chromaticity->show (); brightness->setAdjusterListener (this); contrast->setAdjusterListener (this); chromaticity->setAdjusterListener (this); brightness->setLogScale(2, 0, true); contrast->setLogScale(2, 0, true); chromaticity->setLogScale(2, 0, true); //%%%%%%%%%%%%%%%%%% Gtk::Separator* hsep2 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); hsep2->show (); pack_start (*hsep2, Gtk::PACK_EXPAND_WIDGET, 4); avoidcolorshift = Gtk::manage (new Gtk::CheckButton (M("TP_LABCURVE_AVOIDCOLORSHIFT"))); avoidcolorshift->set_tooltip_text (M("TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP")); pack_start (*avoidcolorshift, Gtk::PACK_SHRINK, 4); lcredsk = Gtk::manage (new Gtk::CheckButton (M("TP_LABCURVE_LCREDSK"))); lcredsk->set_tooltip_markup (M("TP_LABCURVE_LCREDSK_TIP")); pack_start (*lcredsk); rstprotection = Gtk::manage ( new Adjuster (M("TP_LABCURVE_RSTPROTECTION"), 0., 100., 0.1, 0.) ); pack_start (*rstprotection); rstprotection->show (); rstprotection->setAdjusterListener (this); rstprotection->set_tooltip_text (M("TP_LABCURVE_RSTPRO_TOOLTIP")); acconn = avoidcolorshift->signal_toggled().connect( sigc::mem_fun(*this, &LCurve::avoidcolorshift_toggled) ); lcconn = lcredsk->signal_toggled().connect( sigc::mem_fun(*this, &LCurve::lcredsk_toggled) ); //%%%%%%%%%%%%%%%%%%% Gtk::Separator* hsep3 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); hsep3->show (); pack_start (*hsep3, Gtk::PACK_EXPAND_WIDGET, 4); curveEditorG = new CurveEditorGroup (options.lastLabCurvesDir); curveEditorG->setCurveListener (this); lshape = static_cast(curveEditorG->addCurve(CT_Diagonal, "L*")); lshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP")); lshape->setEditID(EUID_Lab_LCurve, BT_SINGLEPLANE_FLOAT); ashape = static_cast(curveEditorG->addCurve(CT_Diagonal, "a*")); ashape->setEditID(EUID_Lab_aCurve, BT_SINGLEPLANE_FLOAT); ashape->setRangeLabels( M("TP_LABCURVE_CURVEEDITOR_A_RANGE1"), M("TP_LABCURVE_CURVEEDITOR_A_RANGE2"), M("TP_LABCURVE_CURVEEDITOR_A_RANGE3"), M("TP_LABCURVE_CURVEEDITOR_A_RANGE4") ); //from green to magenta std::vector milestones = { GradientMilestone(0., 0., 1., 0.), GradientMilestone(1., 1., 0., 1.) }; ashape->setBottomBarBgGradient(milestones); ashape->setLeftBarBgGradient(milestones); bshape = static_cast(curveEditorG->addCurve(CT_Diagonal, "b*")); bshape->setRangeLabels( M("TP_LABCURVE_CURVEEDITOR_B_RANGE1"), M("TP_LABCURVE_CURVEEDITOR_B_RANGE2"), M("TP_LABCURVE_CURVEEDITOR_B_RANGE3"), M("TP_LABCURVE_CURVEEDITOR_B_RANGE4") ); bshape->setEditID(EUID_Lab_bCurve, BT_SINGLEPLANE_FLOAT); //from blue to yellow milestones = { GradientMilestone(0., 0., 0., 1.), GradientMilestone(1., 1., 1., 0.) }; bshape->setBottomBarBgGradient(milestones); bshape->setLeftBarBgGradient(milestones); curveEditorG->newLine(); // ------------------------------------------------ second line lhshape = static_cast(curveEditorG->addCurve(CT_Flat, M("TP_LABCURVE_CURVEEDITOR_LH"))); lhshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP")); lhshape->setCurveColorProvider(this, 4); lhshape->setEditID(EUID_Lab_LHCurve, BT_SINGLEPLANE_FLOAT); chshape = static_cast(curveEditorG->addCurve(CT_Flat, M("TP_LABCURVE_CURVEEDITOR_CH"))); chshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP")); chshape->setCurveColorProvider(this, 1); chshape->setEditID(EUID_Lab_CHCurve, BT_SINGLEPLANE_FLOAT); hhshape = static_cast(curveEditorG->addCurve(CT_Flat, M("TP_LABCURVE_CURVEEDITOR_HH"))); hhshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP")); hhshape->setCurveColorProvider(this, 5); hhshape->setEditID(EUID_Lab_HHCurve, BT_SINGLEPLANE_FLOAT); curveEditorG->newLine(); // ------------------------------------------------ 3rd line ccshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_CC"))); ccshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP")); ccshape->setEditID(EUID_Lab_CCurve, BT_SINGLEPLANE_FLOAT); ccshape->setRangeLabels( M("TP_LABCURVE_CURVEEDITOR_CC_RANGE1"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE2"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE3"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE4") ); ccshape->setBottomBarColorProvider(this, 2); ccshape->setLeftBarColorProvider(this, 7); ccshape->setRangeDefaultMilestones(0.05, 0.2, 0.58); lcshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_LC"))); lcshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP")); lcshape->setEditID(EUID_Lab_LCCurve, BT_SINGLEPLANE_FLOAT); // left and bottom bar uses the same caller id because the will display the same content lcshape->setBottomBarColorProvider(this, 2); lcshape->setRangeLabels( M("TP_LABCURVE_CURVEEDITOR_CC_RANGE1"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE2"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE3"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE4") ); lcshape->setRangeDefaultMilestones(0.05, 0.2, 0.58); clshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_CL"))); clshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP")); clshape->setEditID(EUID_Lab_CLCurve, BT_SINGLEPLANE_FLOAT); clshape->setLeftBarColorProvider(this, 7); clshape->setRangeDefaultMilestones(0.25, 0.5, 0.75); milestones = { GradientMilestone(0., 0., 0., 0.), GradientMilestone(1., 1., 1., 1.) }; clshape->setBottomBarBgGradient(milestones); // Setting the gradient milestones // from black to white milestones.emplace_back(0., 0., 0., 0.); milestones.emplace_back(1., 1., 1., 1.); lshape->setBottomBarBgGradient(milestones); lshape->setLeftBarBgGradient(milestones); milestones.emplace_back(0., 0., 0., 0.); milestones.emplace_back(1., 1., 1., 1.); lcshape->setRangeDefaultMilestones(0.05, 0.2, 0.58); lcshape->setBottomBarBgGradient(milestones); milestones.at(0).r = milestones.at(0).g = milestones.at(0).b = 0.1; milestones.at(1).r = milestones.at(1).g = milestones.at(1).b = 0.8; lcshape->setLeftBarBgGradient(milestones); // whole hue range milestones.clear(); for (int i = 0; i < 7; i++) { float R, G, B; float x = i / 6.0; Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); milestones.emplace_back(x, R, G, B); } chshape->setBottomBarBgGradient(milestones); lhshape->setBottomBarBgGradient(milestones); hhshape->setBottomBarBgGradient(milestones); // This will add the reset button at the end of the curveType buttons curveEditorG->curveListComplete(); pack_start (*curveEditorG, Gtk::PACK_SHRINK, 4); Gtk::Separator* hsepdh = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); hsepdh->show (); pack_start (*hsepdh, Gtk::PACK_EXPAND_WIDGET, 4); } LCurve::~LCurve () { delete curveEditorG; } void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); if (pedited) { brightness->setEditedState (pedited->labCurve.brightness ? Edited : UnEdited); contrast->setEditedState (pedited->labCurve.contrast ? Edited : UnEdited); chromaticity->setEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited); //%%%%%%%%%%%%%%%%%%%%%% rstprotection->setEditedState (pedited->labCurve.rstprotection ? Edited : UnEdited); avoidcolorshift->set_inconsistent (!pedited->labCurve.avoidcolorshift); lcredsk->set_inconsistent (!pedited->labCurve.lcredsk); //%%%%%%%%%%%%%%%%%%%%%% lshape->setUnChanged (!pedited->labCurve.lcurve); ashape->setUnChanged (!pedited->labCurve.acurve); bshape->setUnChanged (!pedited->labCurve.bcurve); ccshape->setUnChanged (!pedited->labCurve.cccurve); chshape->setUnChanged (!pedited->labCurve.chcurve); lhshape->setUnChanged (!pedited->labCurve.lhcurve); hhshape->setUnChanged (!pedited->labCurve.hhcurve); lcshape->setUnChanged (!pedited->labCurve.lccurve); clshape->setUnChanged (!pedited->labCurve.clcurve); set_inconsistent(multiImage && !pedited->labCurve.enabled); } brightness->setValue (pp->labCurve.brightness); contrast->setValue (pp->labCurve.contrast); chromaticity->setValue (pp->labCurve.chromaticity); adjusterChanged(chromaticity, pp->labCurve.chromaticity); // To update the GUI sensitiveness //%%%%%%%%%%%%%%%%%%%%%% rstprotection->setValue (pp->labCurve.rstprotection); bwtconn.block (true); acconn.block (true); lcconn.block (true); avoidcolorshift->set_active (pp->labCurve.avoidcolorshift); lcredsk->set_active (pp->labCurve.lcredsk); bwtconn.block (false); acconn.block (false); lcconn.block (false); lastACVal = pp->labCurve.avoidcolorshift; lastLCVal = pp->labCurve.lcredsk; //%%%%%%%%%%%%%%%%%%%%%% lshape->setCurve (pp->labCurve.lcurve); ashape->setCurve (pp->labCurve.acurve); bshape->setCurve (pp->labCurve.bcurve); ccshape->setCurve (pp->labCurve.cccurve); chshape->setCurve (pp->labCurve.chcurve); lhshape->setCurve (pp->labCurve.lhcurve); hhshape->setCurve (pp->labCurve.hhcurve); lcshape->setCurve (pp->labCurve.lccurve); clshape->setCurve (pp->labCurve.clcurve); setEnabled(pp->labCurve.enabled); queue_draw(); enableListener (); } void LCurve::autoOpenCurve () { // Open up the first curve if selected bool active = lshape->openIfNonlinear(); if (!active) { active = ashape->openIfNonlinear(); } if (!active) { active = bshape->openIfNonlinear(); } if (!active) { active = ccshape->openIfNonlinear(); } if (!active) { active = chshape->openIfNonlinear(); } if (!active) { active = lhshape->openIfNonlinear(); } if (!active) { active = hhshape->openIfNonlinear(); } if (!active) { active = lcshape->openIfNonlinear(); } if (!active) { clshape->openIfNonlinear(); } } void LCurve::setEditProvider (EditDataProvider *provider) { lshape->setEditProvider(provider); ccshape->setEditProvider(provider); lcshape->setEditProvider(provider); clshape->setEditProvider(provider); lhshape->setEditProvider(provider); chshape->setEditProvider(provider); hhshape->setEditProvider(provider); ashape->setEditProvider(provider); bshape->setEditProvider(provider); } void LCurve::write (ProcParams* pp, ParamsEdited* pedited) { pp->labCurve.enabled = getEnabled(); pp->labCurve.brightness = brightness->getValue (); pp->labCurve.contrast = (int)contrast->getValue (); pp->labCurve.chromaticity = (int)chromaticity->getValue (); //%%%%%%%%%%%%%%%%%%%%%% pp->labCurve.avoidcolorshift = avoidcolorshift->get_active (); pp->labCurve.lcredsk = lcredsk->get_active (); pp->labCurve.rstprotection = rstprotection->getValue (); //%%%%%%%%%%%%%%%%%%%%%% pp->labCurve.lcurve = lshape->getCurve (); pp->labCurve.acurve = ashape->getCurve (); pp->labCurve.bcurve = bshape->getCurve (); pp->labCurve.cccurve = ccshape->getCurve (); pp->labCurve.chcurve = chshape->getCurve (); pp->labCurve.lhcurve = lhshape->getCurve (); pp->labCurve.hhcurve = hhshape->getCurve (); pp->labCurve.lccurve = lcshape->getCurve (); pp->labCurve.clcurve = clshape->getCurve (); if (pedited) { pedited->labCurve.brightness = brightness->getEditedState (); pedited->labCurve.contrast = contrast->getEditedState (); pedited->labCurve.chromaticity = chromaticity->getEditedState (); //%%%%%%%%%%%%%%%%%%%%%% pedited->labCurve.avoidcolorshift = !avoidcolorshift->get_inconsistent(); pedited->labCurve.lcredsk = !lcredsk->get_inconsistent(); pedited->labCurve.rstprotection = rstprotection->getEditedState (); pedited->labCurve.lcurve = !lshape->isUnChanged (); pedited->labCurve.acurve = !ashape->isUnChanged (); pedited->labCurve.bcurve = !bshape->isUnChanged (); pedited->labCurve.cccurve = !ccshape->isUnChanged (); pedited->labCurve.chcurve = !chshape->isUnChanged (); pedited->labCurve.lhcurve = !lhshape->isUnChanged (); pedited->labCurve.hhcurve = !hhshape->isUnChanged (); pedited->labCurve.lccurve = !lcshape->isUnChanged (); pedited->labCurve.clcurve = !clshape->isUnChanged (); pedited->labCurve.enabled = !get_inconsistent(); } } void LCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { brightness->setDefault (defParams->labCurve.brightness); contrast->setDefault (defParams->labCurve.contrast); chromaticity->setDefault (defParams->labCurve.chromaticity); rstprotection->setDefault (defParams->labCurve.rstprotection); if (pedited) { brightness->setDefaultEditedState (pedited->labCurve.brightness ? Edited : UnEdited); contrast->setDefaultEditedState (pedited->labCurve.contrast ? Edited : UnEdited); chromaticity->setDefaultEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited); rstprotection->setDefaultEditedState (pedited->labCurve.rstprotection ? Edited : UnEdited); } else { brightness->setDefaultEditedState (Irrelevant); contrast->setDefaultEditedState (Irrelevant); chromaticity->setDefaultEditedState (Irrelevant); rstprotection->setDefaultEditedState (Irrelevant); } } //%%%%%%%%%%%%%%%%%%%%%% //Color shift control changed void LCurve::avoidcolorshift_toggled () { if (batchMode) { if (avoidcolorshift->get_inconsistent()) { avoidcolorshift->set_inconsistent (false); acconn.block (true); avoidcolorshift->set_active (false); acconn.block (false); } else if (lastACVal) { avoidcolorshift->set_inconsistent (true); } lastACVal = avoidcolorshift->get_active (); } if (listener && getEnabled()) { if (avoidcolorshift->get_active ()) { listener->panelChanged (EvLAvoidColorShift, M("GENERAL_ENABLED")); } else { listener->panelChanged (EvLAvoidColorShift, M("GENERAL_DISABLED")); } } } void LCurve::lcredsk_toggled () { if (batchMode) { if (lcredsk->get_inconsistent()) { lcredsk->set_inconsistent (false); lcconn.block (true); lcredsk->set_active (false); lcconn.block (false); } else if (lastLCVal) { lcredsk->set_inconsistent (true); } lastLCVal = lcredsk->get_active (); } else { lcshape->refresh(); } if (listener && getEnabled()) { if (lcredsk->get_active ()) { listener->panelChanged (EvLLCredsk, M("GENERAL_ENABLED")); } else { listener->panelChanged (EvLLCredsk, M("GENERAL_DISABLED")); } } } //%%%%%%%%%%%%%%%%%%%%%% /* * Curve listener * * If more than one curve has been added, the curve listener is automatically * set to 'multi=true', and send a pointer of the modified curve in a parameter */ void LCurve::curveChanged (CurveEditor* ce) { if (listener && getEnabled()) { if (ce == lshape) { listener->panelChanged (EvLLCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == ashape) { listener->panelChanged (EvLaCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == bshape) { listener->panelChanged (EvLbCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == ccshape) { listener->panelChanged (EvLCCCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == chshape) { listener->panelChanged (EvLCHCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == lhshape) { listener->panelChanged (EvLLHCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == hhshape) { listener->panelChanged (EvLHHCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == lcshape) { listener->panelChanged (EvLLCCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == clshape) { listener->panelChanged (EvLCLCurve, M("HISTORY_CUSTOMCURVE")); } } } void LCurve::adjusterChanged(Adjuster* a, double newval) { Glib::ustring costr; if (a == brightness) { costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); } else if (a == rstprotection) { costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(1), a->getValue()); } else { costr = Glib::ustring::format ((int)a->getValue()); } if (a == brightness) { if (listener && getEnabled()) { listener->panelChanged (EvLBrightness, costr); } } else if (a == contrast) { if (listener && getEnabled()) { listener->panelChanged (EvLContrast, costr); } } else if (a == rstprotection) { if (listener && getEnabled()) { listener->panelChanged (EvLRSTProtection, costr); } } else if (a == chromaticity) { if (multiImage) { //if chromaticity==-100 (lowest value), we enter the B&W mode and avoid color shift and rstprotection has no effect rstprotection->set_sensitive( true ); avoidcolorshift->set_sensitive( true ); lcredsk->set_sensitive( true ); } else { //if chromaticity==-100 (lowest value), we enter the B&W mode and avoid color shift and rstprotection has no effect rstprotection->set_sensitive( int(newval) > -100 ); //no reason for grey rstprotection avoidcolorshift->set_sensitive( int(newval) > -100 ); lcredsk->set_sensitive( int(newval) > -100 ); } if (listener && getEnabled()) { listener->panelChanged (EvLSaturation, costr); } } } void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) { float R = 0.f, G = 0.f, B = 0.f; if (elemType == ColorCaller::CCET_VERTICAL_BAR) { valY = 0.5; } if (callerId == 1) { // ch - main curve Color::hsv2rgb01(float(valX), float(valY), 0.5f, R, G, B); } else if (callerId == 2) { // cc - bottom bar float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); } else if (callerId == 6) { // cc - left bar float value = (1.f - 0.7f) * float(valX) + 0.7f; float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; if (hue > 1.0f) { hue -= 1.0f; } // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else if (callerId == 3) { // lc - bottom bar float value = (1.f - 0.7f) * float(valX) + 0.7f; if (lcredsk->get_active()) { // skin range // -0.1 rad < Hue < 1.6 rad // Y axis / from 0.92 up to 0.14056 float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; if (hue > 1.0f) { hue -= 1.0f; } // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else { // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); } } else if (callerId == 4) { // LH - bottom bar Color::hsv2rgb01(float(valX), 0.5f, float(valY), R, G, B); } else if (callerId == 5) { // HH - bottom bar float h = float((valY - 0.5) * 0.3 + valX); if (h > 1.0f) { h -= 1.0f; } else if (h < 0.0f) { h += 1.0f; } Color::hsv2rgb01(h, 0.5f, 0.5f, R, G, B); } else if (callerId == 7) { // cc and cl - left bar float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(float(valY*0.8), 1.f - float(valX), value, R, G, B); } caller->ccRed = double(R); caller->ccGreen = double(G); caller->ccBlue = double(B); } void LCurve::setBatchMode (bool batchMode) { ToolPanel::setBatchMode (batchMode); brightness->showEditedCB (); contrast->showEditedCB (); chromaticity->showEditedCB (); rstprotection->showEditedCB (); curveEditorG->setBatchMode (batchMode); lcshape->setBottomBarColorProvider(nullptr, -1); lcshape->setLeftBarColorProvider(nullptr, -1); } void LCurve::updateCurveBackgroundHistogram( const LUTu& histToneCurve, const LUTu& histLCurve, const LUTu& histCCurve, const LUTu& histLCAM, const LUTu& histCCAM, const LUTu& histRed, const LUTu& histGreen, const LUTu& histBlue, const LUTu& histLuma, const LUTu& histLRETI ) { lshape->updateBackgroundHistogram (histLCurve); ccshape->updateBackgroundHistogram (histCCurve); lcshape->updateBackgroundHistogram (histCCurve); clshape->updateBackgroundHistogram (histLCurve); } void LCurve::setAdjusterBehavior (bool bradd, bool contradd, bool satadd) { brightness->setAddMode(bradd); contrast->setAddMode(contradd); chromaticity->setAddMode(satadd); } void LCurve::trimValues (rtengine::procparams::ProcParams* pp) { brightness->trimValue(pp->labCurve.brightness); contrast->trimValue(pp->labCurve.contrast); chromaticity->trimValue(pp->labCurve.chromaticity); } void LCurve::enabledChanged() { if (listener) { if (get_inconsistent()) { listener->panelChanged (EvLEnabled, M("GENERAL_UNCHANGED")); } else if (getEnabled()) { listener->panelChanged (EvLEnabled, M("GENERAL_ENABLED")); } else { listener->panelChanged (EvLEnabled, M("GENERAL_DISABLED")); } } }