29#define A(y, x) src[(y - 1)][(x - 1)]
30#define B(y, x) dst[(y - 1)][(x - 1)]
32 const float det =
A(1, 1) * (
A(3, 3) *
A(2, 2) -
A(3, 2) *
A(2, 3))
33 -
A(2, 1) * (
A(3, 3) *
A(1, 2) -
A(3, 2) *
A(1, 3))
34 +
A(3, 1) * (
A(2, 3) *
A(1, 2) -
A(2, 2) *
A(1, 3));
36 const float epsilon = 1e-7f;
37 if(fabsf(det) < epsilon)
return 1;
39 const float invDet = 1.f / det;
41 B(1, 1) = invDet * (
A(3, 3) *
A(2, 2) -
A(3, 2) *
A(2, 3));
42 B(1, 2) = -invDet * (
A(3, 3) *
A(1, 2) -
A(3, 2) *
A(1, 3));
43 B(1, 3) = invDet * (
A(2, 3) *
A(1, 2) -
A(2, 2) *
A(1, 3));
45 B(2, 1) = -invDet * (
A(3, 3) *
A(2, 1) -
A(3, 1) *
A(2, 3));
46 B(2, 2) = invDet * (
A(3, 3) *
A(1, 1) -
A(3, 1) *
A(1, 3));
47 B(2, 3) = -invDet * (
A(2, 3) *
A(1, 1) -
A(2, 1) *
A(1, 3));
49 B(3, 1) = invDet * (
A(3, 2) *
A(2, 1) -
A(3, 1) *
A(2, 2));
50 B(3, 2) = -invDet * (
A(3, 2) *
A(1, 1) -
A(3, 1) *
A(1, 2));
51 B(3, 3) = invDet * (
A(2, 2) *
A(1, 1) -
A(2, 1) *
A(1, 2));
61 output[0][0] = input[0][0];
62 output[0][1] = input[1][0];
63 output[0][2] = input[2][0];
66 output[1][0] = input[0][1];
67 output[1][1] = input[1][1];
68 output[1][2] = input[2][1];
71 output[2][0] = input[0][2];
72 output[2][1] = input[1][2];
73 output[2][2] = input[2][2];
84 output[0][0] = input[0];
85 output[0][1] = input[3];
86 output[0][2] = input[6];
89 output[1][0] = input[1];
90 output[1][1] = input[4];
91 output[1][2] = input[7];
94 output[2][0] = input[2];
95 output[2][1] = input[5];
96 output[2][2] = input[8];
106 output[0][0] = input[0];
107 output[0][1] = input[1];
108 output[0][2] = input[2];
111 output[1][0] = input[3];
112 output[1][1] = input[4];
113 output[1][2] = input[5];
116 output[2][0] = input[6];
117 output[2][1] = input[7];
118 output[2][2] = input[8];
121 for(
size_t c = 0; c < 4; c++)
128 output[0] = input[0][0];
129 output[1] = input[0][1];
130 output[2] = input[0][2];
131 output[3] = input[1][0];
132 output[4] = input[1][1];
133 output[5] = input[1][2];
134 output[6] = input[2][0];
135 output[7] = input[2][1];
136 output[8] = input[2][2];
142 for(
int k = 0; k < 3; ++k)
144 dt_aligned_pixel_t sum = { 0.0f };
147 for(
int j = 0; j < 3; j++)
148 sum[i] += m1[k][j] * m2[j][i];
159#pragma omp declare simd
163 for(
int k = 0; k < 3; k++)
165 for(
int i = 0; i < 3; i++)
168 for(
int j = 0; j < 3; j++)
169 x += m1[k][j] * m2[j][i];
176#pragma omp declare simd uniform(M) aligned(M:64) aligned(v_in, v_out:16)
182 #pragma omp simd aligned(M:64) aligned(v_in, v_out:16)
184 for(
size_t i = 0; i < 3; ++i) v_out[i] =
scalar_product(v_in, M[i]);
#define DT_ALIGNED_ARRAY
Definition darktable.h:270
#define for_each_channel(_var,...)
Definition darktable.h:411
#define for_four_channels(_var,...)
Definition darktable.h:413
static float scalar_product(const dt_aligned_pixel_t v_1, const dt_aligned_pixel_t v_2)
Definition math.h:196
static void transpose_3x3_to_3xSSE(const float input[9], dt_colormatrix_t output)
Definition matrices.h:82
float DT_ALIGNED_ARRAY dt_colormatrix_t[4][4]
Definition matrices.h:24
static void mat3SSEmul(dt_colormatrix_t dest, const dt_colormatrix_t m1, const dt_colormatrix_t m2)
Definition matrices.h:161
static void transpose_3xSSE(const dt_colormatrix_t input, dt_colormatrix_t output)
Definition matrices.h:59
static void dt_colormatrix_mul(dt_colormatrix_t dst, const dt_colormatrix_t m1, const dt_colormatrix_t m2)
Definition matrices.h:140
static int mat3SSEinv(dt_colormatrix_t dst, const dt_colormatrix_t src)
Definition matrices.h:27
static void repack_double3x3_to_3xSSE(const double input[9], dt_colormatrix_t output)
Definition matrices.h:104
static void pack_3xSSE_to_3x3(const dt_colormatrix_t input, float output[9])
Definition matrices.h:126
static void dot_product(const dt_aligned_pixel_t v_in, const dt_colormatrix_t M, dt_aligned_pixel_t v_out)
Definition matrices.h:178