From a19355fe9ff0f1e736e1f86640dae85ae46e36b9 Mon Sep 17 00:00:00 2001 From: Ingo Date: Sun, 26 Jan 2014 00:44:56 +0100 Subject: [PATCH] USM's halo control behaves oddly, Issue 409, on behalf of Martin Burri --- rtengine/ipsharpen.cc | 62 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 7 deletions(-) diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 1d0672ebe..f9d0ddb3a 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -195,15 +195,23 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2) { return; int W = lab->W, H = lab->H; - float** b3; + float** b3 = NULL; + float** labCopy = NULL; + if (params->sharpening.edgesonly) { b3 = new float*[H]; for (int i=0; isharpening.halocontrol && !params->sharpening.edgesonly) { + // We only need the lab parameter copy in this special case + labCopy = new float*[H]; + for( int i=0; iL[i][j] = lab->L[i][j] + delta; } } - else + else { + if (!params->sharpening.edgesonly) { + // make a deep copy of lab->L +#pragma omp for + for( int i=0; iL[i][j]; + base = labCopy; + } sharpenHaloCtrl (lab, b2, base, W, H); + } } // end parallel + if (params->sharpening.halocontrol && !params->sharpening.edgesonly) { + // delete the deep copy + for( int i=0; isharpening.edgesonly) { for (int i=0; isharpening.amount * 0.01f; float** nL = base; -#pragma omp parallel for if (multiThread) +#pragma omp for for (int i=2; iW, H = ncie->H; float** b3; + float** ncieCopy; + if (params->sharpening.edgesonly) { b3 = new float*[H]; for (int i=0; isharpening.halocontrol && !params->sharpening.edgesonly) { + // We only need the lab parameter copy in this special case + ncieCopy = new float*[H]; + for( int i=0; iJ_p[i][j] > 8.0f && ncie->J_p[i][j] < 92.0f) ncie->sh_p[i][j] = ncie->sh_p[i][j] + delta; } } - else + else { + if (!params->sharpening.edgesonly) { + // make a deep copy of lab->L +#pragma omp for + for( int i=0; ish_p[i][j]; + base = ncieCopy; + } sharpenHaloCtrlcam (ncie, b2, base, W, H); + } } // end parallel + if (params->sharpening.halocontrol && !params->sharpening.edgesonly) { + // delete the deep copy + for( int i=0; isharpening.edgesonly) { for (int i=0; isharpening.amount * 0.01f; float** nL = base; -#pragma omp parallel for if (multiThread) +#pragma omp for for (int i=2; i