diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 71bdffc58..5b7647f49 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -139,6 +139,14 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) std::cout << "performing histogram matching for " << getFileName() << " on the embedded thumbnail" << std::endl; } + if (!histMatchingCache.empty()) { + if (settings->verbose) { + std::cout << "tone curve found in cache" << std::endl; + outCurve = histMatchingCache; + return; + } + } + outCurve = { DCT_Linear }; int fw, fh; @@ -161,6 +169,7 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) if (settings->verbose) { std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl; } + histMatchingCache = outCurve; return; } source.reset(thumb->quickProcessImage(neutral, fh / skip, TI_Nearest)); @@ -233,6 +242,8 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) if (settings->verbose) { std::cout << "histogram matching: generated curve with " << outCurve.size()/2 << " control points" << std::endl; } + + histMatchingCache = outCurve; } } // namespace rtengine diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 75fc81e9f..d390d94ca 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -449,7 +449,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); - params.toneCurve.histmatching = false; + params.toneCurve.autoexp = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; params.toneCurve.expcomp = 0.0; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index a199eb13a..59316eccf 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -95,6 +95,7 @@ protected: float psGreenBrightness[4]; float psBlueBrightness[4]; + std::vector histMatchingCache; void hphd_vertical (float** hpmap, int col_from, int col_to); void hphd_horizontal (float** hpmap, int row_from, int row_to); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 0bd784e45..0cc223da1 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -743,7 +743,7 @@ private: if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); - params.toneCurve.histmatching = false; + params.toneCurve.autoexp = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; params.toneCurve.expcomp = 0.0; diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 0d753dcbf..4a25794ff 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -953,7 +953,6 @@ bool ToneCurve::histmatchingComputed() autolevels->set_inconsistent(false); } - histmatching->set_active(false); toneCurveMode->set_active(rtengine::toUnderlying(nextToneCurveMode)); shape->setCurve(nextToneCurve); shape2->setCurve({ DCT_Linear });