Mercurial > MadButterfly
annotate src/redraw_man.c @ 1532:4a92b639a1cd
Clear selection set when switching current scene.
To clear selection set after switching away from current to another scene.
It avoids Inkscape select on nodes they are not saw after switching.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Fri, 30 Sep 2011 12:31:33 +0800 |
parents | e5b3d68d0b05 |
children |
rev | line source |
---|---|
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
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:
818
diff
changeset
|
2 // vim: sw=4:ts=8:sts=4 |
12 | 3 #include <stdio.h> |
4 #include <stdlib.h> | |
5 #include <string.h> | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
6 #include <math.h> |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
7 #include "mb_graph_engine.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
|
8 #include "mb_types.h" |
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
185
diff
changeset
|
9 #include "mb_shapes.h" |
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_tools.h" |
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
185
diff
changeset
|
11 #include "mb_redraw_man.h" |
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
185
diff
changeset
|
12 #include "mb_observer.h" |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
13 #include "mb_prop.h" |
467
6e18550c8fa8
Header file to config graphic engine
Thinker K.F. Li <thinker@branda.to>
parents:
466
diff
changeset
|
14 #include "config.h" |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
15 |
408
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
16 /* required by rdman_img_ldr_load_paint() */ |
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
17 #include "mb_paint.h" |
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
18 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
19 /*! \page dirty Dirty geo, coord, and area. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
20 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
21 * \section dirty_of_ego Dirty of geo |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
22 * A geo is dirty when any of the shape, size or positions is changed. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
23 * It's geo and positions should be recomputed before drawing. So, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
24 * dirty geos are marked as dirty and put into redraw_man_t::dirty_geos list. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
25 * geos in the list are cleaned to compute information as a reaction for |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
26 * dirty. It recomputes size, position and other data of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
27 * repective shapes. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
28 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
29 * \section dirty_of_coord Dirty of coord |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
30 * A coord is dirty when it's transformation matrix being changed. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
31 * Dirty coords are marked as dirty and put into dirty_coords list. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
32 * Once a coord is dirty, every member geos of it are also dirty. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
33 * Because, their shape, size and positions will be changed. But, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
34 * they are not marked as dirty and put into dirty_geos list, since |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
35 * all these member geos will be recomputed for computing new current |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
36 * area of the coord. The changes of a coord also affect child |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
37 * coords. Once parent is dirty, all children are also dirty for |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
38 * their aggregate matrix out of date. Dirty coords should be |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
39 * clean in preorder of tree traversal. The redraw_man_t::dirty_coords |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
40 * list are sorted to keep ordering before cleaning. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
41 * Whenever a coord is marked dirty and put into redraw_man_t::dirty_coords |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
42 * list, all it's children should also be marked. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
43 * |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
44 * The procedure of clean coords comprises recomputing aggregated |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
45 * transform matrix and area where members spreading in. The aggregated |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
46 * transform matrix can reduce number of matrix mul to transform |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
47 * positions from space of a coord to the closest cached ancestor coord. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
48 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
49 * The list is inspected before drawing to recompute new shape, size, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
50 * and positions of member geos of coords in the list. The drity |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
51 * flag of member geos will be clean. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
52 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
53 * Clean coords should be performed before clean geos, since clean |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
54 * coords will also clean member geos. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
55 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
56 * \section dirty_of_area Dirty of area |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
57 * When an area is dirty, it is added to coord_canvas_info_t::dirty_areas |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
58 * of it's closest cached coord. Areas are created when a shape is cleaned |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
59 * for dirty. The areas where a cleaned shape occupied before and after |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
60 * cleaning should be redrawed. Areas are added to dirty area list to |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
61 * mark areas where should be redrawed. So, all shapes covered by |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
62 * dirty area list should be redrawed to update these areas. So, areas |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
63 * are added to dirty lists after cleaning geos due to changes of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
64 * shapes. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
65 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
66 * For example, when a shape is moved from location A to location B, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
67 * areas where the shape occupied for A and B are changed for moving. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
68 * Bothe areas are added into dirty list to mark these areas should |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
69 * be redrawed. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
70 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
71 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
72 /*! \page redraw How to Redraw Shapes? |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
73 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
74 * Coords are corresponding objects for group tags of SVG files. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
75 * In conceptional, every SVG group has a canvas, graphics of child shapes |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
76 * are drawed into the canvas, applied filters of group, and blended into |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
77 * canvas of parent of the group. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
78 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
79 * But, we don't need to create actually a surface/canvas for every coord. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
80 * We only create surface for coords their opacity value are not 1 or they |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
81 * apply filters on background. Child shapes of coords without canvas |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
82 * are drawed on canvas of nearest ancestor which have canvas. It said |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
83 * a coord owns a canvas or inherits from an ancestor. (\ref COF_OWN_CANVAS, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
84 * clean_coord()) Except, root_coord always owns a canvas. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
85 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
86 * \note Default opacity of a coord is 1. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
87 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
88 * \sa |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
89 * - rdman_redraw_all() |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
90 * - rdman_redraw_changed() |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
91 * - draw_shapes_in_areas() |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
92 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
93 * \section img_cache Image Cache |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
94 * It costs time to redraw every component in a complete graphic. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
95 * Image cache try to cache result of prviously rendering, and reusing it |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
96 * to avoid wasting CPU time on repeatitive and redundant rendering. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
97 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
98 * \ref COF_FAST_CACHE and \ref COF_PRECISE_CACHE are used to tag a |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
99 * coord that it's |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
100 * rendering result is cached in fast way or precise way. With fast cache, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
101 * MB renders descendants of a coord in once, and reuse the result until it |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
102 * being dirty. With precise cache, it alike fast cache, but it also |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
103 * performs rendering when an ancester of the coord transform it to larger |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
104 * size, in width or height. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
105 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
106 * coord_t::aggr_matrix of a cached coord is computed from aggr_matrix of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
107 * parent. But, it does not use one from parent directly. parent one is |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
108 * transformed as |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
109 * \code |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
110 * cache_scale_x = sqrt(p_matrix[0]**2 + p_matrix[3]**2); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
111 * cache_scale_y = sqrt(p_matrix[1]**2 + p_matrix[4]**2); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
112 * cache_p_matrix[0] = cache_scale_x; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
113 * cache_p_matrix[1] = 0; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
114 * cache_p_matrix[2] = range_shift_x; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
115 * cache_p_matrix[3] = 0; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
116 * cache_p_matrix[4] = cache_scale_y; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
117 * cache_p_matrix[5] = range_shift_y; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
118 * \endcode |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
119 * where p_matrix is parent one, and cache_p_matrix is one derived from |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
120 * parent one. coord_t::aggr_matrix of a cached coord is |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
121 * \code |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
122 * aggr_matrix = cache_p_matrix * matrix |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
123 * \endcode |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
124 * where matrix is the transform being installed on the cached coord. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
125 * range_shift_x and range_shift_y are defined above. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
126 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
127 * cache_p_matrix rescales sub-graphic to an appropriately size |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
128 * (cache_scale_x, cache_scale_y) and aligns left-top of the minimum |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
129 * rectangle (range_shift_x, range_shift_y) that cover the area occupied |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
130 * by sub-graphic with origin of the space. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
131 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
132 * The sub-graphic should be rendered on space defined by cache_p_matrix of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
133 * cached one. But rendering result are transformed to the space defined |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
134 * by parent with following matrix. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
135 * \code |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
136 * draw_matrix = reverse(p_matrix * reverse(cache_p_matrix)) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
137 * \endcode |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
138 * With Cairo, draw_matrix is applied on source surface (canvas) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
139 * to draw image to parent's surface (canvas). draw_matrix is a function |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
140 * map points from parent space to the space of cached one. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
141 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
142 * Cached coords are marked for changing transformation of ancestors only if |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
143 * following condition is true. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
144 * \code |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
145 * cache_scale_x < sqrt(p_matrix[0]**2 + p_matrix[3]**2) || |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
146 * cache_scale_y < sqrt(p_matrix[1]**2 + p_matrix[4]**2) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
147 * \endcode |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
148 * where p_matrix is latest aggr_matrix of parent after changing |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
149 * transformation, and where cache_scale_* are ones mention above and computed |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
150 * before changing transformation of ancestors. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
151 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
152 * Cache_scale_* can be recovered by following instructions. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
153 * \code |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
154 * cache_scale_x = aggr_matrix[0] / matrix[0]; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
155 * cache_scale_y = aggr_matrix[4] / matrix[4]; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
156 * \endcode |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
157 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
158 * \section cache_area Area of cached coord |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
159 * - *_transform of shapes works as normal |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
160 * - areas of descendants of cached coord are in space defined |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
161 * by aggr_matrix of cached coord. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
162 * - descendants are marked with \ref COF_ANCESTOR_CACHE |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
163 * |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
164 * Since *_transform of shapes compute area with aggr_matrix that is |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
165 * derived from aggr_matrix of a cached ancestor, area of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
166 * \ref COF_ANCESTOR_CACHE ones should be transformed to device space in |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
167 * find_shape_at_pos() with following statement. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
168 * \code |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
169 * area_matrix = p_matrix * reverse(cache_p_matrix) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
170 * \endcode |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
171 * where cache_p_matrix and p_matrix are corresponding matrix of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
172 * cached ancestor. We can also perform transforming in reversed |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
173 * direction to transform point to space defined by aggr_matrix of cached |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
174 * coord. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
175 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
176 * Since it is costly to transform area of \ref COF_ANCESTOR_CACHE ones to |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
177 * device space if more than one ancestor are cached, no ancestor of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
178 * cached coord can be set to cached. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
179 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
180 * \section cached_bounding Bounding box of cached coord and descendants |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
181 * Bounding box of a cached coord and it's descendants is the range that |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
182 * cached coord and descendants are rendered on canvas. It is also called |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
183 * cached-bounding. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
184 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
185 * range_shift_x and range_shift_y are computed by initailizing cache_p_matrix |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
186 * with range_shift_x == range_shift_y == 0 at first. cache_p_matrix is |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
187 * used to compute aggr_matrix and cached-bounding in turn. Then, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
188 * range_shift_x and range_shift_y are initialized to negative of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
189 * x-axis and y-axis, repectively, of left-top of cached-bounding. Then, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
190 * aggr_matrix of cached coord and descendants are updated by |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
191 * following statements. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
192 * \code |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
193 * aggr_matrix[2] += range_shift_x; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
194 * aggr_matrix[5] += range_shift_y; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
195 * \endcode |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
196 * The statements shift the spaces to make cached-bounding |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
197 * aligned to origin of coordinate system. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
198 * The purpose of range_shift_* is to reduce size of canvas used to cache |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
199 * rendering result. The canvas are shrink to size the same as bounding |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
200 * box. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
201 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
202 * \section cache_redraw How cache and redraw work together? |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
203 * When a coord and descedants are cached, the coord is flaged with |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
204 * COF_FAST_CACHE or COF_PRECISE_CACHE. When a coord is marked dirty, all |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
205 * descendants are also marked dirty by rdman except descendants of cached |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
206 * ones. But, cached ones are also marked dirty as normal ones. The |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
207 * reason to mark cached ones is giving them a chance to update their |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
208 * area. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
209 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
210 * For precise cached descendants, above rule has an exception. They should |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
211 * also be marked dirty if cached coord should be rendered in a larger |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
212 * resize factor to get better output. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
213 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
214 * coord_t::aggr_matrix and cached-bounding of cached coord must be computed |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
215 * in the way described in \ref cached_bounding. Propagating range_shift_* |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
216 * to descendants must skip cached ones and their descendants. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
217 * Range_shift_* are computed after updating descendants. So, procedure |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
218 * of clean descendants of a cached one must performed in two phases. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
219 * One for computing areas of descendants and one for propagating |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
220 * range_shift_*. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
221 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
222 * A cached coord or/and descendants are dirty only for cached coord or |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
223 * descendants being marked dirty by application. Once a cached coord or |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
224 * descendant is marked dirty, all descendants of marked one are also |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
225 * marked. redraw_man_t::dirty_areas collects areas, in device space, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
226 * that should be updated. All shapes overlaid with any area in |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
227 * redraw_man_t::dirty_areas should be redraw. Since descendants of cached |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
228 * coord compute their areas in spaces other than device space. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
229 * Separated lists should be maintained for each cached coord and it's |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
230 * descendants. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
231 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
232 * \section cache_imp Implementation of Cache |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
233 * Both cached coords and coords that opacity != 1 need a canvas to |
519
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
234 * draw descendants on. Both cases are traded in the same way. Every |
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
235 * of them own a canvas_info to describe canvas and related |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
236 * information. aggr_matrix of descendants must be adjusted to make |
519
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
237 * left-top of bounding box just at origin (0, 0) of canvas. It saves |
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
238 * space to give a canvas just enough for rending descadants. The |
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
239 * process of adjusting left-top of bounding box is zeroing. |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
240 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
241 * Following is rules. |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
242 * - zeroing on a cached coord is performed by adjust coord_t::aggr_matrix |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
243 * of the cached coord and descendnats. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
244 * - Clean coords works just like before without change. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
245 * - in preorder |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
246 * - never perform zeroing on root_coord. |
519
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
247 * - do zeroing on cached coords marked with \ref COF_MUST_ZEROING. |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
248 * - when clean a descendant that moves out-side of it's canvas, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
249 * respective cached coord is marked with \ref COF_MUST_ZEROING. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
250 * - zeroing is performed immediately after clean coords. |
519
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
251 * - zeroing will not be propagated to ancestors of a cached coord. |
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
252 * - It will be stopped once a cached coord being found. |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
253 * - coord_t::cur_area and coord_t::aggr_matrix of cached coords |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
254 * must be ajdusted. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
255 * - the area of a cached coord is defined in parent space. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
256 * - areas of descendants are defined in space defined by aggr_matrix of |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
257 * cached coord. |
519
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
258 * - coord_t::aggr_matrix of cached coord defines coordination of |
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
259 * descendants. |
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
260 * - the parent knows the area in where cached coord and descendnats will |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
261 * be draw. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
262 * - cached coords keep their private dirty area list. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
263 * - private dirty areas of a cached coord are transformed and added to |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
264 * parent cached coord. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
265 * - aggregates areas before adding to parent. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
266 * - canvas of a cached coord is updated if |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
267 * - descendants are dirty, or |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
268 * - it-self is dirty. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
269 * - change of a canvas must copy to canvas of parent space. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
270 * - a cached is updated if canvas of descendant cached coord is updated. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
271 * - updating canvas is performed by redraw dirty areas. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
272 * - since dirty areas of cached ones would be aggregated and added to |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
273 * parent, parent cached coord would copy it from cache of descedants. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
274 * - descendant cached coords must be updated before ancestor cached coords. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
275 * - add dirty areas to parent immediately after updating canvas. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
276 * - Making dirty coords is not propagated through cached ones. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
277 * - cached ones are also made dirty, but stop after that. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
278 * |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
279 * Steps: |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
280 * - SWAP coord_t::cur_area of dirty coords. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
281 * - SWAP geo_t::cur_area of dirty geos. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
282 * - clean coords |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
283 * - coord_t::aggr_matrix of cached coord is not the same as non-cached. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
284 * - see \ref img_cache |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
285 * - clean geos |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
286 * - Add canvas owner of dirty geos to redraw_man_t::zeroing_coords |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
287 * - Cached ancestors of redraw_man_t::dirty_geos |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
288 * - Cached ancestors of redraw_man_t::dirty_coords |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
289 * - Cached ancestors of zeroed ones should also be zeroed. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
290 * - zeroing |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
291 * - Add more dirty areas if canvas should be fully redrawed. |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
292 * - From leaves to root. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
293 * - Adjust area of child cached coords. |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
294 * - add aggregated dirty areas from descendant cached coords to ancestors. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
295 * - Must include old area of cached coords if it is just clean and |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
296 * parent cached one is not just clean. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
297 * - Just clean is a coord cleaned in last time of cleaning coords. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
298 * - draw dirty areas |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
299 * - areas are rounded to N at first. |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
300 * - from leaves to root. |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
301 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
302 |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
303 #ifndef ASSERT |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
304 #define ASSERT(x) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
305 #endif |
12 | 306 |
1059
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
307 /* |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
308 * Conitions for coords. |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
309 */ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
310 #define coord_is_cached(co) ((co)->flags & COF_OWN_CANVAS) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
311 #define coord_is_always_cached(co) ((co)->flags & COF_ALWAYS_CACHE) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
312 #define coord_is_fast_cached(co) ((co)->flags & COF_FAST_MASK) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
313 #define coord_is_precise_cached(co) ((co)->flags & COF_PRECISE_MASK) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
314 #define coord_is_zeroing(co) ((co)->flags & COF_MUST_ZEROING) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
315 #define coord_set_zeroing(co) \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
316 do { (co)->flags |= COF_MUST_ZEROING; } while(0) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
317 #define coord_clear_zeroing(co) \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
318 do { (co)->flags &= ~COF_MUST_ZEROING; } while(0) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
319 #define coord_set_flags(co, _flags) \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
320 do { (co)->flags |= (_flags); } while(0) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
321 #define coord_get_parent(co) ((co)->parent) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
322 #define coord_get_flags(co, _flags) ((co)->flags & (_flags)) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
323 #define coord_clear_flags(co, _flags) \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
324 do { (co)->flags &= ~(_flags); } while(0) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
325 |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
326 #define coord_get_pcache_area(coord) ((coord)->canvas_info->pcache_cur_area) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
327 #define coord_get_pcache_last_area(coord) \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
328 ((coord)->canvas_info->pcache_last_area) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
329 #define coord_get_cached(coord) ((coord)->canvas_info->owner) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
330 #define _coord_get_dirty_areas(coord) (&(coord)->canvas_info->dirty_areas) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
331 #define _coord_get_aggr_dirty_areas(coord) \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
332 ((coord)->canvas_info->aggr_dirty_areas) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
333 #define coord_get_2pdev(coord) ((coord)->canvas_info->cache_2_pdev) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
334 #define coord_get_2pdev_rev(coord) ((coord)->canvas_info->cache_2_pdev_rev) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
335 #define coord_get_aggr2pdev(coord) ((coord)->canvas_info->aggr_2_pdev) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
336 #define coord_get_aggr2pdev_rev(coord) ((coord)->canvas_info->aggr_2_pdev_rev) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
337 |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
935
diff
changeset
|
338 |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
339 /* NOTE: bounding box should also consider width of stroke. |
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
340 */ |
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
341 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
342 #define sh_attach_geo(sh, g) \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
343 do { \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
344 (sh)->geo = g; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
345 (g)->shape = (shape_t *)(sh); \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
346 } while(0) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
347 #define sh_detach_geo(sh) \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
348 do { \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
349 (sh)->geo->shape = NULL; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
350 (sh)->geo = NULL; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
351 } while(0) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
352 #define sh_get_geo(sh) ((sh)->geo) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
353 #define sh_attach_coord(sh, coord) do { (sh)->coord = coord; } while(0) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
354 #define sh_detach_coord(sh) do { (sh)->coord = NULL; } while(0) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
355 #define rdman_is_dirty(rdman) \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
356 ((rdman)->dirty_coords.num != 0 || \ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
357 (rdman)->dirty_geos.num != 0) |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
358 |
12 | 359 #define OK 0 |
360 #define ERR -1 | |
361 | |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
362 #define ARRAY_EXT_SZ 64 |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
363 |
13 | 364 #define SWAP(a, b, t) do { t c; c = a; a = b; b = c; } while(0) |
365 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
366 #ifdef UNITTEST |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
367 typedef struct _sh_dummy sh_dummy_t; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
368 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
369 extern void sh_dummy_transform(shape_t *shape); |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
370 extern void sh_dummy_fill(shape_t *, mbe_t *); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
371 #endif /* UNITTEST */ |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
372 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
373 static subject_t *observer_subject_alloc(observer_factory_t *factory); |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
374 static void observer_subject_free(observer_factory_t *factory, |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
375 subject_t *subject); |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
376 static observer_t *observer_observer_alloc(observer_factory_t *factory); |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
377 static void observer_observer_free(observer_factory_t *factory, |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
378 observer_t *observer); |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
379 static subject_t *observer_get_parent_subject(observer_factory_t *factory, |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
380 subject_t *cur_subject); |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
381 /* Functions for children. */ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
382 #define FORCHILDREN(coord, child) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
383 for((child) = STAILQ_HEAD((coord)->children); \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
384 (child) != NULL; \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
385 (child) = STAILQ_NEXT(coord_t, sibling, (child))) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
386 #define NEXT_CHILD(child) STAILQ_NEXT(coord_t, sibling, child) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
387 #define ADD_CHILD(parent, child) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
388 STAILQ_INS_TAIL((parent)->children, coord_t, sibling, (child)) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
389 #define RM_CHILD(parent, child) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
390 STAILQ_REMOVE((parent)->children, coord_t, sibling, (child)) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
391 #define FIRST_CHILD(parent) STAILQ_HEAD((parent)->children) |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
392 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
393 /* Functions for members. */ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
394 #define FORMEMBERS(coord, member) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
395 for((member) = STAILQ_HEAD((coord)->members); \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
396 (member) != NULL; \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
397 (member) = STAILQ_NEXT(geo_t, coord_next, (member))) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
398 #define NEXT_MEMBER(member) STAILQ_NEXT(geo_t, coord_next, (member)) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
399 #define ADD_MEMBER(coord, member) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
400 STAILQ_INS_TAIL((coord)->members, geo_t, coord_next, (member)) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
401 #define RM_MEMBER(coord, member) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
402 STAILQ_REMOVE((coord)->members, geo_t, coord_next, (member)) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
403 #define FIRST_MEMBER(coord) STAILQ_HEAD((coord)->members) |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
404 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
405 /* Functions for paint members. */ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
406 #define FORPAINTMEMBERS(paint, member) \ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
407 for((member) = STAILQ_HEAD((paint)->members); \ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
408 (member) != NULL; \ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
409 (member) = STAILQ_NEXT(paint_t, next, member)) |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
410 #define RM_PAINTMEMBER(paint, member) \ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
411 STAILQ_REMOVE((paint)->members, shnode_t, next, member) |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
412 |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
413 /*! \brief Sort a list of element by a unsigned integer. |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
414 * |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
415 * The result is in ascend order. The unsigned integers is |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
416 * at offset specified by 'off' from start address of elemnts. |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
417 */ |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
418 static void _insert_sort(void **elms, int num, int off) { |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
419 int i, j; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
420 unsigned int val; |
121
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
421 void *elm_i; |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
422 |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
423 for(i = 1; i < num; i++) { |
121
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
424 elm_i = elms[i]; |
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
425 val = *(unsigned int *)(elm_i + off); |
119 | 426 for(j = i; j > 0; j--) { |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
427 if(*(unsigned int *)(elms[j - 1] + off) <= val) |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
428 break; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
429 elms[j] = elms[j - 1]; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
430 } |
121
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
431 elms[j] = elm_i; |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
432 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
433 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
434 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
435 DARRAY_DEFINE(coords, coord_t *); |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
436 DARRAY_DEFINE(geos, geo_t *); |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
437 DARRAY_DEFINE(areas, area_t *); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
438 |
235 | 439 int rdman_add_gen_geos(redraw_man_t *rdman, geo_t *geo) { |
440 int r; | |
441 | |
442 r = geos_add(rdman_get_gen_geos(rdman), geo); | |
443 return r; | |
444 } | |
445 | |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
446 /*! Use \brief DARRAY to implement dirty & free lists. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
447 */ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
448 #define ADD_DATA(sttype, field, v) \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
449 int r; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
450 r = sttype ## _add(&rdman->field, v); \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
451 return r == 0? OK: ERR; |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
452 |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
453 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
454 static int is_area_in_areas(area_t *area, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
455 int n_areas, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
456 area_t **areas) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
457 int i; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
458 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
459 for(i = 0; i < n_areas; i++) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
460 if(areas_are_overlay(area, areas[i])) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
461 return 1; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
462 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
463 return 0; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
464 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
465 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
466 static int is_geo_in_areas(geo_t *geo, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
467 int n_areas, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
468 area_t **areas) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
469 return is_area_in_areas(geo->cur_area, n_areas, areas); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
470 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
471 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
472 static void area_to_positions(area_t *area, co_aix (*poses)[2]) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
473 poses[0][0] = area->x; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
474 poses[0][1] = area->y; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
475 poses[1][0] = area->x + area->w; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
476 poses[1][1] = area->y + area->h;; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
477 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
478 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
479 /* Maintain Lists */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
480 |
152
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
481 static int add_dirty_coord(redraw_man_t *rdman, coord_t *coord) { |
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
482 coord->flags |= COF_DIRTY; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
483 ADD_DATA(coords, dirty_coords, coord); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
484 return OK; |
152
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
485 } |
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
486 |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
487 static int add_dirty_geo(redraw_man_t *rdman, geo_t *geo) { |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
488 geo->flags |= GEF_DIRTY; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
489 ADD_DATA(geos, dirty_geos, geo); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
490 return OK; |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
491 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
492 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
493 static int add_dirty_area(redraw_man_t *rdman, coord_t *coord, area_t *area) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
494 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
495 |
530
cd41d9033567
Ignore small dirty area.
Thinker K.F. Li <thinker@branda.to>
parents:
528
diff
changeset
|
496 if(area->w < 0.01 || area->h < 0.01) |
cd41d9033567
Ignore small dirty area.
Thinker K.F. Li <thinker@branda.to>
parents:
528
diff
changeset
|
497 return OK; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
498 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
499 rdman->n_dirty_areas++; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
500 r = areas_add(_coord_get_dirty_areas(coord), area); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
501 return r == 0? OK: ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
502 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
503 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
504 static int add_zeroing_coord(redraw_man_t *rdman, coord_t *coord) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
505 coord_set_zeroing(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
506 ADD_DATA(coords, zeroing_coords, coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
507 return OK; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
508 } |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
509 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
510 static int add_dirty_pcache_area_coord(redraw_man_t *rdman, coord_t *coord) { |
836
f3ce3598612f
Avoid to add a coord to dirty_pcache_area_coords twice or more
Thinker K.F. Li <thinker@codemud.net>
parents:
835
diff
changeset
|
511 if(!coord_get_flags(coord, COF_DIRTY_PCACHE_AREA)) { |
f3ce3598612f
Avoid to add a coord to dirty_pcache_area_coords twice or more
Thinker K.F. Li <thinker@codemud.net>
parents:
835
diff
changeset
|
512 coord_set_flags(coord, COF_DIRTY_PCACHE_AREA); |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
513 ADD_DATA(coords, zeroing_coords, coord); |
836
f3ce3598612f
Avoid to add a coord to dirty_pcache_area_coords twice or more
Thinker K.F. Li <thinker@codemud.net>
parents:
835
diff
changeset
|
514 } |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
515 return OK; |
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
516 } |
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
517 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
518 static int add_free_obj(redraw_man_t *rdman, void *obj, |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
519 free_func_t free_func) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
520 int max; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
521 free_obj_t *new_objs, *free_obj; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
522 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
523 if(rdman->free_objs.num >= rdman->free_objs.max) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
524 max = rdman->free_objs.num + ARRAY_EXT_SZ; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
525 new_objs = realloc(rdman->free_objs.objs, |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
526 max * sizeof(free_obj_t)); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
527 if(new_objs == NULL) |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
528 return ERR; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
529 rdman->free_objs.max = max; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
530 rdman->free_objs.objs = new_objs; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
531 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
532 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
533 free_obj = rdman->free_objs.objs + rdman->free_objs.num++; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
534 free_obj->obj = obj; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
535 free_obj->free_func = free_func; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
536 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
537 return OK; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
538 } |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
539 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
540 static void free_free_objs(redraw_man_t *rdman) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
541 int i; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
542 free_obj_t *free_obj; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
543 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
544 for(i = 0; i < rdman->free_objs.num; i++) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
545 free_obj = &rdman->free_objs.objs[i]; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
546 free_obj->free_func(rdman, free_obj->obj); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
547 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
548 rdman->free_objs.num = 0; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
549 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
550 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
551 static void free_objs_destroy(redraw_man_t *rdman) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
552 if(rdman->free_objs.objs != NULL) |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
553 free(rdman->free_objs.objs); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
554 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
555 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
556 #ifdef UNITTEST |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
557 /*! \brief This is only used for unittest. |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
558 */ |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
559 typedef struct { |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
560 co_aix parent_2_cache[6]; |
834
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
561 int w, h; |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
562 } mock_mbe_t; |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
563 #endif |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
564 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
565 static mbe_t *canvas_new(int w, int h) { |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
566 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
567 mbe_surface_t *surface; |
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
568 mbe_t *cr; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
569 |
450
a417fd980228
Replace cairo_format_t with mb_img_fmt_t.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
570 surface = mbe_image_surface_create(MB_IFMT_ARGB32, |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
571 w, h); |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
572 cr = mbe_create(surface); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
573 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
574 return cr; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
575 #else |
834
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
576 mock_mbe_t *mbe; |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
577 |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
578 mbe = malloc(sizeof(mock_mbe_t)); |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
579 mbe->w = w; |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
580 mbe->h = h; |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
581 |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
582 return (mbe_t *)mbe; |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
583 #endif |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
584 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
585 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
586 static void canvas_free(mbe_t *canvas) { |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
587 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
588 mbe_destroy(canvas); |
825
e83956ba22d7
Make sure drawing on right cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
824
diff
changeset
|
589 #else |
e83956ba22d7
Make sure drawing on right cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
824
diff
changeset
|
590 free(canvas); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
591 #endif |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
592 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
593 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
594 static void canvas_get_size(mbe_t *canvas, int *w, int *h) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
595 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
596 mbe_surface_t *surface; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
597 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
598 surface = mbe_get_target(canvas); |
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
599 *w = mbe_image_surface_get_width(surface); |
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
600 *h = mbe_image_surface_get_height(surface); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
601 #else |
834
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
602 mock_mbe_t *mbe; |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
603 |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
604 mbe = (mock_mbe_t *)canvas; |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
605 *w = mbe->w; |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
606 *h = mbe->h; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
607 #endif |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
608 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
609 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
610 static int geo_off_in_coord(geo_t *geo, coord_t *coord) { |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
611 int off = 0; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
612 geo_t *vgeo; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
613 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
614 FORMEMBERS(coord, vgeo) { |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
615 if(vgeo == geo) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
616 return off; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
617 off++; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
618 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
619 return -1; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
620 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
621 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
622 static void geo_attach_coord(geo_t *geo, coord_t *coord) { |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
623 ADD_MEMBER(coord, geo); |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
624 coord->num_members++; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
625 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
626 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
627 static void geo_detach_coord(geo_t *geo, coord_t *coord) { |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
628 int off; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
629 coord_t *child; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
630 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
631 off = geo_off_in_coord(geo, coord); |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
632 if(off < 0) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
633 return; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
634 FORCHILDREN(coord, child) { |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
635 if(child->before_pmem >= off) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
636 child->before_pmem--; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
637 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
638 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
639 RM_MEMBER(coord, geo); |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
640 coord->num_members--; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
641 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
642 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
643 /*! \brief Create a new canvas and respective info struct for a coord. |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
644 */ |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
645 static coord_canvas_info_t * |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
646 coord_canvas_info_new(redraw_man_t *rdman, coord_t *coord, |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
647 mbe_t *canvas) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
648 coord_canvas_info_t *info; |
851
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
649 static co_aix id[6] = {1, 0, 0, 0, 1, 0}; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
650 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
651 info = (coord_canvas_info_t *)elmpool_elm_alloc(rdman->coord_canvas_pool); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
652 if(info == NULL) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
653 return info; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
654 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
655 info->owner = coord; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
656 info->canvas = canvas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
657 DARRAY_INIT(&info->dirty_areas); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
658 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
659 bzero(info->pcache_areas, sizeof(area_t) * 2); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
660 info->pcache_cur_area = &info->pcache_areas[0]; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
661 info->pcache_last_area = &info->pcache_areas[1]; |
851
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
662 memcpy(info->cache_2_pdev, id, sizeof(co_aix) * 6); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
663 memcpy(info->cache_2_pdev_rev, id, sizeof(co_aix) * 6); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
664 memcpy(info->aggr_2_pdev, id, sizeof(co_aix) * 6); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
665 memcpy(info->aggr_2_pdev_rev, id, sizeof(co_aix) * 6); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
666 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
667 return info; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
668 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
669 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
670 static void coord_canvas_info_free(redraw_man_t *rdman, |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
671 coord_canvas_info_t *info) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
672 DARRAY_DESTROY(&info->dirty_areas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
673 elmpool_elm_free(rdman->coord_canvas_pool, info); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
674 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
675 |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
676 static void mouse_event_root_dummy(event_t *evt, void *arg) { |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
677 } |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
678 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
679 int redraw_man_init(redraw_man_t *rdman, mbe_t *cr, mbe_t *backend) { |
12 | 680 extern void redraw_man_destroy(redraw_man_t *rdman); |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
864
diff
changeset
|
681 extern int _sh_path_size; |
866
9a7ac4487849
Allocate sh_rect_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
682 extern int _sh_rect_size; |
147
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
683 extern int _paint_color_size; |
867
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
684 extern int _paint_linear_size; |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
685 extern int _paint_radial_size; |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
686 extern int _paint_image_size; |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
687 observer_t *addrm_ob; |
231
2637519e2bd7
Move mouse event handler and interpreter to src/mouse.c.
Thinker K.F. Li <thinker@branda.to>
parents:
224
diff
changeset
|
688 extern void addrm_monitor_hdlr(event_t *evt, void *arg); |
12 | 689 |
690 memset(rdman, 0, sizeof(redraw_man_t)); | |
691 | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
692 DARRAY_INIT(&rdman->dirty_coords); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
693 DARRAY_INIT(&rdman->dirty_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
694 DARRAY_INIT(&rdman->gen_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
695 DARRAY_INIT(&rdman->zeroing_coords); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
696 |
12 | 697 rdman->geo_pool = elmpool_new(sizeof(geo_t), 128); |
698 rdman->coord_pool = elmpool_new(sizeof(coord_t), 16); | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
699 rdman->shnode_pool = elmpool_new(sizeof(shnode_t), 16); |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
864
diff
changeset
|
700 rdman->sh_path_pool = elmpool_new(_sh_path_size, 16); |
866
9a7ac4487849
Allocate sh_rect_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
701 rdman->sh_rect_pool = elmpool_new(_sh_rect_size, 16); |
75
23bc382d9683
find_geo_in_pos() should return shapes that is not hidden
Thinker K.F. Li <thinker@branda.to>
parents:
73
diff
changeset
|
702 rdman->observer_pool = elmpool_new(sizeof(observer_t), 32); |
23bc382d9683
find_geo_in_pos() should return shapes that is not hidden
Thinker K.F. Li <thinker@branda.to>
parents:
73
diff
changeset
|
703 rdman->subject_pool = elmpool_new(sizeof(subject_t), 32); |
147
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
704 rdman->paint_color_pool = elmpool_new(_paint_color_size, 64); |
867
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
705 rdman->paint_linear_pool = elmpool_new(_paint_linear_size, 64); |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
706 rdman->paint_radial_pool = elmpool_new(_paint_radial_size, 64); |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
707 rdman->paint_image_pool = elmpool_new(_paint_image_size, 64); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
708 rdman->pent_pool = elmpool_new(sizeof(mb_prop_entry_t), 128); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
709 rdman->coord_canvas_pool = elmpool_new(sizeof(coord_canvas_info_t), 16); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
710 if(!(rdman->geo_pool && rdman->coord_pool && rdman->shnode_pool && |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
711 rdman->observer_pool && rdman->subject_pool && |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
712 rdman->paint_color_pool && rdman->coord_canvas_pool)) |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
713 goto err; |
146
e96a584487af
Use elmpool to manage paint_color_t objects.
Thinker K.F. Li <thinker@branda.to>
parents:
141
diff
changeset
|
714 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
715 rdman->observer_factory.subject_alloc = observer_subject_alloc; |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
716 rdman->observer_factory.subject_free = observer_subject_free; |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
717 rdman->observer_factory.observer_alloc = observer_observer_alloc; |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
718 rdman->observer_factory.observer_free = observer_observer_free; |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
719 rdman->observer_factory.get_parent_subject = observer_get_parent_subject; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
720 |
154 | 721 rdman->redraw = |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
722 subject_new(&rdman->observer_factory, rdman, OBJT_RDMAN); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
723 rdman->addrm_monitor = |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
724 subject_new(&rdman->observer_factory, rdman, OBJT_RDMAN); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
725 if(!(rdman->redraw && rdman->addrm_monitor)) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
726 goto err; |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
727 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
728 addrm_ob = subject_add_observer(rdman->addrm_monitor, |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
729 addrm_monitor_hdlr, rdman); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
730 if(addrm_ob == NULL) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
731 goto err; |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
732 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
733 rdman->last_mouse_over = NULL; |
154 | 734 |
12 | 735 rdman->root_coord = elmpool_elm_alloc(rdman->coord_pool); |
736 if(rdman->root_coord == NULL) | |
737 redraw_man_destroy(rdman); | |
13 | 738 rdman->n_coords = 1; |
12 | 739 coord_init(rdman->root_coord, NULL); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
740 mb_prop_store_init(&rdman->root_coord->obj.props, rdman->pent_pool); |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
741 rdman->root_coord->mouse_event = subject_new(&rdman->observer_factory, |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
742 rdman->root_coord, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
743 OBJT_COORD); |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
744 coord_set_flags(rdman->root_coord, COF_OWN_CANVAS); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
745 rdman->root_coord->canvas_info = |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
746 coord_canvas_info_new(rdman, rdman->root_coord, cr); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
747 rdman->root_coord->opacity = 1; |
12 | 748 |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
749 rdman->cr = cr; |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
750 rdman->backend = backend; |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
751 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
752 STAILQ_INIT(rdman->shapes); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
753 |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
754 /* \note To make root coord always have at leat one observer. |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
755 * It triggers mouse interpreter to be installed on root. |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
756 */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
757 subject_set_monitor(rdman->root_coord->mouse_event, |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
758 rdman->addrm_monitor); |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
759 subject_add_observer(rdman->root_coord->mouse_event, |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
760 mouse_event_root_dummy, NULL); |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
761 |
257
50d253d0fcba
Simple image loader and image shape.
Thinker K.F. Li <thinker@branda.to>
parents:
251
diff
changeset
|
762 mb_prop_store_init(&rdman->props, rdman->pent_pool); |
12 | 763 return OK; |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
764 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
765 err: |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
766 if(rdman->geo_pool) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
767 elmpool_free(rdman->geo_pool); |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
768 if(rdman->coord_pool) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
769 elmpool_free(rdman->coord_pool); |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
770 if(rdman->shnode_pool) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
771 elmpool_free(rdman->shnode_pool); |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
864
diff
changeset
|
772 if(rdman->sh_path_pool) |
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
864
diff
changeset
|
773 elmpool_free(rdman->sh_path_pool); |
866
9a7ac4487849
Allocate sh_rect_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
774 if(rdman->sh_rect_pool) |
9a7ac4487849
Allocate sh_rect_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
775 elmpool_free(rdman->sh_rect_pool); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
776 if(rdman->observer_pool) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
777 elmpool_free(rdman->observer_pool); |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
778 if(rdman->subject_pool) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
779 elmpool_free(rdman->subject_pool); |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
780 if(rdman->paint_color_pool) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
781 elmpool_free(rdman->paint_color_pool); |
867
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
782 if(rdman->paint_linear_pool) |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
783 elmpool_free(rdman->paint_linear_pool); |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
784 if(rdman->paint_radial_pool) |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
785 elmpool_free(rdman->paint_radial_pool); |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
786 if(rdman->paint_image_pool) |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
787 elmpool_free(rdman->paint_image_pool); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
788 if(rdman->pent_pool) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
789 elmpool_free(rdman->pent_pool); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
790 if(rdman->coord_canvas_pool) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
791 elmpool_free(rdman->coord_canvas_pool); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
792 DARRAY_DESTROY(&rdman->dirty_coords); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
793 DARRAY_DESTROY(&rdman->dirty_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
794 DARRAY_DESTROY(&rdman->gen_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
795 DARRAY_DESTROY(&rdman->zeroing_coords); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
796 return ERR; |
12 | 797 } |
798 | |
799 void redraw_man_destroy(redraw_man_t *rdman) { | |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
800 coord_t *coord, *saved_coord; |
769
7c73fbc8d700
Remove unused local variables
Thinker K.F. Li <thinker@codemud.net>
parents:
747
diff
changeset
|
801 shape_t *shape; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
802 geo_t *member; |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
803 |
257
50d253d0fcba
Simple image loader and image shape.
Thinker K.F. Li <thinker@branda.to>
parents:
251
diff
changeset
|
804 mb_prop_store_destroy(&rdman->props); |
50d253d0fcba
Simple image loader and image shape.
Thinker K.F. Li <thinker@branda.to>
parents:
251
diff
changeset
|
805 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
806 free_free_objs(rdman); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
807 free_objs_destroy(rdman); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
808 |
489
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
809 /* Mark rdman clean that shapes and coords can be freed |
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
810 * successfully. |
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
811 */ |
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
812 DARRAY_CLEAN(&rdman->dirty_coords); |
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
813 DARRAY_CLEAN(&rdman->dirty_geos); |
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
814 |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
815 coord = postorder_coord_subtree(rdman->root_coord, NULL); |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
816 while(coord) { |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
817 saved_coord = coord; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
818 coord = postorder_coord_subtree(rdman->root_coord, coord); |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
819 FORMEMBERS(saved_coord, member) { |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
820 rdman_shape_free(rdman, member->shape); |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
821 } |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
822 rdman_coord_free(rdman, saved_coord); |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
823 } |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
824 /* Resources of root_coord is free by elmpool_free() or |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
825 * caller; for canvas |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
826 */ |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
827 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
828 while((shape = STAILQ_HEAD(rdman->shapes)) != NULL) { |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
829 rdman_shape_free(rdman, shape); |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
830 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
831 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
832 coord_canvas_info_free(rdman, rdman->root_coord->canvas_info); |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
833 |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
834 /* XXX: paints are not freed, here. All resources of paints would |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
835 * be reclaimed by freeing elmpools. |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
836 */ |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
837 |
12 | 838 elmpool_free(rdman->coord_pool); |
839 elmpool_free(rdman->geo_pool); | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
840 elmpool_free(rdman->shnode_pool); |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
864
diff
changeset
|
841 elmpool_free(rdman->sh_path_pool); |
866
9a7ac4487849
Allocate sh_rect_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
842 elmpool_free(rdman->sh_rect_pool); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
843 elmpool_free(rdman->observer_pool); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
844 elmpool_free(rdman->subject_pool); |
146
e96a584487af
Use elmpool to manage paint_color_t objects.
Thinker K.F. Li <thinker@branda.to>
parents:
141
diff
changeset
|
845 elmpool_free(rdman->paint_color_pool); |
867
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
846 elmpool_free(rdman->paint_linear_pool); |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
847 elmpool_free(rdman->paint_radial_pool); |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
848 elmpool_free(rdman->paint_image_pool); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
849 elmpool_free(rdman->pent_pool); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
850 elmpool_free(rdman->coord_canvas_pool); |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
851 |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
852 DARRAY_DESTROY(&rdman->dirty_coords); |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
853 DARRAY_DESTROY(&rdman->dirty_geos); |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
854 DARRAY_DESTROY(&rdman->gen_geos); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
855 DARRAY_DESTROY(&rdman->zeroing_coords); |
12 | 856 } |
857 | |
858 | |
859 #define ASSERT(x) | |
860 /* | |
861 * Change transformation matrix | |
862 * - update aggregated transformation matrix | |
863 * - of coord_t object been changed. | |
864 * - of children coord_t objects. | |
865 * - redraw members of coord_t objects. | |
866 * - redraw shape objects they are overlaid with members. | |
867 * - find out overlaid shape objects. | |
868 * - geo_t of a coord_t object | |
869 * - can make finding more efficiency. | |
870 * - fill overlay geo_t objects of members. | |
871 * | |
872 * Change a shape object | |
873 * - redraw changed object. | |
874 * - redraw shape objects they are overlaid with changed object. | |
875 * - find out overlaid shape objects. | |
876 * | |
877 * That coord and geo of shape objects are setted by user code | |
878 * give user code a chance to collect coord and geo objects together | |
879 * and gain interest of higher cache hit rate. | |
880 */ | |
881 | |
882 int rdman_add_shape(redraw_man_t *rdman, shape_t *shape, coord_t *coord) { | |
883 geo_t *geo; | |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
884 int r; |
12 | 885 |
886 geo = elmpool_elm_alloc(rdman->geo_pool); | |
887 if(geo == NULL) | |
888 return ERR; | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
889 |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
890 geo_init(geo); |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
891 geo->mouse_event = subject_new(&rdman->observer_factory, geo, OBJT_GEO); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
892 subject_set_monitor(geo->mouse_event, rdman->addrm_monitor); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
893 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
894 geo_attach_coord(geo, coord); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
895 |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
896 /* New one should be dirty to recompute it when drawing. */ |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
897 r = add_dirty_geo(rdman, geo); |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
898 if(r != OK) |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
899 return ERR; |
13 | 900 |
12 | 901 sh_attach_coord(shape, coord); |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
902 sh_attach_geo(shape, geo); |
12 | 903 |
904 return OK; | |
905 } | |
906 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
907 /*! \brief Remove a shape object from redraw manager. |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
908 * |
154 | 909 * \note Shapes should be removed after redrawing or when rdman is in clean. |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
910 * \note Removing shapes or coords when a rdman is dirty, removing |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
911 * is postponsed. |
58 | 912 * \todo redraw shape objects that overlaid with removed one. |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
913 */ |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
914 int rdman_shape_free(redraw_man_t *rdman, shape_t *shape) { |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
915 geo_t *geo; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
916 int r; |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
917 |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
918 geo = shape->geo; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
919 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
920 if(rdman_is_dirty(rdman) && geo != NULL) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
921 if(geo->flags & GEF_FREE) |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
922 return ERR; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
923 |
160
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
924 geo->flags |= GEF_FREE; |
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
925 sh_hide(shape); |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
926 if(!(geo->flags & GEF_DIRTY)) { |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
927 r = add_dirty_geo(rdman, geo); |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
928 if(r != OK) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
929 return ERR; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
930 } |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
931 r = add_free_obj(rdman, shape, (free_func_t)rdman_shape_free); |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
932 if(r != OK) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
933 return ERR; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
934 return OK; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
935 } |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
936 |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
937 if(shape->stroke != NULL) |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
938 rdman_paint_stroke(rdman, (paint_t *)NULL, shape); |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
939 if(shape->fill != NULL) |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
940 rdman_paint_fill(rdman, (paint_t *)NULL, shape); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
941 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
942 if(geo != NULL) { |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
943 subject_free(geo->mouse_event); |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
944 geo_detach_coord(geo, shape->coord); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
945 sh_detach_coord(shape); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
946 sh_detach_geo(shape); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
947 elmpool_elm_free(rdman->geo_pool, geo); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
948 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
949 STAILQ_REMOVE(rdman->shapes, shape_t, sh_next, shape); |
251
f08b3ba9c1d8
Remove potential memory address error.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
950 mb_prop_store_destroy(&shape->obj.props); |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
951 shape->free(shape); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
952 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
953 if(rdman->last_mouse_over == (mb_obj_t *)shape) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
954 rdman->last_mouse_over = NULL; |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
955 |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
956 |
12 | 957 return OK; |
958 } | |
959 | |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
960 shnode_t *shnode_new(redraw_man_t *rdman, shape_t *shape) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
961 shnode_t *node; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
962 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
963 node = (shnode_t *)elmpool_elm_alloc(rdman->shnode_pool); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
964 if(node) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
965 node->shape = shape; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
966 node->next = NULL; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
967 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
968 return node; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
969 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
970 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
971 int rdman_paint_free(redraw_man_t *rdman, paint_t *paint) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
972 shnode_t *shnode, *saved_shnode; |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
973 shape_t *shape; |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
974 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
975 if(rdman_is_dirty(rdman)) { |
771
01b514800fbe
Fix logic error of checking clear flag for paint.
Thinker K.F. Li <thinker@codemud.net>
parents:
769
diff
changeset
|
976 if(paint->flags & PNTF_FREE) |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
977 return ERR; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
978 add_free_obj(rdman, paint, (free_func_t)rdman_paint_free); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
979 paint->flags |= PNTF_FREE; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
980 return OK; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
981 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
982 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
983 /* Free member shapes that using this paint. */ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
984 saved_shnode = NULL; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
985 FORPAINTMEMBERS(paint, shnode) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
986 if(saved_shnode) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
987 RM_PAINTMEMBER(paint, saved_shnode); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
988 |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
989 shape = saved_shnode->shape; |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
990 if(shape->stroke == paint) |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
991 rdman_paint_stroke(rdman, (paint_t *)NULL, shape); |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
992 if(shape->fill == paint) |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
993 rdman_paint_fill(rdman, (paint_t *)NULL, shape); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
994 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
995 shnode_free(rdman, saved_shnode); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
996 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
997 saved_shnode = shnode; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
998 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
999 if(saved_shnode) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1000 RM_PAINTMEMBER(paint, saved_shnode); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1001 |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
1002 shape = saved_shnode->shape; |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
1003 if(shape->stroke == paint) |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
1004 rdman_paint_stroke(rdman, (paint_t *)NULL, shape); |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
1005 if(shape->fill == paint) |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
1006 rdman_paint_fill(rdman, (paint_t *)NULL, shape); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1007 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1008 shnode_free(rdman, saved_shnode); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1009 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1010 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1011 paint->free(rdman, paint); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1012 return OK; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1013 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1014 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1015 void _rdman_paint_real_remove_child(redraw_man_t *rdman, |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1016 paint_t *paint, |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1017 shape_t *shape) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1018 shnode_t *shnode; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1019 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1020 FORPAINTMEMBERS(paint, shnode) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1021 if(shnode->shape == shape) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1022 RM_PAINTMEMBER(paint, shnode); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1023 shnode_free(rdman, shnode); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1024 break; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1025 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1026 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1027 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1028 |
12 | 1029 coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent) { |
13 | 1030 coord_t *coord, *root_coord; |
1031 coord_t *visit; | |
12 | 1032 |
1033 coord = elmpool_elm_alloc(rdman->coord_pool); | |
1034 if(coord == NULL) | |
1035 return NULL; | |
1036 | |
1037 coord_init(coord, parent); | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
1038 mb_prop_store_init(&coord->obj.props, rdman->pent_pool); |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
1039 coord->mouse_event = subject_new(&rdman->observer_factory, |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1040 coord, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1041 OBJT_COORD); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
1042 subject_set_monitor(coord->mouse_event, rdman->addrm_monitor); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1043 /*! \note default opacity == 1 */ |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1044 coord->opacity = 1; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1045 if(parent) |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1046 coord->canvas_info = parent->canvas_info; |
13 | 1047 rdman->n_coords++; |
1048 | |
1049 coord->order = ++rdman->next_coord_order; | |
1050 if(coord->order == 0) { | |
1051 rdman->next_coord_order = 0; | |
1052 root_coord = visit = rdman->root_coord; | |
1053 /* skip root coord. */ | |
1054 visit = preorder_coord_subtree(root_coord, visit); | |
1055 while(visit) { | |
1056 visit->order = ++rdman->next_coord_order; | |
1057 visit = preorder_coord_subtree(root_coord, visit); | |
1058 } | |
1059 } | |
12 | 1060 |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
1061 coord->before_pmem = parent->num_members; |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
1062 |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1063 /* If parent is dirty, children should be dirty. */ |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1064 if(parent && (parent->flags & COF_DIRTY)) |
152
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
1065 add_dirty_coord(rdman, coord); |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1066 |
12 | 1067 return coord; |
1068 } | |
1069 | |
1371
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1070 static shape_t * |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1071 _rdman_clone_shape(redraw_man_t *rdman, const shape_t *sh) { |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1072 shape_t *cloning = NULL; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1073 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1074 #ifndef UNITTEST |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1075 switch(sh->obj.obj_type) { |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1076 case MBO_PATH: |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1077 cloning = rdman_shape_path_clone(rdman, sh); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1078 break; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1079 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1080 case MBO_TEXT: |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1081 break; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1082 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1083 case MBO_RECT: |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1084 cloning = rdman_shape_rect_clone(rdman, sh); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1085 break; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1086 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1087 case MBO_IMAGE: |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1088 cloning = rdman_shape_image_clone(rdman, sh); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1089 break; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1090 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1091 case MBO_STEXT: |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1092 cloning = rdman_shape_stext_clone(rdman, sh); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1093 break; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1094 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1095 #else |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1096 extern shape_t *sh_dummy_clone(redraw_man_t *rdman, const shape_t *_src); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1097 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1098 cloning = sh_dummy_clone(rdman, sh); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1099 #endif /* UNITTEST */ |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1100 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1101 return cloning; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1102 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1103 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1104 /*! \brief Clone a subtree rooted at a srouce coord. |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1105 * |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1106 * \param rdman is the redraw manager managing the tree where parent is in. |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1107 * \param parent is a coord where the cloning subtree would be hooked. |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1108 * \param src is the coord that cloned subtree is rooted. |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1109 * \return the root of new subtree. |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1110 */ |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1111 coord_t * |
1372
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1371
diff
changeset
|
1112 rdman_coord_clone_from_subtree(redraw_man_t *rdman, |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1371
diff
changeset
|
1113 coord_t *parent, coord_t *src) { |
1371
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1114 coord_t *cloning; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1115 coord_t *child; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1116 shape_t *member, *cloning_member; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1117 geo_t *member_geo; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1118 int member_idx, child_pos; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1119 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1120 cloning = rdman_coord_new(rdman, parent); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1121 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1122 member_geo = FIRST_MEMBER(src); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1123 member_idx = 0; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1124 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1125 /* |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1126 * Clone all children and members. |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1127 */ |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1128 FORCHILDREN(src, child) { |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1129 /* Add members before the child */ |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1130 child_pos = child->before_pmem; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1131 while(member_idx < child_pos) { |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1132 member = member_geo->shape; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1133 cloning_member = _rdman_clone_shape(rdman, member); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1134 rdman_add_shape(rdman, cloning_member, cloning); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1135 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1136 member_geo = NEXT_MEMBER(member_geo); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1137 member_idx++; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1138 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1139 |
1372
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1371
diff
changeset
|
1140 rdman_coord_clone_from_subtree(rdman, cloning, child); |
1371
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1141 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1142 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1143 /* Clone remain members after last child if any */ |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1144 while(member_geo) { |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1145 member = member_geo->shape; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1146 cloning_member = _rdman_clone_shape(rdman, member); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1147 rdman_add_shape(rdman, cloning_member, cloning); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1148 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1149 member_geo = NEXT_MEMBER(member_geo); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1150 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1151 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1152 return cloning; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1153 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
1154 |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1155 static int rdman_coord_free_postponse(redraw_man_t *rdman, coord_t *coord) { |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1156 int r; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1157 |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1158 if(coord->flags & COF_FREE) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1159 return ERR; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1160 |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1161 coord->flags |= COF_FREE; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1162 coord_hide(coord); |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1163 if(!(coord->flags & COF_DIRTY)) { |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1164 r = add_dirty_coord(rdman, coord); |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1165 if(r != OK) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1166 return ERR; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1167 } |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1168 r = add_free_obj(rdman, coord, (free_func_t)rdman_coord_free); |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1169 if(r != OK) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1170 return ERR; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1171 return OK; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1172 } |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1173 |
12 | 1174 /*! \brief Free a coord of a redraw_man_t object. |
1175 * | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1176 * All children and members should be freed before parent being freed. |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1177 * |
12 | 1178 * \param coord is a coord_t without children and members. |
1179 * \return 0 for successful, -1 for error. | |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1180 * |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1181 * \note Free is postponsed if the coord is dirty or it has children |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1182 * or members postponsed for free. |
12 | 1183 */ |
1184 int rdman_coord_free(redraw_man_t *rdman, coord_t *coord) { | |
1185 coord_t *parent; | |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1186 coord_t *child; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1187 geo_t *member; |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1188 int cm_cnt; /* children & members counter */ |
12 | 1189 |
1190 parent = coord->parent; | |
1191 if(parent == NULL) | |
1192 return ERR; | |
1193 | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1194 cm_cnt = 0; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1195 FORCHILDREN(coord, child) { |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1196 cm_cnt++; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1197 if(!(child->flags & COF_FREE)) |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1198 return ERR; |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1199 } |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1200 FORMEMBERS(coord, member) { |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1201 cm_cnt++; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1202 if(!(member->flags & GEF_FREE)) |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1203 return ERR; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1204 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1205 |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1206 if(cm_cnt || rdman_is_dirty(rdman)) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1207 return rdman_coord_free_postponse(rdman, coord); |
12 | 1208 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1209 /* Free canvas and canvas_info (\ref redraw) */ |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1210 if(coord_is_cached(coord)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1211 canvas_free(_coord_get_canvas(coord)); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1212 coord_canvas_info_free(rdman, coord->canvas_info); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1213 } |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1214 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
1215 RM_CHILD(parent, coord); |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1216 subject_free(coord->mouse_event); |
251
f08b3ba9c1d8
Remove potential memory address error.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
1217 mb_prop_store_destroy(&coord->obj.props); |
12 | 1218 elmpool_elm_free(rdman->coord_pool, coord); |
13 | 1219 rdman->n_coords--; |
1220 | |
1221 return OK; | |
1222 } | |
1223 | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
1224 static int _rdman_coord_free_members(redraw_man_t *rdman, coord_t *coord) { |
194
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1225 geo_t *member; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1226 shape_t *shape; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1227 int r; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1228 |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1229 FORMEMBERS(coord, member) { |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1230 shape = geo_get_shape(member); |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1231 r = rdman_shape_free(rdman, shape); |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1232 if(r != OK) |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1233 return ERR; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1234 } |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1235 return OK; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1236 } |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1237 |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1238 /*! \brief Free descendant coords and shapes of a coord. |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1239 * |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1240 * The specified coord is also freed. |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1241 */ |
154 | 1242 int rdman_coord_subtree_free(redraw_man_t *rdman, coord_t *subtree) { |
1243 coord_t *coord, *prev_coord; | |
1244 int r; | |
1245 | |
1246 if(subtree == NULL) | |
1247 return OK; | |
1248 | |
1249 prev_coord = postorder_coord_subtree(subtree, NULL); | |
1250 for(coord = postorder_coord_subtree(subtree, prev_coord); | |
1251 coord != NULL; | |
1252 coord = postorder_coord_subtree(subtree, coord)) { | |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1253 if(!(prev_coord->flags & COF_FREE)) { |
194
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1254 r = _rdman_coord_free_members(rdman, prev_coord); |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1255 if(r != OK) |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1256 return ERR; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1257 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1258 r = rdman_coord_free(rdman, prev_coord); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1259 if(r != OK) |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1260 return ERR; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1261 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1262 prev_coord = coord; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1263 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1264 if(!(prev_coord->flags & COF_FREE)) { |
194
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1265 r = _rdman_coord_free_members(rdman, prev_coord); |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1266 if(r != OK) |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1267 return ERR; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1268 |
154 | 1269 r = rdman_coord_free(rdman, prev_coord); |
1270 if(r != OK) | |
1271 return ERR; | |
1272 } | |
1273 | |
1274 return OK; | |
1275 } | |
1276 | |
13 | 1277 /*! \brief Mark a coord is changed. |
1278 * | |
1279 * A changed coord_t object is marked as dirty and put | |
160
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
1280 * into dirty_coords list. rdman_coord_changed() should be called |
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
1281 * for a coord after it been changed to notify redraw manager to |
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
1282 * redraw shapes grouped by it. |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1283 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1284 * Once a coord is changed, all its descendants are also put marked |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1285 * dirty. |
13 | 1286 */ |
1287 int rdman_coord_changed(redraw_man_t *rdman, coord_t *coord) { | |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
1288 coord_t *child; |
13 | 1289 |
1290 if(coord->flags & COF_DIRTY) | |
1291 return OK; | |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1292 |
152
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
1293 add_dirty_coord(rdman, coord); |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1294 |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
1295 #if 0 |
160
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
1296 if(coord->flags & COF_HIDDEN) |
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
1297 return OK; |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
1298 #endif |
160
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
1299 |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1300 /* Make child coords dirty. */ |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1301 for(child = preorder_coord_subtree(coord, coord); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
1302 child != NULL; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
1303 child = preorder_coord_subtree(coord, child)) { |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1304 if(child->flags & (COF_DIRTY | COF_HIDDEN)) { |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1305 preorder_coord_skip_subtree(child); |
114
1909d53071ab
Check if a coord dirty before dirty it
Thinker K.F. Li <thinker@branda.to>
parents:
104
diff
changeset
|
1306 continue; |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1307 } |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1308 |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1309 if(coord_is_cached(child)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1310 preorder_coord_skip_subtree(child); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1311 continue; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1312 } |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1313 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1314 add_dirty_coord(rdman, child); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
1315 } |
13 | 1316 |
1317 return OK; | |
1318 } | |
1319 | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1320 static int _rdman_shape_changed(redraw_man_t *rdman, shape_t *shape) { |
13 | 1321 geo_t *geo; |
1322 int r; | |
1323 | |
1324 geo = shape->geo; | |
1325 | |
1326 if(geo->flags & GEF_DIRTY) | |
1327 return OK; | |
1328 | |
1329 r = add_dirty_geo(rdman, geo); | |
1330 if(r == ERR) | |
1331 return ERR; | |
12 | 1332 |
1333 return OK; | |
1334 } | |
1335 | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1336 /*! \brief Mark a shape is changed. |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1337 * |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1338 * The geo_t object of a changed shape is mark as dirty and |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1339 * put into dirty_geos list. |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1340 */ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1341 int rdman_shape_changed(redraw_man_t *rdman, shape_t *shape) { |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1342 return _rdman_shape_changed(rdman, shape); |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1343 } |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1344 |
29 | 1345 int rdman_paint_changed(redraw_man_t *rdman, paint_t *paint) { |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1346 shnode_t *shnode; |
29 | 1347 int r; |
1348 | |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1349 FORPAINTMEMBERS(paint, shnode) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1350 r = _rdman_shape_changed(rdman, shnode->shape); |
29 | 1351 if(r != OK) |
1352 return ERR; | |
1353 } | |
1354 return OK; | |
1355 } | |
1356 | |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1357 |
28 | 1358 /* Clean dirties */ |
1359 | |
57
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1360 static int is_coord_subtree_hidden(coord_t *coord) { |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1361 while(coord) { |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1362 if(coord->flags & COF_HIDDEN) |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1363 return 1; |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1364 coord = coord->parent; |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1365 } |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1366 return 0; |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1367 } |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1368 |
28 | 1369 static void clean_shape(shape_t *shape) { |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
1370 switch(MBO_TYPE(shape)) { |
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
1371 case MBO_PATH: |
28 | 1372 sh_path_transform(shape); |
1373 break; | |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1374 #ifdef SH_TEXT |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
1375 case MBO_TEXT: |
28 | 1376 sh_text_transform(shape); |
1377 break; | |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1378 #endif |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
1379 case MBO_RECT: |
35
581a03196093
Support rectangle tag of SVG.
Thinker K.F. Li <thinker@branda.to>
parents:
33
diff
changeset
|
1380 sh_rect_transform(shape); |
581a03196093
Support rectangle tag of SVG.
Thinker K.F. Li <thinker@branda.to>
parents:
33
diff
changeset
|
1381 break; |
260
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
1382 case MBO_IMAGE: |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
1383 sh_image_transform(shape); |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
1384 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1385 #ifdef SH_STEXT |
424
585baa462778
Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents:
408
diff
changeset
|
1386 case MBO_STEXT: |
430
bec538d361e9
Fix typo in redraw_man.c when adding sh_stext object type.
Thinker K.F. Li <thinker@branda.to>
parents:
427
diff
changeset
|
1387 sh_stext_transform(shape); |
424
585baa462778
Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents:
408
diff
changeset
|
1388 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1389 #endif |
28 | 1390 #ifdef UNITTEST |
1391 default: | |
1392 sh_dummy_transform(shape); | |
1393 break; | |
1394 #endif /* UNITTEST */ | |
1395 } | |
1396 shape->geo->flags &= ~GEF_DIRTY; | |
57
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1397 |
747
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
1398 if(sh_get_flags(shape, GEF_HIDDEN) || |
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
1399 is_coord_subtree_hidden(shape->coord)) |
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
1400 sh_set_flags(shape, GEF_NOT_SHOWED); |
57
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1401 else |
747
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
1402 sh_clear_flags(shape, GEF_NOT_SHOWED); |
28 | 1403 } |
1404 | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1405 /*! \brief Setup canvas_info for the coord. |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1406 * |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1407 * Own a canvas or inherit it from parent. |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1408 * \sa |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1409 * - \ref redraw |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1410 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1411 static void setup_canvas_info(redraw_man_t *rdman, coord_t *coord) { |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1412 if(coord->parent == NULL) |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1413 return; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1414 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
1415 if(coord->opacity != 1 || coord_is_always_cached(coord)) { |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1416 if(!coord_is_cached(coord)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1417 /* canvas is assigned latter, in zeroing_coord() */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1418 coord->canvas_info = coord_canvas_info_new(rdman, coord, NULL); |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1419 coord_set_flags(coord, COF_OWN_CANVAS); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1420 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1421 } else { |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1422 if(coord_is_cached(coord)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1423 canvas_free(_coord_get_canvas(coord)); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1424 coord_canvas_info_free(rdman, coord->canvas_info); |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1425 coord_clear_flags(coord, COF_OWN_CANVAS); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1426 } |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1427 /* This must here to keep coords that do not own canvas |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1428 * can always point to right canvas_info. Since, they |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1429 * don't know when will parent change it's canvas_info. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1430 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1431 coord->canvas_info = coord->parent->canvas_info; |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1432 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1433 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1434 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1435 /* \brief Compute matrix from cached canvas to parent device space. |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1436 */ |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1437 static void compute_cached_2_pdev_matrix(coord_t *coord) { |
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1438 co_aix *canvas2pdev_matrix = coord_get_2pdev(coord); |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1439 coord_t *parent; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1440 co_aix *aggr; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1441 co_aix *matrix, *paggr; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1442 co_aix scale_x, scale_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1443 co_aix shift_x, shift_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1444 co_aix canvas2p[6]; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1445 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1446 aggr = coord_get_aggr_matrix(coord); |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1447 matrix = coord->matrix; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1448 parent = coord->parent; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1449 paggr = coord_get_aggr_matrix(parent); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1450 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1451 scale_x = matrix[0] / aggr[0]; |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
1452 scale_y = matrix[4] / aggr[4]; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1453 shift_x = matrix[2] - scale_x * aggr[2]; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1454 shift_y = matrix[5] - scale_y * aggr[5]; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1455 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1456 canvas2p[0] = scale_x; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1457 canvas2p[1] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1458 canvas2p[2] = shift_x; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1459 canvas2p[3] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1460 canvas2p[4] = scale_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1461 canvas2p[5] = shift_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1462 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1463 matrix_mul(paggr, canvas2p, canvas2pdev_matrix); |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1464 |
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1465 compute_reverse(canvas2pdev_matrix, coord_get_2pdev_rev(coord)); |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1466 } |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1467 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1468 /*! \brief Compute area in parent cached coord for a cached coord. |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1469 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1470 * The coordination system of cached coord and descendants is resized, |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1471 * and shifted. It makes all descendants bound by a box, canvas box, |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1472 * at 0, 0 and size is the same as the canvas. |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1473 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1474 * The bounding box where the canvas would be draw on the canvas on |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1475 * ancestral cached coord can be retreived by shifting and resizing |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1476 * canvas box in reverse and transform to coordination system of |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1477 * ancestral cached coord. |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1478 */ |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1479 static void compute_pcache_area(coord_t *coord) { |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1480 co_aix *cached2pdev = coord_get_2pdev(coord); |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1481 int c_w, c_h; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1482 canvas_t *canvas; |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1483 coord_canvas_info_t *canvas_info; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1484 co_aix poses[4][2]; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1485 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1486 canvas_info = coord->canvas_info; |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1487 SWAP(canvas_info->pcache_cur_area, canvas_info->pcache_last_area, |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1488 area_t *); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1489 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1490 canvas = _coord_get_canvas(coord); |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1491 canvas_get_size(canvas, &c_w, &c_h); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1492 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1493 poses[0][0] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1494 poses[0][1] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1495 poses[1][0] = c_w; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1496 poses[1][1] = c_h; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1497 poses[2][0] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1498 poses[2][1] = c_h; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1499 poses[3][0] = c_w; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1500 poses[3][1] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1501 matrix_trans_pos(cached2pdev, &poses[0][0], &poses[0][1]); |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1502 matrix_trans_pos(cached2pdev, &poses[1][0], &poses[1][1]); |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1503 matrix_trans_pos(cached2pdev, &poses[2][0], &poses[2][1]); |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1504 matrix_trans_pos(cached2pdev, &poses[3][0], &poses[3][1]); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1505 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1506 area_init(coord_get_pcache_area(coord), 4, poses); |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1507 |
834
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
1508 coord_clear_flags(coord, COF_DIRTY_PCACHE_AREA); |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1509 } |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1510 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1511 /*! \brief Compute area of a coord. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1512 */ |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1513 static int |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1514 compute_area(coord_t *coord) { |
864
6eaeec6806f2
Fix the issue of potential to free a wild pointer
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1515 static co_aix (*poses)[2] = NULL; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1516 static int max_poses = 0; |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1517 geo_t *geo; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1518 int cnt, pos_cnt; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1519 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1520 cnt = 0; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1521 FORMEMBERS(coord, geo) { |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1522 cnt++; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1523 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1524 |
147
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
1525 if(max_poses < (cnt * 2)) { |
864
6eaeec6806f2
Fix the issue of potential to free a wild pointer
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1526 if(poses) |
6eaeec6806f2
Fix the issue of potential to free a wild pointer
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1527 free(poses); |
147
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
1528 max_poses = cnt * 2; |
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
1529 poses = (co_aix (*)[2])malloc(sizeof(co_aix [2]) * max_poses); |
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
1530 if(poses == NULL) |
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
1531 return ERR; |
995ee8fd5f1a
Use local static variable to hold position array to reduce using malloc().
Thinker K.F. Li <thinker@branda.to>
parents:
146
diff
changeset
|
1532 } |
28 | 1533 |
1534 pos_cnt = 0; | |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
1535 FORMEMBERS(coord, geo) { |
28 | 1536 area_to_positions(geo->cur_area, poses + pos_cnt); |
1537 pos_cnt += 2; | |
1538 } | |
1539 | |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1540 area_init(coord_get_area(coord), pos_cnt, poses); |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1541 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1542 return OK; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1543 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1544 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1545 static int coord_clean_members_n_compute_area(coord_t *coord) { |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1546 geo_t *geo; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1547 int r; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1548 /*! \note poses is shared by invokings, it is not support reentrying. */ |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1549 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1550 /* Clean member shapes. */ |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1551 FORMEMBERS(coord, geo) { |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1552 clean_shape(geo->shape); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1553 } |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1554 |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1555 r = compute_area(coord); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1556 if(r != OK) |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1557 return ERR; |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1558 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1559 return OK; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1560 } |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1561 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1562 /*! \brief Clean dirty coords. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1563 * |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1564 * This function compute aggregation matrix and area for dirty |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1565 * coords. But, aggregation matrix of a cached coord is different from |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1566 * normal one. (see compute_aggr_of_cached_coord()). |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1567 * |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1568 * \note coords their opacity != 1 are also traded as cached ones. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1569 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1570 static int clean_coord(redraw_man_t *rdman, coord_t *coord) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1571 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1572 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1573 setup_canvas_info(rdman, coord); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1574 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1575 compute_aggr(coord); |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1576 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1577 /* Areas of cached coords are computed in two phase. |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
1578 * Phase 1 works like other normal ones. Phase 2, collects |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1579 * all areas of descendants to compute a minimum covering area. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1580 * Phase 2 is performed by zeroing_coord(). |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1581 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1582 r = coord_clean_members_n_compute_area(coord); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1583 if(r != OK) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1584 return ERR; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1585 |
835
51da337879bd
Do not add dirty area for cached coords
Thinker K.F. Li <thinker@codemud.net>
parents:
834
diff
changeset
|
1586 /* Dirty areas of cached one is added after update pcache_areas. |
51da337879bd
Do not add dirty area for cached coords
Thinker K.F. Li <thinker@codemud.net>
parents:
834
diff
changeset
|
1587 */ |
839
a3be0162bf44
Move decision of dirty pcache_area to one place.
Thinker K.F. Li <thinker@codemud.net>
parents:
837
diff
changeset
|
1588 add_dirty_area(rdman, coord, coord->cur_area); |
a3be0162bf44
Move decision of dirty pcache_area to one place.
Thinker K.F. Li <thinker@codemud.net>
parents:
837
diff
changeset
|
1589 add_dirty_area(rdman, coord, coord->last_area); |
a3be0162bf44
Move decision of dirty pcache_area to one place.
Thinker K.F. Li <thinker@codemud.net>
parents:
837
diff
changeset
|
1590 |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1591 coord_clear_flags(coord, COF_DIRTY); |
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1592 coord_set_flags(coord, COF_JUST_CLEAN); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1593 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1594 return OK; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1595 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1596 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1597 /*! \brief Clean coord_t objects. |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1598 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1599 * It computes aggregation matrix and area for dirty coords. |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1600 * |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1601 * This function also responsible for computing area of parent cached |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1602 * coord, coord_canvas_info_t::pcache_cur_area, for its cached children. |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1603 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1604 static int clean_rdman_coords(redraw_man_t *rdman) { |
769
7c73fbc8d700
Remove unused local variables
Thinker K.F. Li <thinker@codemud.net>
parents:
747
diff
changeset
|
1605 coord_t *coord; |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1606 coord_t **dirty_coords; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1607 int n_dirty_coords; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1608 int i, r; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1609 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1610 n_dirty_coords = rdman->dirty_coords.num; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1611 if(n_dirty_coords > 0) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1612 dirty_coords = rdman->dirty_coords.ds; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1613 _insert_sort((void **)dirty_coords, n_dirty_coords, |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1614 OFFSET(coord_t, order)); /* ascend order */ |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1615 for(i = 0; i < n_dirty_coords; i++) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1616 coord = dirty_coords[i]; |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1617 if(!coord_get_flags(coord, COF_DIRTY | COF_JUST_CLEAN)) |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1618 continue; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1619 r = clean_coord(rdman, coord); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1620 if(r != OK) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1621 return ERR; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1622 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1623 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1624 return OK; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1625 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1626 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1627 static int clean_rdman_geos(redraw_man_t *rdman) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1628 int i; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1629 int n_dirty_geos; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1630 geo_t **dirty_geos; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1631 geo_t *visit_geo; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1632 coord_t *coord; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1633 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1634 n_dirty_geos = rdman->dirty_geos.num; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1635 if(n_dirty_geos > 0) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1636 dirty_geos = rdman->dirty_geos.ds; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1637 for(i = 0; i < n_dirty_geos; i++) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1638 visit_geo = dirty_geos[i]; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1639 if(!(visit_geo->flags & GEF_DIRTY)) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1640 continue; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1641 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1642 clean_shape(visit_geo->shape); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1643 coord = geo_get_coord(visit_geo); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1644 add_dirty_area(rdman, coord, visit_geo->cur_area); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1645 add_dirty_area(rdman, coord, visit_geo->last_area); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1646 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1647 } |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1648 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1649 return OK; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1650 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1651 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1652 /*! \brief Shift space of coord to align left-top of minimum covering. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1653 * |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1654 * Align left-top of minimum rectangle covering occupied area of |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1655 * sub-graphic to origin of the space. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1656 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1657 static |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1658 void zeroing_coord(redraw_man_t *rdman, coord_t *coord) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1659 coord_t *cur; |
769
7c73fbc8d700
Remove unused local variables
Thinker K.F. Li <thinker@codemud.net>
parents:
747
diff
changeset
|
1660 area_t *area; |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1661 geo_t *geo; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1662 co_aix min_x, min_y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1663 co_aix max_x, max_y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1664 co_aix x, y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1665 int w, h; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1666 int c_w, c_h; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
1667 mbe_t *canvas; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1668 co_aix *aggr; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1669 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1670 if(coord->parent == NULL) /*! \note Should not zeroing root coord */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1671 abort(); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1672 if(!(coord_is_zeroing(coord))) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1673 abort(); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1674 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1675 coord_clear_zeroing(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1676 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1677 /* |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1678 * Compute minimum overing area of sub-graphic |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1679 */ |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1680 area = coord_get_area(coord); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1681 min_x = area->x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1682 min_y = area->y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1683 max_x = min_x + area->w; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1684 max_y = min_y + area->h; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1685 |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
1686 for(cur = preorder_coord_subtree(coord, coord); |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
1687 cur != NULL; |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
1688 cur = preorder_coord_subtree(coord, cur)) { |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1689 if(coord_is_cached(cur)) { |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1690 preorder_coord_skip_subtree(cur); |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1691 /* This means pcache_area of descendants must be computed |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1692 * before zeroing ancestor cached one. |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1693 * (See add_rdman_zeroing_n_pcache_coords()) |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1694 */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1695 area = coord_get_pcache_area(cur); |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1696 } else |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1697 area = coord_get_area(cur); |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1698 |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1699 if(area->w == 0 && area->h == 0) |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1700 continue; |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1701 |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1702 if(min_x == max_x && min_y == max_y) { |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1703 min_x = area->x; |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1704 max_x = area->x + area->w; |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1705 min_y = area->y; |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1706 max_y = area->y + area->h; |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1707 continue; |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1708 } |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1709 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1710 if(area->x < min_x) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1711 min_x = area->x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1712 if(area->y < min_y) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1713 min_y = area->y; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1714 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1715 x = area->x + area->w; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1716 y = area->y + area->h; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1717 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1718 if(x > max_x) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1719 max_x = x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1720 if(y > max_y) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1721 max_y = y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1722 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1723 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1724 w = max_x - min_x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1725 h = max_y - min_y; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1726 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1727 canvas = _coord_get_canvas(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1728 if(canvas) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1729 canvas_get_size(canvas, &c_w, &c_h); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1730 else |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1731 c_w = c_h = 0; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1732 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1733 /* Without COF_JUST_CLEAN means the coordination system and matrix |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1734 * of the coord have not changed since last time of zeroing. So, |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1735 * if canvas box cover all descendants, we don't need rezeroing, |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1736 * and avoid redraw all descendants. |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1737 * |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1738 * Width and height of actually drawing area should not be smaller |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1739 * than half of canvas's width and height. |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1740 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1741 if(!coord_get_flags(coord, COF_JUST_CLEAN) && |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1742 min_x >= 0 && min_y >= 0 && max_x <= c_w && max_y <= c_h && |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1743 h >= (c_h >> 2) && w >= (c_w >> 2)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1744 /* Canvas fully cover sub-graphic. */ |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1745 coord_set_flags(coord, COF_SKIP_ZERO); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1746 return; |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1747 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1748 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1749 /* |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1750 * Adjust matrics of descendants to align left-top corner of |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1751 * minimum covering area with origin of space defined by |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1752 * zeroing coord. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1753 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1754 FOR_COORDS_PREORDER(coord, cur) { |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1755 if(coord_is_cached(cur) && coord != cur) { |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1756 /* |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1757 * Cached coords are zeroed from root to leaves, so |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1758 * changes of aggr_matrix would be propagated to next |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1759 * level of cached. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1760 */ |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1761 preorder_coord_skip_subtree(cur); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1762 } |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1763 /* Shift space */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1764 aggr = coord_get_aggr_matrix(cur); |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
1765 aggr[2] -= min_x; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1766 aggr[5] -= min_y; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1767 |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1768 FOR_COORD_MEMBERS(coord, geo) { |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1769 /* \see GEO_SWAP() */ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1770 if(!geo_get_flags(geo, GEF_SWAP)) |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1771 SWAP(geo->cur_area, geo->last_area, area_t *); |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1772 } |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1773 coord_clean_members_n_compute_area(cur); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1774 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1775 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1776 /* |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1777 * Setup canvas |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1778 * |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1779 * Canvas of a cached coord is not setted in |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1780 * coord_canvas_info_new(). It should be setted, here. |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1781 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1782 if(canvas == NULL || w > c_w || h > c_w) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1783 if(canvas) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1784 canvas_free(canvas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1785 canvas = canvas_new(w, h); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1786 _coord_set_canvas(coord, canvas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1787 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1788 |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1789 coord_set_flags(coord, COF_JUST_ZERO); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1790 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1791 |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1792 /*! \brief Add coords that need to perform zeroing or re-compute pcache_area. |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1793 * |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1794 * A coord that need to perform zeroing has one or more dirty members |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1795 * in its descendants. |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1796 * |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1797 * To zeroing a coord, pcache_area of first level cached descendants |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1798 * must be updated. To update the pcache_area of a cached coord, the |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1799 * cached coord also need to perform zeroing. So, zeroing and |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1800 * re-computing pcache_area are interleaved. |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1801 * |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1802 * The pcache_area of a cached coord must be re-computed if its |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1803 * parent/ancestors is dirty/just cleaned, or it must be zeroed. It |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1804 * means cached coord with jsut cleaned parent should also re-compute |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1805 * pcache_area. So, this function also check and add coords for this |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1806 * situation. |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1807 */ |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1808 static int add_rdman_zeroing_n_pcache_coords(redraw_man_t *rdman) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1809 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1810 int n_dirty_geos; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1811 geo_t **dirty_geos, *geo; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1812 int n_dirty_coords; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1813 coord_t **dirty_coords, *coord; |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1814 coord_t *parent_coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1815 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1816 /* Mark all cached ancestral coords of dirty geos */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1817 n_dirty_geos = rdman->dirty_geos.num; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1818 dirty_geos = rdman->dirty_geos.ds; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1819 for(i = 0; i < n_dirty_geos; i++) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1820 geo = dirty_geos[i]; |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1821 coord = coord_get_cached(geo_get_coord(geo)); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1822 while(!coord_get_flags(coord, COF_MUST_ZEROING | COF_TEMP_MARK)) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1823 if(coord_is_root(coord)) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1824 break; |
525
f9326e955417
Does not add root coord to zeroing list
Thinker K.F. Li <thinker@branda.to>
parents:
524
diff
changeset
|
1825 coord_set_flags(coord, COF_TEMP_MARK); |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1826 coord = coord_get_cached(coord_get_parent(coord)); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1827 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1828 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1829 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1830 /* Mark all cached ancestral coords of dirty coords */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1831 n_dirty_coords = rdman->dirty_coords.num; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1832 dirty_coords = rdman->dirty_coords.ds; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1833 for(i = 0; i < n_dirty_coords; i++) { |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1834 coord = coord_get_cached(dirty_coords[i]); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1835 while(!coord_get_flags(coord, COF_MUST_ZEROING | COF_TEMP_MARK)) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1836 if(coord_is_root(coord)) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1837 break; |
525
f9326e955417
Does not add root coord to zeroing list
Thinker K.F. Li <thinker@branda.to>
parents:
524
diff
changeset
|
1838 coord_set_flags(coord, COF_TEMP_MARK); |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1839 coord = coord_get_cached(coord_get_parent(coord)); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1840 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1841 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1842 |
519
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
1843 /* Add all marked coords into redraw_man_t::zeroing_coords list */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1844 FOR_COORDS_PREORDER(rdman->root_coord, coord) { |
811
5aca6024b147
subtree of root coord can not be skept
Thinker K.F. Li <thinker@codemud.net>
parents:
771
diff
changeset
|
1845 if(!coord_is_cached(coord) || coord_is_root(coord)) |
520
f106b57b8660
Skip coords that is not cached when add coords into zeroing_coords list.
Thinker K.F. Li <thinker@branda.to>
parents:
519
diff
changeset
|
1846 continue; /* skip coords that is not cached */ |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1847 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1848 if(!coord_get_flags(coord, COF_TEMP_MARK)) { |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1849 parent_coord = coord_get_parent(coord); |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1850 /* The pcache_area of a cached coord that is a child of a |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1851 * just cleaned one must be recomputed. |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1852 */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1853 if(coord_get_flags(parent_coord, COF_JUST_CLEAN)) |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1854 add_dirty_pcache_area_coord(rdman, coord); |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1855 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1856 preorder_coord_skip_subtree(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1857 continue; |
28 | 1858 } |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1859 add_zeroing_coord(rdman, coord); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1860 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1861 coord_clear_flags(coord, COF_TEMP_MARK); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1862 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1863 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1864 return OK; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1865 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1866 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1867 /*! \brief Zeroing coords in redraw_man_t::zeroing_coords. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1868 * |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1869 * \note redraw_man_t::zeroing_coords must in descent partial order of |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1870 * tree. The size of a cached coord is effected by cached |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1871 * descendants. |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1872 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1873 static int zeroing_rdman_coords(redraw_man_t *rdman) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1874 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1875 coords_t *all_zeroing; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1876 coord_t *coord; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1877 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1878 all_zeroing = &rdman->zeroing_coords; |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1879 /*! Zeroing is performed from leaves to root. |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1880 * |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1881 * REASON: The size of canvas is also effected by cached |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1882 * descedants. A cached coord is only effected by parent |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1883 * cached coord when it-self is dirty. When a cached |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1884 * coord is dirty, it is clean (compute aggregated matrix) |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1885 * by recomputing a scale for x and y-axis from aggregated |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1886 * matrix of parent coord. And, cleaning coord is |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1887 * performed before zeroing. It means ancestors of a |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1888 * cached coord would not effect it when zeroing. |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1889 */ |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1890 for(i = all_zeroing->num - 1; i >= 0; i--) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1891 coord = all_zeroing->ds[i]; |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1892 if(coord_is_zeroing(coord)) |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1893 zeroing_coord(rdman, coord); |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1894 compute_cached_2_pdev_matrix(coord); |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1895 /* This is required by ancester cached ones to perform |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1896 * zeroing. |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1897 */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1898 compute_pcache_area(coord); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1899 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1900 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1901 return OK; |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1902 } |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1903 |
851
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1904 /*! \brief Update aggregated cache_2_pdev matrix for cached coords. |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1905 * |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1906 * This is perfromed from root to leaves. Aggregated cache_2_pdev is |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1907 * named as aggr_2_pdev field of canvas_info_t. It is the matrix to |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1908 * transform a point from space of a cached coord to the space of root |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1909 * coord. |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1910 */ |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1911 static int |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1912 update_aggr_pdev(redraw_man_t *rdman) { |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1913 int i; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1914 coords_t *all_zeroing; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1915 coord_t *coord, *parent_cached; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1916 |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1917 all_zeroing = &rdman->zeroing_coords; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1918 for(i = 0; i < all_zeroing->num; i++) { |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1919 coord = all_zeroing->ds[i]; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1920 parent_cached = coord_get_cached(coord_get_parent(coord)); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1921 matrix_mul(coord_get_2pdev(parent_cached), |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1922 coord_get_2pdev(coord), |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1923 coord_get_aggr2pdev(coord)); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1924 matrix_mul(coord_get_2pdev_rev(coord), |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1925 coord_get_2pdev_rev(parent_cached), |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1926 coord_get_aggr2pdev_rev(coord)); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1927 } |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1928 |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1929 return OK; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1930 } |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1931 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1932 /*! \brief Add aggregated dirty areas to ancestor. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1933 * |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1934 * Dirty areas are aggregated into two areas. It assumes that even or odd |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1935 * ones are old areas or new areas repsective. So, all even ones are |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1936 * aggregated in an area, and odd ones are in another. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1937 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1938 static void add_aggr_dirty_areas_to_ancestor(redraw_man_t *rdman, |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1939 coord_t *coord) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1940 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1941 int n_areas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1942 co_aix poses0[2][2], poses1[2][2]; |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1943 co_aix *canvas2pdev_matrix; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1944 area_t **areas, *area; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1945 area_t *area0, *area1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1946 coord_t *parent, *pcached_coord; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1947 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1948 n_areas = _coord_get_dirty_areas(coord)->num; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1949 areas = _coord_get_dirty_areas(coord)->ds; |
935
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1950 if(n_areas == 0) { |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1951 /* Go here for cached one that is descendant of another zeroed |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1952 * one, but itself is not zeroed. It is here for recomputing |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1953 * pcache areas. |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1954 */ |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1955 if(coord_get_flags(coord, COF_JUST_CLEAN | COF_JUST_ZERO)) |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1956 abort(); /* should not happen! */ |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1957 |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1958 parent = coord_get_parent(coord); |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1959 pcached_coord = coord_get_cached(parent); |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1960 area = coord_get_pcache_area(coord); |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1961 add_dirty_area(rdman, pcached_coord, area); |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1962 area = coord_get_pcache_last_area(coord); |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1963 add_dirty_area(rdman, pcached_coord, area); |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1964 return; |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1965 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1966 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1967 area0 = _coord_get_aggr_dirty_areas(coord); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1968 area1 = area0 + 1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1969 |
532 | 1970 /* TODO: Since both cur & last area of coords are added into dirty |
1971 * area list, position of both areas shoud be adjusted for | |
1972 * all descendants when zeroing a cached coord. | |
1973 */ | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1974 for(i = 0; i < n_areas; i++) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1975 area = areas[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1976 if(area->w != 0 || area->h != 0) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1977 break; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1978 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1979 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1980 if(i >= n_areas) |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1981 return; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1982 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1983 area = areas[i++]; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1984 poses0[0][0] = area->x; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1985 poses0[0][1] = area->y; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1986 poses0[1][0] = area->x + area->w; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1987 poses0[1][1] = area->y + area->h; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1988 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1989 if(i < n_areas) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1990 area = areas[i++]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1991 poses1[0][0] = area->x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1992 poses1[0][1] = area->y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1993 poses1[1][0] = area->x + area->w; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1994 poses1[1][1] = area->y + area->h; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1995 } else { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1996 poses1[0][0] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1997 poses1[0][1] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1998 poses1[1][0] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1999 poses1[1][1] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2000 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2001 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2002 for(; i < n_areas - 1;) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2003 /* Even areas */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2004 area = areas[i++]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2005 if(area->w != 0 || area->h != 0) { |
375
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2006 poses0[0][0] = MB_MIN(poses0[0][0], area->x); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2007 poses0[0][1] = MB_MIN(poses0[0][1], area->y); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2008 poses0[1][0] = MB_MAX(poses0[1][0], area->x + area->w); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2009 poses0[1][1] = MB_MAX(poses0[1][1], area->y + area->h); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2010 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2011 /* Odd areas */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2012 area = areas[i++]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2013 if(area->w != 0 || area->h != 0) { |
375
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2014 poses1[0][0] = MB_MIN(poses1[0][0], area->x); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2015 poses1[0][1] = MB_MIN(poses1[0][1], area->y); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2016 poses1[1][0] = MB_MAX(poses1[1][0], area->x + area->w); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2017 poses1[1][1] = MB_MAX(poses1[1][1], area->y + area->h); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2018 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2019 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2020 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2021 if(i < n_areas) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2022 area = areas[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2023 if(area->w != 0 || area->h != 0) { |
375
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2024 poses0[0][0] = MB_MIN(poses0[0][0], area->x); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2025 poses0[0][1] = MB_MIN(poses0[0][1], area->y); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2026 poses0[1][0] = MB_MAX(poses0[1][0], area->x + area->w); |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
2027 poses0[1][1] = MB_MAX(poses0[1][1], area->y + area->h); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2028 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2029 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2030 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2031 parent = coord_get_parent(coord); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2032 pcached_coord = coord_get_cached(parent); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2033 |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2034 canvas2pdev_matrix = coord_get_2pdev(coord); |
532 | 2035 |
2036 /* Add dirty areas to parent cached coord. */ | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2037 matrix_trans_pos(canvas2pdev_matrix, poses0[0], poses0[0] + 1); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2038 matrix_trans_pos(canvas2pdev_matrix, poses0[1], poses0[1] + 1); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2039 area_init(area0, 2, poses0); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2040 add_dirty_area(rdman, pcached_coord, area0); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2041 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2042 matrix_trans_pos(canvas2pdev_matrix, poses1[0], poses1[0] + 1); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2043 matrix_trans_pos(canvas2pdev_matrix, poses1[1], poses1[1] + 1); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2044 area_init(area1, 2, poses1); |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2045 add_dirty_area(rdman, pcached_coord, area1); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2046 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2047 if(coord_get_flags(coord, COF_JUST_CLEAN) && |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2048 !coord_get_flags(pcached_coord, COF_JUST_CLEAN)) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2049 add_dirty_area(rdman, pcached_coord, coord->last_area); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2050 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2051 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2052 /*! \brief To test if redrawing all elements on the canvas of a cached coord. |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2053 */ |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2054 #define IS_CACHE_REDRAW_ALL(co) \ |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2055 (coord_get_flags((co), COF_JUST_CLEAN | COF_JUST_ZERO)) |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2056 |
526
3f695a6177b2
Change typos in comment
Thinker K.F. Li <thinker@branda.to>
parents:
525
diff
changeset
|
2057 /* Aggregate dirty areas and propagate them to ancestor cached coord. |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
2058 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
2059 * The aggregation is performed from leaves to root. But, this |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
2060 * function do not aggregate dirty areas for root coord. The dirty |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
2061 * areas of a cached coord are aggregated into two areas, one for old |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
2062 * areas and one or new areas. Both aggregation areas are add into |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
2063 * dirty_areas list of closet ancestral cached coord. |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
2064 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2065 static int add_rdman_aggr_dirty_areas(redraw_man_t *rdman) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2066 int i; |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2067 coord_t *coord, *parent_coord, *pcached_coord; |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2068 int n_zeroing_coords; /* number of dirty pcache area coords */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2069 coord_t **zeroing_coords; /* dirty pcache area coords */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2070 |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2071 n_zeroing_coords = rdman->zeroing_coords.num; |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2072 zeroing_coords = rdman->zeroing_coords.ds; |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2073 for(i = n_zeroing_coords - 1; i >= 0; i--) { |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2074 coord = zeroing_coords[i]; |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2075 if(IS_CACHE_REDRAW_ALL(coord)) { |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2076 parent_coord = coord_get_parent(coord); |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2077 pcached_coord = coord_get_cached(parent_coord); |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2078 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2079 add_dirty_area(rdman, pcached_coord, |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2080 coord_get_pcache_area(coord)); |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2081 add_dirty_area(rdman, pcached_coord, |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2082 coord_get_pcache_last_area(coord)); |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2083 } else { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2084 add_aggr_dirty_areas_to_ancestor(rdman, coord); |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2085 } |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
2086 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2087 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2088 return OK; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2089 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2090 |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2091 /*! \brief Swap geo_t::cur_area and geo_t::last_area for a geo_t. |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2092 * |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2093 * It is call by rdman_clean_dirties() to swap areas for members of |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2094 * dirty coord in redraw_man_t::dirty_coords and dirty geos in |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2095 * redraw_man_t::dirty_geos. |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2096 * |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2097 * zeroing_coord() would also swap some areas for members of |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2098 * descendants of a cached coord. But, only members that was not |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2099 * swapped, without GEF_SWAP flag, in this round of redrawing. |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2100 * zeroing_coord() would not mark geos with GEF_SWAP since it not not |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2101 * referenced later. We don't mark geos in zeroing_coord() because we |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2102 * don't want to unmark it later. To unmark it, we should re-travel |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2103 * forest of cached coords in redraw_man_t::zeroing_coords. It is |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2104 * expansive. |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2105 */ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2106 #define GEO_SWAP(g) \ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2107 if(!geo_get_flags((g), GEF_SWAP)) { \ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2108 SWAP((g)->cur_area, (g)->last_area, area_t *); \ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2109 geo_set_flags((g), GEF_SWAP); \ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2110 } |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2111 |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2112 /* \brief Clean dirty coords and shapes. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2113 * |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2114 * The procedure of clean dirty coords and shapes include 3 major steps. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2115 * |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2116 * - Add dirty coords and shapes to rdman. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2117 * - All descendants of a dirty coord are also dirty, except |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2118 * descendants of cached descendants. |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2119 * - Recompute aggregated transformation matrix from root to leaves |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2120 * for dirty coords. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2121 * - The aggregated transformation matrix for a cached coord is |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2122 * different from other coords. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2123 * - Compute new area for every dirty coord. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2124 * - Area of a dirty coord is an aggregation of areas of all members. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2125 * - A cached coord has two type of areas, one is for members of the cached |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2126 * coord, another one is for the block that cached coord and descendants |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2127 * will be mapped in parent cached coord. |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2128 * - Areas, for parent cached coord (pcache_cur_area), of |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2129 * non-dirty cached coord would be recomputed when cleaning |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2130 * parent coord. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2131 * - Areas, for parent cached coord (pcache_cur_area), of dirty |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2132 * cached coord would be recomputed when zeroing the cached |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2133 * coord. (because zeroing would change aggregated matrix, and |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2134 * zeroing was performed after cleaning) |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2135 * - Areas, for members, of dirty cached coord would only be |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2136 * recomputed when cleaning the coord. |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2137 * - Perform zeroing on some cached coords that |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2138 * - dirty, is, |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2139 * - dirty descendants, has. |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2140 * - Propagate dirty areas to dirty area list of parent cached coord |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2141 * for every cached coords, not only for dirty cached coords. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2142 * |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2143 * The cur_area of a cached coord is where members of the coord will |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2144 * be draw in cache buffer, i.e. surface. The area of the cached |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2145 * coord and descendants is described by pcache_cur_area and |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2146 * pcache_last_area in coord_canvas_info_t. |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2147 */ |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2148 static int rdman_clean_dirties(redraw_man_t *rdman) { |
29 | 2149 int r; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2150 int i; |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2151 coord_t **coords, *coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2152 geo_t **geos; |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2153 geo_t *geo; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2154 |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2155 /* coord_t::cur_area of coords are temporary pointed to |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2156 * coord_canvas_info_t::owner_mems_area for store area |
526
3f695a6177b2
Change typos in comment
Thinker K.F. Li <thinker@branda.to>
parents:
525
diff
changeset
|
2157 * by clean_coord(). |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2158 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2159 coords = rdman->dirty_coords.ds; |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2160 for(i = 0; i < rdman->dirty_coords.num; i++) { |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2161 coord = coords[i]; |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2162 SWAP(coord->cur_area, coord->last_area, area_t *); |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2163 FOR_COORD_MEMBERS(coord, geo) { |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2164 GEO_SWAP(geo); |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2165 } |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2166 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2167 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2168 /* XXX: some geo may swap two times. Should avoid it. |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2169 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2170 geos = rdman->dirty_geos.ds; |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2171 for(i = 0; i < rdman->dirty_geos.num; i++) { |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2172 geo = geos[i]; |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2173 GEO_SWAP(geo); |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2174 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2175 |
29 | 2176 r = clean_rdman_coords(rdman); |
2177 if(r != OK) | |
2178 return ERR; | |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2179 |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2180 /* TODO: save area of cached coord and descendants in |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2181 * cached_dirty_area for parent cached coord space. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2182 */ |
29 | 2183 |
2184 r = clean_rdman_geos(rdman); | |
2185 if(r != OK) | |
2186 return ERR; | |
2187 | |
531
1ad6c6192a80
Skip root coord when propagate dirty area to parent cached
Thinker K.F. Li <thinker@branda.to>
parents:
530
diff
changeset
|
2188 /* Zeroing must be performed after clearing to get latest position |
1ad6c6192a80
Skip root coord when propagate dirty area to parent cached
Thinker K.F. Li <thinker@branda.to>
parents:
530
diff
changeset
|
2189 * of shapes for computing new bounding box |
1ad6c6192a80
Skip root coord when propagate dirty area to parent cached
Thinker K.F. Li <thinker@branda.to>
parents:
530
diff
changeset
|
2190 */ |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2191 r = add_rdman_zeroing_n_pcache_coords(rdman); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2192 if(r != OK) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2193 return ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2194 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2195 r = zeroing_rdman_coords(rdman); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2196 if(r != OK) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2197 return ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2198 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2199 r = add_rdman_aggr_dirty_areas(rdman); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2200 if(r != OK) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2201 return ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2202 |
851
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
2203 r = update_aggr_pdev(rdman); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
2204 if(r != OK) |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
2205 return ERR; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
2206 |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2207 /* |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2208 * Clear all flags setted by zeroing. |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2209 */ |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2210 coords = rdman->dirty_coords.ds; |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2211 for(i = 0; i < rdman->dirty_coords.num; i++) { |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2212 coord = coords[i]; |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2213 coord_clear_flags(coord, COF_JUST_CLEAN); |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2214 /* \see GEO_SWAP() */ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2215 FOR_COORD_MEMBERS(coord, geo) { |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2216 geo_clear_flags(geo, GEF_SWAP); |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2217 } |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2218 } |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2219 coords = rdman->zeroing_coords.ds; |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2220 for(i = 0; i < rdman->zeroing_coords.num; i++) |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2221 coord_clear_flags(coords[i], |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2222 COF_JUST_CLEAN | COF_JUST_ZERO | COF_SKIP_ZERO); |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2223 |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2224 /* \see GEO_SWAP() */ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2225 for(i = 0; i < rdman->dirty_geos.num; i++) { |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2226 geo = geos[i]; |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2227 geo_clear_flags(geo, GEF_SWAP); |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2228 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2229 |
29 | 2230 return OK; |
2231 } | |
2232 | |
2233 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2234 /* Drawing and Redrawing |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2235 * ============================================================ |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2236 */ |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2237 |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2238 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2239 static void set_shape_stroke_param(shape_t *shape, mbe_t *cr) { |
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2240 mbe_set_line_width(cr, shape->stroke_width); |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2241 } |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2242 |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2243 static void fill_path_preserve(redraw_man_t *rdman, mbe_t *cr) { |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2244 mbe_fill_preserve(cr); |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2245 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2246 |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2247 static void fill_path(redraw_man_t *rdman, mbe_t *cr) { |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2248 mbe_fill(cr); |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2249 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2250 |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2251 static void stroke_path(redraw_man_t *rdman, mbe_t *cr) { |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2252 mbe_stroke(cr); |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2253 } |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2254 #else |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2255 static void set_shape_stroke_param(shape_t *shape, mbe_t *cr) { |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2256 } |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2257 |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2258 static void fill_path_preserve(redraw_man_t *rdman, mbe_t *cr) { |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2259 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2260 |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2261 static void fill_path(redraw_man_t *rdman, mbe_t *cr) { |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2262 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2263 |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2264 static void stroke_path(redraw_man_t *rdman, mbe_t *cr) { |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2265 } |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2266 #endif |
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2267 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2268 static void draw_shape(redraw_man_t *rdman, mbe_t *cr, shape_t *shape) { |
22 | 2269 paint_t *fill, *stroke; |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
2270 |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
2271 /*! \todo Move operator of shapes into singleton structures that define |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
2272 * operators for them. |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
2273 */ |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2274 if(shape->fill || shape->stroke) { |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2275 switch(MBO_TYPE(shape)) { |
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2276 case MBO_PATH: |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2277 sh_path_draw(shape, cr); |
19 | 2278 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2279 #ifdef SH_TEXT |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2280 case MBO_TEXT: |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2281 sh_text_draw(shape, cr); |
27 | 2282 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2283 #endif |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2284 case MBO_RECT: |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2285 sh_rect_draw(shape, cr); |
35
581a03196093
Support rectangle tag of SVG.
Thinker K.F. Li <thinker@branda.to>
parents:
33
diff
changeset
|
2286 break; |
260
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
2287 case MBO_IMAGE: |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
2288 sh_image_draw(shape, cr); |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
2289 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2290 #ifdef SH_STEXT |
427
8f900da42eed
Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents:
424
diff
changeset
|
2291 case MBO_STEXT: |
8f900da42eed
Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents:
424
diff
changeset
|
2292 sh_stext_draw(shape, cr); |
8f900da42eed
Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents:
424
diff
changeset
|
2293 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2294 #endif |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2295 #ifdef UNITTEST |
19 | 2296 default: |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2297 sh_dummy_fill(shape, cr); |
19 | 2298 break; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2299 #endif /* UNITTEST */ |
19 | 2300 } |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2301 |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2302 fill = shape->fill; |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2303 if(shape->fill) { |
881
a17c4e231e54
Transform positions of radient paints.
Thinker K.F. Li <thinker@codemud.net>
parents:
873
diff
changeset
|
2304 fill->prepare(fill, cr, shape); |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2305 if(shape->stroke) |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2306 fill_path_preserve(rdman, cr); |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2307 else |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2308 fill_path(rdman, cr); |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2309 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2310 |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2311 stroke = shape->stroke; |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2312 if(stroke) { |
881
a17c4e231e54
Transform positions of radient paints.
Thinker K.F. Li <thinker@codemud.net>
parents:
873
diff
changeset
|
2313 stroke->prepare(stroke, cr, shape); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2314 set_shape_stroke_param(shape, cr); |
841
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
2315 stroke_path(rdman, cr); |
22 | 2316 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2317 } |
13 | 2318 } |
2319 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2320 #ifndef UNITTEST |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2321 static void clear_canvas(canvas_t *canvas) { |
469
4dc0be6c044a
Add copy and clear graphic engine functions.
Thinker K.F. Li <thinker@branda.to>
parents:
467
diff
changeset
|
2322 mbe_clear(canvas); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2323 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2324 |
1073
d09f603438d8
Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents:
1067
diff
changeset
|
2325 #define make_scissoring(canvas, n_dirty_areas, dirty_areas) \ |
d09f603438d8
Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents:
1067
diff
changeset
|
2326 mbe_scissoring(canvas, n_dirty_areas, dirty_areas) |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2327 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2328 static void reset_clip(canvas_t *cr) { |
1073
d09f603438d8
Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents:
1067
diff
changeset
|
2329 mbe_reset_scissoring(cr); |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2330 } |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2331 |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2332 static void copy_cr_2_backend(redraw_man_t *rdman, int n_dirty_areas, |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2333 area_t **dirty_areas) { |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2334 if(n_dirty_areas) |
1073
d09f603438d8
Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents:
1067
diff
changeset
|
2335 make_scissoring(rdman->backend, n_dirty_areas, dirty_areas); |
d09f603438d8
Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents:
1067
diff
changeset
|
2336 |
512
d186d1e24458
Change prototype of mbe_copy_source().
Thinker K.F. Li <thinker@branda.to>
parents:
491
diff
changeset
|
2337 mbe_copy_source(rdman->cr, rdman->backend); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2338 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2339 #else /* UNITTEST */ |
1073
d09f603438d8
Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents:
1067
diff
changeset
|
2340 #define make_scissoring(canvas, n_dirty_areas, dirty_areas) |
408
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
2341 |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2342 static void clear_canvas(canvas_t *canvas) { |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2343 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2344 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2345 static void reset_clip(canvas_t *cr) { |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2346 } |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2347 |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2348 static void copy_cr_2_backend(redraw_man_t *rdman, int n_dirty_areas, |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2349 area_t **dirty_areas) { |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2350 } |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2351 #endif /* UNITTEST */ |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2352 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2353 static void |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2354 _update_cached_canvas_2_parent(redraw_man_t *rdman, co_aix reverse[6], |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2355 mbe_t *canvas, mbe_t *pcanvas, |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2356 co_aix opacity) { |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2357 mbe_surface_t *surface; |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2358 mbe_pattern_t *pattern; |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2359 |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2360 surface = mbe_get_target(canvas); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2361 pattern = mbe_pattern_create_for_surface(surface); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2362 mbe_pattern_set_matrix(pattern, reverse); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2363 mbe_set_source(pcanvas, pattern); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2364 mbe_paint_with_alpha(pcanvas, opacity); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2365 } |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2366 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2367 static void update_cached_canvas_2_parent(redraw_man_t *rdman, |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2368 coord_t *coord) { |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2369 mbe_t *pcanvas, *canvas; |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2370 co_aix *c2pdev_reverse; |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2371 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2372 if(coord_is_root(coord)) |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2373 return; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2374 |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2375 c2pdev_reverse = coord_get_2pdev_rev(coord); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2376 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2377 canvas = _coord_get_canvas(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2378 pcanvas = _coord_get_canvas(coord->parent); |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2379 #ifndef UNITTEST |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2380 _update_cached_canvas_2_parent(rdman, c2pdev_reverse, canvas, pcanvas, |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2381 coord->opacity); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2382 #else |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2383 memcpy(((mock_mbe_t *)canvas)->parent_2_cache, c2pdev_reverse, |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2384 sizeof(co_aix) * 6); |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
2385 #endif |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2386 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2387 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2388 static int draw_coord_shapes_in_dirty_areas(redraw_man_t *rdman, |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2389 coord_t *coord) { |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2390 int dirty = 0; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2391 int r; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2392 area_t **areas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2393 int n_areas; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2394 mbe_t *canvas; |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2395 geo_t *member; |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2396 coord_t *child; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2397 int mem_idx; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2398 |
160
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
2399 if(coord->flags & COF_HIDDEN) |
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
2400 return OK; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2401 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2402 areas = _coord_get_dirty_areas(coord)->ds; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2403 n_areas = _coord_get_dirty_areas(coord)->num; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2404 canvas = _coord_get_canvas(coord); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2405 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2406 member = FIRST_MEMBER(coord); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2407 mem_idx = 0; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2408 child = FIRST_CHILD(coord); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2409 while(child != NULL || member != NULL) { |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2410 if(child && child->before_pmem == mem_idx) { |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
2411 if(coord_is_cached(child)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2412 if(!(child->flags & COF_HIDDEN) && |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2413 is_area_in_areas(coord_get_pcache_area(child), |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2414 n_areas, areas)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2415 update_cached_canvas_2_parent(rdman, child); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2416 dirty = 1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2417 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2418 } else { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2419 r = draw_coord_shapes_in_dirty_areas(rdman, child); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2420 dirty |= r; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2421 } |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2422 child = NEXT_CHILD(child); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2423 } else { |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2424 ASSERT(member != NULL); |
747
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
2425 if((!(member->flags & GEF_NOT_SHOWED)) && |
150
0824f4804ee0
Fix bug of broken coord_hide() and shape_hide().
Thinker K.F. Li <thinker@branda.to>
parents:
148
diff
changeset
|
2426 is_geo_in_areas(member, n_areas, areas)) { |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2427 draw_shape(rdman, canvas, member->shape); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2428 dirty = 1; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2429 } |
160
147c93163ef0
Fix bug of tank that bullet is not hidden when go out the map.
Thinker K.F. Li <thinker@branda.to>
parents:
159
diff
changeset
|
2430 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2431 member = NEXT_MEMBER(member); |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2432 mem_idx++; |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2433 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2434 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2435 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2436 return dirty; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2437 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2438 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2439 static int draw_dirty_cached_coord(redraw_man_t *rdman, |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2440 coord_t *coord) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2441 area_t **areas, *area; |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2442 area_t full_area; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2443 int n_areas; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2444 mbe_t *canvas; |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2445 mbe_surface_t *surface; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2446 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2447 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2448 |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2449 canvas = _coord_get_canvas(coord); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2450 |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2451 if(IS_CACHE_REDRAW_ALL(coord)) { |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2452 /* |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2453 * full_area covers all dirty areas of the cached coord. |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2454 */ |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2455 DARRAY_CLEAN(_coord_get_dirty_areas(coord)); |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2456 surface = mbe_get_target(canvas); |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2457 full_area.x = 0; |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2458 full_area.y = 0; |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2459 full_area.w = mbe_image_surface_get_width(surface); |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2460 full_area.h = mbe_image_surface_get_height(surface); |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2461 add_dirty_area(rdman, coord, &full_area); |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2462 } |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2463 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2464 areas = _coord_get_dirty_areas(coord)->ds; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2465 n_areas = _coord_get_dirty_areas(coord)->num; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2466 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2467 for(i = 0; i < n_areas; i++) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2468 area = areas[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2469 area->x = floorf(area->x); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2470 area->y = floorf(area->y); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2471 area->w = ceilf(area->w); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2472 area->h = ceilf(area->h); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2473 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2474 |
1073
d09f603438d8
Merge the work of improvement for graphic engine of openvg branch
Thinker K.F. Li <thinker@codemud.net>
parents:
1067
diff
changeset
|
2475 make_scissoring(canvas, n_areas, areas); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2476 clear_canvas(canvas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2477 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2478 r = draw_coord_shapes_in_dirty_areas(rdman, coord); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2479 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2480 reset_clip(canvas); |
441
94477e7d981e
Fix compile error: no return statement
john.cylee@gmail.com
parents:
435
diff
changeset
|
2481 |
94477e7d981e
Fix compile error: no return statement
john.cylee@gmail.com
parents:
435
diff
changeset
|
2482 return OK; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2483 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2484 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2485 static void draw_shapes_in_dirty_areas(redraw_man_t *rdman) { |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2486 int num; |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2487 coord_t **zeroings; |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2488 coord_t *coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2489 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2490 |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2491 zeroings = rdman->zeroing_coords.ds; |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2492 num = rdman->zeroing_coords.num; |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2493 /* Draw cached ones from leaves to root. |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2494 * Since content of cached ones depend on descendants. |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2495 */ |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2496 for(i = num - 1; i >= 0; i--) { |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2497 coord = zeroings[i]; |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2498 if(coord_get_flags(coord, COF_TEMP_MARK)) |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2499 continue; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2500 draw_dirty_cached_coord(rdman, coord); |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2501 coord_set_flags(coord, COF_TEMP_MARK); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2502 } |
887
8a2d676d9fa3
Fix bug of clearing COF_TEMP_MARK.
Thinker K.F. Li <thinker@codemud.net>
parents:
881
diff
changeset
|
2503 for(i = 0; i < num; i++) { |
8a2d676d9fa3
Fix bug of clearing COF_TEMP_MARK.
Thinker K.F. Li <thinker@codemud.net>
parents:
881
diff
changeset
|
2504 coord = zeroings[i]; |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2505 coord_clear_flags(coord, COF_TEMP_MARK); |
887
8a2d676d9fa3
Fix bug of clearing COF_TEMP_MARK.
Thinker K.F. Li <thinker@codemud.net>
parents:
881
diff
changeset
|
2506 } |
528
d687d3395264
Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents:
527
diff
changeset
|
2507 |
d687d3395264
Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents:
527
diff
changeset
|
2508 draw_dirty_cached_coord(rdman, rdman->root_coord); |
13 | 2509 } |
2510 | |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2511 |
13 | 2512 /*! \brief Re-draw all changed shapes or shapes affected by changed coords. |
2513 * | |
2514 * A coord object has a geo to keep track the range that it's members will | |
2515 * draw on. Geo of a coord should be recomputed when the coord is changed. | |
2516 * Geo of a coord used to accelerate finding overlay shape objects of | |
2517 * a specified geo. A coord object also must be recomputed when one of | |
2518 * it's members is changed. | |
2519 * | |
2520 * New and old geo values of a coord object that is recomputed for | |
2521 * changing of it-self must be used to find overlay shape objects. | |
2522 * New and old geo values of a shape should also be used to find | |
2523 * overlay shape objects, too. If a shape's coord is changed, shape's | |
2524 * geo object is not used to find overlay shape objects any more. | |
2525 * | |
2526 * steps: | |
2527 * - update chagned coord objects | |
14 | 2528 * - recompute area for changed coord objects |
13 | 2529 * - recompute geo for members shape objects |
14 | 2530 * - clear dirty of geo for members to prevent from |
2531 * recomputing for change of shape objects. | |
2532 * - add old and new area value to list of dirty areas. | |
13 | 2533 * - recompute geo for changed shape objects |
14 | 2534 * - only if a shape object is dirty. |
2535 * - put new and old value of area of geo to list of dirty areas. | |
2536 * - Scan all shapes and redraw shapes overlaid with dirty areas. | |
13 | 2537 * |
14 | 2538 * dirty flag of coord objects is cleared after update. |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2539 * dirty flag of geo objects is also cleared after recomputing. |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2540 * Clean dirty flag can prevent redundant computing for geo and |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2541 * corod objects. |
14 | 2542 * |
13 | 2543 */ |
2544 int rdman_redraw_changed(redraw_man_t *rdman) { | |
28 | 2545 int r; |
154 | 2546 event_t event; |
2547 subject_t *redraw; | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2548 int i; |
769
7c73fbc8d700
Remove unused local variables
Thinker K.F. Li <thinker@codemud.net>
parents:
747
diff
changeset
|
2549 coord_t *coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2550 int n_areas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2551 area_t **areas; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2552 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2553 r = rdman_clean_dirties(rdman); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2554 if(r != OK) |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2555 return ERR; |
13 | 2556 |
1440
e5b3d68d0b05
Leave commented code here so that we can clear the screen for debugging
wycc
parents:
1372
diff
changeset
|
2557 //mbe_clear(rdman->cr); |
e5b3d68d0b05
Leave commented code here so that we can clear the screen for debugging
wycc
parents:
1372
diff
changeset
|
2558 //mbe_copy_source(rdman->cr, rdman->backend); |
e5b3d68d0b05
Leave commented code here so that we can clear the screen for debugging
wycc
parents:
1372
diff
changeset
|
2559 //printf("clear\n"); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2560 if(rdman->n_dirty_areas > 0) { |
135 | 2561 /*! \brief Draw shapes in preorder of coord tree and support opacity |
2562 * rules. | |
2563 */ | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2564 draw_shapes_in_dirty_areas(rdman); |
1114
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2565 if(rdman->backend) { |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2566 n_areas = _coord_get_dirty_areas(rdman->root_coord)->num; |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2567 areas = _coord_get_dirty_areas(rdman->root_coord)->ds; |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2568 copy_cr_2_backend(rdman, n_areas, areas); |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2569 reset_clip(rdman->backend); |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2570 } else { |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2571 mbe_flush(rdman->cr); |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2572 } |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2573 for(i = 0; i < rdman->zeroing_coords.num; i++) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2574 coord = rdman->zeroing_coords.ds[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2575 DARRAY_CLEAN(_coord_get_dirty_areas(coord)); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2576 } |
528
d687d3395264
Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents:
527
diff
changeset
|
2577 DARRAY_CLEAN(_coord_get_dirty_areas(rdman->root_coord)); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2578 rdman->n_dirty_areas = 0; |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2579 } |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
2580 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2581 DARRAY_CLEAN(&rdman->dirty_coords); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2582 DARRAY_CLEAN(&rdman->dirty_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2583 DARRAY_CLEAN(&rdman->zeroing_coords); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2584 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
2585 /* Free postponsed removing */ |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2586 free_free_objs(rdman); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2587 |
154 | 2588 redraw = rdman_get_redraw_subject(rdman); |
2589 event.type = EVT_RDMAN_REDRAW; | |
2590 event.tgt = event.cur_tgt = redraw; | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
2591 subject_notify(redraw, &event); |
154 | 2592 |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2593 return OK; |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2594 } |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2595 |
38 | 2596 /* NOTE: Before redrawing, the canvas/surface must be cleaned. |
2597 * NOTE: After redrawing, the content must be copied to the backend surface. | |
2598 */ | |
2599 | |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2600 int rdman_redraw_all(redraw_man_t *rdman) { |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2601 area_t area; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2602 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2603 mbe_surface_t *surface; |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2604 #endif |
29 | 2605 int r; |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2606 |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2607 area.x = area.y = 0; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2608 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2609 surface = mbe_get_target(rdman->cr); |
1114
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2610 area.w = rdman->w; |
7451af5d63ec
Make tank and calculator works for console backend
Thinker K.F. Li <thinker@codemud.net>
parents:
1073
diff
changeset
|
2611 area.h = rdman->h; |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2612 #else |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2613 area.w = 1024; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2614 area.h = 1024; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2615 #endif |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2616 add_dirty_area(rdman, rdman->root_coord, &area); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2617 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2618 r = rdman_redraw_changed(rdman); |
29 | 2619 if(r != OK) |
2620 return ERR; | |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2621 |
13 | 2622 return OK; |
12 | 2623 } |
2624 | |
37 | 2625 int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y, |
2626 co_aix w, co_aix h) { | |
2627 area_t area; | |
2628 int r; | |
2629 | |
2630 area.x = x; | |
2631 area.y = y; | |
2632 area.w = w; | |
2633 area.h = h; | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2634 add_dirty_area(rdman, rdman->root_coord, &area); |
37 | 2635 |
2636 r = rdman_redraw_changed(rdman); | |
2637 | |
2638 return r; | |
2639 } | |
2640 | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2641 /*! \brief Helping function to travel descendant shapes of a coord. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2642 */ |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2643 geo_t *rdman_geos(redraw_man_t *rdman, geo_t *last) { |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2644 geo_t *next; |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2645 coord_t *coord; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2646 |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2647 if(last == NULL) { |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2648 coord = rdman->root_coord; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2649 while(coord != NULL && FIRST_MEMBER(coord) == NULL) |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2650 coord = preorder_coord_subtree(rdman->root_coord, coord); |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2651 if(coord == NULL) |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2652 return NULL; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2653 return FIRST_MEMBER(coord); |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2654 } |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2655 |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2656 coord = last->shape->coord; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2657 next = NEXT_MEMBER(last); |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2658 while(next == NULL) { |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2659 coord = preorder_coord_subtree(rdman->root_coord, coord); |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2660 if(coord == NULL) |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2661 return NULL; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2662 next = FIRST_MEMBER(coord); |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2663 } |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2664 return next; |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2665 } |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2666 |
30
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
29
diff
changeset
|
2667 int rdman_force_clean(redraw_man_t *rdman) { |
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
29
diff
changeset
|
2668 int r; |
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
29
diff
changeset
|
2669 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2670 r = rdman_clean_dirties(rdman); |
30
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
29
diff
changeset
|
2671 |
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
29
diff
changeset
|
2672 return r; |
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
29
diff
changeset
|
2673 } |
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
29
diff
changeset
|
2674 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2675 /*! \page man_obj Manage Objects. |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2676 * |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2677 * Shapes and paints should also be managed by redraw manager. Redraw |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2678 * manager must know life-cycle of shapes and paints to avoid to use them |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2679 * after being free. If a shape is released when it is dirty, redraw |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2680 * manager will try to access them, after released, for redrawing. |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2681 * We can make a copy information need by redraw manager to redraw them, |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2682 * but it is more complicate, and induce runtime overhead. |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2683 * |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2684 * So, redraw manage had better also manage life-cycle of shapes and paints. |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2685 * Shapes and paints should be created and freed through interfaces |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2686 * provided by redraw manager. To reduce overhead of interfaces, they can |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2687 * be implemented as C macros. |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2688 * |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2689 * To refactory redraw manage to manage life-cycle of shapes and paints, |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2690 * following functions/macros are introduced. |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2691 * - rdman_paint_*_new() |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2692 * - rdman_paint_free() |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2693 * - rdman_shape_*_new() |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2694 * - rdman_shape_free() |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2695 */ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2696 |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2697 /* \defgroup rdman_observer Observer memory management |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2698 * |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2699 * Implment factory and strategy functions for observers and subjects. |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2700 * @{ |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2701 */ |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2702 static subject_t *observer_subject_alloc(observer_factory_t *factory) { |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2703 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2704 subject_t *subject; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2705 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2706 rdman = MEM2OBJ(factory, redraw_man_t, observer_factory); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2707 subject = elmpool_elm_alloc(rdman->subject_pool); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2708 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2709 return subject; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2710 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2711 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2712 static void |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2713 observer_subject_free(observer_factory_t *factory, subject_t *subject) { |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2714 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2715 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2716 rdman = MEM2OBJ(factory, redraw_man_t, observer_factory); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2717 elmpool_elm_free(rdman->subject_pool, subject); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2718 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2719 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2720 static observer_t *observer_observer_alloc(observer_factory_t *factory) { |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2721 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2722 observer_t *observer; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2723 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2724 rdman = MEM2OBJ(factory, redraw_man_t, observer_factory); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2725 observer = elmpool_elm_alloc(rdman->observer_pool); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2726 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2727 return observer; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2728 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2729 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2730 static void |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2731 observer_observer_free(observer_factory_t *factory, observer_t *observer) { |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2732 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2733 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2734 rdman = MEM2OBJ(factory, redraw_man_t, observer_factory); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2735 elmpool_elm_free(rdman->observer_pool, observer); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2736 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2737 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2738 static subject_t * |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2739 observer_get_parent_subject(observer_factory_t *factory, |
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2740 subject_t *cur_subject) { |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2741 redraw_man_t *rdman; |
79
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2742 coord_t *coord, *parent_coord; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2743 geo_t *geo; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2744 subject_t *parent; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2745 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
2746 rdman = MEM2OBJ(factory, redraw_man_t, observer_factory); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2747 switch(cur_subject->obj_type) { |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2748 case OBJT_GEO: |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2749 geo = (geo_t *)cur_subject->obj; |
79
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2750 parent_coord = geo->shape->coord; |
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2751 parent = parent_coord->mouse_event; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2752 break; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2753 case OBJT_COORD: |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2754 coord = (coord_t *)cur_subject->obj; |
79
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2755 parent_coord = coord->parent; |
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2756 if(parent_coord == NULL) { |
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2757 parent = NULL; |
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2758 break; |
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2759 } |
5bcb329a5157
Fix bug of core dump caused by forget to check if parent is NULL, root.
Thinker K.F. Li <thinker@branda.to>
parents:
75
diff
changeset
|
2760 parent = parent_coord->mouse_event; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2761 break; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2762 default: |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2763 parent = NULL; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2764 break; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2765 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2766 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2767 return parent; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2768 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2769 |
322
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2770 /* @} */ |
c1afd14caa85
Remove out-of-date comments and refactor code and fix a small bug.
Thinker K.F. Li <thinker@branda.to>
parents:
317
diff
changeset
|
2771 |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2772 /*! \brief Load an image as a paint_image_t. |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2773 */ |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2774 paint_t *rdman_img_ldr_load_paint(redraw_man_t *rdman, const char *img_id) { |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2775 mb_img_data_t *img_data; |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2776 paint_t *paint; |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2777 mb_img_ldr_t *ldr = rdman_img_ldr(rdman); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2778 |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2779 img_data = MB_IMG_LDR_LOAD(ldr, img_id); |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2780 if(img_data == NULL) |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2781 return NULL; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2782 |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2783 paint = rdman_paint_image_new(rdman, img_data); |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2784 if(paint == NULL) |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2785 MB_IMG_DATA_FREE(img_data); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2786 |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2787 return paint; |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2788 } |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
327
diff
changeset
|
2789 |
12 | 2790 #ifdef UNITTEST |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2791 /* Test cases */ |
12 | 2792 |
2793 #include <CUnit/Basic.h> | |
2794 | |
2795 struct _sh_dummy { | |
2796 shape_t shape; | |
2797 co_aix x, y; | |
2798 co_aix w, h; | |
119 | 2799 int trans_cnt; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2800 int draw_cnt; |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2801 mbe_t *last_draw; |
12 | 2802 }; |
2803 | |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2804 void sh_dummy_free(shape_t *sh) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2805 free(sh); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2806 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2807 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2808 shape_t *sh_dummy_new(redraw_man_t *rdman, |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2809 co_aix x, co_aix y, co_aix w, co_aix h) { |
12 | 2810 sh_dummy_t *dummy; |
2811 | |
2812 dummy = (sh_dummy_t *)malloc(sizeof(sh_dummy_t)); | |
2813 if(dummy == NULL) | |
2814 return NULL; | |
2815 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2816 memset(dummy, 0, sizeof(sh_dummy_t)); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2817 |
12 | 2818 dummy->x = x; |
2819 dummy->y = y; | |
2820 dummy->w = w; | |
2821 dummy->h = h; | |
119 | 2822 dummy->trans_cnt = 0; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2823 dummy->draw_cnt = 0; |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2824 dummy->shape.free = sh_dummy_free; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2825 |
1062
a8d20bc8ce40
Rename rdman_shape_man() to rdman_man_shape() to mean managing a shape
Thinker K.F. Li <thinker@codemud.net>
parents:
1060
diff
changeset
|
2826 rdman_man_shape(rdman, (shape_t *)dummy); |
12 | 2827 |
2828 return (shape_t *)dummy; | |
2829 } | |
2830 | |
1371
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2831 shape_t * |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2832 sh_dummy_clone(redraw_man_t *rdman, const shape_t *_src) { |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2833 sh_dummy_t *src = (sh_dummy_t *)_src; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2834 shape_t *new_dummy; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2835 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2836 new_dummy = sh_dummy_new(rdman, src->x, src->y, src->w, src->h); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2837 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2838 return new_dummy; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2839 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
2840 |
12 | 2841 void sh_dummy_transform(shape_t *shape) { |
2842 sh_dummy_t *dummy = (sh_dummy_t *)shape; | |
2843 co_aix poses[2][2]; | |
2844 co_aix x1, y1, x2, y2; | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2845 |
12 | 2846 if(shape->geo && shape->coord) { |
2847 x1 = dummy->x; | |
2848 y1 = dummy->y; | |
2849 x2 = x1 + dummy->w; | |
2850 y2 = y1 + dummy->h; | |
2851 | |
2852 coord_trans_pos(shape->coord, &x1, &y1); | |
2853 coord_trans_pos(shape->coord, &x2, &y2); | |
2854 poses[0][0] = x1; | |
2855 poses[0][1] = y1; | |
2856 poses[1][0] = x2; | |
2857 poses[1][1] = y2; | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2858 |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2859 if(shape->geo) |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2860 geo_from_positions(shape->geo, 2, poses); |
12 | 2861 } |
119 | 2862 dummy->trans_cnt++; |
12 | 2863 } |
2864 | |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2865 void sh_dummy_fill(shape_t *shape, mbe_t *cr) { |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2866 sh_dummy_t *dummy; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2867 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2868 dummy = (sh_dummy_t *)shape; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2869 dummy->draw_cnt++; |
825
e83956ba22d7
Make sure drawing on right cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
824
diff
changeset
|
2870 dummy->last_draw = cr; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2871 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2872 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2873 static void dummy_paint_prepare(paint_t *paint, mbe_t *cr) { |
19 | 2874 } |
2875 | |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2876 static void dummy_paint_free(redraw_man_t *rdman, paint_t *paint) { |
19 | 2877 if(paint) |
2878 free(paint); | |
2879 } | |
2880 | |
2881 paint_t *dummy_paint_new(redraw_man_t *rdman) { | |
2882 paint_t *paint; | |
2883 | |
2884 paint = (paint_t *)malloc(sizeof(paint_t)); | |
2885 if(paint == NULL) | |
2886 return NULL; | |
2887 | |
408
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
2888 paint_init(paint, MBP_DUMMY, dummy_paint_prepare, dummy_paint_free); |
19 | 2889 |
2890 return paint; | |
2891 } | |
2892 | |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2893 static void test_rdman_redraw_changed(void) { |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2894 coord_t *coords[3]; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2895 shape_t *shapes[3]; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2896 sh_dummy_t **dummys; |
19 | 2897 paint_t *paint; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2898 redraw_man_t *rdman; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2899 redraw_man_t _rdman; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2900 int i; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2901 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2902 dummys = (sh_dummy_t **)shapes; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2903 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2904 rdman = &_rdman; |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2905 redraw_man_init(rdman, NULL, NULL); |
19 | 2906 paint = dummy_paint_new(rdman); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2907 for(i = 0; i < 3; i++) { |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2908 shapes[i] = sh_dummy_new(rdman, 0, 0, 50, 50); |
19 | 2909 rdman_paint_fill(rdman, paint, shapes[i]); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2910 coords[i] = rdman_coord_new(rdman, rdman->root_coord); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2911 coords[i]->matrix[2] = 10 + i * 100; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2912 coords[i]->matrix[5] = 10 + i * 100; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2913 rdman_coord_changed(rdman, coords[i]); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2914 rdman_add_shape(rdman, shapes[i], coords[i]); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2915 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2916 rdman_redraw_all(rdman); |
119 | 2917 CU_ASSERT(dummys[0]->trans_cnt == 1); |
2918 CU_ASSERT(dummys[1]->trans_cnt == 1); | |
2919 CU_ASSERT(dummys[2]->trans_cnt == 1); | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2920 CU_ASSERT(dummys[0]->draw_cnt == 1); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2921 CU_ASSERT(dummys[1]->draw_cnt == 1); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2922 CU_ASSERT(dummys[2]->draw_cnt == 1); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2923 |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2924 coords[2]->matrix[2] = 100; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2925 coords[2]->matrix[5] = 100; |
119 | 2926 rdman_coord_changed(rdman, coords[0]); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2927 rdman_coord_changed(rdman, coords[2]); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2928 rdman_redraw_changed(rdman); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2929 |
119 | 2930 CU_ASSERT(dummys[0]->draw_cnt == 2); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2931 CU_ASSERT(dummys[1]->draw_cnt == 2); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2932 CU_ASSERT(dummys[2]->draw_cnt == 2); |
19 | 2933 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2934 rdman_paint_free(rdman, paint); |
19 | 2935 redraw_man_destroy(rdman); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2936 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2937 |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2938 static int test_free_pass = 0; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2939 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2940 static void test_free(redraw_man_t *rdman, void *obj) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2941 test_free_pass++; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2942 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2943 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2944 static void test_rdman_free_objs(void) { |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2945 redraw_man_t *rdman; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2946 redraw_man_t _rdman; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2947 int i; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2948 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2949 redraw_man_init(&_rdman, NULL, NULL); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2950 rdman = &_rdman; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2951 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2952 test_free_pass = 0; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2953 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2954 for(i = 0; i < 4; i++) |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2955 add_free_obj(rdman, NULL, test_free); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2956 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2957 redraw_man_destroy(rdman); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2958 CU_ASSERT(test_free_pass == 4); |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2959 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2960 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2961 static void |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2962 test_setup_canvas_info(void) { |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2963 redraw_man_t *rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2964 redraw_man_t _rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2965 coord_t *coord; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2966 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2967 redraw_man_init(&_rdman, NULL, NULL); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2968 rdman = &_rdman; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2969 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2970 coord = rdman_coord_new(rdman, rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2971 CU_ASSERT(coord->parent == rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2972 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2973 coord_set_opacity(coord, 0.9); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2974 setup_canvas_info(rdman, coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2975 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2976 CU_ASSERT(coord->canvas_info != rdman->root_coord->canvas_info); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2977 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2978 coord_set_opacity(coord, 1); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2979 setup_canvas_info(rdman, coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2980 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2981 CU_ASSERT(coord->canvas_info == rdman->root_coord->canvas_info); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2982 } |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2983 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2984 static void |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2985 test_own_canvas_area(void) { |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2986 redraw_man_t *rdman; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2987 redraw_man_t _rdman; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2988 coord_t *coord1, *coord2; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2989 sh_dummy_t *sh; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2990 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2991 redraw_man_init(&_rdman, NULL, NULL); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2992 rdman = &_rdman; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2993 |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2994 coord1 = rdman_coord_new(rdman, rdman->root_coord); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2995 CU_ASSERT(coord1->parent == rdman->root_coord); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2996 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2997 coord2 = rdman_coord_new(rdman, coord1); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2998 CU_ASSERT(coord2->parent == coord1); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2999 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3000 coord_set_opacity(coord2, 0.9); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3001 rdman_coord_changed(rdman, coord2); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3002 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3003 sh = (sh_dummy_t *)sh_dummy_new(rdman, 100, 100, 20, 20); |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3004 rdman_add_shape(rdman, (shape_t *)sh, coord2); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3005 rdman_shape_changed(rdman, (shape_t *)sh); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3006 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3007 clean_coord(rdman, coord2); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3008 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3009 /* Parent cached coord must be updated */ |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3010 CU_ASSERT(geo_get_area(coord2)->x == 100); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3011 CU_ASSERT(geo_get_area(coord2)->y == 100); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3012 CU_ASSERT(geo_get_area(coord2)->w <= 22 && geo_get_area(coord2)->w >= 19); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3013 CU_ASSERT(geo_get_area(coord2)->h <= 22 && geo_get_area(coord2)->h >= 19); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3014 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3015 redraw_man_destroy(rdman); |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3016 } |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3017 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3018 static void |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3019 test_own_canvas(void) { |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3020 redraw_man_t *rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3021 redraw_man_t _rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3022 coord_t *coord1, *coord2; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3023 sh_dummy_t *sh; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3024 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3025 redraw_man_init(&_rdman, NULL, NULL); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3026 rdman = &_rdman; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
3027 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3028 coord1 = rdman_coord_new(rdman, rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3029 CU_ASSERT(coord1->parent == rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3030 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3031 coord2 = rdman_coord_new(rdman, coord1); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3032 CU_ASSERT(coord2->parent == coord1); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3033 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3034 coord_set_opacity(coord2, 0.9); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3035 rdman_coord_changed(rdman, coord2); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3036 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3037 sh = (sh_dummy_t *)sh_dummy_new(rdman, 100, 100, 20, 20); |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3038 rdman_add_shape(rdman, (shape_t *)sh, coord2); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3039 rdman_shape_changed(rdman, (shape_t *)sh); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3040 |
817
387d1c597632
Change order of statements to fix bug of wild pointers.
Thinker K.F. Li <thinker@codemud.net>
parents:
816
diff
changeset
|
3041 rdman_clean_dirties(rdman); |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3042 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3043 /* Parent cached coord must be updated */ |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3044 CU_ASSERT(_coord_get_dirty_areas(rdman->root_coord)->num == 1); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3045 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3046 CU_ASSERT(geo_get_area(coord2)->x == 0); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3047 CU_ASSERT(geo_get_area(coord2)->y == 0); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3048 CU_ASSERT(geo_get_area(coord2)->w <= 22 && geo_get_area(coord2)->w >= 19); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3049 CU_ASSERT(geo_get_area(coord2)->h <= 22 && geo_get_area(coord2)->h >= 19); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3050 |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3051 redraw_man_destroy(rdman); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3052 } |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3053 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3054 static void |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3055 test_own_canvas_redraw(void) { |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3056 redraw_man_t *rdman; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3057 redraw_man_t _rdman; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3058 coord_t *coord1, *coord2; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3059 sh_dummy_t *sh; |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
3060 paint_t *paint; |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3061 co_aix *parent_2_cache; |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3062 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3063 redraw_man_init(&_rdman, NULL, NULL); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3064 rdman = &_rdman; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3065 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3066 coord1 = rdman_coord_new(rdman, rdman->root_coord); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3067 CU_ASSERT(coord1->parent == rdman->root_coord); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3068 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3069 coord2 = rdman_coord_new(rdman, coord1); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3070 CU_ASSERT(coord2->parent == coord1); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3071 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3072 coord_set_opacity(coord2, 0.9); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3073 rdman_coord_changed(rdman, coord2); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3074 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3075 sh = (sh_dummy_t *)sh_dummy_new(rdman, 100, 100, 20, 20); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3076 rdman_add_shape(rdman, (shape_t *)sh, coord2); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3077 rdman_shape_changed(rdman, (shape_t *)sh); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3078 |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
3079 paint = dummy_paint_new(rdman); |
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
3080 rdman_paint_fill(rdman, paint, (shape_t *)sh); |
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
3081 |
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
3082 rdman_redraw_all(rdman); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3083 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3084 CU_ASSERT(sh->draw_cnt == 1); |
825
e83956ba22d7
Make sure drawing on right cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
824
diff
changeset
|
3085 CU_ASSERT(sh->last_draw == _coord_get_canvas(coord2)); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3086 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3087 parent_2_cache = ((mock_mbe_t *)_coord_get_canvas(coord2))->parent_2_cache; |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3088 CU_ASSERT(parent_2_cache[0] == 1); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3089 CU_ASSERT(parent_2_cache[1] == 0); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3090 CU_ASSERT(parent_2_cache[2] == -100); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3091 CU_ASSERT(parent_2_cache[3] == 0); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3092 CU_ASSERT(parent_2_cache[4] == 1); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3093 CU_ASSERT(parent_2_cache[5] == -100); |
833
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3094 |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3095 coord2->matrix[2] = 20; |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3096 coord2->matrix[5] = 30; |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3097 rdman_coord_changed(rdman, coord2); |
834
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
3098 rdman_redraw_changed(rdman); |
833
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3099 |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3100 /* To test if transform matrix of cached coord working */ |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3101 parent_2_cache = ((mock_mbe_t *)_coord_get_canvas(coord2))->parent_2_cache; |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3102 CU_ASSERT(parent_2_cache[0] == 1); |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3103 CU_ASSERT(parent_2_cache[1] == 0); |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3104 CU_ASSERT(parent_2_cache[2] == -120); |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3105 CU_ASSERT(parent_2_cache[3] == 0); |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3106 CU_ASSERT(parent_2_cache[4] == 1); |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
3107 CU_ASSERT(parent_2_cache[5] == -130); |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
3108 |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
3109 rdman_paint_free(rdman, paint); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3110 redraw_man_destroy(rdman); |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3111 } |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3112 |
1371
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3113 static void |
1372
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1371
diff
changeset
|
3114 test_rdman_coord_clone_from_subtree(void) { |
1371
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3115 redraw_man_t _rdman; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3116 redraw_man_t *rdman; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3117 coord_t *coord1, *coord2, *coord3; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3118 coord_t *cloning; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3119 shape_t *sh1, *sh2; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3120 coord_t *cloning_visit; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3121 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3122 redraw_man_init(&_rdman, NULL, NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3123 rdman = &_rdman; |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3124 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3125 coord1 = rdman_coord_new(rdman, rdman->root_coord); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3126 CU_ASSERT(coord1 != NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3127 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3128 sh1 = sh_dummy_new(rdman, 100, 100, 20, 20); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3129 CU_ASSERT(sh1 != NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3130 rdman_add_shape(rdman, (shape_t *)sh1, coord1); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3131 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3132 coord2 = rdman_coord_new(rdman, coord1); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3133 CU_ASSERT(coord2 != NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3134 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3135 sh2 = sh_dummy_new(rdman, 150, 150, 11, 11); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3136 CU_ASSERT(sh2 != NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3137 rdman_add_shape(rdman, (shape_t *)sh2, coord2); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3138 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3139 coord3 = rdman_coord_new(rdman, coord2); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3140 CU_ASSERT(coord3 != NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3141 |
1372
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1371
diff
changeset
|
3142 cloning = rdman_coord_clone_from_subtree(rdman, rdman->root_coord, coord1); |
1371
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3143 CU_ASSERT(NEXT_CHILD(coord1) == cloning); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3144 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3145 cloning_visit = FIRST_CHILD(cloning); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3146 CU_ASSERT(cloning_visit != NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3147 CU_ASSERT(cloning_visit->before_pmem == 1); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3148 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3149 cloning_visit = FIRST_CHILD(cloning_visit); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3150 CU_ASSERT(cloning_visit != NULL); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3151 |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3152 redraw_man_destroy(rdman); |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3153 } |
36cbe73813a8
add rdman_coord_clone_subtree()
Thinker K.F. Li <thinker@codemud.net>
parents:
1114
diff
changeset
|
3154 |
12 | 3155 CU_pSuite get_redraw_man_suite(void) { |
3156 CU_pSuite suite; | |
3157 | |
3158 suite = CU_add_suite("Suite_redraw_man", NULL, NULL); | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
3159 CU_ADD_TEST(suite, test_rdman_redraw_changed); |
159
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
3160 CU_ADD_TEST(suite, test_rdman_free_objs); |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3161 CU_ADD_TEST(suite, test_setup_canvas_info); |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
3162 CU_ADD_TEST(suite, test_own_canvas_area); |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
3163 CU_ADD_TEST(suite, test_own_canvas); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
3164 CU_ADD_TEST(suite, test_own_canvas_redraw); |
1372
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1371
diff
changeset
|
3165 CU_ADD_TEST(suite, test_rdman_coord_clone_from_subtree); |
12 | 3166 |
3167 return suite; | |
3168 } | |
3169 | |
3170 #endif /* UNITTEST */ |