ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtimg.C
(Generate patch)

Comparing rxvt-unicode/src/rxvtimg.C (file contents):
Revision 1.92 by root, Fri Jun 15 18:05:15 2012 UTC vs.
Revision 1.93 by root, Fri Jun 15 18:07:24 2012 UTC

5 5
6#if HAVE_IMG 6#if HAVE_IMG
7 7
8typedef rxvt_img::nv nv; 8typedef rxvt_img::nv nv;
9 9
10namespace
11{
12
10struct 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
49mat3x3
50mat3x3::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
76static mat3x3 79 static mat3x3
77operator *(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
90mat3x3 93 mat3x3
91mat3x3::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
101struct pict 106struct pict
102{ 107{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines