Removed another pixSort() and improved two places (#3346)

This commit is contained in:
Flössie
2016-06-26 15:28:04 +02:00
parent 787a892737
commit 1275659a91
2 changed files with 37 additions and 59 deletions

View File

@@ -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<float, 9> 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

View File

@@ -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<vfloat, 9> 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<float, 9> 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);
}
}
}