diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 76556ba1f..640074075 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -37,6 +37,33 @@ using namespace std; +namespace { +void fillCurveArray(const rtengine::DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed) +{ + if (needed) { + for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1) { + // change to [0,1] range + // apply custom/parametric/NURBS curve, if any + outCurve[i] = diagCurve->getVal(i / 65535.f); + } + + // if skip > 1, let apply linear interpolation in the skipped points of the curve + if (skip > 1) { + const float skipmul = 1.f / skip; + + for (int i = 0; i <= 0x10000 - skip; i += skip) { + for (int j = 1; j < skip; j++) { + outCurve[i + j] = (outCurve[i] * (skip - j) + outCurve[i + skip] * j) * skipmul; + } + } + } + + outCurve *= 65535.f; + } else { + outCurve.makeIdentity(); + } +} +} namespace rtengine { bool sanitizeCurve(std::vector& curve) @@ -200,35 +227,6 @@ void Curve::getControlPoint(int cpNum, double &x, double &y) const const double CurveFactory::sRGBGamma = 2.2; const double CurveFactory::sRGBGammaCurve = 2.4; -void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed) -{ - if (needed) { - for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1) { - // change to [0,1] range - float val = (float)i / 65535.f; - // apply custom/parametric/NURBS curve, if any - val = diagCurve->getVal(val); - // store result in a temporary array - outCurve[i] = val; - } - - // if skip>1, let apply linear interpolation in the skipped points of the curve - if (skip > 1) { - float skipmul = 1.f / (float) skip; - - for (int i = 0; i <= 0x10000 - skip; i += skip) { - for (int j = 1; j < skip; j++) { - outCurve[i + j] = (outCurve[i] * (skip - j) + outCurve[i + skip] * j) * skipmul; - } - } - } - - outCurve *= 65535.f; - } else { - outCurve.makeIdentity(); - } -} - void CurveFactory::curveLightBrightColor(const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3, const LUTu & histogram, LUTu & outBeforeCCurveHistogram,//for Luminance const LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma @@ -334,113 +332,34 @@ void CurveFactory::curveBW(const std::vector& curvePointsbw, const std:: } } -// add curve Lab : C=f(L) -void CurveFactory::curveCL(bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip) -{ - clcutili = false; - std::unique_ptr dCurve; - - if (!clcurvePoints.empty() && clcurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(clcurvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (dCurve && !dCurve->isIdentity()) { - clcutili = true; - } - } - - fillCurveArray(dCurve.get(), clCurve, skip, clcutili); -} - -void CurveFactory::mapcurve(bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) +bool CurveFactory::diagonalCurve2Lut(const std::vector& curvePoints, LUTf & curve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) { bool needed = false; std::unique_ptr dCurve; outBeforeCurveHistogram.clear(); bool histNeeded = false; - if (!mapcurvePoints.empty() && mapcurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(mapcurvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (outBeforeCurveHistogram) { - histNeeded = true; - } - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - mapcontlutili = true; - } - } - - if (histNeeded) { - histogram.compressTo(outBeforeCurveHistogram, 32768); - } - - fillCurveArray(dCurve.get(), mapcurve, skip, needed); -} - -void CurveFactory::curveDehaContL(bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) -{ - bool needed = false; - std::unique_ptr dCurve; - outBeforeCurveHistogram.clear(); - bool histNeeded = false; - - if (!dehaclcurvePoints.empty() && dehaclcurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (outBeforeCurveHistogram) { - histNeeded = true; - } - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - dehacontlutili = true; - } - } - - if (histNeeded) { - histogram.compressTo(outBeforeCurveHistogram, 32768); - } - - fillCurveArray(dCurve.get(), dehaclCurve, skip, needed); -} - -// add curve Lab wavelet : Cont=f(L) -void CurveFactory::curveWavContL(bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip) -{ - bool needed = false; - std::unique_ptr dCurve; - - if (!wavclcurvePoints.empty() && wavclcurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - wavcontlutili = true; - } - } - - fillCurveArray(dCurve.get(), wavclCurve, skip, needed); -} - -// add curve Colortoning : C=f(L) and CLf(L) -void CurveFactory::curveToning(const std::vector& curvePoints, LUTf & ToningCurve, int skip) -{ - bool needed = false; - std::unique_ptr dCurve; - if (!curvePoints.empty() && curvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); + + if (outBeforeCurveHistogram) { + histNeeded = true; + } if (dCurve && !dCurve->isIdentity()) { needed = true; } } - fillCurveArray(dCurve.get(), ToningCurve, skip, needed); + if (histNeeded) { + histogram.compressTo(outBeforeCurveHistogram, 32768); + } + + fillCurveArray(dCurve.get(), curve, skip, needed); + return needed; } -bool CurveFactory::curveLocal(const std::vector& curvePoints, LUTf& LocalCurve, int skip) +bool CurveFactory::diagonalCurve2Lut(const std::vector& curvePoints, LUTf& curve, int skip) { bool needed = false; std::unique_ptr dCurve; @@ -453,217 +372,11 @@ bool CurveFactory::curveLocal(const std::vector& curvePoints, LUTf& Loca } } - fillCurveArray(dCurve.get(), LocalCurve, skip, needed); + fillCurveArray(dCurve.get(), curve, skip, needed); return needed; } -void CurveFactory::curveskLocal(bool & localskutili, const std::vector& curvePoints, LUTf & LocalskCurve, int skip) -{ - bool needed = false; - std::unique_ptr dCurve; - -// if (localskutili && !curvePoints.empty() && curvePoints[0] != 0) { - if (!curvePoints.empty() && curvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - localskutili = true; - } - } - - fillCurveArray(dCurve.get(), LocalskCurve, skip, needed); - -} - -void CurveFactory::localLCurve(double br, double contr, /*const std::vector& curvePoints,*/ - LUTu & histogram, LUTf & outCurve, - int skip, bool & utili) -{ - - // curve without contrast - LUTf dcurve(65536, 0); - - // clear array that stores histogram valid before applying the custom curve - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - // check if brightness curve is needed - if (br > 0.00001 || br < -0.00001) { - utili = true; - - std::vector brightcurvePoints; - brightcurvePoints.resize(9); - brightcurvePoints.at(0) = double (DCT_NURBS); - - brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range - brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range - - if (br > 0) { - brightcurvePoints.at(3) = 0.1; // toe point - brightcurvePoints.at(4) = 0.1 + br / 150.0; //value at toe point - - brightcurvePoints.at(5) = 0.7; // shoulder point - brightcurvePoints.at(6) = min(1.0, 0.7 + br / 300.0); //value at shoulder point - } else { - brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point - brightcurvePoints.at(4) = 0.1; // value at toe point - - brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point - brightcurvePoints.at(6) = 0.7; // value at shoulder point - } - - brightcurvePoints.at(7) = 1.; // white point - brightcurvePoints.at(8) = 1.; // value at white point - - DiagonalCurve* brightcurve = new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - // Applying brightness curve - for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow - - // change to [0,1] range - float val = (float)i / 32767.0; - - // apply brightness curve - val = brightcurve->getVal(val); - - // store result in a temporary array - dcurve[i] = val; - } - - delete brightcurve; - } else { - for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow - // set the identity curve in the temporary array - dcurve[i] = (float)i / 32767.0; - } - } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - // check if contrast curve is needed - if (contr > 0.00001 || contr < -0.00001) { - utili = true; - - DiagonalCurve* contrastcurve = NULL; - - // compute mean luminance of the image with the curve applied - int sum = 0; - float avg = 0; - - //float sqavg = 0; - for (int i = 0; i < 32768; i++) { - avg += dcurve[i] * histogram[i]; - //sqavg += dcurve[i]*dcurve[i] * histogram[i]; - sum += histogram[i]; - } - - if (sum) { - avg /= sum; - //sqavg /= sum; - //float stddev = sqrt(sqavg-avg*avg); - // printf("avg=%f\n",avg); - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - std::vector contrastcurvePoints; - contrastcurvePoints.resize(9); - contrastcurvePoints.at(0) = double (DCT_NURBS); - - contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range - - contrastcurvePoints.at(3) = avg - avg * (0.6 - contr / 250.0); // toe point - contrastcurvePoints.at(4) = avg - avg * (0.6 + contr / 250.0); // value at toe point - - contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - contr / 250.0); // shoulder point - contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + contr / 250.0); // value at shoulder point - - contrastcurvePoints.at(7) = 1.; // white point - contrastcurvePoints.at(8) = 1.; // value at white point - - contrastcurve = new DiagonalCurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - } else { - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // sum has an invalid value (next to 0, producing a division by zero, so we create a fake contrast curve, producing a white image - std::vector contrastcurvePoints; - contrastcurvePoints.resize(5); - contrastcurvePoints.at(0) = double (DCT_NURBS); - - contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range - - contrastcurvePoints.at(3) = 1.; // white point - contrastcurvePoints.at(4) = 1.; // value at white point - - contrastcurve = new DiagonalCurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - } - - // apply contrast enhancement - for (int i = 0; i < 32768; i++) { - dcurve[i] = contrastcurve->getVal(dcurve[i]); - } - - delete contrastcurve; - } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - // create a curve if needed - /* DiagonalCurve* tcurve = NULL; - bool histNeeded = false; - if (!curvePoints.empty() && curvePoints[0]!=0) { - tcurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS/skip); - } - if (tcurve && tcurve->isIdentity()) { - delete tcurve; - tcurve = NULL; - } - - if (tcurve) { - utili=true;//if active - - // L values go up to 32767, last stop is for highlight overflow - for (int i=0; i<32768; i++) { - float val; - // apply custom/parametric/NURBS curve, if any - val = tcurve->getVal (dcurve[i]); - - outCurve[i] = (32767.0 * val); - } - } - else - */ - { - // Skip the slow getval method if no curve is used (or an identity curve) - // L values go up to 32767, last stop is for highlight overflow - for (int i = 0; i < 32768; i++) { - outCurve[i] = 32767.0 * dcurve[i]; - } - } - - for (int i = 32768; i < 65536; i++) { - outCurve[i] = (float)i; - } - - // if (tcurve) - // delete tcurve; - -} - - - - - - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & cclutili, const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, @@ -675,7 +388,7 @@ void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili // create a curve if needed if (!acurvePoints.empty() && acurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { autili = true; @@ -684,12 +397,12 @@ void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili fillCurveArray(dCurve.get(), aoutCurve, skip, autili); - dCurve = nullptr; + dCurve.reset(); //----------------------------------------------------- if (!bcurvePoints.empty() && bcurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { butili = true; @@ -698,12 +411,12 @@ void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili fillCurveArray(dCurve.get(), boutCurve, skip, butili); - dCurve = nullptr; + dCurve.reset(); //----------------------------------------------- if (!cccurvePoints.empty() && cccurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { ccutili = true; @@ -712,12 +425,12 @@ void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili fillCurveArray(dCurve.get(), satCurve, skip, ccutili); - dCurve = nullptr; + dCurve.reset(); //---------------------------- if (!lccurvePoints.empty() && lccurvePoints[0] != 0) { - dCurve = std::unique_ptr (new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { cclutili = true; @@ -755,9 +468,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou // clear array that stores histogram valid before applying the custom curve outBeforeCCurveHistogram.clear(); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% std::unique_ptr brightcurve; @@ -787,11 +498,9 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou brightcurvePoints[7] = 1.; // white point brightcurvePoints[8] = 1.; // value at white point - brightcurve = std::unique_ptr (new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip)); + brightcurve.reset(new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip)); } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details float exp_scale = a; float scale = 65536.0; @@ -849,7 +558,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou // curve without contrast LUTf dcurve(0x10000); - //%%%%%%%%%%%%%%%%%%%%%%%%%% // change to [0,1] range shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value. if (black == 0.0) { @@ -889,11 +597,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou dcurve[i] = val; } - brightcurve = nullptr; - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + brightcurve.reset(); // check if contrast curve is needed if (contr > 0.00001 || contr < -0.00001) { @@ -910,7 +614,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou avg /= sum; - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% std::vector contrastcurvePoints(9); contrastcurvePoints[0] = DCT_NURBS; @@ -928,15 +631,12 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou const DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // apply contrast enhancement for (int i = 0; i <= 0xffff; i++) { dcurve[i] = contrastcurve.getVal(dcurve[i]); } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // create second curve if needed bool histNeeded = false; customToneCurve2.Reset(); @@ -953,10 +653,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // create first curve if needed customToneCurve1.Reset(); @@ -972,8 +668,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - #ifdef __SSE2__ vfloat gamma_v = F2V(gamma_); vfloat startv = F2V(start); @@ -1076,8 +770,6 @@ void CurveFactory::Curvelocalhl(double ecomp, double hlcompr, double hlcomprthre } } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double cont, double lumare, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTf & lightCurveloc, float avg, @@ -1091,8 +783,6 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, const float add = 0.0954f; float maxran = 65536.f; //65536 -// ecomp /= 100.; - // check if brightness curve is needed if (br > 0.00001 || br < -0.00001) { // utili = true; @@ -1124,7 +814,6 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, brightcurvePoints.at(8) = 1.; // value at white point DiagonalCurve brightcurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Applying brightness curve for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow @@ -1138,9 +827,6 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, // store result in a temporary array lightCurveloc[i] = val; } - - - } else { lightCurveloc.makeIdentity(32767.f); } @@ -1151,42 +837,21 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, int k = avg * 32768; avg = lightCurveloc[k]; - // printf("avg=%f lumaref=%f\n", avg, lumare/100.f); std::vector contrastcurvePoints; - bool lumm = true; + contrastcurvePoints.resize(9); + contrastcurvePoints.at(0) = double (DCT_NURBS); - if (lumm) { - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - contrastcurvePoints.resize(9); - contrastcurvePoints.at(0) = double (DCT_NURBS); + contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range + contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range + contrastcurvePoints.at(3) = avg - avg * (0.6 - cont / 250.0); // toe point + contrastcurvePoints.at(4) = avg - avg * (0.6 + cont / 250.0); // value at toe point - contrastcurvePoints.at(3) = avg - avg * (0.6 - cont / 250.0); // toe point - contrastcurvePoints.at(4) = avg - avg * (0.6 + cont / 250.0); // value at toe point + contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - cont / 250.0); // shoulder point + contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + cont / 250.0); // value at shoulder point - contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - cont / 250.0); // shoulder point - contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + cont / 250.0); // value at shoulder point - - contrastcurvePoints.at(7) = 1.; // white point - contrastcurvePoints.at(8) = 1.; // value at white point - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - } else { - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // sum has an invalid value (next to 0, producing a division by zero, so we create a fake contrast curve, producing a white image - contrastcurvePoints.resize(5); - contrastcurvePoints.at(0) = double (DCT_NURBS); - - contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range - - contrastcurvePoints.at(3) = 1.; // white point - contrastcurvePoints.at(4) = 1.; // value at white point - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - } + contrastcurvePoints.at(7) = 1.; // white point + contrastcurvePoints.at(8) = 1.; // value at white point DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); @@ -1203,19 +868,12 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, lightCurveloc[i] = (float)i; } - // a: slope of the curve, black: starting point at the x axis const float a = powf(2.0f, ecomp); - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details float exp_scale = a; -// float scale = 65536.0; float scale = maxran; float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0; float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1; @@ -1269,11 +927,9 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, } - // curve without contrast LUTf dcurve(maxran); - //%%%%%%%%%%%%%%%%%%%%%%%%%% // change to [0,1] range shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value. if (black == 0.0) { @@ -1282,32 +938,22 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, const float val = 1.f / (maxran - 1.f); shCurve[0] = simplebasecurve(val, black, 0.015 * shcompr) / val; } - - - - // gamma correction + // gamma correction float val = Color::gammatab_bt709[0] / maxran; // store result in a temporary array dcurve[0] = LIM01(val); for (int i = 1; i < maxran; i++) { - float val = i / (maxran - 1.f); - -// float val2 = simplebasecurve(val, black, 0.015 * shcompr); -// shCurve[i] = val2 / val; if (black != 0.0) { - const float val = i / 65535.f; - shCurve[i] = simplebasecurve(val, black, 0.015 * shcompr) / val; + const float bval = i / 65535.f; + shCurve[i] = simplebasecurve(bval, black, 0.015 * shcompr) / bval; } // gamma correction - val = Color::gammatab_bt709[i] / maxran; - // store result in a temporary array - dcurve[i] = val; + dcurve[i] = Color::gammatab_bt709[i] / maxran; } - #ifdef __SSE2__ vfloat gamma_v = F2V(gamma_); vfloat startv = F2V(start); @@ -1322,23 +968,13 @@ void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, valv = igamma(valv, gamma_v, startv, slopev, mulv, addv); STVFU(outCurve[i], c65535v * valv); } - #else - for (int i = 0; i <= (maxran - 1.f); i++) { - float val = dcurve[i]; - val = igamma(val, gamma_, start, slope, mul, add); - outCurve[i] = ((maxran - 1.) * val); + outCurve[i] = (maxran - 1.f) * igamma(dcurve[i], gamma_, start, slope, mul, add); } - #endif - } - - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - void CurveFactory::complexLCurve(double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili) @@ -1351,9 +987,7 @@ void CurveFactory::complexLCurve(double br, double contr, const std::vector1), hr,sr: highlight,shadow recovery - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // check if brightness curve is needed if (br > 0.00001 || br < -0.00001) { @@ -1384,7 +1018,6 @@ void CurveFactory::complexLCurve(double br, double contr, const std::vector 0.00001 || contr < -0.00001) { utili = true; @@ -1425,7 +1054,6 @@ void CurveFactory::complexLCurve(double br, double contr, const std::vector tcurve; bool histNeeded = false; if (!curvePoints.empty() && curvePoints[0] != 0) { - tcurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); + tcurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeCCurveHistogram) { histNeeded = true; } } - if (tcurve && tcurve->isIdentity()) { - tcurve = nullptr; - } - - if (tcurve) { + if (tcurve && !tcurve->isIdentity()) { utili = true; //if active // L values go up to 32767, last stop is for highlight overflow @@ -1500,7 +1117,7 @@ void CurveFactory::complexLCurve(double br, double contr, const std::vectorgetVal(outCurve[i]); - outCurve[i] = (32767.f * val); + outCurve[i] = 32767.f * val; } } else { @@ -1515,15 +1132,11 @@ void CurveFactory::complexLCurve(double br, double contr, const std::vector& curvePoints, LUTf & outCurve, int skip) { @@ -1531,14 +1144,10 @@ void CurveFactory::RGBCurve(const std::vector& curvePoints, LUTf & outCu std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] != 0) { - tcurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); + tcurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); } - if (tcurve && tcurve->isIdentity()) { - tcurve = nullptr; - } - - if (tcurve) { + if (tcurve && !tcurve->isIdentity()) { if (!outCurve) { outCurve(65536, 0); } @@ -1555,7 +1164,6 @@ void CurveFactory::RGBCurve(const std::vector& curvePoints, LUTf & outCu } } - LocretigainCurverab::LocretigainCurverab() : sum(0.f) {}; void LocretigainCurverab::Reset() @@ -3026,18 +2634,13 @@ void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili) std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = std::unique_ptr (new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); + tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); tcurve->setIdentityValue(0.); - } - - if (tcurve) { Set(tcurve.get()); opautili = true; - tcurve = nullptr; } } - WavCurve::WavCurve() : sum(0.f) {} void WavCurve::Reset() @@ -3464,10 +3067,7 @@ void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const do std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = std::unique_ptr (new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); - } - - if (tcurve) { + tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); SetXYZ(tcurve.get(), xyz_rgb, satur, lumin); } } @@ -3555,10 +3155,7 @@ void ColorGradientCurve::SetRGB(const std::vector &curvePoints) std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = std::unique_ptr (new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); - } - - if (tcurve) { + tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); SetRGB(tcurve.get()); } } diff --git a/rtengine/curves.h b/rtengine/curves.h index 9adf525cc..8800e54db 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -367,23 +367,13 @@ public: static void curveBW(const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip); - static void curveCL(bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip); - - static void curveWavContL(bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip); - static void curveDehaContL(bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); - static void mapcurve(bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); - - static void curveToning(const std::vector& curvePoints, LUTf & ToningCurve, int skip); - - static bool curveLocal(const std::vector& curvePoints, LUTf& LocalCurve, int skip); - static void curveskLocal(bool & localskutili, const std::vector& curvePoints, LUTf & LocalskCurve, int skip); + static bool diagonalCurve2Lut(const std::vector& curvePoints, LUTf& curve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); + static bool diagonalCurve2Lut(const std::vector& curvePoints, LUTf& curve, int skip); static void complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & clcutili, const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, int skip = 1); - static void localLCurve(double br, double contr,/* const std::vector& curvePoints,*/ LUTu & histogram, LUTf & outCurve, int skip, bool & utili); - static void updatechroma( const std::vector& cccurvePoints, LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index ca2e12850..c89d2bdb0 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -974,22 +974,22 @@ void Crop::update(int todo) const bool loccompwavutili = loccompwavCurve.Set(params.locallab.spots.at(sp).loccompwavcurve); const bool loccomprewavutili = loccomprewavCurve.Set(params.locallab.spots.at(sp).loccomprewavcurve); const bool locedgwavutili = locedgwavCurve.Set(params.locallab.spots.at(sp).locedgwavcurve); - const bool locallutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).llcurve, lllocalcurve2, skip); - const bool localclutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).clcurve, cllocalcurve2, skip); - const bool locallcutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).lccurve, lclocalcurve2, skip); - const bool localrgbutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).rgbcurve, rgblocalcurve2, skip); - const bool localcutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).cccurve, cclocalcurve2, skip); - const bool localexutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).excurve, exlocalcurve2, skip); - const bool localmaskutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve2, skip); - const bool localmaskexputili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve2, skip); - const bool localmaskSHutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve2, skip); - const bool localmaskvibutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve2, skip); - const bool localmasktmutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve2, skip); - const bool localmaskretiutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve2, skip); - const bool localmaskcbutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve2, skip); - const bool localmasklcutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve2, skip); - const bool localmaskblutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve2, skip); - const bool localmask_utili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve2, skip); + const bool locallutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).llcurve, lllocalcurve2, skip); + const bool localclutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).clcurve, cllocalcurve2, skip); + const bool locallcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).lccurve, lclocalcurve2, skip); + const bool localrgbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).rgbcurve, rgblocalcurve2, skip); + const bool localcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).cccurve, cclocalcurve2, skip); + const bool localexutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).excurve, exlocalcurve2, skip); + const bool localmaskutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve2, skip); + const bool localmaskexputili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve2, skip); + const bool localmaskSHutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve2, skip); + const bool localmaskvibutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve2, skip); + const bool localmasktmutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve2, skip); + const bool localmaskretiutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve2, skip); + const bool localmaskcbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve2, skip); + const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve2, skip); + const bool localmaskblutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve2, skip); + const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve2, skip); double ecomp = params.locallab.spots.at(sp).expcomp; double black = params.locallab.spots.at(sp).black; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 011d7fa9a..aa8770504 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -876,8 +876,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) {wprof[2][0], wprof[2][1], wprof[2][2]} }; params->colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, opautili); - CurveFactory::curveToning(params->colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); - CurveFactory::curveToning(params->colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); + CurveFactory::diagonalCurve2Lut(params->colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); + CurveFactory::diagonalCurve2Lut(params->colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); } if (params->blackwhite.enabled) { @@ -1005,7 +1005,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (todo & M_LUMACURVE) { - CurveFactory::curveCL(clcutili, params->labCurve.clcurve, clcurve, scale == 1 ? 1 : 16); + clcutili = CurveFactory::diagonalCurve2Lut(params->labCurve.clcurve, clcurve, scale == 1 ? 1 : 16); CurveFactory::complexsgnCurve(autili, butili, ccutili, cclutili, params->labCurve.acurve, params->labCurve.bcurve, params->labCurve.cccurve, params->labCurve.lccurve, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, scale == 1 ? 1 : 16); @@ -1108,22 +1108,22 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) const bool locwavdenutili = locwavCurveden.Set(params->locallab.spots.at(sp).locwavcurveden); const bool locedgwavutili = locedgwavCurve.Set(params->locallab.spots.at(sp).locedgwavcurve); const bool lmasutili_wav = loclmasCurve_wav.Set(params->locallab.spots.at(sp).LLmask_curvewav); - const bool locallutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).llcurve, lllocalcurve, sca); - const bool localclutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).clcurve, cllocalcurve, sca); - const bool locallcutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).lccurve, lclocalcurve, sca); - const bool localcutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).cccurve, cclocalcurve, sca); - const bool localrgbutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).rgbcurve, rgblocalcurve, sca); - const bool localexutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).excurve, exlocalcurve, sca); - const bool localmaskutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, sca); - const bool localmaskexputili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, sca); - const bool localmaskSHutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, sca); - const bool localmaskvibutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve, sca); - const bool localmasktmutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, sca); - const bool localmaskretiutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, sca); - const bool localmaskcbutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, sca); - const bool localmaskblutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, sca); - const bool localmasklcutili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, sca); - const bool localmask_utili = CurveFactory::curveLocal(params->locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, sca); + const bool locallutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).llcurve, lllocalcurve, sca); + const bool localclutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).clcurve, cllocalcurve, sca); + const bool locallcutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).lccurve, lclocalcurve, sca); + const bool localcutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).cccurve, cclocalcurve, sca); + const bool localrgbutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).rgbcurve, rgblocalcurve, sca); + const bool localexutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).excurve, exlocalcurve, sca); + const bool localmaskutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, sca); + const bool localmaskexputili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, sca); + const bool localmaskSHutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, sca); + const bool localmaskvibutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve, sca); + const bool localmasktmutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, sca); + const bool localmaskretiutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, sca); + const bool localmaskcbutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, sca); + const bool localmaskblutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, sca); + const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, sca); + const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, sca); double ecomp = params->locallab.spots.at(sp).expcomp; double black = params->locallab.spots.at(sp).black; double hlcompr = params->locallab.spots.at(sp).hlcompr; @@ -1275,9 +1275,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } - - wavcontlutili = false; - CurveFactory::curveWavContL(wavcontlutili, params->wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); + wavcontlutili = CurveFactory::diagonalCurve2Lut(params->wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 018649bf2..08e027306 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -387,7 +387,7 @@ public: void Eval2(const float* const* WavCoeffs_L, int level, int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, int numThreads); void calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs); - + std::unique_ptr buildMeaLut(const float inVals[11], const float mea[10], float& lutFactor); void Aver(const float* HH_Coeffs, int datalen, float &averagePlus, float &averageNeg, float &max, float &min, int numThreads); void Sigma(const float* HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg, int numThreads); void calckoe(const float* const* WavCoeffs_LL, float gradw, float tloww, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float &maxkoeLi, float **tmC = nullptr); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 82b8b66f2..6813ddfeb 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -69,42 +69,6 @@ constexpr int TS = 64; // Tile size constexpr float epsilonw = 0.001f / (TS * TS); //tolerance constexpr int offset = 25; // shift between tiles -std::unique_ptr buildMeaLut(const float inVals[11], const float mea[10], float& lutFactor) -{ - constexpr int lutSize = 100; - - const float lutMax = std::ceil(mea[9]); - const float lutDiff = lutMax / lutSize; - - std::vector lutVals(lutSize); - int jStart = 1; - for (int i = 0; i < lutSize; ++i) { - const float val = i * lutDiff; - if (val < mea[0]) { - // still < first value => no interpolation - lutVals[i] = inVals[0]; - } else { - for (int j = jStart; j < 10; ++j) { - if (val == mea[j]) { - // exact match => no interpolation - lutVals[i] = inVals[j]; - ++jStart; - break; - } - if (val < mea[j]) { - // interpolate - const float dist = (val - mea[j - 1]) / (mea[j] - mea[j - 1]); - lutVals[i] = rtengine::intp(dist, inVals[j], inVals[j - 1]); - break; - } - lutVals[i] = inVals[10]; - } - } - } - lutFactor = 1.f / lutDiff; - return std::unique_ptr(new LUTf(lutVals)); -} - constexpr float clipLoc(float x) { return rtengine::LIM(x, 0.f, 32767.f); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 949dbafbd..9b9a9612e 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -50,6 +50,8 @@ #endif #include "cplx_wavelet_dec.h" +#define BENCHMARK +#include "StopWatch.h" namespace rtengine { @@ -162,6 +164,41 @@ struct cont_params { int wavNestedLevels = 1; +std::unique_ptr ImProcFunctions::buildMeaLut(const float inVals[11], const float mea[10], float& lutFactor) +{ + constexpr int lutSize = 100; + + const float lutMax = std::ceil(mea[9]); + const float lutDiff = lutMax / lutSize; + + std::vector lutVals(lutSize); + int jStart = 1; + for (int i = 0; i < lutSize; ++i) { + const float val = i * lutDiff; + if (val < mea[0]) { + // still < first value => no interpolation + lutVals[i] = inVals[0]; + } else { + for (int j = jStart; j < 10; ++j) { + if (val == mea[j]) { + // exact match => no interpolation + lutVals[i] = inVals[j]; + ++jStart; + break; + } + if (val < mea[j]) { + // interpolate + const float dist = (val - mea[j - 1]) / (mea[j] - mea[j - 1]); + lutVals[i] = rtengine::intp(dist, inVals[j], inVals[j - 1]); + break; + } + lutVals[i] = inVals[10]; + } + } + } + lutFactor = 1.f / lutDiff; + return std::unique_ptr(new LUTf(lutVals)); +} void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) @@ -1974,6 +2011,7 @@ void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition& WaveletCoeffs_ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_L, const Wavblcurve & wavblcurve, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { + BENCHFUN const int maxlvl = WaveletCoeffs_L.maxlevel(); const int W_L = WaveletCoeffs_L.level_W(0); const int H_L = WaveletCoeffs_L.level_H(0); @@ -2129,10 +2167,6 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } } -// - int n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n32; - n0 = n1 = n2 = n3 = n4 = n5 = n6 = n7 = n8 = n9 = n10 = n32 = 0; - float *koeLi[12]; const std::unique_ptr koeLibuffer(new float[12 * H_L * W_L]()); @@ -2281,13 +2315,14 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * for (int i = 0; i < 500; i++) { if (wavblcurve[i] != 0.) { wavcurvecomp = true; + break; } } } + std::unique_ptr aft; #ifdef _OPENMP - // #pragma omp for schedule(dynamic) collapse(2) - #pragma omp for reduction(+:n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n32) schedule(dynamic) collapse(2) + #pragma omp for schedule(dynamic) collapse(2) #endif for (int dir = 1; dir < 4; dir++) { @@ -2299,85 +2334,37 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); ContAllL(koeLi, maxkoeLi[lvl * 3 + dir - 1], true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveSH, ChCurve, Chutili); - int minWL = min(Wlvl_L, Hlvl_L); - if(minWL > 180) { + if (std::min(Wlvl_L, Hlvl_L) > 180) { if (wavblcurve && wavcurvecomp && cp.blena) { // printf("Blur level L\n"); float mea[10]; const float effect = cp.bluwav; constexpr float offs = 1.f; - float * beta = new float[Wlvl_L * Hlvl_L]; - calceffect(lvl, mean, sigma, mea, effect, offs); - - float * bef = new float[Wlvl_L * Hlvl_L]; - float * aft = new float[Wlvl_L * Hlvl_L]; - - for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { - bef[co] = WavCoeffs_L[dir][co]; - float WavCL = std::fabs(WavCoeffs_L[dir][co]); - - if (WavCL < mea[0]) { - beta[co] = 0.05f; - n0++; - - if (WavCL < 32.7) { - n32++; - } - } else if (WavCL < mea[1]) { - beta[co] = 0.2f; - n1++; - } else if (WavCL < mea[2]) { - beta[co] = 0.7f; - n2++; - } else if (WavCL < mea[3]) { - beta[co] = 1.f; //standard - n3++; - } else if (WavCL < mea[4]) { - beta[co] = 1.f; - n4++; - } else if (WavCL < mea[5]) { - beta[co] = 0.8f; //+sigma - n5++; - } else if (WavCL < mea[6]) { - beta[co] = 0.6f; - n6++; - } else if (WavCL < mea[7]) { - beta[co] = 0.4f; - n7++; - } else if (WavCL < mea[8]) { - beta[co] = 0.2f; // + 2 sigma - n8++; - } else if (WavCL < mea[9]) { - beta[co] = 0.1f; - n9++; - } else { - beta[co] = 0.01f; - n10++; - } - - + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.6f, 0.4f, 0.2f, 0.1f, 0.01f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + if (!aft.get()) { + aft.reset(new float[Wlvl_L * Hlvl_L]); } - if (settings->verbose) { - printf("lvl=%i n0=%i n32=%i n1=%i n2=%i n3=%i n4=%i n5=%i n6=%i n7=%i n8=%i n9=%i n10=%i\n", lvl, n0, n0 - n32, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); + //blur level + const float klev = wavblcurve[lvl * 55.5f] * 80.f / skip; + auto WavL = WavCoeffs_L[dir]; + boxblur(WavL, aft.get(), klev, Wlvl_L, Hlvl_L, false); + + int co = 0; +#ifdef __SSE2__ + const vfloat lutFactorv = F2V(lutFactor); + for (; co < Hlvl_L * Wlvl_L - 3; co += 4) { + const vfloat valv = LVFU(WavL[co]); + STVFU(WavL[co], intp((*meaLut)[vabsf(valv) * lutFactorv], LVFU(aft[co]), valv)); } - - float klev = (wavblcurve[lvl * 55.5f]); - - //blur level - klev *= 80.f / skip; - boxblur(bef, aft, klev, Wlvl_L, Hlvl_L, false); - - for (int co = 0; co < Hlvl_L * Wlvl_L; co++) { - aft[co] = bef[co] * (1.f - beta[co]) + aft[co] * beta[co]; - WavCoeffs_L[dir][co] = aft[co]; +#endif + for (; co < Hlvl_L * Wlvl_L; co++) { + WavL[co] = intp((*meaLut)[std::fabs(WavL[co]) * lutFactor], aft[co], WavL[co]); } - - delete[] bef; - delete[] aft; - delete[] beta; } } } @@ -2454,7 +2441,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition& WaveletCoeffs_a, void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_ab, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab) { - +BENCHFUN int maxlvl = WaveletCoeffs_ab.maxlevel(); int W_L = WaveletCoeffs_ab.level_W(0); int H_L = WaveletCoeffs_ab.level_H(0); @@ -2594,10 +2581,12 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float for (int i = 0; i < 500; i++) { if (wavblcurve[i] != 0.) { wavcurvecomp = true; + break; } } } + std::unique_ptr aft; #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2610,85 +2599,44 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA, meanab, sigmaab); - int minWL = min(Wlvl_ab, Hlvl_ab); - if(minWL > 180) { + if(std::min(Wlvl_ab, Hlvl_ab) > 180) { if (wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { - float mea[10]; - float effect = cp.bluwav; - float offs = 1.f; - float * beta = new float[Wlvl_ab * Hlvl_ab]; - - for (int co = 0; co < Wlvl_ab * Hlvl_ab; co++) { - beta[co] = 1.f; - } - + const float effect = cp.bluwav; + constexpr float offs = 1.f; calceffect(lvl, meanab, sigmaab, mea, effect, offs); + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.6f, 0.4f, 0.2f, 0.1f, 0.00f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); - float * bef = new float[Wlvl_ab * Hlvl_ab]; - float * aft = new float[Wlvl_ab * Hlvl_ab]; - float klev; - - for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { - bef[co] = WavCoeffs_ab[dir][co]; - float WavCab = std::fabs(WavCoeffs_ab[dir][co]); - - if (WavCab < mea[0]) { - beta[co] = 0.05f; - } else if (WavCab < mea[1]) { - beta[co] = 0.2f; - } else if (WavCab < mea[2]) { - beta[co] = 0.7f; - } else if (WavCab < mea[3]) { - beta[co] = 1.f; //standard - } else if (WavCab < mea[4]) { - beta[co] = 1.f; - } else if (WavCab < mea[5]) { - beta[co] = 0.8f; //+sigma - } else if (WavCab < mea[6]) { - beta[co] = 0.6f; - } else if (WavCab < mea[7]) { - beta[co] = 0.4f; - } else if (WavCab < mea[8]) { - beta[co] = 0.2f; // + 2 sigma - } else if (WavCab < mea[9]) { - beta[co] = 0.1f; - } else { - beta[co] = 0.0f; - } - - + if (!aft.get()) { + aft.reset(new float[Wlvl_ab * Hlvl_ab]); } - klev = (wavblcurve[lvl * 55.5f]); + //blur level + const float klev = wavblcurve[lvl * 55.5f] * 80.f / skip; + boxblur(WavCoeffs_ab[dir], aft.get(), klev, Wlvl_ab, Hlvl_ab, false); - klev *= cp.chrwav * 80.f / skip; - - boxblur(bef, aft, klev, Wlvl_ab, Hlvl_ab, false); - - for (int co = 0; co < Hlvl_ab * Wlvl_ab; co++) { - aft[co] = bef[co] * (1.f - beta[co]) + aft[co] * beta[co]; - WavCoeffs_ab[dir][co] = aft[co]; + auto WavAb = WavCoeffs_ab[dir]; + int co = 0; +#ifdef __SSE2__ + const vfloat lutFactorv = F2V(lutFactor); + for (; co < Hlvl_ab * Wlvl_ab - 3; co += 4) { + const vfloat valv = LVFU(WavAb[co]); + STVFU(WavAb[co], intp((*meaLut)[vabsf(valv) * lutFactorv], LVFU(aft[co]), valv)); + } +#endif + for (; co < Hlvl_ab * Wlvl_ab; co++) { + WavAb[co] = intp((*meaLut)[std::fabs(WavAb[co]) * lutFactor], aft[co], WavAb[co]); } - - delete[] bef; - delete[] aft; - delete[] beta; } } - } } - - } } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -//void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const cont_params& cp, float *koeLi[12], int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC) void ImProcFunctions::calckoe (const float* const* WavCoeffs_LL, float gradw, float tloww, float *koeLi[12], int level, int dir, int W_L, int H_L, float edd, float &maxkoeLi, float **tmC) { int borderL = 2; @@ -3432,32 +3380,26 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float maxkoeLi, bool lipschitz, } } - if (!cp.link && cp.noiseena) { //used both with denoise 1 2 3 float refine = 0.f; + if (level == 0) { + refine = cp.lev0s / 40.f; + } else if (level == 1) { + refine = cp.lev1s / 40.f; + } else if (level == 2) { + refine = cp.lev2s / 40.f; + } else if (level == 3) { + refine = cp.lev3s / 40.f; + } - for (int i = 0; i < W_L * H_L; i++) { - if (level == 0) { - refine = cp.lev0s / 40.f; + if (refine != 0.f) { + refine += 1.f; + for (int i = 0; i < W_L * H_L; i++) { + WavCoeffs_L[dir][i] *= refine; } - - if (level == 1) { - refine = cp.lev1s / 40.f; - } - - if (level == 2) { - refine = cp.lev2s / 40.f; - } - - if (level == 3) { - refine = cp.lev3s / 40.f; - } - - WavCoeffs_L[dir][i] *= (1.f + refine); } } - float cpMul = cp.mul[level]; if (cpMul != 0.f && cp.contena) { // cpMul == 0.f means all will be multiplied by 1.f, so we can skip this diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 2022f7516..f88514a10 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1948,12 +1948,12 @@ void RawImageSource::retinexPrepareCurves(const RetinexParams &retinexParams, LU useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN"); if (useHsl) { - CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdHcurve, cdcurve, 1, lhist16RETI, histLRETI); + retinexcontlutili = CurveFactory::diagonalCurve2Lut(retinexParams.cdHcurve, cdcurve, 1, lhist16RETI, histLRETI); } else { - CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdcurve, cdcurve, 1, lhist16RETI, histLRETI); + retinexcontlutili = CurveFactory::diagonalCurve2Lut(retinexParams.cdcurve, cdcurve, 1, lhist16RETI, histLRETI); } - CurveFactory::mapcurve(mapcontlutili, retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); + mapcontlutili = CurveFactory::diagonalCurve2Lut(retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); mapcurve *= 0.5f; retinexParams.getCurves(retinextransmissionCurve, retinexgaintransmissionCurve); } diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 4ebb95842..357ad3a69 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1327,10 +1327,10 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili); clToningcurve (65536); - CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); + CurveFactory::diagonalCurve2Lut (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); cl2Toningcurve (65536); - CurveFactory::curveToning (params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); + CurveFactory::diagonalCurve2Lut (params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); } if (params.blackwhite.enabled) { @@ -1406,8 +1406,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 16, utili); - bool clcutili; - CurveFactory::curveCL (clcutili, params.labCurve.clcurve, clcurve, 16); + const bool clcutili = CurveFactory::diagonalCurve2Lut(params.labCurve.clcurve, clcurve, 16); bool autili, butili, ccutili, cclutili; CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index ae5440a78..7b8575635 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -965,9 +965,9 @@ private: }; params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, opautili); clToningcurve(65536, 0); - CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, 1); + CurveFactory::diagonalCurve2Lut(params.colorToning.clcurve, clToningcurve, 1); cl2Toningcurve(65536, 0); - CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, 1); + CurveFactory::diagonalCurve2Lut(params.colorToning.cl2curve, cl2Toningcurve, 1); } labView = new LabImage(fw, fh); @@ -1070,8 +1070,7 @@ private: bool utili; CurveFactory::complexLCurve(params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 1, utili); - bool clcutili; - CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, 1); + const bool clcutili = CurveFactory::diagonalCurve2Lut(params.labCurve.clcurve, clcurve, 1); bool ccutili, cclutili; CurveFactory::complexsgnCurve(autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, @@ -1209,22 +1208,22 @@ private: const bool loccompwavutili = loccompwavCurve.Set(params.locallab.spots.at(sp).loccompwavcurve); const bool loccomprewavutili = loccomprewavCurve.Set(params.locallab.spots.at(sp).loccomprewavcurve); const bool locedgwavutili = locedgwavCurve.Set(params.locallab.spots.at(sp).locedgwavcurve); - const bool locallutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).llcurve, lllocalcurve, 1); - const bool localclutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).clcurve, cllocalcurve, 1); - const bool locallcutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).lccurve, lclocalcurve, 1); - const bool localcutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).cccurve, cclocalcurve, 1); - const bool localrgbutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).rgbcurve, rgblocalcurve, 1); - const bool localexutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).excurve, exlocalcurve, 1); - const bool localmaskutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, 1); - const bool localmaskexputili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, 1); - const bool localmaskSHutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, 1); - const bool localmaskvibutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve, 1); - const bool localmasktmutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, 1); - const bool localmaskretiutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, 1); - const bool localmaskcbutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, 1); - const bool localmaskblutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, 1); - const bool localmasklcutili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, 1); - const bool localmask_utili = CurveFactory::curveLocal(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, 1); + const bool locallutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).llcurve, lllocalcurve, 1); + const bool localclutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).clcurve, cllocalcurve, 1); + const bool locallcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).lccurve, lclocalcurve, 1); + const bool localcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).cccurve, cclocalcurve, 1); + const bool localrgbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).rgbcurve, rgblocalcurve, 1); + const bool localexutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).excurve, exlocalcurve, 1); + const bool localmaskutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, 1); + const bool localmaskexputili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, 1); + const bool localmaskSHutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, 1); + const bool localmaskvibutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve, 1); + const bool localmasktmutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, 1); + const bool localmaskretiutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, 1); + const bool localmaskcbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, 1); + const bool localmaskblutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, 1); + const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, 1); + const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, 1); //provisory double ecomp = params.locallab.spots.at(sp).expcomp; @@ -1363,9 +1362,6 @@ private: if ((params.wavelet.enabled)) { LabImage *unshar = nullptr; - Glib::ustring provis; - - bool wavcontlutili = false; WaveletParams WaveParams = params.wavelet; WavCurve wavCLVCurve; Wavblcurve wavblcurve; @@ -1394,10 +1390,10 @@ private: params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); + CurveFactory::diagonalCurve2Lut(params.wavelet.wavclCurve, wavclCurve, 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { - provis = params.wavelet.CLmethod; + const Glib::ustring provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); unshar = new LabImage(*labView, true);