diff --git a/rtdata/languages/default b/rtdata/languages/default index 44b0aa9d2..1b796626e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -456,6 +456,7 @@ HISTORY_MSG_247;'LH' curve HISTORY_MSG_248;'HH' curve HISTORY_MSG_249;CbDL - Threshold HISTORY_MSG_250;NR - Enhanced +HISTORY_MSG_251;B&W - Algorithm HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOTS;Snapshots @@ -939,6 +940,10 @@ TP_BWMIX_TCMODE_STANDARD;B&W Standard TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard TP_BWMIX_VAL;L TP_BWMIX_YELLOW;Yellow +TP_BWMIX_ALGO;Algorithm OYCPM +TP_BWMIX_ALGO_LI;Linear +TP_BWMIX_ALGO_SP;Special effects +TP_BWMIX_ALGO_TOOLTIP;Linear :will produce a normal linear response\nSpecial effects: will produce special effects by mixing non-linear channels TP_CACORRECTION_BLUE;Blue TP_CACORRECTION_LABEL;Chromatic Aberration Correction TP_CACORRECTION_RED;Red diff --git a/rtengine/color.cc b/rtengine/color.cc index ab52fc73c..b8bc213c6 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -432,7 +432,7 @@ namespace rtengine { * @param setting BlackWhite::setting * @param setting BlackWhite::filter */ - void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, float &mixerRed, float &mixerGreen, + void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen, float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta, bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm) { @@ -488,24 +488,34 @@ namespace rtengine { float crM=0.f; float cgM=0.f; float cbM=0.f; - + //printf("mixred=%f\n",mixerRed); float fcompl = 1.f; - if(complement) fcompl = 3.f; + if(complement && algo=="SP") fcompl = 3.f;//special + else if(complement && algo=="LI") fcompl = 1.5f;//linear // ponderate filters: report to R=G=B=33 // I ponder RGB channel, not only orange or yellow or cyan, etc...it's my choice ! if(mixerOrange != 33) { - if (mixerOrange >= 33) orM = fcompl*(mixerOrange*0.67f - 22.11f)/100.f; else orM = fcompl*(-0.3f*mixerOrange +9.9f)/100.f; - if (mixerOrange >= 33) ogM = fcompl*(-0.164f*mixerOrange+5.412f)/100.f; else ogM = fcompl*(0.4f*mixerOrange-13.2f)/100.f; + if (algo=="SP") {//special + if (mixerOrange >= 33) orM = fcompl*(mixerOrange*0.67f - 22.11f)/100.f; else orM = fcompl*(-0.3f*mixerOrange +9.9f)/100.f; + if (mixerOrange >= 33) ogM = fcompl*(-0.164f*mixerOrange+5.412f)/100.f; else ogM = fcompl*(0.4f*mixerOrange-13.2f)/100.f; + } + else if (algo=="LI") {//linear + orM = fcompl*(mixerOrange - 33.f)/100.f; + ogM = fcompl*(0.5f*mixerOrange-16.5f)/100.f; + } if(complement) obM =(-0.492f*mixerOrange+16.236f)/100.f; mixerRed += orM; mixerGreen += ogM; mixerBlue += obM; koymcp += (orM+ogM+obM); + // printf("mixred+ORange=%f\n",mixerRed); + } if(mixerYellow != 33) { - yrM = fcompl*(-0.134f*mixerYellow+4.422f)/100.f;//22.4 - ygM = fcompl*( 0.5f *mixerYellow-16.5f )/100.f; + if (algo=="SP") yrM = fcompl*(-0.134f*mixerYellow+4.422f)/100.f;//22.4 + else if (algo=="LI")yrM = fcompl*(0.5f*mixerYellow-16.5f)/100.f;//22.4 + ygM = fcompl*(0.5f *mixerYellow-16.5f )/100.f; if(complement) ybM =(-0.492f*mixerYellow+16.236f)/100.f; mixerRed += yrM; mixerGreen += ygM; @@ -513,8 +523,14 @@ namespace rtengine { koymcp += (yrM+ygM+ybM); } if(mixerMagenta != 33) { - if(mixerMagenta >= 33) mrM = fcompl*( 0.67f *mixerMagenta-22.11f)/100.f; else mrM = fcompl*(-0.3f*mixerMagenta +9.9f)/100.f; - if(mixerMagenta >= 33) mbM = fcompl*(-0.164f*mixerMagenta+5.412f)/100.f; else mbM = fcompl*( 0.4f*mixerMagenta-13.2f)/100.f; + if (algo=="SP"){ + if(mixerMagenta >= 33) mrM = fcompl*( 0.67f *mixerMagenta-22.11f)/100.f; else mrM = fcompl*(-0.3f*mixerMagenta +9.9f)/100.f; + if(mixerMagenta >= 33) mbM = fcompl*(-0.164f*mixerMagenta+5.412f)/100.f; else mbM = fcompl*( 0.4f*mixerMagenta-13.2f)/100.f; + } + else if (algo=="LI"){ + mrM = fcompl*(mixerMagenta-33.f)/100.f; + mbM = fcompl*(0.5f*mixerMagenta-16.5f)/100.f; + } if(complement) mgM =(-0.492f*mixerMagenta+16.236f)/100.f; mixerRed += mrM; mixerGreen += mgM; @@ -522,7 +538,8 @@ namespace rtengine { koymcp += (mrM+mgM+mbM); } if(mixerPurple != 33) { - prM = fcompl*(-0.134f*mixerPurple+4.422f)/100.f; + if (algo=="SP") prM = fcompl*(-0.134f*mixerPurple+4.422f)/100.f; + else if (algo=="LI")prM = fcompl*(0.5f*mixerPurple-16.5f)/100.f; pbM = fcompl*(0.5f*mixerPurple-16.5f)/100.f; if(complement) pgM = (-0.492f*mixerPurple+16.236f)/100.f; mixerRed += prM; @@ -531,7 +548,8 @@ namespace rtengine { koymcp += (prM+pgM+pbM); } if(mixerCyan != 33) { - cgM = fcompl*(-0.134f*mixerCyan +4.422f)/100.f; + if (algo=="SP")cgM = fcompl*(-0.134f*mixerCyan +4.422f)/100.f; + else if (algo=="LI")cgM = fcompl*(0.5f*mixerCyan -16.5f)/100.f; cbM = fcompl*(0.5f*mixerCyan-16.5f)/100.f; if(complement) crM = (-0.492f*mixerCyan+16.236f)/100.f; mixerRed += crM; @@ -993,10 +1011,10 @@ munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue); #ifdef _DEBUG neg=true; #endif - if (Lprov1 < 0.01f) + if (Lprov1 < 0.01f) Lprov1 = 0.01f; Chprov1 *= higherCoef; // decrease the chromaticity value - if (Chprov1 <= 3.0f) + if (Chprov1 <= 3.0f) Lprov1 += lowerCoef; inGamut = false; } else if (!isHLEnabled && (R>ClipLevel || G>ClipLevel || B>ClipLevel)) { @@ -1005,10 +1023,10 @@ munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue); #ifdef _DEBUG more_rgb=true; #endif - if (Lprov1 > 99.999f) + if (Lprov1 > 99.999f) Lprov1 = 99.98f; Chprov1 *= higherCoef; - if (Chprov1 <= 3.0f) + if (Chprov1 <= 3.0f) Lprov1 -= lowerCoef; inGamut = false; } diff --git a/rtengine/color.h b/rtengine/color.h index 15cf6f72b..dc579fc40 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -136,7 +136,7 @@ public: static double f2xyz(double f); static void calcGamma (double pwr, double ts, int mode, int imax, double &gamma0, double &gamma1, double &gamma2, double &gamma3, double &gamma4,double &gamma5); static void trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb); - static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, float &mixerRed, float &mixerGreen, + static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen, float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta, bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index d005ab52a..4ed0c24f1 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2731,7 +2731,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, LUTf & hltone mixerCyan = 33.f; } - Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter, + Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter,params->blackwhite.algo, bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta, params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm); @@ -3890,7 +3890,7 @@ fclose(f);*/ //diagnostics //printf ("**************** AUTO LEVELS ****************\n"); - + /* if (settings->verbose) { printf("sum=%i clip=%f clippable=%i clipWh=%i clipBl=%i\n",somm, clip, clippable,clipwh, clipbl); printf ("expcomp1= %f expcomp2= %f gain= %f expcomp=%f\n",expcomp1,expcomp2,gain,expcomp); @@ -3907,7 +3907,7 @@ fclose(f);*/ printf ("ospread= %f\n",ospread); printf ("overexp= %i\n",overex); } - + */ /* // %%%%%%%%%% LEGACY AUTOEXPOSURE CODE %%%%%%%%%%%%% // black point selection is based on the linear result (yielding better visual results) diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 2f136367b..8d58b891c 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -273,8 +273,8 @@ enum ProcEvent { EvLHHCurve=247, EvDirPyrEqualizerThreshold=248, EvDPDNenhance=249, - - NUMOFEVENTS=250 + EvBWMethodalg=250, + NUMOFEVENTS=251 }; } #endif diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4562c5b8b..57bee1ceb 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -408,6 +408,7 @@ void ProcParams::setDefaults () { blackwhite.afterCurve.clear (); blackwhite.afterCurve.push_back(DCT_Linear); blackwhite.afterCurveMode = BlackWhiteParams::TC_MODE_STD_BW; + blackwhite.algo = "SP"; resize.enabled = false; resize.scale = 1.0; @@ -620,6 +621,8 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol if (!pedited || pedited->blackwhite.gammaRed) keyFile.set_integer ("Black & White", "GammaRed", blackwhite.gammaRed); if (!pedited || pedited->blackwhite.gammaGreen) keyFile.set_integer ("Black & White", "GammaGreen", blackwhite.gammaGreen); if (!pedited || pedited->blackwhite.gammaBlue) keyFile.set_integer ("Black & White", "GammaBlue", blackwhite.gammaBlue); + if (!pedited || pedited->blackwhite.algo) keyFile.set_string ("Black & White", "Algorithm", blackwhite.algo); + if (!pedited || pedited->blackwhite.luminanceCurve) { Glib::ArrayHandle luminanceCurve = blackwhite.luminanceCurve; keyFile.set_double_list("Black & White", "LuminanceCurve", luminanceCurve); @@ -1238,7 +1241,8 @@ if (keyFile.has_group ("Black & White")) { if (keyFile.has_key ("Black & White", "Setting")) { blackwhite.setting = keyFile.get_string ("Black & White", "Setting"); if (pedited) pedited->blackwhite.setting = true; } if (keyFile.has_key ("Black & White", "LuminanceCurve")) { blackwhite.luminanceCurve = keyFile.get_double_list ("Black & White", "LuminanceCurve"); if (pedited) pedited->blackwhite.luminanceCurve = true; } if (keyFile.has_key ("Black & White", "BeforeCurve")) { blackwhite.beforeCurve = keyFile.get_double_list ("Black & White", "BeforeCurve"); if (pedited) pedited->blackwhite.beforeCurve = true; } - if (keyFile.has_key ("Black & White", "BeforeCurveMode")) { + if (keyFile.has_key ("Black & White", "Algorithm")) { blackwhite.algo = keyFile.get_string ("Black & White", "Algorithm"); if (pedited) pedited->blackwhite.algo = true; } + if (keyFile.has_key ("Black & White", "BeforeCurveMode")) { Glib::ustring sMode = keyFile.get_string ("Black & White", "BeforeCurveMode"); if (sMode == "Standard") blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_STD_BW; else if (sMode == "FilmLike") blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_FILMLIKE_BW; @@ -1978,6 +1982,7 @@ bool ProcParams::operator== (const ProcParams& other) { && blackwhite.beforeCurveMode == other.blackwhite.beforeCurveMode && blackwhite.afterCurveMode == other.blackwhite.afterCurveMode && blackwhite.autoc == other.blackwhite.autoc + && blackwhite.algo == other.blackwhite.algo && resize.scale == other.resize.scale && resize.appliesTo == other.resize.appliesTo && resize.method == other.resize.method diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 656180761..f3604b459 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -649,6 +649,7 @@ class BlackWhiteParams { eTCModeId beforeCurveMode; std::vector afterCurve; eTCModeId afterCurveMode; + Glib::ustring algo; std::vector luminanceCurve; bool autoc; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index ae2eb6933..1c4d31f3e 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -269,8 +269,8 @@ LUMINANCECURVE, // EvLCLCurve LUMINANCECURVE, // EvLLHCurve LUMINANCECURVE, // EvLHHCurve DIRPYREQUALIZER, // EvDirPyrEqualizerThreshold -ALLNORAW // EvDPDNenhance - +ALLNORAW, // EvDPDNenhance +RGBCURVE //EvBWMethodalg //LUMINANCECURVE // EvCATsharpcie diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index f9bcab58a..b629d3f4c 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -235,6 +235,22 @@ BlackWhite::BlackWhite (): Gtk::VBox(), FoldableToolPanel(this) { filterSep2 = Gtk::manage (new Gtk::HSeparator()); mixerVBox->pack_start (*filterSep2); + algoHBox = Gtk::manage (new Gtk::HBox ()); + algoHBox->set_border_width (0); + algoHBox->set_spacing (2); + algoHBox->set_tooltip_markup (M("TP_BWMIX_ALGO_TOOLTIP")); + + alLabel = Gtk::manage (new Gtk::Label (M("TP_BWMIX_ALGO")+":")); + algoHBox->pack_start (*alLabel, Gtk::PACK_SHRINK); + + algo = Gtk::manage (new MyComboBoxText ()); + algo->append_text (M("TP_BWMIX_ALGO_LI")); + algo->append_text (M("TP_BWMIX_ALGO_SP")); + algo->set_active (1); + algoHBox->pack_start (*algo); + mixerVBox->pack_start(*algoHBox); + algoconn = algo->signal_changed().connect ( sigc::mem_fun(*this, &BlackWhite::algoChanged) ); + mixerOrange= Gtk::manage(new Adjuster (/*M("TP_BWMIX_ORANGE")*/"", -100, 200, 1, 33, imgIcon[1])); if (mixerOrange->delay < 50) mixerOrange->delay = 50; mixerOrange->setAdjusterListener (this); @@ -493,6 +509,17 @@ void BlackWhite::read (const ProcParams* pp, const ParamsEdited* pedited) { autoch->set_active (pp->blackwhite.autoc); lastAuto = pp->blackwhite.autoc; + algoconn.block(true); + if (pedited && !pedited->blackwhite.algo) + algo->set_active (2); + else if (pp->blackwhite.algo=="LI") + algo->set_active (0); + else if (pp->blackwhite.algo=="SP") + algo->set_active (1); + algoconn.block(false); + algoChanged(); + + if (pedited) { luminanceCurve->setUnChanged (!pedited->blackwhite.luminanceCurve); beforeCurve->setUnChanged (!pedited->blackwhite.beforeCurve); @@ -581,6 +608,8 @@ void BlackWhite::write (ProcParams* pp, ParamsEdited* pedited) { pedited->blackwhite.beforeCurve = !beforeCurve->isUnChanged (); pedited->blackwhite.beforeCurveMode = beforeCurveMode->get_active_row_number() != 4; pedited->blackwhite.afterCurve = !afterCurve->isUnChanged (); + pedited->blackwhite.algo = algo->get_active_text()!=M("GENERAL_UNCHANGED"); + // pedited->blackwhite.afterCurveMode = afterCurveMode->get_active_row_number() != 1; } if (method->get_active_row_number()==0) @@ -590,10 +619,20 @@ void BlackWhite::write (ProcParams* pp, ParamsEdited* pedited) { else if (method->get_active_row_number()==2) pp->blackwhite.method = "ChannelMixer"; + if (algo->get_active_row_number()==0) + pp->blackwhite.algo = "LI"; + else if (algo->get_active_row_number()==1) + pp->blackwhite.algo = "SP"; + pp->blackwhite.setting = getSettingString(); pp->blackwhite.filter = getFilterString(); } +void BlackWhite::algoChanged () { + if (listener && (multiImage||enabled->get_active()) ) { + listener->panelChanged (EvBWMethodalg, algo->get_active_text ());} +} + void BlackWhite::curveChanged (CurveEditor* ce) { if (listener) { if (ce == beforeCurve) @@ -1045,7 +1084,7 @@ void BlackWhite::updateRGBLabel () { } double mixR, mixG, mixB; Glib::ustring sSetting = getSettingString(); - Color::computeBWMixerConstants(sSetting, getFilterString(), r, g, b, + Color::computeBWMixerConstants(sSetting, getFilterString(),getalgoString(), r, g, b, mixerOrange->getValue(), mixerYellow->getValue(), mixerCyan->getValue(), mixerPurple->getValue(), mixerMagenta->getValue(), autoch->get_active(), enabledcc->get_active(), kcorrec, mixR, mixG, mixB); RGBLabels->set_text( @@ -1095,6 +1134,7 @@ void BlackWhite::setBatchMode (bool batchMode) { beforeCurveMode->append_text (M("GENERAL_UNCHANGED")); afterCurveCEG->setBatchMode (batchMode); // afterCurveMode->append_text (M("GENERAL_UNCHANGED")); + algo->append_text (M("GENERAL_UNCHANGED")); showLuminance(); showFilter(); @@ -1185,6 +1225,8 @@ void BlackWhite::showMixer(int nChannels, bool RGBIsSensitive) { mixerGreen->show(); mixerGreen->set_sensitive (RGBIsSensitive); mixerBlue->show(); mixerBlue->set_sensitive (RGBIsSensitive); filterSep2->hide(); + algo->hide(); + alLabel->hide(); mixerOrange->hide(); mixerYellow->hide(); mixerCyan->hide(); @@ -1197,6 +1239,8 @@ void BlackWhite::showMixer(int nChannels, bool RGBIsSensitive) { mixerBlue->show(); mixerBlue->set_sensitive (true); filterSep2->show(); mixerOrange->show(); + algo->show(); + alLabel->show(); mixerYellow->show(); mixerCyan->show(); mixerMagenta->show(); @@ -1219,6 +1263,15 @@ void BlackWhite::hideGamma() { gammaFrame->hide(); } +Glib::ustring BlackWhite::getalgoString() { + Glib::ustring retVal; + if (algo->get_active_row_number()==0) + retVal = "LI"; + else if (algo->get_active_row_number()==1) + retVal = "SP"; + return retVal; +} + Glib::ustring BlackWhite::getSettingString() { Glib::ustring retVal; if (setting->get_active_row_number()==0) diff --git a/rtgui/blackwhite.h b/rtgui/blackwhite.h index 804a5f569..b6846eefa 100644 --- a/rtgui/blackwhite.h +++ b/rtgui/blackwhite.h @@ -44,6 +44,10 @@ class BlackWhite : public Gtk::VBox, public AdjusterListener, public FoldableToo Gtk::HBox* autoHBox; Gtk::Button* neutral; Gtk::Label* RGBLabels; + MyComboBoxText* algo; + sigc::connection algoconn; + Gtk::Label* alLabel; + Gtk::HBox* algoHBox; Adjuster *mixerRed; Adjuster *mixerGreen; @@ -125,9 +129,12 @@ class BlackWhite : public Gtk::VBox, public AdjusterListener, public FoldableToo bool curveMode1Changed_ (); void curveMode1Changed2 (); bool curveMode1Changed2_ (); + void algoChanged (); Glib::ustring getSettingString (); Glib::ustring getFilterString (); + Glib::ustring getalgoString (); + }; #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 9e552a9e8..00051ce82 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -243,6 +243,7 @@ void ParamsEdited::set (bool v) { blackwhite.afterCurve = v; blackwhite.afterCurveMode = v; blackwhite.autoc = v; + blackwhite.algo = v; resize.scale = v; resize.appliesTo = v; @@ -528,6 +529,7 @@ void ParamsEdited::initFrom (const std::vector blackwhite.afterCurve = blackwhite.afterCurve && p.blackwhite.afterCurve == other.blackwhite.afterCurve; blackwhite.afterCurveMode = blackwhite.afterCurveMode && p.blackwhite.afterCurveMode == other.blackwhite.afterCurveMode; blackwhite.autoc = blackwhite.autoc && p.blackwhite.autoc == other.blackwhite.autoc; + blackwhite.algo = blackwhite.algo && p.blackwhite.algo == other.blackwhite.algo; resize.scale = resize.scale && p.resize.scale == other.resize.scale; resize.appliesTo = resize.appliesTo && p.resize.appliesTo == other.resize.appliesTo; resize.method = resize.method && p.resize.method == other.resize.method; @@ -807,6 +809,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (blackwhite.beforeCurveMode) toEdit.blackwhite.beforeCurveMode = mods.blackwhite.beforeCurveMode; if (blackwhite.afterCurve) toEdit.blackwhite.afterCurve = mods.blackwhite.afterCurve; if (blackwhite.afterCurveMode) toEdit.blackwhite.afterCurveMode = mods.blackwhite.afterCurveMode; + if (blackwhite.algo) toEdit.blackwhite.algo = mods.blackwhite.algo; if (resize.scale) toEdit.resize.scale = mods.resize.scale; if (resize.appliesTo) toEdit.resize.appliesTo = mods.resize.appliesTo; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 3ba0bc8bb..46cf41262 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -384,6 +384,8 @@ class BlackWhiteParamsEdited { bool afterCurve; bool afterCurveMode; bool autoc; + bool algo; + }; class CACorrParamsEdited {