38#define A(y, x) src[(y - 1)][(x - 1)]
39#define B(y, x) dst[(y - 1)][(x - 1)]
41 const float det =
A(1, 1) * (
A(3, 3) *
A(2, 2) -
A(3, 2) *
A(2, 3))
42 -
A(2, 1) * (
A(3, 3) *
A(1, 2) -
A(3, 2) *
A(1, 3))
43 +
A(3, 1) * (
A(2, 3) *
A(1, 2) -
A(2, 2) *
A(1, 3));
45 const float epsilon = 1e-7f;
46 if(fabsf(det) < epsilon)
return 1;
48 const float invDet = 1.f / det;
50 B(1, 1) = invDet * (
A(3, 3) *
A(2, 2) -
A(3, 2) *
A(2, 3));
51 B(1, 2) = -invDet * (
A(3, 3) *
A(1, 2) -
A(3, 2) *
A(1, 3));
52 B(1, 3) = invDet * (
A(2, 3) *
A(1, 2) -
A(2, 2) *
A(1, 3));
54 B(2, 1) = -invDet * (
A(3, 3) *
A(2, 1) -
A(3, 1) *
A(2, 3));
55 B(2, 2) = invDet * (
A(3, 3) *
A(1, 1) -
A(3, 1) *
A(1, 3));
56 B(2, 3) = -invDet * (
A(2, 3) *
A(1, 1) -
A(2, 1) *
A(1, 3));
58 B(3, 1) = invDet * (
A(3, 2) *
A(2, 1) -
A(3, 1) *
A(2, 2));
59 B(3, 2) = -invDet * (
A(3, 2) *
A(1, 1) -
A(3, 1) *
A(1, 2));
60 B(3, 3) = invDet * (
A(2, 2) *
A(1, 1) -
A(2, 1) *
A(1, 2));
70 output[0][0] = input[0][0];
71 output[0][1] = input[1][0];
72 output[0][2] = input[2][0];
75 output[1][0] = input[0][1];
76 output[1][1] = input[1][1];
77 output[1][2] = input[2][1];
80 output[2][0] = input[0][2];
81 output[2][1] = input[1][2];
82 output[2][2] = input[2][2];
93 output[0][0] = input[0];
94 output[0][1] = input[3];
95 output[0][2] = input[6];
98 output[1][0] = input[1];
99 output[1][1] = input[4];
100 output[1][2] = input[7];
103 output[2][0] = input[2];
104 output[2][1] = input[5];
105 output[2][2] = input[8];
115 output[0][0] = input[0];
116 output[0][1] = input[1];
117 output[0][2] = input[2];
120 output[1][0] = input[3];
121 output[1][1] = input[4];
122 output[1][2] = input[5];
125 output[2][0] = input[6];
126 output[2][1] = input[7];
127 output[2][2] = input[8];
130 for(
size_t c = 0;
c < 4;
c++)
137 output[0] = input[0][0];
138 output[1] = input[0][1];
139 output[2] = input[0][2];
140 output[3] = input[1][0];
141 output[4] = input[1][1];
142 output[5] = input[1][2];
143 output[6] = input[2][0];
144 output[7] = input[2][1];
145 output[8] = input[2][2];
151 output[0] = input[0][0];
152 output[1] = input[0][1];
153 output[2] = input[0][2];
155 output[4] = input[1][0];
156 output[5] = input[1][1];
157 output[6] = input[1][2];
159 output[8] = input[2][0];
160 output[9] = input[2][1];
161 output[10] = input[2][2];
168 for(
int k = 0; k < 3; ++k)
170 dt_aligned_pixel_t sum = { 0.0f };
173 for(
int j = 0; j < 3; j++)
174 sum[
i] += m1[k][j] * m2[j][
i];
185#pragma omp declare simd
189 for(
int k = 0; k < 3; k++)
191 for(
int i = 0;
i < 3;
i++)
194 for(
int j = 0; j < 3; j++)
195 x += m1[k][j] * m2[j][
i];
202#pragma omp declare simd uniform(M) aligned(M:64) aligned(v_in, v_out:16)
208 #pragma omp simd aligned(M:64) aligned(v_in, v_out:16)
const float i
Definition colorspaces_inline_conversions.h:669
const float c
Definition colorspaces_inline_conversions.h:1365
static const dt_colormatrix_t M
Definition colorspaces_inline_conversions.h:933
#define DT_ALIGNED_ARRAY
Definition darktable.h:312
#define for_each_channel(_var,...)
Definition darktable.h:582
#define for_four_channels(_var,...)
Definition darktable.h:584
static const float x
Definition iop_profile.h:239
static float scalar_product(const dt_aligned_pixel_t v_1, const dt_aligned_pixel_t v_2)
Definition math.h:204
static void transpose_3x3_to_3xSSE(const float input[9], dt_colormatrix_t output)
Definition matrices.h:91
float DT_ALIGNED_ARRAY dt_colormatrix_t[4][4]
Definition matrices.h:33
static void mat3SSEmul(dt_colormatrix_t dest, const dt_colormatrix_t m1, const dt_colormatrix_t m2)
Definition matrices.h:187
static void transpose_3xSSE(const dt_colormatrix_t input, dt_colormatrix_t output)
Definition matrices.h:68
static void pack_3xSSE_to_3x4(const dt_colormatrix_t input, float output[12])
Definition matrices.h:149
static void dt_colormatrix_mul(dt_colormatrix_t dst, const dt_colormatrix_t m1, const dt_colormatrix_t m2)
Definition matrices.h:166
static int mat3SSEinv(dt_colormatrix_t dst, const dt_colormatrix_t src)
Definition matrices.h:36
static void repack_double3x3_to_3xSSE(const double input[9], dt_colormatrix_t output)
Definition matrices.h:113
static void pack_3xSSE_to_3x3(const dt_colormatrix_t input, float output[9])
Definition matrices.h:135
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:204