From 0991b0a380033d33c62973ec05d3aa252827e272 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 3 Sep 2021 07:51:31 +0200 Subject: [PATCH] Ciecam - re enable - curve brightness (#6350) * Re enable curve ciecam brighness * Change default tone curve2 to Brightness --- rtengine/improcfun.cc | 128 ++++++++------------------------------- rtengine/procparams.cc | 2 +- rtgui/colorappearance.cc | 8 +-- 3 files changed, 30 insertions(+), 108 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7a9b24eed..b92c5d0d3 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -747,7 +747,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb const bool hasColCurve1 = bool (customColCurve1); const bool t1L = hasColCurve1 && curveMode == ColorAppearanceParams::TcMode::LIGHT; -// const ColorAppearanceParams::TcMode curveMode2 = params->colorappearance.curveMode2; + const ColorAppearanceParams::TcMode curveMode2 = params->colorappearance.curveMode2; const bool hasColCurve2 = bool (customColCurve2); const ColorAppearanceParams::CtcMode curveMode3 = params->colorappearance.curveMode3; @@ -1129,7 +1129,28 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb Qpro = Q; Mpro = M; spro = s; - + bool jp = false; + if ((hasColCurve1) && (curveMode == ColorAppearanceParams::TcMode::BRIGHT)) { + jp = true; + float Qq = Qpro * coefQ; + float Qold = Qpro; + const Brightcurve& userColCurveB1 = static_cast(customColCurve1); + userColCurveB1.Apply(Qq); + Qq = Qq / coefQ; + Qpro = 0.2f * (Qq - Qold) + Qold; + } + if ((hasColCurve2) && (curveMode2 == ColorAppearanceParams::TcMode::BRIGHT)) { + jp = true; + float Qq2 = Qpro * coefQ; + float Qold2 = Qpro; + const Brightcurve& userColCurveB2 = static_cast(customColCurve2); + userColCurveB2.Apply(Qq2); + Qq2 = Qq2 / coefQ; + Qpro = 0.2f * (Qq2 - Qold2) + Qold2; + } + if(jp) { + Jpro = SQR((10.f * Qpro) / wh); + } // we cannot have all algorithms with all chroma curves if (alg == 0) { Jpro = CAMBrightCurveJ[Jpro * 327.68f]; //lightness CIECAM02 + contrast @@ -1216,8 +1237,7 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb } } - if (hasColCurve1) {//curve 1 with Lightness and Brightness - // if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { + if (hasColCurve1 && (curveMode == ColorAppearanceParams::TcMode::LIGHT)) { float Jj = (float) Jpro * 327.68f; float Jold = Jj; float Jold100 = (float) Jpro; @@ -1246,52 +1266,9 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb if (Jpro < 1.f) { Jpro = 1.f; } - // } - /* else if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { - //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algorithms will be different - float coef = ((aw + 4.f) * (4.f / c)) / 100.f; - float Qanc = Qpro; - float Qq = (float) Qpro * 327.68f * (1.f / coef); - float Qold100 = (float) Qpro / coef; - - float Qold = Qq; - float redu = 20.f; - float reduc = 1.f; - - const Brightcurve& userColCurveB1 = static_cast(customColCurve1); - userColCurveB1.Apply(Qq); - - if (Qq > Qold) { - if (Qq < 65535.f) { - if (Qold < 327.68f * redu) { - Qq = 0.25f * (Qq - Qold) + Qold; //divide sensibility - } else { - reduc = LIM((100.f - Qold100) / (100.f - redu), 0.f, 1.f); - Qq = 0.25f * reduc * (Qq - Qold) + Qold; //reduct sensibility in highlights - } - } - } else if (Qq > 10.f) { - Qq = 0.5f * (Qq - Qold) + Qold; - } else if (Qq >= 0.f) { - Qq = 0.7f * (Qq - Qold) + Qold; // not zero ==>artifacts - } - - if (Qold == 0.f) { - Qold = 0.001f; - } - - Qpro = Qanc * (Qq / Qold); - Jpro = SQR ((10.f * Qpro) / wh); - - if (Jpro < 1.f) { - Jpro = 1.f; - } - } - */ } - if (hasColCurve2) {//curve 2 with Lightness and Brightness - // if (curveMode2 == ColorAppearanceParams::TcMode::LIGHT) { + if (hasColCurve2 && (curveMode2 == ColorAppearanceParams::TcMode::LIGHT)) { float Jj = (float) Jpro * 327.68f; float Jold = Jj; float Jold100 = (float) Jpro; @@ -1328,61 +1305,6 @@ void ImProcFunctions::ciecam_02float(CieImage* ncie, float adap, int pW, int pwb if (Jpro < 1.f) { Jpro = 1.f; } - - // } - /* - else if (curveMode2 == ColorAppearanceParams::TcMode::BRIGHT) { // - float Qanc = Qpro; - - float coef = ((aw + 4.f) * (4.f / c)) / 100.f; - float Qq = (float) Qpro * 327.68f * (1.f / coef); - float Qold100 = (float) Qpro / coef; - - float Qold = Qq; - float redu = 20.f; - float reduc = 1.f; - - const Brightcurve& userColCurveB2 = static_cast(customColCurve2); - userColCurveB2.Apply(Qq); - - if (Qq > Qold) { - if (Qq < 65535.f) { - if (Qold < 327.68f * redu) { - Qq = 0.25f * (Qq - Qold) + Qold; //divide sensibility - } else { - reduc = LIM((100.f - Qold100) / (100.f - redu), 0.f, 1.f); - Qq = 0.25f * reduc * (Qq - Qold) + Qold; //reduct sensibility in highlights - } - } - } else if (Qq > 10.f) { - Qq = 0.5f * (Qq - Qold) + Qold; - } else if (Qq >= 0.f) { - Qq = 0.7f * (Qq - Qold) + Qold; // not zero ==>artifacts - } - - if (Qold == 0.f) { - Qold = 0.001f; - } - - Qpro = Qanc * (Qq / Qold); - Jpro = SQR ((10.f * Qpro) / wh); - - if (t1L) { //to workaround the problem if we modify curve1-lightnees after curve2 brightness(the cat that bites its own tail!) in fact it's another type of curve only for this case - coef = 2.f; //adapt Q to J approximation - Qq = (float) Qpro * coef; - Qold = Qq; - const Lightcurve& userColCurveJ1 = static_cast(customColCurve1); - userColCurveJ1.Apply(Qq); - Qq = 0.05f * (Qq - Qold) + Qold; //approximative adaptation - Qpro = (float)(Qq / coef); - Jpro = 100.f * (Qpro * Qpro) / ((4.0f / c) * (4.0f / c) * (aw + 4.0f) * (aw + 4.0f)); - } - - if (Jpro < 1.f) { - Jpro = 1.f; - } - } - */ } if (hasColCurve3) {//curve 3 with chroma saturation colorfullness diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index e737eb2b5..04f71de59 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1427,7 +1427,7 @@ ColorAppearanceParams::ColorAppearanceParams() : DCT_Linear }, curveMode(TcMode::LIGHT), - curveMode2(TcMode::LIGHT), + curveMode2(TcMode::BRIGHT), curveMode3(CtcMode::CHROMA), complexmethod("normal"), modelmethod("16"), diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index a5fc53c2f..bae0c7e11 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -533,8 +533,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" curveEditorG->setCurveListener (this); curveEditorG->setTooltip (M ("TP_COLORAPP_CURVEEDITOR1_TOOLTIP")); - // shape = static_cast (curveEditorG->addCurve (CT_Diagonal, "", toneCurveMode)); - shape = static_cast (curveEditorG->addCurve (CT_Diagonal, "J(J)")); + shape = static_cast (curveEditorG->addCurve (CT_Diagonal, "", toneCurveMode)); + // shape = static_cast (curveEditorG->addCurve (CT_Diagonal, "J(J)")); @@ -549,8 +549,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" curveEditorG2 = new CurveEditorGroup (options.lastToneCurvesDir, M ("TP_COLORAPP_CURVEEDITOR2")); curveEditorG2->setCurveListener (this); - // shape2 = static_cast (curveEditorG2->addCurve (CT_Diagonal, "", toneCurveMode2)); - shape2 = static_cast (curveEditorG2->addCurve (CT_Diagonal, "J(J)")); + shape2 = static_cast (curveEditorG2->addCurve (CT_Diagonal, "", toneCurveMode2)); +// shape2 = static_cast (curveEditorG2->addCurve (CT_Diagonal, "J(J)")); tcmode2conn = toneCurveMode2->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::curveMode2Changed), true );