diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 017f7755e..76556ba1f 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -2698,6 +2698,56 @@ bool LocLHCurve::Set(const std::vector &curvePoints) } } +LocCHCurve::LocCHCurve() : sum(0.f) {}; + +void LocCHCurve::Reset() +{ + lutLocCHCurve.reset(); + sum = 0.f; +} +void LocCHCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCHCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCHCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCHCurve[i] < 0.02f) { + lutLocCHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCHCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +bool LocCHCurve::Set(const std::vector &curvePoints) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + Set(ttcurve); + return true; + } else { + Reset(); + return false; + } +} + + + + + LocwavCurve::LocwavCurve() : sum(0.f) {}; void LocwavCurve::Reset() diff --git a/rtengine/curves.h b/rtengine/curves.h index 5769cada1..9adf525cc 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -1283,6 +1283,35 @@ public: } }; + +class LocCHCurve +{ +private: + LUTf lutLocCHCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCHCurve() {}; + LocCHCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCHCurve[index]; + } + operator bool (void) const + { + return lutLocCHCurve; + } +}; + class LocretigainCurve { private: diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 0ac39e66e..ca2e12850 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -881,6 +881,7 @@ void Crop::update(int todo) auto& locRETtransCurve = parent->locRETtransCurve; auto& loclhCurve = parent->loclhCurve; auto& lochhCurve = parent->lochhCurve; + auto& locchCurve = parent->locchCurve; auto& locccmasCurve = parent->locccmasCurve; auto& locllmasCurve = parent->locllmasCurve; auto& lochhmasCurve = parent->lochhmasCurve; @@ -930,6 +931,7 @@ void Crop::update(int todo) locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve); const bool LHutili = loclhCurve.Set(params.locallab.spots.at(sp).LHcurve); const bool HHutili = lochhCurve.Set(params.locallab.spots.at(sp).HHcurve); + const bool CHutili = locchCurve.Set(params.locallab.spots.at(sp).CHcurve); const bool lcmasutili = locccmasCurve.Set(params.locallab.spots.at(sp).CCmaskcurve); const bool llmasutili = locllmasCurve.Set(params.locallab.spots.at(sp).LLmaskcurve); const bool lhmasutili = lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); @@ -1028,7 +1030,7 @@ void Crop::update(int todo) lllocalcurve2,locallutili, cllocalcurve2, localclutili, lclocalcurve2, locallcutili, - loclhCurve, lochhCurve, + loclhCurve, lochhCurve, locchCurve, lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, lmaskSHlocalcurve2, localmaskSHutili, @@ -1060,7 +1062,7 @@ void Crop::update(int todo) locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav,lmasutili_wav, - LHutili, HHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, + LHutili, HHutili, CHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, parent->previewDeltaE, parent->locallColorMask, parent->locallColorMaskinv, parent->locallExpMask, parent->locallExpMaskinv, parent->locallSHMask, parent->locallSHMaskinv, parent->locallvibMask, parent->localllcMask, parent->locallsharMask, parent->locallcbMask, parent->locallretiMask, parent->locallsoftMask, parent->localltmMask, parent->locallblMask, parent->locall_Mask, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); @@ -1069,7 +1071,7 @@ void Crop::update(int todo) lllocalcurve2,locallutili, cllocalcurve2, localclutili, lclocalcurve2, locallcutili, - loclhCurve, lochhCurve, + loclhCurve, lochhCurve, locchCurve, lmasklocalcurve2, localmaskutili, lmaskexplocalcurve2, localmaskexputili, lmaskSHlocalcurve2, localmaskSHutili, @@ -1102,7 +1104,7 @@ void Crop::update(int todo) locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav,lmasutili_wav, - LHutili, HHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, + LHutili, HHutili, CHutili, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 7a20513f0..011d7fa9a 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1065,6 +1065,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locRETtransCurve.Set(params->locallab.spots.at(sp).localTtranscurve); const bool LHutili = loclhCurve.Set(params->locallab.spots.at(sp).LHcurve); const bool HHutili = lochhCurve.Set(params->locallab.spots.at(sp).HHcurve); + const bool CHutili = locchCurve.Set(params->locallab.spots.at(sp).CHcurve); const bool lcmasutili = locccmasCurve.Set(params->locallab.spots.at(sp).CCmaskcurve); const bool llmasutili = locllmasCurve.Set(params->locallab.spots.at(sp).LLmaskcurve); const bool lhmasutili = lochhmasCurve.Set(params->locallab.spots.at(sp).HHmaskcurve); @@ -1179,7 +1180,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) lllocalcurve, locallutili, cllocalcurve, localclutili, lclocalcurve, locallcutili, - loclhCurve, lochhCurve, + loclhCurve, lochhCurve, locchCurve, lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, lmaskSHlocalcurve, localmaskSHutili, @@ -1211,7 +1212,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav, lmasutili_wav, - LHutili, HHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, + LHutili, HHutili, CHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index c04387b5d..ab57a4419 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -261,6 +261,7 @@ protected: LocretigainCurverab locRETgainCurverab; LocLHCurve loclhCurve; LocHHCurve lochhCurve; + LocCHCurve locchCurve; LocCCmaskCurve locccmasCurve; LocLLmaskCurve locllmasCurve; LocHHmaskCurve lochhmasCurve; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 66ad4dc57..018649bf2 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -283,7 +283,7 @@ public: const LUTf& lllocalcurve, bool locallutili, const LUTf& cllocalcurve, bool localclutili, const LUTf& lclocalcurve, bool locallcutili, - const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, + const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, const LocCHCurve& locchCurve, const LUTf& lmasklocalcurve, bool localmaskutili, const LUTf& lmaskexplocalcurve, bool localmaskexputili, const LUTf& lmaskSHlocalcurve, bool localmaskSHutili, @@ -317,7 +317,7 @@ public: const LocwavCurve& locwavCurveden, bool locwavdenutili, const LocwavCurve& locedgwavCurve, bool locedgwavutili, const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav, - bool LHutili, bool HHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, + bool LHutili, bool HHutili, bool CHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, double& huerefblur, double &chromarefblur, double& lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int &lastsav, bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int ll_Mask, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index b9d070e14..d2cbe949e 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -9512,7 +9512,7 @@ void ImProcFunctions::Lab_Local( const LUTf& lllocalcurve, bool locallutili, const LUTf& cllocalcurve, bool localclutili, const LUTf& lclocalcurve, bool locallcutili, - const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, + const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, const LocCHCurve& locchCurve, const LUTf& lmasklocalcurve, bool localmaskutili, const LUTf& lmaskexplocalcurve, bool localmaskexputili, const LUTf& lmaskSHlocalcurve, bool localmaskSHutili, @@ -9546,7 +9546,7 @@ void ImProcFunctions::Lab_Local( const LocwavCurve& locedgwavCurve, bool locedgwavutili, const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav, - bool LHutili, bool HHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, + bool LHutili, bool HHutili, bool CHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, double& huerefblur, double& chromarefblur, double& lumarefblur, double& hueref, double& chromaref, double& lumaref, double& sobelref, int &lastsav, bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int ll_Mask, float& minCD, float& maxCD, float& mini, float& maxi, float& Tmean, float& Tsigma, float& Tmin, float& Tmax diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 8eae9daba..ae5440a78 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1087,6 +1087,7 @@ private: LocretitransCurve locRETtransCurve; LocLHCurve loclhCurve; LocHHCurve lochhCurve; + LocCHCurve locchCurve; LocCCmaskCurve locccmasCurve; LocLLmaskCurve locllmasCurve; LocHHmaskCurve lochhmasCurve; @@ -1165,6 +1166,7 @@ private: locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve); const bool LHutili = loclhCurve.Set(params.locallab.spots.at(sp).LHcurve); const bool HHutili = lochhCurve.Set(params.locallab.spots.at(sp).HHcurve); + const bool CHutili = locchCurve.Set(params.locallab.spots.at(sp).CHcurve); const bool lcmasutili = locccmasCurve.Set(params.locallab.spots.at(sp).CCmaskcurve); const bool llmasutili = locllmasCurve.Set(params.locallab.spots.at(sp).LLmaskcurve); const bool lhmasutili = lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); @@ -1262,7 +1264,7 @@ private: lllocalcurve, locallutili, cllocalcurve, localclutili, lclocalcurve, locallcutili, - loclhCurve, lochhCurve, + loclhCurve, lochhCurve, locchCurve, lmasklocalcurve, localmaskutili, lmaskexplocalcurve, localmaskexputili, lmaskSHlocalcurve, localmaskSHutili, @@ -1294,7 +1296,7 @@ private: locwavCurveden, locwavdenutili, locedgwavCurve, locedgwavutili, loclmasCurve_wav,lmasutili_wav, - LHutili, HHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, + LHutili, HHutili, CHutili, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax);