… | |
… | |
5 | |
5 | |
6 | #if HAVE_IMG |
6 | #if HAVE_IMG |
7 | |
7 | |
8 | typedef rxvt_img::nv nv; |
8 | typedef rxvt_img::nv nv; |
9 | |
9 | |
|
|
10 | namespace |
|
|
11 | { |
|
|
12 | |
10 | struct mat3x3 |
13 | struct mat3x3 |
11 | { |
|
|
12 | nv v[3][3]; |
|
|
13 | |
|
|
14 | mat3x3 () |
|
|
15 | { |
14 | { |
|
|
15 | nv v[3][3]; |
|
|
16 | |
|
|
17 | mat3x3 () |
|
|
18 | { |
16 | } |
19 | } |
17 | |
20 | |
18 | mat3x3 (nv matrix[3][3]) |
21 | mat3x3 (nv matrix[3][3]) |
19 | { |
22 | { |
20 | memcpy (v, matrix, sizeof (v)); |
23 | memcpy (v, matrix, sizeof (v)); |
21 | } |
24 | } |
22 | |
25 | |
23 | mat3x3 (nv v11, nv v12, nv v13, nv v21, nv v22, nv v23, nv v31, nv v32, nv v33) |
26 | mat3x3 (nv v11, nv v12, nv v13, nv v21, nv v22, nv v23, nv v31, nv v32, nv v33) |
24 | { |
27 | { |
25 | v[0][0] = v11; v[0][1] = v12; v[0][2] = v13; |
28 | v[0][0] = v11; v[0][1] = v12; v[0][2] = v13; |
26 | v[1][0] = v21; v[1][1] = v22; v[1][2] = v23; |
29 | v[1][0] = v21; v[1][1] = v22; v[1][2] = v23; |
27 | v[2][0] = v31; v[2][1] = v32; v[2][2] = v33; |
30 | v[2][0] = v31; v[2][1] = v32; v[2][2] = v33; |
28 | } |
31 | } |
29 | |
32 | |
30 | mat3x3 invert (); |
33 | mat3x3 invert (); |
31 | |
34 | |
32 | nv *operator [](int i) { return &v[i][0]; } |
35 | nv *operator [](int i) { return &v[i][0]; } |
33 | const nv *operator [](int i) const { return &v[i][0]; } |
36 | const nv *operator [](int i) const { return &v[i][0]; } |
34 | |
37 | |
35 | // quite inefficient, hopefully gcc pulls the w calc out of any loops |
38 | // quite inefficient, hopefully gcc pulls the w calc out of any loops |
36 | nv apply1 (int i, nv x, nv y) |
39 | nv apply1 (int i, nv x, nv y) |
|
|
40 | { |
|
|
41 | mat3x3 &m = *this; |
|
|
42 | |
|
|
43 | nv v = m[i][0] * x + m[i][1] * y + m[i][2]; |
|
|
44 | nv w = m[2][0] * x + m[2][1] * y + m[2][2]; |
|
|
45 | |
|
|
46 | return v * (1. / w); |
|
|
47 | } |
|
|
48 | |
|
|
49 | static mat3x3 translate (nv x, nv y); |
|
|
50 | }; |
|
|
51 | |
|
|
52 | mat3x3 |
|
|
53 | mat3x3::invert () |
37 | { |
54 | { |
38 | mat3x3 &m = *this; |
55 | mat3x3 &m = *this; |
|
|
56 | mat3x3 inv; |
39 | |
57 | |
40 | nv v = m[i][0] * x + m[i][1] * y + m[i][2]; |
|
|
41 | nv w = m[2][0] * x + m[2][1] * y + m[2][2]; |
58 | nv s0 = m[2][2] * m[1][1] - m[2][1] * m[1][2]; |
|
|
59 | nv s1 = m[2][1] * m[0][2] - m[2][2] * m[0][1]; |
|
|
60 | nv s2 = m[1][2] * m[0][1] - m[1][1] * m[0][2]; |
42 | |
61 | |
43 | return v * (1. / w); |
62 | nv invdet = 1. / (m[0][0] * s0 + m[1][0] * s1 + m[2][0] * s2); |
|
|
63 | |
|
|
64 | inv[0][0] = invdet * s0; |
|
|
65 | inv[0][1] = invdet * s1; |
|
|
66 | inv[0][2] = invdet * s2; |
|
|
67 | |
|
|
68 | inv[1][0] = invdet * (m[2][0] * m[1][2] - m[2][2] * m[1][0]); |
|
|
69 | inv[1][1] = invdet * (m[2][2] * m[0][0] - m[2][0] * m[0][2]); |
|
|
70 | inv[1][2] = invdet * (m[1][0] * m[0][2] - m[1][2] * m[0][0]); |
|
|
71 | |
|
|
72 | inv[2][0] = invdet * (m[2][1] * m[1][0] - m[2][0] * m[1][1]); |
|
|
73 | inv[2][1] = invdet * (m[2][0] * m[0][1] - m[2][1] * m[0][0]); |
|
|
74 | inv[2][2] = invdet * (m[1][1] * m[0][0] - m[1][0] * m[0][1]); |
|
|
75 | |
|
|
76 | return inv; |
44 | } |
77 | } |
45 | |
78 | |
46 | static mat3x3 translate (nv x, nv y); |
|
|
47 | }; |
|
|
48 | |
|
|
49 | mat3x3 |
|
|
50 | mat3x3::invert () |
|
|
51 | { |
|
|
52 | mat3x3 &m = *this; |
|
|
53 | mat3x3 inv; |
|
|
54 | |
|
|
55 | nv s0 = m[2][2] * m[1][1] - m[2][1] * m[1][2]; |
|
|
56 | nv s1 = m[2][1] * m[0][2] - m[2][2] * m[0][1]; |
|
|
57 | nv s2 = m[1][2] * m[0][1] - m[1][1] * m[0][2]; |
|
|
58 | |
|
|
59 | nv invdet = 1. / (m[0][0] * s0 + m[1][0] * s1 + m[2][0] * s2); |
|
|
60 | |
|
|
61 | inv[0][0] = invdet * s0; |
|
|
62 | inv[0][1] = invdet * s1; |
|
|
63 | inv[0][2] = invdet * s2; |
|
|
64 | |
|
|
65 | inv[1][0] = invdet * (m[2][0] * m[1][2] - m[2][2] * m[1][0]); |
|
|
66 | inv[1][1] = invdet * (m[2][2] * m[0][0] - m[2][0] * m[0][2]); |
|
|
67 | inv[1][2] = invdet * (m[1][0] * m[0][2] - m[1][2] * m[0][0]); |
|
|
68 | |
|
|
69 | inv[2][0] = invdet * (m[2][1] * m[1][0] - m[2][0] * m[1][1]); |
|
|
70 | inv[2][1] = invdet * (m[2][0] * m[0][1] - m[2][1] * m[0][0]); |
|
|
71 | inv[2][2] = invdet * (m[1][1] * m[0][0] - m[1][0] * m[0][1]); |
|
|
72 | |
|
|
73 | return inv; |
|
|
74 | } |
|
|
75 | |
|
|
76 | static mat3x3 |
79 | static mat3x3 |
77 | operator *(const mat3x3 &a, const mat3x3 &b) |
80 | operator *(const mat3x3 &a, const mat3x3 &b) |
78 | { |
81 | { |
79 | mat3x3 r; |
82 | mat3x3 r; |
80 | |
83 | |
81 | for (int i = 0; i < 3; ++i) |
84 | for (int i = 0; i < 3; ++i) |
82 | for (int j = 0; j < 3; ++j) |
85 | for (int j = 0; j < 3; ++j) |
83 | r[i][j] = a[i][0] * b[0][j] |
86 | r[i][j] = a[i][0] * b[0][j] |
84 | + a[i][1] * b[1][j] |
87 | + a[i][1] * b[1][j] |
85 | + a[i][2] * b[2][j]; |
88 | + a[i][2] * b[2][j]; |
86 | |
89 | |
87 | return r; |
90 | return r; |
88 | } |
91 | } |
89 | |
92 | |
90 | mat3x3 |
93 | mat3x3 |
91 | mat3x3::translate (nv x, nv y) |
94 | mat3x3::translate (nv x, nv y) |
92 | { |
95 | { |
93 | return mat3x3 ( |
96 | return mat3x3 ( |
94 | 1, 0, x, |
97 | 1, 0, x, |
95 | 0, 1, y, |
98 | 0, 1, y, |
96 | 0, 0, 1 |
99 | 0, 0, 1 |
97 | ); |
100 | ); |
|
|
101 | } |
|
|
102 | |
98 | } |
103 | } |
99 | |
104 | |
100 | #if 0 |
105 | #if 0 |
101 | struct pict |
106 | struct pict |
102 | { |
107 | { |