diff --git a/rtdata/languages/default b/rtdata/languages/default index b518b568d..e0f0a8c39 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1103,6 +1103,7 @@ HISTORY_MSG_863;Local - Contrast Merge Original HISTORY_MSG_864;Local - Contrast Detail HISTORY_MSG_865;Local - Contrast Anchor HISTORY_MSG_867;Local - Contrast Amount residual +HISTORY_MSG_868;Local - balance deltaE C-H HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -2179,6 +2180,7 @@ TP_LOCALLAB_ARTIF_TOOLTIP;Increase deltaE Weakening improve shape detection, but TP_LOCALLAB_AUTOGRAY;Automatic TP_LOCALLAB_AVOID;Avoid color shift TP_LOCALLAB_BALAN;Balance deltaE ab-L +TP_LOCALLAB_BALANH;Balance deltaE C-H TP_LOCALLAB_BALANEXP;PDE balance TP_LOCALLAB_BASELOG;Logarithm base TP_LOCALLAB_BILATERAL;Bilateral filter diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index ac6e66fe1..cedbd5241 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -235,7 +235,7 @@ public: 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, - float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance); + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh); void discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t); void rex_poisson_dct(float * data, size_t nx, size_t ny, double m); void mean_dt(const float * data, size_t size, double * mean_p, double * dt_p); @@ -254,7 +254,7 @@ public: LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread, 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, float balance, float lumask); + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask); //3 functions from Alberto Griggio, adapted J.Desmis 2019 void filmGrain(Imagefloat *rgb, int isogr, int strengr, int scalegr, int bfw, int bfh); @@ -268,7 +268,7 @@ public: LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * transformed, bool retiMasktmap, bool retiMask, 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, float balance, float lumask); + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask); void calc_ref(int sp, LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &chromarefblur, double &lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, float &avg); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index bb1ffca92..8191a31b4 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -192,6 +192,7 @@ struct local_params { float dxx, dyy; float iterat; float balance; + float balanceh; int cir; float thr; float stru; @@ -527,6 +528,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall double local_dxy = locallab.spots.at(sp).iter / 8000.0; //for proxi = 2==> # 1 pixel float iterati = (float) locallab.spots.at(sp).iter; float balanc = (float) locallab.spots.at(sp).balan; + float balanch = (float) locallab.spots.at(sp).balanh; if (iterati > 4.f || iterati < 0.2f) {//to avoid artifacts if user does not clear cache with new settings Can be suppressed after iterati = 2.f; @@ -1020,6 +1022,7 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.shiter = local_shariter; lp.iterat = iterati; lp.balance = balanc; + lp.balanceh = balanch; lp.dxx = w * local_dxy; lp.dyy = h * local_dxy; lp.thr = thre; @@ -2290,6 +2293,18 @@ static void balancedeltaE(float kL, float &kab) kab = abal * kL + bbal; } +static void balancedeltaEH(float kH, float &kch) +{ + float mincurs = 0.3f;//minimum slider balan_ + float maxcurs = 1.7f;//maximum slider balan_ + float maxkab = 1.35;//0.5 * (3 - 0.3) + float minkab = 0.65;//0.5 * (3 - 1.7) + float abal = (maxkab - minkab) / (mincurs - maxcurs); + float bbal = maxkab - mincurs * abal; + kch = abal * kH + bbal; +} + + static void calcreducdE(float dE, float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float &reducdE) { if (dE > maxdE) { @@ -3092,14 +3107,17 @@ static void blendmask(const local_params& lp, int xstart, int ystart, int cx, in } void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* bufcolorig, const float hueref, const float chromaref, const float lumaref, - float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance) + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh) { const float refa = chromaref * cos(hueref); const float refb = chromaref * sin(hueref); const float refL = lumaref; float kL = balance; //lp.balance; float kab = 1.f; + float kH = balanceh; + float kch = 1.f; balancedeltaE(kL, kab); + balancedeltaEH(kH, kch); float reducdE = 1.f; #ifdef _OPENMP @@ -3108,7 +3126,11 @@ void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* buf for (int y = 0; y < bfh; y++) { for (int x = 0; x < bfw; x++) { - float tempdE = sqrt(kab * (SQR(refa - bufcolorig->a[y][x] / 327.68f) + SQR(refb - bufcolorig->b[y][x] / 327.68f)) + kL * SQR(refL - bufcolorig->L[y][x] / 327.68f)); + float chrodelta = 0.5f * SQR(refa - bufcolorig->a[y][x] / 327.68f) + SQR(refb - bufcolorig->b[y][x] / 327.68f); + float hueh = xatan2f(bufcolorig->b[y][x], bufcolorig->a[y][x]); + float huedelta = 125.f * SQR(hueref - hueh); + // float tempdE = sqrt(kab * (SQR(refa - bufcolorig->a[y][x] / 327.68f) + SQR(refb - bufcolorig->b[y][x] / 327.68f)) + kL * SQR(refL - bufcolorig->L[y][x] / 327.68f)); + float tempdE = sqrt(kab * (kch * chrodelta + kH * huedelta) + kL * SQR(refL - bufcolorig->L[y][x] / 327.68f)); if (tempdE > maxdE) { reducdE = 0.f; @@ -4061,7 +4083,7 @@ void ImProcFunctions::maskcalccol(int call, bool invmask, bool pde, int bfw, int std::unique_ptr> rdEBuffer(new JaggedArray(bfw, bfh)); float** rdE = *(rdEBuffer.get()); - deltaEforMask(rdE, bfw, bfh, bufreserv.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, lp.balance); + deltaEforMask(rdE, bfw, bfh, bufreserv.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, lp.balance, lp.balanceh); std::unique_ptr delta(new LabImage(bfw, bfh)); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -6056,7 +6078,11 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag //balance deltaE float kL = lp.balance; float kab = 1.f; + float kH = lp.balanceh; + float kch = 1.f; balancedeltaE(kL, kab); + balancedeltaEH(kH, kch); + kab /= SQR(327.68f); kL /= SQR(327.68f); @@ -6182,7 +6208,12 @@ void ImProcFunctions::transit_shapedetect2(int call, int senstype, const LabImag } //deltaE - const float dE = rsob + sqrt(kab * (SQR(refa - maskptr->a[y][x]) + SQR(refb - maskptr->b[y][x])) + kL * SQR(refL - maskptr->L[y][x])); + float chrodelta = 0.5f * (SQR(refa - maskptr->a[y][x]) + SQR(refb - maskptr->b[y][x])); + float hueh = xatan2f(maskptr->b[y][x], maskptr->a[y][x]); + float huedelta = 125.f * SQR(hueref - hueh); + + // const float dE = rsob + sqrt(kab * (SQR(refa - maskptr->a[y][x]) + SQR(refb - maskptr->b[y][x])) + kL * SQR(refL - maskptr->L[y][x])); + const float dE = rsob + sqrt(kab * (kch * chrodelta + kH * huedelta) + kL * SQR(refL - maskptr->L[y][x])); float reducdE; //reduction action with deltaE calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens, reducdE); @@ -9289,7 +9320,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o std::unique_ptr> rdEBuffer(new JaggedArray(GW, GH)); float** rdE = *(rdEBuffer.get()); - deltaEforMask(rdE, GW, GH, bufgb.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.balance); + deltaEforMask(rdE, GW, GH, bufgb.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.balance, lp.balanceh); std::unique_ptr delta(new LabImage(GW, GH)); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -11554,7 +11585,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o lmaskretilocalcurve, localmaskretiutili, transformed, lp.enaretiMasktmap, lp.enaretiMask, delt, hueref, chromaref, lumaref, - maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance, lumask); + maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance, lp.balanceh, lumask); #ifdef _OPENMP #pragma omp parallel for #endif @@ -11927,7 +11958,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o lmaskretilocalcurve, localmaskretiutili, transformed, lp.enaretiMasktmap, lp.enaretiMask, delt, hueref, chromaref, lumaref, - maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance, lumask); + maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope2, sco, lp.balance, lp.balanceh, lumask); #ifdef _OPENMP #pragma omp parallel for @@ -13449,7 +13480,7 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o std::unique_ptr> rdEBuffer(new JaggedArray(bfw, bfh)); float** rdE = *(rdEBuffer.get()); - deltaEforMask(rdE, bfw, bfh, bufreser.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, mercol, lp.balance); + deltaEforMask(rdE, bfw, bfh, bufreser.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, mercol, lp.balance, lp.balanceh); if (lp.mergecolMethod == 0) { //normal diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index c554b5b84..94b96af94 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -783,7 +783,7 @@ void ImProcFunctions::maskforretinex(int sp, int before, float ** luminance, flo LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, bool multiThread, 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, float balance, float lumask) + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask) { array2D loctemp(W_L, H_L); array2D ble(W_L, H_L); @@ -972,7 +972,7 @@ void ImProcFunctions::maskforretinex(int sp, int before, float ** luminance, flo rdE[i] = &rdEBuffer[i * W_L]; } - deltaEforMask(rdE, W_L, H_L, bufreti, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance); + deltaEforMask(rdE, W_L, H_L, bufreti, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance, balanceh); // printf("rde1=%f rde2=%f\n", rdE[1][1], rdE[100][100]); std::unique_ptr delta(new LabImage(W_L, H_L)); #ifdef _OPENMP @@ -1130,7 +1130,7 @@ void ImProcFunctions::MSRLocal(int call, int sp, bool fftw, int lum, float** red LUTf & lmaskretilocalcurve, bool & localmaskretiutili, LabImage * transformed, bool retiMasktmap, bool retiMask, 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, float balance, float lumask) + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask) { BENCHFUN @@ -1640,7 +1640,7 @@ void ImProcFunctions::MSRLocal(int call, int sp, bool fftw, int lum, float** red lmaskretilocalcurve, localmaskretiutili, bufreti, bufmask, buforig, buforigmas, multiThread, delt, hueref, chromaref, lumaref, - maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance, lumask + maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance, balanceh, lumask ); } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index ecbeb38af..0951cfc62 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -893,6 +893,7 @@ enum ProcEventCode { Evlocallabfatanch = 864, EvlocallabwavCurvecomp = 865, Evlocallabfatres = 866, + EvLocallabSpotbalanh = 867, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4ac20a406..698125b36 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2437,6 +2437,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : thresh(2.0), iter(2.0), balan(1.0), + balanh(1.0), transitweak(1.0), transitgrad(0.0), avoid(false), @@ -2823,6 +2824,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && thresh == other.thresh && iter == other.iter && balan == other.balan + && balanh == other.balanh && transitweak == other.transitweak && transitgrad == other.transitgrad && avoid == other.avoid @@ -4204,6 +4206,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->locallab.spots.at(i).thresh, "Locallab", "Thresh_" + std::to_string(i), spot.thresh, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).iter, "Locallab", "Iter_" + std::to_string(i), spot.iter, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).balan, "Locallab", "Balan_" + std::to_string(i), spot.balan, keyFile); + saveToKeyfile(!pedited || pedited->locallab.spots.at(i).balanh, "Locallab", "Balanh_" + std::to_string(i), spot.balanh, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).transitweak, "Locallab", "Transitweak_" + std::to_string(i), spot.transitweak, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).transitgrad, "Locallab", "Transitgrad_" + std::to_string(i), spot.transitgrad, keyFile); saveToKeyfile(!pedited || pedited->locallab.spots.at(i).avoid, "Locallab", "Avoid_" + std::to_string(i), spot.avoid, keyFile); @@ -5693,6 +5696,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Thresh_" + std::to_string(i), pedited, spot.thresh, spotEdited.thresh); assignFromKeyfile(keyFile, "Locallab", "Iter_" + std::to_string(i), pedited, spot.iter, spotEdited.iter); assignFromKeyfile(keyFile, "Locallab", "Balan_" + std::to_string(i), pedited, spot.balan, spotEdited.balan); + assignFromKeyfile(keyFile, "Locallab", "Balanh_" + std::to_string(i), pedited, spot.balanh, spotEdited.balanh); assignFromKeyfile(keyFile, "Locallab", "Transitweak_" + std::to_string(i), pedited, spot.transitweak, spotEdited.transitweak); assignFromKeyfile(keyFile, "Locallab", "Transitgrad_" + std::to_string(i), pedited, spot.transitgrad, spotEdited.transitgrad); assignFromKeyfile(keyFile, "Locallab", "Avoid_" + std::to_string(i), pedited, spot.avoid, spotEdited.avoid); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 3da6846d7..9b7224114 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -980,6 +980,7 @@ struct LocallabParams { double thresh; double iter; double balan; + double balanh; double transitweak; double transitgrad; bool avoid; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index d459f1c2e..3325be9bf 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -896,7 +896,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabfatdet LUMINANCECURVE, // Evlocallabfatanch LUMINANCECURVE, //EvlocallabwavCurvecomp - LUMINANCECURVE //Evlocallabfatres + LUMINANCECURVE, //Evlocallabfatres + LUMINANCECURVE //EvLocallabSpotbalanh }; namespace rtengine diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index 098f1bd49..68cb6da80 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -69,6 +69,7 @@ ControlSpotPanel::ControlSpotPanel(): thresh_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESDELTAE"), 0.0, 10.0, 0.1, 2.0))), iter_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_PROXI"), 0.2, 10.0, 0.1, 2.0))), balan_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALAN"), 0.2, 2.5, 0.1, 1.0, Gtk::manage(new RTImage("rawtherapee-logo-16.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + balanh_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALANH"), 0.2, 2.5, 0.1, 1.0))), transitweak_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITWEAK"), 0.5, 10.0, 0.1, 1.0))), transitgrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITGRAD"), -1.0, 1.0, 0.01, 0.0))), scopemask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCOPEMASK"), 0, 100, 1, 60))), @@ -375,12 +376,14 @@ ControlSpotPanel::ControlSpotPanel(): artifBox->pack_start(*iter_); - if (complexsoft < 2) { +// if (complexsoft < 2) { artifBox->pack_start(*balan_); - } + artifBox->pack_start(*balanh_); +// } iter_->setAdjusterListener(this); balan_->setAdjusterListener(this); + balanh_->setAdjusterListener(this); artifFrame->add(*artifBox); pack_start(*artifFrame); /* @@ -761,6 +764,7 @@ void ControlSpotPanel::load_ControlSpot_param() thresh_->setValue((double)row[spots_.thresh]); iter_->setValue((double)row[spots_.iter]); balan_->setValue((double)row[spots_.balan]); + balanh_->setValue((double)row[spots_.balanh]); transitweak_->setValue((double)row[spots_.transitweak]); transitgrad_->setValue((double)row[spots_.transitgrad]); scopemask_->setValue((double)row[spots_.scopemask]); @@ -1245,6 +1249,14 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } } + if (a == balanh_) { + row[spots_.balanh] = balanh_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotbalanh, balanh_->getTextValue()); + } + } + if (a == transitweak_) { row[spots_.transitweak] = transitweak_->getValue(); @@ -1521,6 +1533,7 @@ void ControlSpotPanel::disableParamlistener(bool cond) thresh_->block(cond); iter_->block(cond); balan_->block(cond); + balanh_->block(cond); transitweak_->block(cond); transitgrad_->block(cond); scopemask_->block(cond); @@ -1558,6 +1571,7 @@ void ControlSpotPanel::setParamEditable(bool cond) thresh_->set_sensitive(cond); iter_->set_sensitive(cond); balan_->set_sensitive(cond); + balanh_->set_sensitive(cond); transitweak_->set_sensitive(cond); transitgrad_->set_sensitive(cond); scopemask_->set_sensitive(cond); @@ -2203,6 +2217,7 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int id) r->thresh = row[spots_.thresh]; r->iter = row[spots_.iter]; r->balan = row[spots_.balan]; + r->balanh = row[spots_.balanh]; r->transitweak = row[spots_.transitweak]; r->transitgrad = row[spots_.transitgrad]; r->scopemask = row[spots_.scopemask]; @@ -2339,6 +2354,7 @@ void ControlSpotPanel::addControlSpot(SpotRow* newSpot) row[spots_.thresh] = newSpot->thresh; row[spots_.iter] = newSpot->iter; row[spots_.balan] = newSpot->balan; + row[spots_.balanh] = newSpot->balanh; row[spots_.transitweak] = newSpot->transitweak; row[spots_.transitgrad] = newSpot->transitgrad; row[spots_.scopemask] = newSpot->scopemask; @@ -2394,6 +2410,7 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot) row[spots_.thresh] = spot->thresh; row[spots_.iter] = spot->iter; row[spots_.balan] = spot->balan; + row[spots_.balanh] = spot->balanh; row[spots_.transitweak] = spot->transitweak; row[spots_.transitgrad] = spot->transitgrad; row[spots_.scopemask] = spot->scopemask; @@ -2495,6 +2512,7 @@ ControlSpotPanel::SpotEdited* ControlSpotPanel::getEditedStates() se->thresh = thresh_->getEditedState(); se->iter = iter_->getEditedState(); se->balan = balan_->getEditedState(); + se->balanh = balanh_->getEditedState(); se->transitweak = transitweak_->getEditedState(); se->transitgrad = transitgrad_->getEditedState(); se->scopemask = scopemask_->getEditedState(); @@ -2581,6 +2599,7 @@ void ControlSpotPanel::setEditedStates(SpotEdited* se) thresh_->setEditedState(se->thresh ? Edited : UnEdited); iter_->setEditedState(se->iter ? Edited : UnEdited); balan_->setEditedState(se->balan ? Edited : UnEdited); + balanh_->setEditedState(se->balanh ? Edited : UnEdited); transitweak_->setEditedState(se->transitweak ? Edited : UnEdited); transitgrad_->setEditedState(se->transitgrad ? Edited : UnEdited); scopemask_->setEditedState(se->scopemask ? Edited : UnEdited); @@ -2634,6 +2653,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP thresh_->setDefault(defSpot->thresh); iter_->setDefault(defSpot->iter); balan_->setDefault(defSpot->balan); + balanh_->setDefault(defSpot->balanh); transitweak_->setDefault(defSpot->transitweak); transitgrad_->setDefault(defSpot->transitgrad); scopemask_->setDefault(defSpot->scopemask); @@ -2656,6 +2676,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP thresh_->setDefaultEditedState(Irrelevant); iter_->setDefaultEditedState(Irrelevant); balan_->setDefaultEditedState(Irrelevant); + balanh_->setDefaultEditedState(Irrelevant); transitweak_->setDefaultEditedState(Irrelevant); transitgrad_->setDefaultEditedState(Irrelevant); scopemask_->setDefaultEditedState(Irrelevant); @@ -2682,6 +2703,7 @@ void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defP thresh_->setDefaultEditedState(defSpotState->thresh ? Edited : UnEdited); iter_->setDefaultEditedState(defSpotState->iter ? Edited : UnEdited); balan_->setDefaultEditedState(defSpotState->balan ? Edited : UnEdited); + balanh_->setDefaultEditedState(defSpotState->balanh ? Edited : UnEdited); transitweak_->setDefaultEditedState(defSpotState->transitweak ? Edited : UnEdited); transitgrad_->setDefaultEditedState(defSpotState->transitgrad ? Edited : UnEdited); scopemask_->setDefaultEditedState(defSpotState->scopemask ? Edited : UnEdited); @@ -2709,6 +2731,7 @@ void ControlSpotPanel::setBatchMode(bool batchMode) thresh_->showEditedCB(); iter_->showEditedCB(); balan_->showEditedCB(); + balanh_->showEditedCB(); transitweak_->showEditedCB(); transitgrad_->showEditedCB(); scopemask_->showEditedCB(); @@ -2754,6 +2777,7 @@ ControlSpotPanel::ControlSpots::ControlSpots() add(thresh); add(iter); add(balan); + add(balanh); add(transitweak); add(transitgrad); add(scopemask); diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index 59195c638..ec3258a3a 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -64,6 +64,7 @@ public: double thresh; double iter; double balan; + double balanh; double transitweak; double transitgrad; int scopemask; @@ -105,6 +106,7 @@ public: bool thresh; bool iter; bool balan; + bool balanh; bool transitweak; bool transitgrad; bool scopemask; @@ -335,6 +337,7 @@ private: Gtk::TreeModelColumn thresh; Gtk::TreeModelColumn iter; Gtk::TreeModelColumn balan; + Gtk::TreeModelColumn balanh; Gtk::TreeModelColumn transitweak; Gtk::TreeModelColumn transitgrad; Gtk::TreeModelColumn scopemask; @@ -410,6 +413,7 @@ private: Adjuster* const thresh_; Adjuster* const iter_; Adjuster* const balan_; + Adjuster* const balanh_; Adjuster* const transitweak_; Adjuster* const transitgrad_; Adjuster* const scopemask_; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index b50720497..a39513a4b 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -4106,6 +4106,7 @@ void Locallab::read(const rtengine::procparams::ProcParams* pp, const ParamsEdit r->thresh = pp->locallab.spots.at(i).thresh; r->iter = pp->locallab.spots.at(i).iter; r->balan = pp->locallab.spots.at(i).balan; + r->balanh = pp->locallab.spots.at(i).balanh; r->transitweak = pp->locallab.spots.at(i).transitweak; r->transitgrad = pp->locallab.spots.at(i).transitgrad; if (complexsoft == 2) { @@ -4257,6 +4258,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited r->thresh = newSpot->thresh; r->iter = newSpot->iter; r->balan = newSpot->balan; + r->balanh = newSpot->balan; r->transitweak = newSpot->transitweak; r->transitgrad = newSpot->transitgrad; if (complexsoft == 2) { @@ -4496,6 +4498,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited r->thresh = newSpot->thresh; r->iter = newSpot->iter; r->balan = newSpot->balan; + r->balanh = newSpot->balanh; r->transitweak = newSpot->transitweak; r->transitgrad = newSpot->transitgrad; if (complexsoft == 2) { @@ -4634,6 +4637,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).thresh = r->thresh; pp->locallab.spots.at(pp->locallab.selspot).iter = r->iter; pp->locallab.spots.at(pp->locallab.selspot).balan = r->balan; + pp->locallab.spots.at(pp->locallab.selspot).balanh = r->balanh; pp->locallab.spots.at(pp->locallab.selspot).transitweak = r->transitweak; pp->locallab.spots.at(pp->locallab.selspot).transitgrad = r->transitgrad; if (complexsoft == 2) { @@ -5209,6 +5213,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pe->locallab.spots.at(pp->locallab.selspot).scopemask = pe->locallab.spots.at(pp->locallab.selspot).scopemask || se->scopemask; pe->locallab.spots.at(pp->locallab.selspot).lumask = pe->locallab.spots.at(pp->locallab.selspot).lumask || se->lumask; pe->locallab.spots.at(pp->locallab.selspot).balan = pe->locallab.spots.at(pp->locallab.selspot).balan || se->balan; + pe->locallab.spots.at(pp->locallab.selspot).balanh = pe->locallab.spots.at(pp->locallab.selspot).balanh || se->balanh; pe->locallab.spots.at(pp->locallab.selspot).avoid = pe->locallab.spots.at(pp->locallab.selspot).avoid || se->avoid; pe->locallab.spots.at(pp->locallab.selspot).recurs = pe->locallab.spots.at(pp->locallab.selspot).recurs || se->recurs; pe->locallab.spots.at(pp->locallab.selspot).laplac = pe->locallab.spots.at(pp->locallab.selspot).laplac || se->laplac; @@ -5599,6 +5604,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pedited->locallab.spots.at(pp->locallab.selspot).thresh = pedited->locallab.spots.at(pp->locallab.selspot).thresh || se->thresh; pedited->locallab.spots.at(pp->locallab.selspot).iter = pedited->locallab.spots.at(pp->locallab.selspot).iter || se->iter; pedited->locallab.spots.at(pp->locallab.selspot).balan = pedited->locallab.spots.at(pp->locallab.selspot).balan || se->balan; + pedited->locallab.spots.at(pp->locallab.selspot).balanh = pedited->locallab.spots.at(pp->locallab.selspot).balanh || se->balanh; pedited->locallab.spots.at(pp->locallab.selspot).transitweak = pedited->locallab.spots.at(pp->locallab.selspot).transitweak || se->transitweak; pedited->locallab.spots.at(pp->locallab.selspot).transitgrad = pedited->locallab.spots.at(pp->locallab.selspot).transitgrad || se->transitgrad; pedited->locallab.spots.at(pp->locallab.selspot).scopemask = pedited->locallab.spots.at(pp->locallab.selspot).scopemask || se->scopemask; @@ -11803,6 +11809,7 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con se->thresh = spotState->thresh; se->iter = spotState->iter; se->balan = spotState->balan; + se->balanh = spotState->balanh; se->transitweak = spotState->transitweak; se->transitgrad = spotState->transitgrad; se->scopemask = spotState->scopemask; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index f7ebe4c65..3ab734806 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -973,6 +973,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).thresh = locallab.spots.at(j).thresh && pSpot.thresh == otherSpot.thresh; locallab.spots.at(j).iter = locallab.spots.at(j).iter && pSpot.iter == otherSpot.iter; locallab.spots.at(j).balan = locallab.spots.at(j).balan && pSpot.balan == otherSpot.balan; + locallab.spots.at(j).balanh = locallab.spots.at(j).balanh && pSpot.balanh == otherSpot.balanh; locallab.spots.at(j).transitweak = locallab.spots.at(j).transitweak && pSpot.transitweak == otherSpot.transitweak; locallab.spots.at(j).transitgrad = locallab.spots.at(j).transitgrad && pSpot.transitgrad == otherSpot.transitgrad; locallab.spots.at(j).avoid = locallab.spots.at(j).avoid && pSpot.avoid == otherSpot.avoid; @@ -2888,6 +2889,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).balan = mods.locallab.spots.at(i).balan; } + if (locallab.spots.at(i).balanh) { + toEdit.locallab.spots.at(i).balanh = mods.locallab.spots.at(i).balanh; + } + if (locallab.spots.at(i).transitweak) { toEdit.locallab.spots.at(i).transitweak = mods.locallab.spots.at(i).transitweak; } @@ -5255,6 +5260,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : thresh(v), iter(v), balan(v), + balanh(v), transitweak(v), transitgrad(v), avoid(v), @@ -5637,6 +5643,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) thresh = v; iter = v; balan = v; + balanh = v; transitweak = v; transitgrad = v; avoid = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 7cc426aee..e76d09e20 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -407,6 +407,7 @@ public: bool thresh; bool iter; bool balan; + bool balanh; bool transitweak; bool transitgrad; bool avoid;