From e89a3041fa0ebed63e4de4b9bb251ba4081b312c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 19 Jun 2020 17:07:49 +0200 Subject: [PATCH] fix black level computation for applying flat-field correction, taken from ART, thanks @agriggio --- rtengine/rawimage.cc | 23 +++++++++++++++++++++++ rtengine/rawimage.h | 4 ++++ rtengine/rawimagesource.cc | 9 +++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 1c5451b34..e3a747048 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -84,6 +84,29 @@ eSensorType RawImage::getSensorType() const */ void RawImage::get_colorsCoeff(float *pre_mul_, float *scale_mul_, float *cblack_, bool forceAutoWB) { + if (!pre_mul_ && !scale_mul_ && !forceAutoWB) { + // only black levels + if (isXtrans()) { + // for xtrans files dcraw stores black levels in cblack[6] .. cblack[41], but all are equal, so we just use cblack[6] + for (int c = 0; c < 4; c++) { + cblack_[c] = (float) this->get_cblack(6); + } + } else if ((this->get_cblack(4) + 1) / 2 == 1 && (this->get_cblack(5) + 1) / 2 == 1) { + for (int c = 0; c < 4; c++) { + cblack_[c] = this->get_cblack(c); + } + + for (int c = 0; c < 4; c++) { + cblack_[FC(c / 2, c % 2)] = this->get_cblack(6 + c / 2 % this->get_cblack(4) * this->get_cblack(5) + c % 2 % this->get_cblack(5)); + } + } else { + for (int c = 0; c < 4; c++) { + cblack_[c] = (float) this->get_cblack(c); + } + } + return; + } + unsigned sum[8], c; unsigned W = this->get_width(); unsigned H = this->get_height(); diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 7fb1dbbc4..871267dac 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -259,6 +259,10 @@ public: { return float_raw_image; } + void set_filters(unsigned f) + { + filters = f; + } public: // dcraw functions diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 036423d21..d5272c611 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2400,10 +2400,11 @@ void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) */ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, RawImage *riDark, RawImage *riFlatFile, array2D &rawData) { - const float black[4] = { - static_cast(ri->get_cblack(0)), static_cast(ri->get_cblack(1)), - static_cast(ri->get_cblack(2)), static_cast(ri->get_cblack(3)) - }; + const auto tmpfilters = ri->get_filters(); + ri->set_filters(ri->prefilters); // we need 4 blacks for bayer processing + float black[4]; + ri->get_colorsCoeff(nullptr, nullptr, black, false); + ri->set_filters(tmpfilters); if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) { if (!rawData) {