From 4c99d3b78b03684cdf251f6f1b275e6574f7602b Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 17 Nov 2019 13:58:43 +0100 Subject: [PATCH 1/2] Segfault in before/after mode, fixes #5529 --- rtengine/boxblur.cc | 1 + rtengine/cplx_wavelet_level.h | 2 +- rtengine/ipwavelet.cc | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rtengine/boxblur.cc b/rtengine/boxblur.cc index 491ffae14..045c7ac3f 100644 --- a/rtengine/boxblur.cc +++ b/rtengine/boxblur.cc @@ -33,6 +33,7 @@ void boxblur(float** src, float** dst, int radius, int W, int H, bool multiThrea { //box blur using rowbuffers and linebuffers instead of a full size buffer + radius = rtengine::min(radius, W - 1, H - 1); if (radius == 0) { if (src != dst) { #ifdef _OPENMP diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h index 8664606c6..09b4e4a88 100644 --- a/rtengine/cplx_wavelet_level.h +++ b/rtengine/cplx_wavelet_level.h @@ -272,7 +272,7 @@ template void wavelet_level::SynthesisFilterHaarVertical (const T #pragma omp for nowait #endif - for(int i = 0; i < skip; i++) + for(int i = 0; i < std::min(skip, height); i++) { for(int j = 0; j < width; j++) { dst[width * i + j] = (srcLo[i * width + j] + srcHi[i * width + j]); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 91c7d6c44..7c0dc368b 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1195,7 +1195,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const b = 327.68f * Chprov * sincosv.x; //aply Munsell } else {//general case L = labco->L[i1][j1]; - const float Lin = labco->L[i1][j1]; + const float Lin = std::max(0.f, L); if(wavclCurve && cp.finena) { labco->L[i1][j1] = (0.5f * Lin + 1.5f * wavclCurve[Lin]) / 2.f; //apply contrast curve From 62eb970aeeb6a472c7fd990e1128175d997127c6 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 17 Nov 2019 14:13:28 +0100 Subject: [PATCH 2/2] Capture sharpening: xtrans auto radius calculation bugfix --- rtengine/capturesharpening.cc | 81 ----------------------------------- 1 file changed, 81 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index e271de2e6..55d2d3378 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -488,87 +488,6 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } } } - const float valtl = rawData[row][col]; - const float valtr = rawData[row][col + 1]; - const float valbl = rawData[row + 1][col]; - const float valbr = rawData[row + 1][col + 1]; - if (valtl > 1.f) { - const float maxValtltr = std::max(valtl, valtr); - if (valtr > 1.f && maxValtltr > lowerLimit) { - const float minVal = std::min(valtl, valtr); - if (UNLIKELY(maxValtltr > maxRatio * minVal)) { - bool clipped = false; - if (maxValtltr == valtl) { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) { - clipped = true; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) { - clipped = true; - } - } - if (!clipped) { - maxRatio = maxValtltr / minVal; - } - } - } - const float maxValtlbl = std::max(valtl, valbl); - if (valbl > 1.f && maxValtlbl > lowerLimit) { - const float minVal = std::min(valtl, valbl); - if (UNLIKELY(maxValtlbl > maxRatio * minVal)) { - bool clipped = false; - if (maxValtlbl == valtl) { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) { - clipped = true; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) { - clipped = true; - } - } - if (!clipped) { - maxRatio = maxValtlbl / minVal; - } - } - } - } - if (valbr > 1.f) { - const float maxValblbr = std::max(valbl, valbr); - if (valbl > 1.f && maxValblbr > lowerLimit) { - const float minVal = std::min(valbl, valbr); - if (UNLIKELY(maxValblbr > maxRatio * minVal)) { - bool clipped = false; - if (maxValblbr == valbr) { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) { - clipped = true; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) { - clipped = true; - } - } - if (!clipped) { - maxRatio = maxValblbr / minVal; - } - } - } - const float maxValtrbr = std::max(valtr, valbr); - if (valtr > 1.f && maxValtrbr > lowerLimit) { - const float minVal = std::min(valtr, valbr); - if (UNLIKELY(maxValtrbr > maxRatio * minVal)) { - if (maxValtrbr == valbr) { // check for influence by clipped green in neighborhood - if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) { - continue; - } - } else { // check for influence by clipped green in neighborhood - if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) { - continue; - } - } - maxRatio = maxValtrbr / minVal; - } - } - } } } return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f);