From 1275659a91164567dce8cf559432ddabb30ebc45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 26 Jun 2016 15:28:04 +0200 Subject: [PATCH] Removed another `pixSort()` and improved two places (#3346) --- rtengine/CA_correct_RT.cc | 51 ++++++++++---------------------------- rtengine/demosaic_algos.cc | 45 +++++++++++++++++---------------- 2 files changed, 37 insertions(+), 59 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index ab0b95a27..64bb19113 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -26,6 +26,7 @@ #include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" +#include "median.h" namespace { @@ -106,14 +107,6 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) //end of linear equation solver //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -inline void pixSort(float &a, float &b) { - if (a > b) { - float temp = a; - a = b; - b = temp; - } -} - } using namespace std; @@ -630,36 +623,18 @@ void RawImageSource::CA_correct_RT(const double cared, const double cablue, cons float bstemp[2]; for (int dir = 0; dir < 2; dir++) { //temporary storage for median filter - float p[9]; - p[0] = blockshifts[(vblock - 1) * hblsz + hblock - 1][c][dir]; - p[1] = blockshifts[(vblock - 1) * hblsz + hblock][c][dir]; - p[2] = blockshifts[(vblock - 1) * hblsz + hblock + 1][c][dir]; - p[3] = blockshifts[(vblock) * hblsz + hblock - 1][c][dir]; - p[4] = blockshifts[(vblock) * hblsz + hblock][c][dir]; - p[5] = blockshifts[(vblock) * hblsz + hblock + 1][c][dir]; - p[6] = blockshifts[(vblock + 1) * hblsz + hblock - 1][c][dir]; - p[7] = blockshifts[(vblock + 1) * hblsz + hblock][c][dir]; - p[8] = blockshifts[(vblock + 1) * hblsz + hblock + 1][c][dir]; - pixSort(p[1], p[2]); - pixSort(p[4], p[5]); - pixSort(p[7], p[8]); - pixSort(p[0], p[1]); - pixSort(p[3], p[4]); - pixSort(p[6], p[7]); - pixSort(p[1], p[2]); - pixSort(p[4], p[5]); - pixSort(p[7], p[8]); - pixSort(p[0], p[3]); - pixSort(p[5], p[8]); - pixSort(p[4], p[7]); - pixSort(p[3], p[6]); - pixSort(p[1], p[4]); - pixSort(p[2], p[5]); - pixSort(p[4], p[7]); - pixSort(p[4], p[2]); - pixSort(p[6], p[4]); - pixSort(p[4], p[2]); - bstemp[dir] = p[4]; + const std::array p = { + blockshifts[(vblock - 1) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock - 1) * hblsz + hblock][c][dir], + blockshifts[(vblock - 1) * hblsz + hblock + 1][c][dir], + blockshifts[(vblock) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock) * hblsz + hblock][c][dir], + blockshifts[(vblock) * hblsz + hblock + 1][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock + 1][c][dir] + }; + bstemp[dir] = median(p); } //now prepare coefficient matrix; use only data points within caautostrength/2 std devs of zero diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index b5e05ba53..fd4a16fd1 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -1768,36 +1768,39 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i rix[c] = qix[c] + rr * cc1 + cc; rix[1] = qix[1] + rr * cc1 + cc; // Assign 3x3 differential color values - const __m128 p1v = LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]); - const __m128 p2v = LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]); - const __m128 p3v = LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]); - const __m128 p4v = LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]); - const __m128 p5v = LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]); - const __m128 p6v = LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]); - const __m128 p7v = LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]); - const __m128 p8v = LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]); - const __m128 p9v = LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]); - _mm_storeu_ps(&rix[d][0], median(p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v)); + const std::array p = { + LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]), + LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]), + LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]), + LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]), + LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]), + LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]), + LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]), + LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]), + LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]) + }; + _mm_storeu_ps(&rix[d][0], median(p)); } #endif for (; cc < cc1 - 1; cc++) { - float temp; rix[d] = qix[d] + rr * cc1 + cc; rix[c] = qix[c] + rr * cc1 + cc; rix[1] = qix[1] + rr * cc1 + cc; // Assign 3x3 differential color values - const float p1 = rix[c][-w1 - 1] - rix[1][-w1 - 1]; - const float p2 = rix[c][-w1] - rix[1][-w1]; - const float p3 = rix[c][-w1 + 1] - rix[1][-w1 + 1]; - const float p4 = rix[c][ -1] - rix[1][ -1]; - const float p5 = rix[c][ 0] - rix[1][ 0]; - const float p6 = rix[c][ 1] - rix[1][ 1]; - const float p7 = rix[c][ w1 - 1] - rix[1][ w1 - 1]; - const float p8 = rix[c][ w1] - rix[1][ w1]; - const float p9 = rix[c][ w1 + 1] - rix[1][ w1 + 1]; - rix[d][0] = median(p1, p2, p3, p4, p5, p6, p7, p8, p9); + const std::array p = { + rix[c][-w1 - 1] - rix[1][-w1 - 1], + rix[c][-w1] - rix[1][-w1], + rix[c][-w1 + 1] - rix[1][-w1 + 1], + rix[c][ -1] - rix[1][ -1], + rix[c][ 0] - rix[1][ 0], + rix[c][ 1] - rix[1][ 1], + rix[c][ w1 - 1] - rix[1][ w1 - 1], + rix[c][ w1] - rix[1][ w1], + rix[c][ w1 + 1] - rix[1][ w1 + 1] + }; + rix[d][0] = median(p); } } }