From 0de7b5bacf8a67a98b3b23cfcffad1b387a15db2 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 1 Nov 2019 11:02:47 +0100 Subject: [PATCH] Change checkbox short circuit to method --- rtdata/languages/default | 7 +++- rtengine/improcfun.h | 2 +- rtengine/iplocallab.cc | 33 ++++++++++++------- rtengine/procevents.h | 1 + rtengine/procparams.cc | 4 +++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 +- rtgui/controlspotpanel.cc | 67 +++++++++++++++++++++++++++++++++++++-- rtgui/controlspotpanel.h | 6 ++++ rtgui/locallab.cc | 35 ++++++++++++++++++++ rtgui/paramsedited.cc | 7 ++++ rtgui/paramsedited.h | 1 + 12 files changed, 150 insertions(+), 17 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 34dac041f..a0b0216e7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1034,6 +1034,7 @@ HISTORY_MSG_793;Local - SH TRC gamma HISTORY_MSG_794;Local - SH TRC slope HISTORY_MSG_795;Local - Mask save restore image HISTORY_MSG_796;Local - Recursive references +HISTORY_MSG_797;Local - Merge and Masks method HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2149,7 +2150,11 @@ TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lig TP_LOCALLAB_SAVREST;Save - Restore Current Image TP_LOCALLAB_SCOPEMASK;Scope Mask DeltaE Image TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area -TP_LOCALLAB_MASFRAME;Mask +TP_LOCALLAB_MASFRAME;Mask and Merge +TP_LOCALLAB_MERGETYPE;Merge image and mask +TP_LOCALLAB_MERGENONE;None +TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask +TP_LOCALLAB_MERGETWO;Original TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and contrast curves and levels contrasts curves are used.\nDisabled in Inverse TP_LOCALLAB_WAMASKCOL;Mask Wavelet level TP_LOCALLAB_CSTHRESHOLDBLUR;Mask Wavelet level diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index d08bea13a..5cfad2e83 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -194,7 +194,7 @@ public: bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, int shado, float amountcd, float anchorcd, LUTf & lmasklocalcurve, bool & localmaskutili, const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, - bool shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, + int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope); void deltaEforMask(float **rdE, int bfw, int bfh, LabImage* bufcolorig, const float hueref, const float chromaref, const float lumaref, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index de402f5d0..e0913b930 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -341,6 +341,7 @@ struct local_params { double expcomp; float expchroma; int excmet; + int mergemet; int war; float adjch; int shapmet; @@ -584,6 +585,14 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.excmet = 1; } + if (locallab.spots.at(sp).mergeMethod == "none") { + lp.mergemet = 0; + } else if (locallab.spots.at(sp).mergeMethod == "short") { + lp.mergemet = 1; + } else if (locallab.spots.at(sp).mergeMethod == "orig") { + lp.mergemet = 2; + } + if (locallab.spots.at(sp).shape == "ELI") { lp.shapmet = 0; } else if (locallab.spots.at(sp).shape == "RECT") { @@ -3140,7 +3149,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, int shado, float amountcd, float anchorcd, LUTf & lmasklocalcurve, bool & localmaskutili, const LocwavCurve & loclmasCurvecolwav, bool & lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, - bool shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, + int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope ) { @@ -3238,7 +3247,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int bufmaskblurcol->a[ir][jr] = CLIPC(kmaskC + kmaskH); bufmaskblurcol->b[ir][jr] = CLIPC(kmaskC + kmaskH); - if (shortcu) { //short circuit all L curve + if (shortcu == 1) { //short circuit all L curve bufmaskblurcol->L[ir][jr] = 32768.f - bufcolorig->L[ir][jr]; } @@ -8250,7 +8259,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool lmasutilicolwav = false; float amountcd = 0.f; float anchorcd = 50.f; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, inv, lp, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, multiThread, @@ -8541,7 +8550,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o float blendm = lp.blendmatm; float lap = params->locallab.spots.at(sp).lapmasktm; float pde = params->locallab.spots.at(sp).laplac; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet;// params->locallab.spots.at(sp).shortc; int lumask = params->locallab.spots.at(sp).lumask; if (!params->locallab.spots.at(sp).enatmMaskaft) { @@ -8588,7 +8597,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool lmasutilicolwav = false; bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; @@ -8790,7 +8799,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool lmasutilicolwav = false; bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; @@ -8940,9 +8949,9 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o // bool delt = params->locallab.spots.at(sp).deltae; bool delt = false; int sco = params->locallab.spots.at(sp).scopemask; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; params->locallab.spots.at(sp).shortc; - const int limscope = 80; + const int limscope = 80;// const float mindE = 2.f + MINSCOPE * sco * lp.thr; const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; @@ -11014,7 +11023,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool delt = params->locallab.spots.at(sp).deltae; int sco = params->locallab.spots.at(sp).scopemask; int shado = 0; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; const int limscope = 80; const float mindE = 2.f + MINSCOPE * sco * lp.thr; @@ -11304,7 +11313,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o bool delt = false; int sco = params->locallab.spots.at(sp).scopemask; int shado = 0; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; @@ -11575,7 +11584,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; @@ -11804,7 +11813,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o // bool delt = params->locallab.spots.at(sp).deltae; bool delt = false; int sco = params->locallab.spots.at(sp).scopemask; - bool shortcu = params->locallab.spots.at(sp).shortc; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; int lumask = params->locallab.spots.at(sp).lumask; const int limscope = 80; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index dd90f1ede..4619d3d97 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -823,6 +823,7 @@ enum ProcEventCode { EvlocallabsloSH = 793, Evlocallabsavrest = 794, Evlocallabrecurs = 795, + EvLocallabSpotmergeMethod = 796, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index dee3baf81..57079a7fc 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2413,6 +2413,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : isvisible(true), shape("ELI"), spotMethod("norm"), + mergeMethod("none"), sensiexclu(12), structexclu(0), struc(4.0), @@ -2722,6 +2723,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && isvisible == other.isvisible && shape == other.shape && spotMethod == other.spotMethod + && mergeMethod == other.mergeMethod && sensiexclu == other.sensiexclu && structexclu == other.structexclu && struc == other.struc @@ -4026,6 +4028,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).isvisible, "Locallab", "Isvisible_" + std::to_string(i), spot.isvisible, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).shape, "Locallab", "Shape_" + std::to_string(i), spot.shape, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).spotMethod, "Locallab", "SpotMethod_" + std::to_string(i), spot.spotMethod, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).mergeMethod, "Locallab", "MergeMethod_" + std::to_string(i), spot.mergeMethod, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).sensiexclu, "Locallab", "SensiExclu_" + std::to_string(i), spot.sensiexclu, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).structexclu, "Locallab", "StructExclu_" + std::to_string(i), spot.structexclu, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).struc, "Locallab", "Struc_" + std::to_string(i), spot.struc, keyFile); @@ -5438,6 +5441,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Isvisible_" + std::to_string(i), pedited, spot.isvisible, spotEdited.isvisible); assignFromKeyfile(keyFile, "Locallab", "Shape_" + std::to_string(i), pedited, spot.shape, spotEdited.shape); assignFromKeyfile(keyFile, "Locallab", "SpotMethod_" + std::to_string(i), pedited, spot.spotMethod, spotEdited.spotMethod); + assignFromKeyfile(keyFile, "Locallab", "MergeMethod_" + std::to_string(i), pedited, spot.mergeMethod, spotEdited.mergeMethod); assignFromKeyfile(keyFile, "Locallab", "ShapeMethod_" + std::to_string(i), pedited, spot.shapeMethod, spotEdited.shapeMethod); assignFromKeyfile(keyFile, "Locallab", "SensiExclu_" + std::to_string(i), pedited, spot.sensiexclu, spotEdited.sensiexclu); assignFromKeyfile(keyFile, "Locallab", "StructExclu_" + std::to_string(i), pedited, spot.structexclu, spotEdited.structexclu); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 6bc3d9714..2ca8dd10b 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -960,6 +960,7 @@ struct LocallabParams { bool isvisible; Glib::ustring shape; // ELI, RECT Glib::ustring spotMethod; // norm, exc + Glib::ustring mergeMethod; // none, short, orig int sensiexclu; int structexclu; double struc; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 5fbdd996c..30d0454d7 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -822,7 +822,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabgamSH LUMINANCECURVE, //EvlocallabsloSH LUMINANCECURVE, //Evlocallabsavrest - LUMINANCECURVE //Evlocallabrecurs + LUMINANCECURVE, //Evlocallabrecurs + LUMINANCECURVE // EvLocallabSpotmergeMethod }; namespace rtengine diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index 67569b0de..69ec4e524 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -50,6 +50,7 @@ ControlSpotPanel::ControlSpotPanel(): spotMethod_(Gtk::manage(new MyComboBoxText())), shapeMethod_(Gtk::manage(new MyComboBoxText())), qualityMethod_(Gtk::manage(new MyComboBoxText())), + mergeMethod_(Gtk::manage(new MyComboBoxText())), sensiexclu_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIEXCLU"), 0, 100, 1, 12))), structexclu_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL"), 0, 100, 1, 0))), @@ -181,7 +182,7 @@ ControlSpotPanel::ControlSpotPanel(): sigc::mem_fun( *this, &ControlSpotPanel::spotMethodChanged)); ctboxspotmethod->pack_start(*spotMethod_); - pack_start(*ctboxspotmethod); +// pack_start(*ctboxspotmethod); excluFrame->set_label_align(0.025, 0.5); if(showtooltip) excluFrame->set_tooltip_text(M("TP_LOCALLAB_EXCLUF_TOOLTIP")); @@ -280,6 +281,21 @@ ControlSpotPanel::ControlSpotPanel(): balan_->setAdjusterListener(this); artifFrame->add(*artifBox); pack_start(*artifFrame); + + Gtk::HBox* const ctboxmergemethod = Gtk::manage(new Gtk::HBox()); + Gtk::Label* const labelmergemethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MERGETYPE") + ":")); + ctboxmergemethod->pack_start(*labelmergemethod, Gtk::PACK_SHRINK, 4); + if(showtooltip) ctboxmergemethod->set_tooltip_markup(M("TP_LOCALLAB_MERGETYPE_TOOLTIP")); + mergeMethod_->append(M("TP_LOCALLAB_MERGENONE")); + mergeMethod_->append(M("TP_LOCALLAB_MERGEONE")); + mergeMethod_->append(M("TP_LOCALLAB_MERGETWO")); + mergeMethod_->set_active(0); + mergeMethodconn_ = mergeMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::mergeMethodChanged)); + ctboxmergemethod->pack_start(*mergeMethod_); +// pack_start(*ctboxmergemethod); + avoidConn_ = avoid_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::avoidChanged)); @@ -304,7 +320,9 @@ ControlSpotPanel::ControlSpotPanel(): sigc::mem_fun(*this, &ControlSpotPanel::savrestChanged)); maskBox->pack_start(*deltae_); maskBox->pack_start(*scopemask_); - maskBox->pack_start(*shortc_); +// maskBox->pack_start(*shortc_); + maskBox->pack_start(*ctboxmergemethod); + maskBox->pack_start(*lumask_); // maskBox->pack_start(*savrest_); maskFrame->add(*maskBox); @@ -594,6 +612,7 @@ void ControlSpotPanel::load_ControlSpot_param() // Load param in selected control spot shape_->set_active(row[spots_.shape]); spotMethod_->set_active(row[spots_.spotMethod]); + mergeMethod_->set_active(row[spots_.mergeMethod]); sensiexclu_->setValue((double)row[spots_.sensiexclu]); structexclu_->setValue((double)row[spots_.structexclu]); struc_->setValue((double)row[spots_.struc]); @@ -691,6 +710,38 @@ void ControlSpotPanel::spotMethodChanged() } } +void ControlSpotPanel::mergeMethodChanged() +{ + // printf("mergeMethodChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + row[spots_.mergeMethod] = mergeMethod_->get_active_row_number(); +/* + // Update Control Spot GUI according to spotMethod_ combobox state (to be compliant with updateParamVisibility function) + if (multiImage && mergeMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { + excluFrame->show(); + } else if (spotMethod_->get_active_row_number() == 0) { // Normal case + excluFrame->hide(); + } else { // Excluding case + excluFrame->show(); + } +*/ + // Raise event + if (listener) { + listener->panelChanged(EvLocallabSpotmergeMethod, mergeMethod_->get_active_text()); + } +} + + void ControlSpotPanel::shapeMethodChanged() { // printf("shapeMethodChanged\n"); @@ -1289,6 +1340,7 @@ void ControlSpotPanel::disableParamlistener(bool cond) buttonvisibilityconn_.block(cond); shapeconn_.block(cond); spotMethodconn_.block(cond); + mergeMethodconn_.block(cond); sensiexclu_->block(cond); structexclu_->block(cond); struc_->block(cond); @@ -1323,6 +1375,7 @@ void ControlSpotPanel::setParamEditable(bool cond) shape_->set_sensitive(cond); spotMethod_->set_sensitive(cond); + mergeMethod_->set_sensitive(cond); sensiexclu_->set_sensitive(cond); structexclu_->set_sensitive(cond); struc_->set_sensitive(cond); @@ -1963,6 +2016,7 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int id) r->isvisible = row[spots_.isvisible]; r->shape = row[spots_.shape]; r->spotMethod = row[spots_.spotMethod]; + r->mergeMethod = row[spots_.mergeMethod]; r->sensiexclu = row[spots_.sensiexclu]; r->structexclu = row[spots_.structexclu]; r->struc = row[spots_.struc]; @@ -2096,6 +2150,7 @@ void ControlSpotPanel::addControlSpot(SpotRow* newSpot) row[spots_.curveid] = 0; // No associated curve row[spots_.shape] = newSpot->shape; row[spots_.spotMethod] = newSpot->spotMethod; + row[spots_.mergeMethod] = newSpot->mergeMethod; row[spots_.sensiexclu] = newSpot->sensiexclu; row[spots_.structexclu] = newSpot->structexclu; row[spots_.struc] = newSpot->struc; @@ -2148,6 +2203,7 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot) row[spots_.isvisible] = spot->isvisible; row[spots_.shape] = spot->shape; row[spots_.spotMethod] = spot->spotMethod; + row[spots_.mergeMethod] = spot->mergeMethod; row[spots_.sensiexclu] = spot->sensiexclu; row[spots_.structexclu] = spot->structexclu; row[spots_.struc] = spot->struc; @@ -2246,6 +2302,7 @@ ControlSpotPanel::SpotEdited* ControlSpotPanel::getEditedStates() se->shape = shape_->get_active_text() != M("GENERAL_UNCHANGED"); se->spotMethod = spotMethod_->get_active_text() != M("GENERAL_UNCHANGED"); + se->mergeMethod = mergeMethod_->get_active_text() != M("GENERAL_UNCHANGED"); se->sensiexclu = sensiexclu_->getEditedState(); se->structexclu = structexclu_->getEditedState(); se->struc = struc_->getEditedState(); @@ -2314,6 +2371,10 @@ void ControlSpotPanel::setEditedStates(SpotEdited* se) spotMethod_->set_active_text(M("GENERAL_UNCHANGED")); } + if (!se->mergeMethod) { + mergeMethod_->set_active_text(M("GENERAL_UNCHANGED")); + } + sensiexclu_->setEditedState(se->sensiexclu ? Edited : UnEdited); structexclu_->setEditedState(se->structexclu ? Edited : UnEdited); struc_->setEditedState(se->struc ? Edited : UnEdited); @@ -2470,6 +2531,7 @@ void ControlSpotPanel::setBatchMode(bool batchMode) // Set batch mode for comboBoxText shape_->append(M("GENERAL_UNCHANGED")); spotMethod_->append(M("GENERAL_UNCHANGED")); + mergeMethod_->append(M("GENERAL_UNCHANGED")); shapeMethod_->append(M("GENERAL_UNCHANGED")); qualityMethod_->append(M("GENERAL_UNCHANGED")); } @@ -2513,6 +2575,7 @@ ControlSpotPanel::ControlSpots::ControlSpots() add(deltae); add(shortc); add(savrest); + add(mergeMethod); } //----------------------------------------------------------------------------- diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index 828d06048..53efa7fe7 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -73,6 +73,7 @@ public: bool deltae; bool shortc; bool savrest; + int mergeMethod; // 0 = None, 1 = short circuit, 2 = original }; /** @@ -111,6 +112,7 @@ public: bool deltae; bool shortc; bool savrest; + bool mergeMethod; }; /** @@ -267,6 +269,7 @@ private: void shapeChanged(); void spotMethodChanged(); void shapeMethodChanged(); + void mergeMethodChanged(); void qualityMethodChanged(); void updateParamVisibility(); void adjusterChanged(Adjuster* a, double newval); @@ -336,6 +339,7 @@ private: Gtk::TreeModelColumn deltae; Gtk::TreeModelColumn shortc; Gtk::TreeModelColumn savrest; + Gtk::TreeModelColumn mergeMethod; // 0 = None, 1 = short cir, 2 = original }; class RenameDialog: @@ -382,6 +386,8 @@ private: sigc::connection shapeMethodconn_; MyComboBoxText* const qualityMethod_; sigc::connection qualityMethodconn_; + MyComboBoxText* const mergeMethod_; + sigc::connection mergeMethodconn_; Adjuster* const sensiexclu_; Adjuster* const structexclu_; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 848865694..feff18792 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -2847,6 +2847,14 @@ void Locallab::read(const ProcParams* pp, const ParamsEdited* pedited) r->spotMethod = 1; } + if (pp->locallab.spots.at(i).mergeMethod == "none") { + r->mergeMethod = 0; + } else if (pp->locallab.spots.at(i).mergeMethod == "short") { + r->mergeMethod = 1; + } else if (pp->locallab.spots.at(i).mergeMethod == "orig") { + r->mergeMethod = 2; + } + r->sensiexclu = pp->locallab.spots.at(i).sensiexclu; r->structexclu = pp->locallab.spots.at(i).structexclu; r->struc = pp->locallab.spots.at(i).struc; @@ -2962,6 +2970,14 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->spotMethod = 1; } + if (newSpot->mergeMethod == "none") { + r->mergeMethod = 0; + } else if (newSpot->mergeMethod == "short") { + r->mergeMethod = 1; + } else if (newSpot->mergeMethod == "orig") { + r->mergeMethod = 2; + } + r->sensiexclu = newSpot->sensiexclu; r->structexclu = newSpot->structexclu; r->struc = newSpot->struc; @@ -3185,6 +3201,14 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->spotMethod = 1; } + if (newSpot->mergeMethod == "none") { + r->mergeMethod = 0; + } else if (newSpot->mergeMethod == "short") { + r->mergeMethod = 1; + } else if (newSpot->mergeMethod == "orig") { + r->mergeMethod = 2; + } + r->sensiexclu = newSpot->sensiexclu; r->structexclu = newSpot->structexclu; r->struc = newSpot->struc; @@ -3325,6 +3349,14 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pp->locallab.spots.at(pp->locallab.selspot).spotMethod = "exc"; } + if (r->mergeMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).mergeMethod = "none"; + } else if (r->mergeMethod == 1) { + pp->locallab.spots.at(pp->locallab.selspot).mergeMethod = "short"; + } else if (r->mergeMethod == 2) { + pp->locallab.spots.at(pp->locallab.selspot).mergeMethod = "orig"; + } + pp->locallab.spots.at(pp->locallab.selspot).sensiexclu = r->sensiexclu; pp->locallab.spots.at(pp->locallab.selspot).structexclu = r->structexclu; pp->locallab.spots.at(pp->locallab.selspot).struc = r->struc; @@ -3743,6 +3775,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pe->locallab.spots.at(pp->locallab.selspot).isvisible = pe->locallab.spots.at(pp->locallab.selspot).isvisible || se->isvisible; pe->locallab.spots.at(pp->locallab.selspot).shape = pe->locallab.spots.at(pp->locallab.selspot).shape || se->shape; pe->locallab.spots.at(pp->locallab.selspot).spotMethod = pe->locallab.spots.at(pp->locallab.selspot).spotMethod || se->spotMethod; + pe->locallab.spots.at(pp->locallab.selspot).mergeMethod = pe->locallab.spots.at(pp->locallab.selspot).mergeMethod || se->mergeMethod; pe->locallab.spots.at(pp->locallab.selspot).sensiexclu = pe->locallab.spots.at(pp->locallab.selspot).sensiexclu || se->sensiexclu; pe->locallab.spots.at(pp->locallab.selspot).structexclu = pe->locallab.spots.at(pp->locallab.selspot).structexclu || se->structexclu; pe->locallab.spots.at(pp->locallab.selspot).struc = pe->locallab.spots.at(pp->locallab.selspot).struc || se->struc; @@ -4061,6 +4094,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) pedited->locallab.spots.at(pp->locallab.selspot).isvisible = pedited->locallab.spots.at(pp->locallab.selspot).isvisible || se->isvisible; pedited->locallab.spots.at(pp->locallab.selspot).shape = pedited->locallab.spots.at(pp->locallab.selspot).shape || se->shape; pedited->locallab.spots.at(pp->locallab.selspot).spotMethod = pedited->locallab.spots.at(pp->locallab.selspot).spotMethod || se->spotMethod; + pedited->locallab.spots.at(pp->locallab.selspot).mergeMethod = pedited->locallab.spots.at(pp->locallab.selspot).mergeMethod || se->mergeMethod; pedited->locallab.spots.at(pp->locallab.selspot).sensiexclu = pedited->locallab.spots.at(pp->locallab.selspot).sensiexclu || se->sensiexclu; pedited->locallab.spots.at(pp->locallab.selspot).structexclu = pedited->locallab.spots.at(pp->locallab.selspot).structexclu || se->structexclu; pedited->locallab.spots.at(pp->locallab.selspot).struc = pedited->locallab.spots.at(pp->locallab.selspot).struc || se->struc; @@ -8788,6 +8822,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con se->isvisible = spotState->isvisible; se->shape = spotState->shape; se->spotMethod = spotState->spotMethod; + se->mergeMethod = spotState->mergeMethod; se->sensiexclu = spotState->sensiexclu; se->structexclu = spotState->structexclu; se->struc = spotState->struc; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 0665834f3..90cbebd29 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -954,6 +954,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).isvisible = locallab.spots.at(j).isvisible && pSpot.isvisible == otherSpot.isvisible; locallab.spots.at(j).shape = locallab.spots.at(j).shape && pSpot.shape == otherSpot.shape; locallab.spots.at(j).spotMethod = locallab.spots.at(j).spotMethod && pSpot.spotMethod == otherSpot.spotMethod; + locallab.spots.at(j).mergeMethod = locallab.spots.at(j).mergeMethod && pSpot.mergeMethod == otherSpot.mergeMethod; locallab.spots.at(j).sensiexclu = locallab.spots.at(j).sensiexclu && pSpot.sensiexclu == otherSpot.sensiexclu; locallab.spots.at(j).structexclu = locallab.spots.at(j).structexclu && pSpot.structexclu == otherSpot.structexclu; locallab.spots.at(j).struc = locallab.spots.at(j).struc && pSpot.struc == otherSpot.struc; @@ -2735,6 +2736,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).spotMethod = mods.locallab.spots.at(i).spotMethod; } + if (locallab.spots.at(i).mergeMethod) { + toEdit.locallab.spots.at(i).mergeMethod = mods.locallab.spots.at(i).mergeMethod; + } + if (locallab.spots.at(i).sensiexclu) { toEdit.locallab.spots.at(i).sensiexclu = mods.locallab.spots.at(i).sensiexclu; } @@ -4861,6 +4866,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : isvisible(v), shape(v), spotMethod(v), + mergeMethod(v), sensiexclu(v), structexclu(v), struc(v), @@ -5167,6 +5173,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) isvisible = v; shape = v; spotMethod = v; + mergeMethod = v; sensiexclu = v; structexclu = v; struc = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f95eb2382..01457ec2f 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -372,6 +372,7 @@ public: bool isvisible; bool shape; bool spotMethod; + bool mergeMethod; bool sensiexclu; bool structexclu; bool struc;