diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 6461cbf26..17228ca9b 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -7414,6 +7414,14 @@ float triangle(float a, float a1, float b) return a1; } +void rgbtone (float& maxval, float& medval, float& minval, LUTf & lutToneCurve) +{ + float minvalold = minval, medvalold = medval, maxvalold = maxval; + + maxval = lutToneCurve[maxvalold]; + minval = lutToneCurve[minvalold]; + medval = minval + ((maxval - minval) * (medvalold - minvalold) / (maxvalold - minvalold)); +} void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * original, LabImage * transformed, LabImage * reserved, int cx, int cy, int oW, int oH, int sk, @@ -11726,6 +11734,8 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o tonemod = 1; } else if (params->locallab.spots.at(sp).toneMethod == "thr") { tonemod = 2; + } else if (params->locallab.spots.at(sp).toneMethod == "fou") { + tonemod = 3; } const int limscope = 80; @@ -11904,6 +11914,32 @@ void ImProcFunctions::Lab_Local(int call, int sp, float** shbuffer, LabImage * o g = CLIP (g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); b = CLIP (b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); } + //Film like Adobe + if (tonemod == 3) { + + if (r >= g) { + if (g > b) { + rgbtone(r, g, b, rgblocalcurve); // Case 1: r >= g > b + } else if (b > r) { + rgbtone(b, r, g, rgblocalcurve); // Case 2: b > r >= g + } else if (b > g) { + rgbtone(r, b, g, rgblocalcurve); // Case 3: r >= b > g + } else { // Case 4: r == g == b + r = rgblocalcurve[r]; + g = rgblocalcurve[g]; + b = g; + } + } else { + if (r >= b) { + rgbtone(g, r, b, rgblocalcurve); // Case 5: g > r >= b + } else if (b > g) { + rgbtone(b, g, r, rgblocalcurve); // Case 6: b > g > r + } else { + rgbtone(g, b, r, rgblocalcurve); // Case 7: g >= b > r + } + } + } + setUnlessOOG(rtemp[y * bfw + x], gtemp[y * bfw + x], btemp[y * bfw + x], r, g, b); } diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index a052401d2..fe4ad34cd 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -164,6 +164,7 @@ Locallab::Locallab(): Lmaskshape(static_cast(mask2CurveEditorG->addCurve(CT_Diagonal, "L(L)"))), llshape(static_cast(llCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), ccshape(static_cast(llCurveEditorG->addCurve(CT_Diagonal, "C(C)"))), + toneMethod(Gtk::manage(new MyComboBoxText())), rgbshape(static_cast(rgbCurveEditorG->addCurve(CT_Diagonal,"",toneMethod))), LHshape(static_cast(HCurveEditorG->addCurve(CT_Flat, "L(H)", nullptr, false, true))), HHshape(static_cast(HCurveEditorG->addCurve(CT_Flat, "H(H)", nullptr, false, true))), @@ -462,7 +463,7 @@ Locallab::Locallab(): // Color & Light qualitycurveMethod(Gtk::manage(new MyComboBoxText())), gridMethod(Gtk::manage(new MyComboBoxText())), - toneMethod(Gtk::manage(new MyComboBoxText())), + // toneMethod(Gtk::manage(new MyComboBoxText())), showmaskcolMethod(Gtk::manage(new MyComboBoxText())), showmaskcolMethodinv(Gtk::manage(new MyComboBoxText())), mergecolMethod(Gtk::manage(new MyComboBoxText())), @@ -622,6 +623,8 @@ Locallab::Locallab(): toneMethod->append(M("TP_EXPOSURE_TCMODE_STANDARD")); toneMethod->append(M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); toneMethod->append(M("TP_EXPOSURE_TCMODE_LUMINANCE")); + toneMethod->append(M("TP_EXPOSURE_TCMODE_FILMLIKE")); + toneMethod->set_active(0); toneMethodConn = toneMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallab::toneMethodChanged)); @@ -3548,6 +3551,8 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).toneMethod = "two"; } else if (toneMethod->get_active_row_number() == 2) { pp->locallab.spots.at(pp->locallab.selspot).toneMethod = "thr"; + } else if (toneMethod->get_active_row_number() == 3) { + pp->locallab.spots.at(pp->locallab.selspot).toneMethod = "fou"; } if (mergecolMethod->get_active_row_number() == 0) { @@ -8666,6 +8671,8 @@ void Locallab::updateLocallabGUI(const rtengine::procparams::ProcParams* pp, con toneMethod->set_active(1); } else if (pp->locallab.spots.at(index).toneMethod == "thr") { toneMethod->set_active(2); + } else if (pp->locallab.spots.at(index).toneMethod == "fou") { + toneMethod->set_active(3); } if (pp->locallab.spots.at(index).mergecolMethod == "one") { diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 32364819d..e921a4860 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -80,6 +80,7 @@ private: DiagonalCurveEditor* const Lmaskshape; DiagonalCurveEditor* const llshape; DiagonalCurveEditor* const ccshape; + MyComboBoxText* const toneMethod; DiagonalCurveEditor* const rgbshape; FlatCurveEditor* const LHshape; FlatCurveEditor* const HHshape; @@ -394,7 +395,7 @@ private: sigc::connection qualitycurveMethodConn; MyComboBoxText* const gridMethod; sigc::connection gridMethodConn; - MyComboBoxText* const toneMethod; +// MyComboBoxText* const toneMethod; sigc::connection toneMethodConn; MyComboBoxText* const showmaskcolMethod; sigc::connection showmaskcolMethodConn;