28#ifndef DT_MATH_MATRICES_H
29#define DT_MATH_MATRICES_H
39#define A(y, x) src[(y - 1)][(x - 1)]
40#define B(y, x) dst[(y - 1)][(x - 1)]
42 const float det =
A(1, 1) * (
A(3, 3) *
A(2, 2) -
A(3, 2) *
A(2, 3))
43 -
A(2, 1) * (
A(3, 3) *
A(1, 2) -
A(3, 2) *
A(1, 3))
44 +
A(3, 1) * (
A(2, 3) *
A(1, 2) -
A(2, 2) *
A(1, 3));
46 const float epsilon = 1e-7f;
47 if(fabsf(det) < epsilon)
return 1;
49 const float invDet = 1.f / det;
51 B(1, 1) = invDet * (
A(3, 3) *
A(2, 2) -
A(3, 2) *
A(2, 3));
52 B(1, 2) = -invDet * (
A(3, 3) *
A(1, 2) -
A(3, 2) *
A(1, 3));
53 B(1, 3) = invDet * (
A(2, 3) *
A(1, 2) -
A(2, 2) *
A(1, 3));
55 B(2, 1) = -invDet * (
A(3, 3) *
A(2, 1) -
A(3, 1) *
A(2, 3));
56 B(2, 2) = invDet * (
A(3, 3) *
A(1, 1) -
A(3, 1) *
A(1, 3));
57 B(2, 3) = -invDet * (
A(2, 3) *
A(1, 1) -
A(2, 1) *
A(1, 3));
59 B(3, 1) = invDet * (
A(3, 2) *
A(2, 1) -
A(3, 1) *
A(2, 2));
60 B(3, 2) = -invDet * (
A(3, 2) *
A(1, 1) -
A(3, 1) *
A(1, 2));
61 B(3, 3) = invDet * (
A(2, 2) *
A(1, 1) -
A(2, 1) *
A(1, 2));
71 output[0][0] = input[0][0];
72 output[0][1] = input[1][0];
73 output[0][2] = input[2][0];
76 output[1][0] = input[0][1];
77 output[1][1] = input[1][1];
78 output[1][2] = input[2][1];
81 output[2][0] = input[0][2];
82 output[2][1] = input[1][2];
83 output[2][2] = input[2][2];
94 output[0][0] = input[0];
95 output[0][1] = input[3];
96 output[0][2] = input[6];
99 output[1][0] = input[1];
100 output[1][1] = input[4];
101 output[1][2] = input[7];
104 output[2][0] = input[2];
105 output[2][1] = input[5];
106 output[2][2] = input[8];
116 output[0][0] = input[0];
117 output[0][1] = input[1];
118 output[0][2] = input[2];
121 output[1][0] = input[3];
122 output[1][1] = input[4];
123 output[1][2] = input[5];
126 output[2][0] = input[6];
127 output[2][1] = input[7];
128 output[2][2] = input[8];
131 for(
size_t c = 0; c < 4; c++)
138 output[0] = input[0][0];
139 output[1] = input[0][1];
140 output[2] = input[0][2];
141 output[3] = input[1][0];
142 output[4] = input[1][1];
143 output[5] = input[1][2];
144 output[6] = input[2][0];
145 output[7] = input[2][1];
146 output[8] = input[2][2];
152 output[0] = input[0][0];
153 output[1] = input[0][1];
154 output[2] = input[0][2];
156 output[4] = input[1][0];
157 output[5] = input[1][1];
158 output[6] = input[1][2];
160 output[8] = input[2][0];
161 output[9] = input[2][1];
162 output[10] = input[2][2];
169 for(
int k = 0;
k < 3; ++
k)
174 for(
int j = 0; j < 3; j++)
175 sum[
i] += m1[
k][j] * m2[j][
i];
188 for(
int k = 0;
k < 3;
k++)
190 for(
int i = 0;
i < 3;
i++)
193 for(
int j = 0; j < 3; j++)
194 x += m1[
k][j] * m2[j][
i];
205 for(
size_t i = 0;
i < 3; ++
i)
v_out[
i] = scalar_product(v_in,
M[
i]);
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
float *const restrict const size_t k
static void transpose_3x3_to_3xSSE(const float input[9], dt_colormatrix_t output)
const dt_colormatrix_t dt_aligned_pixel_t v_out
float DT_ALIGNED_ARRAY dt_colormatrix_t[4][4]
static void mat3SSEmul(dt_colormatrix_t dest, const dt_colormatrix_t m1, const dt_colormatrix_t m2)
static void transpose_3xSSE(const dt_colormatrix_t input, dt_colormatrix_t output)
static void pack_3xSSE_to_3x4(const dt_colormatrix_t input, float output[12])
static void dt_colormatrix_mul(dt_colormatrix_t dst, const dt_colormatrix_t m1, const dt_colormatrix_t m2)
static int mat3SSEinv(dt_colormatrix_t dst, const dt_colormatrix_t src)
static void repack_double3x3_to_3xSSE(const double input[9], dt_colormatrix_t output)
static void pack_3xSSE_to_3x3(const dt_colormatrix_t input, float output[9])
#define DT_ALIGNED_ARRAY
Align an object on a cacheline boundary, so AVX2 can load it whole.
#define __OMP_SIMD__(...)
#define __OMP_DECLARE_SIMD__(...)
DT_ALIGNED_PIXEL float dt_aligned_pixel_t[4]
#define for_each_channel(_var,...)
#define for_four_channels(_var,...)