Mercurial > MadButterfly
annotate src/coord.c @ 882:d9d55bb50679 abs_n_rel_center
Parse color and stroke width of tspan object correctly.
Color and stroke width may inherited from parent node, a text. We can
not use loadSVG._set_paint() that only parse current node.
loadSVG._set_paint_style() are used to used inherited style by passing
an aggreagated style.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Sat, 25 Sep 2010 20:31:53 +0800 |
parents | 586e50f82c1f |
children |
rev | line source |
---|---|
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
1 // -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*- |
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
2 // vim: sw=4:ts=8:sts=4 |
2 | 3 /*! \brief Implement coordination tranform mechanism. |
4 * \file | |
5 * This file implements coordination transforming for containers. | |
6 */ | |
1 | 7 #include <stdio.h> |
8 #include <string.h> | |
31
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
9 #include <math.h> |
186
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
185
diff
changeset
|
10 #include "mb_types.h" |
1 | 11 |
12 | 12 |
13 #define ASSERT(x) | |
14 | |
3
164162781a7a
Test cairo with Xlib surface
Thinker K.F. Li <thinker@branda.to>
parents:
2
diff
changeset
|
15 /* To keep possibility of changing type of aix */ |
2 | 16 #define MUL(a, b) ((a) * (b)) |
17 #define ADD(a, b) ((a) + (b)) | |
18 #define DIV(a, b) ((a) / (b)) | |
19 #define SUB(a, b) ((a) - (b)) | |
20 | |
21 static void mul_matrix(co_aix *m1, co_aix *m2, co_aix *dst) { | |
22 dst[0] = ADD(MUL(m1[0], m2[0]), MUL(m1[1], m2[3])); | |
23 dst[1] = ADD(MUL(m1[0], m2[1]), MUL(m1[1], m2[4])); | |
24 dst[2] = ADD(ADD(MUL(m1[0], m2[2]), MUL(m1[1], m2[5])), m1[2]); | |
25 dst[3] = ADD(MUL(m1[3], m2[0]), MUL(m1[4], m2[3])); | |
26 dst[4] = ADD(MUL(m1[3], m2[1]), MUL(m1[4], m2[4])); | |
27 dst[5] = ADD(ADD(MUL(m1[3], m2[2]), MUL(m1[4], m2[5])), m1[5]); | |
1 | 28 } |
29 | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
30 void matrix_mul(co_aix *m1, co_aix *m2, co_aix *dst) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
31 co_aix *_dst = dst; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
32 co_aix fake_dst[6]; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
33 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
34 if(m1 == dst || m2 == dst) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
35 _dst = fake_dst; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
36 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
37 mul_matrix(m1, m2, _dst); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
38 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
39 if(m1 == dst || m2 == dst) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
40 dst[0] = fake_dst[0]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
41 dst[1] = fake_dst[1]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
42 dst[2] = fake_dst[2]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
43 dst[3] = fake_dst[3]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
44 dst[4] = fake_dst[4]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
45 dst[5] = fake_dst[5]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
46 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
47 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
48 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
49 void matrix_trans_pos(co_aix *matrix, co_aix *x, co_aix *y) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
50 co_aix nx, ny; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
51 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
52 nx = ADD(ADD(MUL(matrix[0], *x), |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
53 MUL(matrix[1], *y)), |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
54 matrix[2]); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
55 ny = ADD(ADD(MUL(matrix[3], *x), |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
56 MUL(matrix[4], *y)), |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
57 matrix[5]); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
58 *x = nx; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
59 *y = ny; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
60 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
61 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
62 /*! \brief Compute aggregated transform matrix. |
2 | 63 * |
64 * Base on parent's aggregated matrix if it is existed, or use transform | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
65 * matrix as aggregated matrix. |
2 | 66 */ |
1 | 67 static void compute_transform_function(coord_t *visit) { |
533
b51ae415f459
Use coord_is_root() to indicate the root coord
Thinker K.F. Li <thinker@branda.to>
parents:
314
diff
changeset
|
68 if(!coord_is_root(visit)) |
1 | 69 mul_matrix(visit->parent->aggr_matrix, |
70 visit->matrix, visit->aggr_matrix); | |
71 else | |
72 memcpy(visit->aggr_matrix, visit->matrix, sizeof(visit->matrix)); | |
73 } | |
74 | |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
75 void compute_aggr_of_coord(coord_t *coord) { |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
76 compute_transform_function(coord); |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
77 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
78 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
79 /*! \brief Compute aggregated transform matrix for cached coord. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
80 * |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
81 * \sa \ref img_cache |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
82 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
83 static void compute_transform_function_cached(coord_t *visit) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
84 co_aix *p_matrix; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
85 co_aix cache_p_matrix[6]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
86 co_aix cache_scale_x, cache_scale_y; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
87 |
533
b51ae415f459
Use coord_is_root() to indicate the root coord
Thinker K.F. Li <thinker@branda.to>
parents:
314
diff
changeset
|
88 if(!coord_is_root(visit)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
89 p_matrix = coord_get_aggr_matrix(visit->parent); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
90 cache_scale_x = |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
91 sqrtf(p_matrix[0] * p_matrix[0] + p_matrix[3] * p_matrix[3]); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
92 cache_scale_y = |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
93 sqrtf(p_matrix[1] * p_matrix[1] + p_matrix[4] * p_matrix[4]); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
94 cache_p_matrix[0] = cache_scale_x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
95 cache_p_matrix[1] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
96 cache_p_matrix[2] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
97 cache_p_matrix[3] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
98 cache_p_matrix[4] = cache_scale_y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
99 cache_p_matrix[5] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
100 mul_matrix(cache_p_matrix, visit->matrix, visit->aggr_matrix); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
101 } else { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
102 memcpy(visit->aggr_matrix, visit->matrix, sizeof(visit->matrix)); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
103 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
104 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
105 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
106 void compute_aggr_of_cached_coord(coord_t *coord) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
107 compute_transform_function_cached(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
108 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
109 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
110 void |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
111 compute_aggr(coord_t *coord) { |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
112 if(coord->flags & COF_OWN_CANVAS) |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
113 compute_transform_function_cached(coord); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
114 else |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
115 compute_transform_function(coord); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
116 } |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
533
diff
changeset
|
117 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
118 void compute_reverse(co_aix *orig, co_aix *reverse) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
119 co_aix working[6]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
120 co_aix factor; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
121 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
122 #define VEC_MAC(src, factor, dst) \ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
123 do { \ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
124 (dst)[0] += (src)[0] * (factor); \ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
125 (dst)[1] += (src)[1] * (factor); \ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
126 (dst)[2] += (src)[2] * (factor); \ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
127 } while(0) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
128 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
129 reverse[0] = 1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
130 reverse[1] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
131 reverse[2] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
132 reverse[3] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
133 reverse[4] = 1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
134 reverse[5] = 0; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
135 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
136 memcpy(working, orig, sizeof(co_aix) * 6); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
137 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
138 factor = -working[3] / working[0]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
139 VEC_MAC(working, factor, working + 3); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
140 VEC_MAC(reverse, factor, reverse + 3); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
141 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
142 factor = -working[1] / working[4]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
143 VEC_MAC(working + 3, factor, working); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
144 VEC_MAC(reverse + 3, factor, reverse); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
145 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
146 reverse[2] = -working[2]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
147 reverse[5] = -working[5]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
148 |
779
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
149 factor = 1 / working[0]; |
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
150 reverse[0] *= factor; |
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
151 reverse[1] *= factor; |
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
152 reverse[2] *= factor; |
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
153 factor = 1 / working[4]; |
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
154 reverse[3] *= factor; |
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
155 reverse[4] *= factor; |
8e9481bf1cc0
Avoid float divide to improve performance
Thinker K.F. Li <thinker@codemud.net>
parents:
535
diff
changeset
|
156 reverse[5] *= factor; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
157 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
158 |
1 | 159 /*! \brief Update aggregate matrices of elements under a sub-tree. |
160 * | |
161 * A subtree is specified by the root of it. All elements in the subtree | |
162 * are effected by that changes of matrix of the subtree root. | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
163 * |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
164 * \todo Remove update_aggr_matrix() since it is out of date and |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
165 * no one use it. |
1 | 166 */ |
167 void update_aggr_matrix(coord_t *start) { | |
168 coord_t *visit, *child, *next; | |
169 | |
170 compute_transform_function(start); | |
171 | |
172 visit = start; | |
173 while(visit) { | |
12 | 174 child = STAILQ_HEAD(visit->children); |
1 | 175 while(child) { |
176 compute_transform_function(child); | |
12 | 177 child = STAILQ_NEXT(coord_t, sibling, child); |
1 | 178 } |
179 | |
12 | 180 if(STAILQ_HEAD(visit->children)) |
181 visit = STAILQ_HEAD(visit->children); | |
182 else if(STAILQ_NEXT(coord_t, sibling, visit)) | |
183 visit = STAILQ_NEXT(coord_t, sibling, visit); | |
1 | 184 else { |
185 next = NULL; | |
186 while(visit->parent && visit->parent != start) { | |
187 visit = visit->parent; | |
12 | 188 if(STAILQ_NEXT(coord_t, sibling, visit)) { |
189 next = STAILQ_NEXT(coord_t, sibling, visit); | |
1 | 190 break; |
191 } | |
192 } | |
193 visit = next; | |
194 } | |
195 } | |
196 } | |
197 | |
12 | 198 /*! \brief Initialize a coord object. |
199 * | |
200 * The object is cleared and matrix was initialized to ID. | |
201 * The object is be a children of specified parent. | |
202 */ | |
1 | 203 void coord_init(coord_t *co, coord_t *parent) { |
204 memset(co, 0, sizeof(coord_t)); | |
205 if(parent) { | |
12 | 206 /* insert at tail of children list. */ |
1 | 207 co->parent = parent; |
12 | 208 STAILQ_INS_TAIL(parent->children, coord_t, sibling, co); |
1 | 209 } |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
210 mb_obj_init(co, MBO_COORD); |
1 | 211 co->matrix[0] = 1; |
212 co->matrix[4] = 1; | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
213 co->aggr_matrix[0] = 1; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
214 co->aggr_matrix[4] = 1; |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
13
diff
changeset
|
215 co->cur_area = &co->areas[0]; |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
13
diff
changeset
|
216 co->last_area = &co->areas[1]; |
1 | 217 } |
218 | |
2 | 219 void coord_trans_pos(coord_t *co, co_aix *x, co_aix *y) { |
220 co_aix nx, ny; | |
221 | |
222 nx = ADD(ADD(MUL(co->aggr_matrix[0], *x), | |
223 MUL(co->aggr_matrix[1], *y)), | |
224 co->aggr_matrix[2]); | |
225 ny = ADD(ADD(MUL(co->aggr_matrix[3], *x), | |
226 MUL(co->aggr_matrix[4], *y)), | |
227 co->aggr_matrix[5]); | |
228 *x = nx; | |
229 *y = ny; | |
230 } | |
231 | |
31
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
232 co_aix coord_trans_size(coord_t *co, co_aix sz) { |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
233 co_aix x, y; |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
234 |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
235 x = MUL(co->aggr_matrix[0], sz); |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
236 y = MUL(co->aggr_matrix[3], sz); |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
237 |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
238 return sqrt(x * x + y * y); |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
239 } |
da770188a44d
resize font size for changige of coord.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
240 |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
241 /*! |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
242 * \note Coords, marked with COF_SKIP_TRIVAL (for temporary), and |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
243 * descendants of them will not be trivaled and the flag with be removed |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
244 * after skipping them. |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
245 */ |
13 | 246 coord_t *preorder_coord_subtree(coord_t *root, coord_t *last) { |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
247 coord_t *next = NULL; |
12 | 248 |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
249 ASSERT(last != NULL); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
250 |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
251 if((!(last->flags & COF_SKIP_TRIVAL)) && |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
252 STAILQ_HEAD(last->children)) { |
12 | 253 next = STAILQ_HEAD(last->children); |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
254 if(!(next->flags & COF_SKIP_TRIVAL)) |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
255 return next; |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
256 } else { |
12 | 257 next = last; |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
258 } |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
259 |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
260 do { |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
261 next->flags &= ~COF_SKIP_TRIVAL; |
13 | 262 while(next != root && STAILQ_NEXT(coord_t, sibling, next) == NULL) |
12 | 263 next = next->parent; |
13 | 264 if(next == root) |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
265 return NULL; |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
266 next = STAILQ_NEXT(coord_t, sibling, next); |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
140
diff
changeset
|
267 } while(next->flags & COF_SKIP_TRIVAL); |
12 | 268 |
269 return next; | |
270 } | |
271 | |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
272 coord_t *postorder_coord_subtree(coord_t *root, coord_t *last) { |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
273 coord_t *next; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
274 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
275 if(root == last) |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
276 return NULL; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
277 |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
278 if(last == NULL) { |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
279 /* Go most left leaf. */ |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
280 next = root; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
281 while(STAILQ_HEAD(next->children)) |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
282 next = STAILQ_HEAD(next->children); |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
283 return next; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
284 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
285 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
286 next = last; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
287 if(STAILQ_NEXT(coord_t, sibling, next) == NULL) /* most right */ |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
288 return next->parent; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
289 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
290 /* Go most left leaf of right sibling sub-tree. */ |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
291 next = STAILQ_NEXT(coord_t, sibling, next); |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
292 while(STAILQ_HEAD(next->children)) |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
293 next = STAILQ_HEAD(next->children); |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
294 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
295 return next; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
296 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
31
diff
changeset
|
297 |
1 | 298 #ifdef UNITTEST |
299 | |
300 #include <CUnit/Basic.h> | |
301 | |
302 void test_update_aggr_matrix(void) { | |
303 coord_t elms[6]; | |
2 | 304 co_aix x, y; |
1 | 305 |
306 coord_init(elms, NULL); | |
307 coord_init(elms + 1, elms); | |
308 coord_init(elms + 2, elms); | |
309 coord_init(elms + 3, elms + 1); | |
310 coord_init(elms + 4, elms + 1); | |
311 coord_init(elms + 5, elms + 2); | |
312 | |
313 /* | 2 -1 0 | | |
314 * | 0 1 0 | | |
315 * | 0 0 1 | | |
316 */ | |
317 elms[0].matrix[0] = 2; | |
318 elms[0].matrix[1] = -1; | |
319 | |
320 /* | 1 3 0 | | |
321 * | 5 1 0 | | |
322 * | 0 0 1 | | |
323 */ | |
324 elms[1].matrix[1] = 3; | |
325 elms[1].matrix[3] = 5; | |
326 | |
327 update_aggr_matrix(elms); | |
328 | |
329 /* | -3 5 0 | | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
779
diff
changeset
|
330 * | 5 1 0 | |
1 | 331 * | 0 0 1 | |
332 */ | |
333 CU_ASSERT(elms[3].aggr_matrix[0] == -3); | |
334 CU_ASSERT(elms[3].aggr_matrix[1] == 5); | |
335 CU_ASSERT(elms[3].aggr_matrix[2] == 0); | |
336 CU_ASSERT(elms[3].aggr_matrix[3] == 5); | |
337 CU_ASSERT(elms[3].aggr_matrix[4] == 1); | |
338 CU_ASSERT(elms[3].aggr_matrix[5] == 0); | |
339 | |
340 CU_ASSERT(elms[4].aggr_matrix[0] == -3); | |
341 CU_ASSERT(elms[4].aggr_matrix[1] == 5); | |
342 CU_ASSERT(elms[4].aggr_matrix[2] == 0); | |
343 CU_ASSERT(elms[4].aggr_matrix[3] == 5); | |
344 CU_ASSERT(elms[4].aggr_matrix[4] == 1); | |
345 CU_ASSERT(elms[4].aggr_matrix[5] == 0); | |
346 | |
347 CU_ASSERT(elms[5].aggr_matrix[0] == 2); | |
348 CU_ASSERT(elms[5].aggr_matrix[1] == -1); | |
349 CU_ASSERT(elms[5].aggr_matrix[2] == 0); | |
350 CU_ASSERT(elms[5].aggr_matrix[3] == 0); | |
351 CU_ASSERT(elms[5].aggr_matrix[4] == 1); | |
352 CU_ASSERT(elms[5].aggr_matrix[5] == 0); | |
2 | 353 |
354 x = 50; | |
355 y = 99; | |
356 coord_trans_pos(elms + 5, &x, &y); | |
357 CU_ASSERT(x == 1); | |
358 CU_ASSERT(y == 99); | |
1 | 359 } |
360 | |
13 | 361 void test_preorder_coord_subtree(void) { |
12 | 362 coord_t elms[6]; |
363 coord_t *last; | |
364 | |
365 coord_init(elms, NULL); | |
366 coord_init(elms + 1, elms); | |
367 coord_init(elms + 2, elms); | |
368 coord_init(elms + 3, elms + 1); | |
369 coord_init(elms + 4, elms + 1); | |
370 coord_init(elms + 5, elms + 2); | |
371 | |
372 last = elms; | |
13 | 373 last = preorder_coord_subtree(elms, last); |
12 | 374 CU_ASSERT(last == elms + 1); |
13 | 375 last = preorder_coord_subtree(elms, last); |
12 | 376 CU_ASSERT(last == elms + 3); |
13 | 377 last = preorder_coord_subtree(elms, last); |
12 | 378 CU_ASSERT(last == elms + 4); |
13 | 379 last = preorder_coord_subtree(elms, last); |
12 | 380 CU_ASSERT(last == elms + 2); |
13 | 381 last = preorder_coord_subtree(elms, last); |
12 | 382 CU_ASSERT(last == elms + 5); |
13 | 383 last = preorder_coord_subtree(elms, last); |
12 | 384 CU_ASSERT(last == NULL); |
385 } | |
386 | |
1 | 387 CU_pSuite get_coord_suite(void) { |
388 CU_pSuite suite; | |
389 | |
390 suite = CU_add_suite("Suite_coord", NULL, NULL); | |
391 CU_ADD_TEST(suite, test_update_aggr_matrix); | |
13 | 392 CU_ADD_TEST(suite, test_preorder_coord_subtree); |
1 | 393 |
394 return suite; | |
395 } | |
396 | |
397 #endif |