Mercurial > MadButterfly
annotate src/redraw_man.c @ 935:960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
The cached coords their pcache areas should be recomputed are also add
ro zeroing list. They have no dirty areas. But, their pcache area
must be added to parent cached coord.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Fri, 12 Nov 2010 16:03:19 +0800 |
parents | 8a2d676d9fa3 |
children | 36aef79d68e4 |
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 |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
307 /* 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
|
308 */ |
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
309 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
310 #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
|
311 do { \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
312 (sh)->geo = g; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
313 (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
|
314 } while(0) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
315 #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
|
316 do { \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
317 (sh)->geo->shape = NULL; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
318 (sh)->geo = NULL; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
319 } while(0) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
320 #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
|
321 #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
|
322 #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
|
323 #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
|
324 ((rdman)->dirty_coords.num != 0 || \ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
325 (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
|
326 |
12 | 327 #define OK 0 |
328 #define ERR -1 | |
329 | |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
330 #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
|
331 |
13 | 332 #define SWAP(a, b, t) do { t c; c = a; a = b; b = c; } while(0) |
333 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
334 #ifdef UNITTEST |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
335 typedef struct _sh_dummy sh_dummy_t; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
336 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
337 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
|
338 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
|
339 #endif /* UNITTEST */ |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
340 |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
341 static subject_t *ob_subject_alloc(ob_factory_t *factory); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
342 static void ob_subject_free(ob_factory_t *factory, subject_t *subject); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
343 static observer_t *ob_observer_alloc(ob_factory_t *factory); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
344 static void ob_observer_free(ob_factory_t *factory, observer_t *observer); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
345 static subject_t *ob_get_parent_subject(ob_factory_t *factory, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
346 subject_t *cur_subject); |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
347 /* Functions for children. */ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
348 #define FORCHILDREN(coord, child) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
349 for((child) = STAILQ_HEAD((coord)->children); \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
350 (child) != NULL; \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
351 (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
|
352 #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
|
353 #define ADD_CHILD(parent, child) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
354 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
|
355 #define RM_CHILD(parent, child) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
356 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
|
357 #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
|
358 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
359 /* Functions for members. */ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
360 #define FORMEMBERS(coord, member) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
361 for((member) = STAILQ_HEAD((coord)->members); \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
362 (member) != NULL; \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
363 (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
|
364 #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
|
365 #define ADD_MEMBER(coord, member) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
366 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
|
367 #define RM_MEMBER(coord, member) \ |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
368 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
|
369 #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
|
370 |
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
|
371 /* 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
|
372 #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
|
373 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
|
374 (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
|
375 (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
|
376 #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
|
377 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
|
378 |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
379 /*! \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
|
380 * |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
381 * 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
|
382 * 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
|
383 */ |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
384 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
|
385 int i, j; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
386 unsigned int val; |
121
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
387 void *elm_i; |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
388 |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
389 for(i = 1; i < num; i++) { |
121
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
390 elm_i = elms[i]; |
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
391 val = *(unsigned int *)(elm_i + off); |
119 | 392 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
|
393 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
|
394 break; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
395 elms[j] = elms[j - 1]; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
396 } |
121
76ba6fd61c7d
More bug of insert sort.
Thinker K.F. Li <thinker@branda.to>
parents:
119
diff
changeset
|
397 elms[j] = elm_i; |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
398 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
399 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
400 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
401 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
|
402 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
|
403 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
|
404 |
235 | 405 int rdman_add_gen_geos(redraw_man_t *rdman, geo_t *geo) { |
406 int r; | |
407 | |
408 r = geos_add(rdman_get_gen_geos(rdman), geo); | |
409 return r; | |
410 } | |
411 | |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
412 /*! 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
|
413 */ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
414 #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
|
415 int r; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
416 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
|
417 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
|
418 |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
419 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
420 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
|
421 int n_areas, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
422 area_t **areas) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
423 int i; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
424 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
425 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
|
426 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
|
427 return 1; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
428 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
429 return 0; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
430 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
431 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
432 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
|
433 int n_areas, |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
434 area_t **areas) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
435 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
|
436 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
437 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
438 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
|
439 poses[0][0] = area->x; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
440 poses[0][1] = area->y; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
441 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
|
442 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
|
443 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
444 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
445 /* Maintain Lists */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
446 |
152
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
447 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
|
448 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
|
449 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
|
450 return OK; |
152
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
451 } |
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
452 |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
453 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
|
454 geo->flags |= GEF_DIRTY; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
455 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
|
456 return OK; |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
457 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
458 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
459 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
|
460 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
461 |
530
cd41d9033567
Ignore small dirty area.
Thinker K.F. Li <thinker@branda.to>
parents:
528
diff
changeset
|
462 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
|
463 return OK; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
464 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
465 rdman->n_dirty_areas++; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
466 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
|
467 return r == 0? OK: ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
468 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
469 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
470 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
|
471 coord_set_zeroing(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
472 ADD_DATA(coords, zeroing_coords, coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
473 return OK; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
474 } |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
475 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
476 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
|
477 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
|
478 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
|
479 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
|
480 } |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
481 return OK; |
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
482 } |
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
483 |
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
|
484 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
|
485 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
|
486 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
|
487 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
|
488 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
489 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
|
490 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
|
491 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
|
492 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
|
493 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
|
494 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
|
495 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
|
496 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
|
497 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
498 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
499 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
|
500 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
|
501 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
|
502 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
503 return OK; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
504 } |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
505 |
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
|
506 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
|
507 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
|
508 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
|
509 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
510 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
|
511 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
|
512 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
|
513 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
514 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
|
515 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
516 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
517 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
|
518 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
|
519 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
|
520 } |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
521 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
522 #ifdef UNITTEST |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
523 /*! \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
|
524 */ |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
525 typedef struct { |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
526 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
|
527 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
|
528 } 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
|
529 #endif |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
530 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
531 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
|
532 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
533 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
|
534 mbe_t *cr; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
535 |
450
a417fd980228
Replace cairo_format_t with mb_img_fmt_t.
Thinker K.F. Li <thinker@branda.to>
parents:
448
diff
changeset
|
536 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
|
537 w, h); |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
538 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
|
539 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
540 return cr; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
541 #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
|
542 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
|
543 |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
544 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
|
545 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
|
546 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
|
547 |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
548 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
|
549 #endif |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
550 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
551 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
552 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
|
553 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
554 mbe_destroy(canvas); |
825
e83956ba22d7
Make sure drawing on right cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
824
diff
changeset
|
555 #else |
e83956ba22d7
Make sure drawing on right cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
824
diff
changeset
|
556 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
|
557 #endif |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
558 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
559 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
560 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
|
561 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
562 mbe_surface_t *surface; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
563 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
564 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
|
565 *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
|
566 *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
|
567 #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
|
568 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
|
569 |
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
570 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
|
571 *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
|
572 *h = mbe->h; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
573 #endif |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
574 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
575 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
576 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
|
577 int off = 0; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
578 geo_t *vgeo; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
579 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
580 FORMEMBERS(coord, vgeo) { |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
581 if(vgeo == geo) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
582 return off; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
583 off++; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
584 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
585 return -1; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
586 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
587 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
588 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
|
589 ADD_MEMBER(coord, geo); |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
590 coord->num_members++; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
591 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
592 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
593 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
|
594 int off; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
595 coord_t *child; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
596 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
597 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
|
598 if(off < 0) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
599 return; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
600 FORCHILDREN(coord, child) { |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
601 if(child->before_pmem >= off) |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
602 child->before_pmem--; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
603 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
604 |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
605 RM_MEMBER(coord, geo); |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
606 coord->num_members--; |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
607 } |
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
608 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
609 /*! \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
|
610 */ |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
611 static coord_canvas_info_t * |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
612 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
|
613 mbe_t *canvas) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
614 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
|
615 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
|
616 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
617 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
|
618 if(info == NULL) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
619 return info; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
620 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
621 info->owner = coord; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
622 info->canvas = canvas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
623 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
|
624 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
625 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
|
626 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
|
627 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
|
628 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
|
629 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
|
630 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
|
631 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
|
632 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
633 return info; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
634 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
635 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
636 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
|
637 coord_canvas_info_t *info) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
638 DARRAY_DESTROY(&info->dirty_areas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
639 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
|
640 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
641 |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
642 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
|
643 } |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
644 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
645 int redraw_man_init(redraw_man_t *rdman, mbe_t *cr, mbe_t *backend) { |
12 | 646 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
|
647 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
|
648 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
|
649 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
|
650 extern int _paint_linear_size; |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
651 extern int _paint_radial_size; |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
652 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
|
653 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
|
654 extern void addrm_monitor_hdlr(event_t *evt, void *arg); |
12 | 655 |
656 memset(rdman, 0, sizeof(redraw_man_t)); | |
657 | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
658 DARRAY_INIT(&rdman->dirty_coords); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
659 DARRAY_INIT(&rdman->dirty_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
660 DARRAY_INIT(&rdman->gen_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
661 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
|
662 |
12 | 663 rdman->geo_pool = elmpool_new(sizeof(geo_t), 128); |
664 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
|
665 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
|
666 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
|
667 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
|
668 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
|
669 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
|
670 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
|
671 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
|
672 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
|
673 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
|
674 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
|
675 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
|
676 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
|
677 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
|
678 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
|
679 goto err; |
146
e96a584487af
Use elmpool to manage paint_color_t objects.
Thinker K.F. Li <thinker@branda.to>
parents:
141
diff
changeset
|
680 |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
681 rdman->ob_factory.subject_alloc = ob_subject_alloc; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
682 rdman->ob_factory.subject_free = ob_subject_free; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
683 rdman->ob_factory.observer_alloc = ob_observer_alloc; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
684 rdman->ob_factory.observer_free = ob_observer_free; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
685 rdman->ob_factory.get_parent_subject = ob_get_parent_subject; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
686 |
154 | 687 rdman->redraw = |
688 subject_new(&rdman->ob_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
|
689 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
|
690 subject_new(&rdman->ob_factory, rdman, OBJT_RDMAN); |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
691 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
|
692 goto err; |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
693 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
694 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
|
695 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
|
696 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
|
697 goto err; |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
698 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
699 rdman->last_mouse_over = NULL; |
154 | 700 |
12 | 701 rdman->root_coord = elmpool_elm_alloc(rdman->coord_pool); |
702 if(rdman->root_coord == NULL) | |
703 redraw_man_destroy(rdman); | |
13 | 704 rdman->n_coords = 1; |
12 | 705 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
|
706 mb_prop_store_init(&rdman->root_coord->obj.props, rdman->pent_pool); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
707 rdman->root_coord->mouse_event = subject_new(&rdman->ob_factory, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
708 rdman->root_coord, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
709 OBJT_COORD); |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
710 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
|
711 rdman->root_coord->canvas_info = |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
712 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
|
713 rdman->root_coord->opacity = 1; |
12 | 714 |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
715 rdman->cr = cr; |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
716 rdman->backend = backend; |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
717 |
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
|
718 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
|
719 |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
720 /* \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
|
721 * 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
|
722 */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
723 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
|
724 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
|
725 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
|
726 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
|
727 |
257
50d253d0fcba
Simple image loader and image shape.
Thinker K.F. Li <thinker@branda.to>
parents:
251
diff
changeset
|
728 mb_prop_store_init(&rdman->props, rdman->pent_pool); |
12 | 729 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
|
730 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
731 err: |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
732 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
|
733 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
|
734 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
|
735 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
|
736 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
|
737 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
|
738 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
|
739 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
|
740 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
|
741 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
|
742 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
|
743 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
|
744 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
|
745 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
|
746 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
|
747 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
|
748 if(rdman->paint_linear_pool) |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
749 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
|
750 if(rdman->paint_radial_pool) |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
751 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
|
752 if(rdman->paint_image_pool) |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
753 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
|
754 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
|
755 elmpool_free(rdman->pent_pool); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
756 if(rdman->coord_canvas_pool) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
757 elmpool_free(rdman->coord_canvas_pool); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
758 DARRAY_DESTROY(&rdman->dirty_coords); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
759 DARRAY_DESTROY(&rdman->dirty_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
760 DARRAY_DESTROY(&rdman->gen_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
761 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
|
762 return ERR; |
12 | 763 } |
764 | |
765 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
|
766 coord_t *coord, *saved_coord; |
769
7c73fbc8d700
Remove unused local variables
Thinker K.F. Li <thinker@codemud.net>
parents:
747
diff
changeset
|
767 shape_t *shape; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
768 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
|
769 |
257
50d253d0fcba
Simple image loader and image shape.
Thinker K.F. Li <thinker@branda.to>
parents:
251
diff
changeset
|
770 mb_prop_store_destroy(&rdman->props); |
50d253d0fcba
Simple image loader and image shape.
Thinker K.F. Li <thinker@branda.to>
parents:
251
diff
changeset
|
771 |
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
|
772 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
|
773 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
|
774 |
489
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
775 /* 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
|
776 * successfully. |
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
777 */ |
23c7667b3ec0
Fix a potential bug when destroy a rdman.
Thinker K.F. Li <thinker@branda.to>
parents:
473
diff
changeset
|
778 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
|
779 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
|
780 |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
781 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
|
782 while(coord) { |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
783 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
|
784 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
|
785 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
|
786 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
|
787 } |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
788 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
|
789 } |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
790 /* 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
|
791 * caller; for canvas |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
792 */ |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
793 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
794 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
|
795 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
|
796 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
797 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
798 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
|
799 |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
800 /* 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
|
801 * 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
|
802 */ |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
803 |
12 | 804 elmpool_free(rdman->coord_pool); |
805 elmpool_free(rdman->geo_pool); | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
806 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
|
807 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
|
808 elmpool_free(rdman->sh_rect_pool); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
809 elmpool_free(rdman->observer_pool); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
810 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
|
811 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
|
812 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
|
813 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
|
814 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
|
815 elmpool_free(rdman->pent_pool); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
816 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
|
817 |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
818 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
|
819 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
|
820 DARRAY_DESTROY(&rdman->gen_geos); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
821 DARRAY_DESTROY(&rdman->zeroing_coords); |
12 | 822 } |
823 | |
824 | |
825 #define ASSERT(x) | |
826 /* | |
827 * Change transformation matrix | |
828 * - update aggregated transformation matrix | |
829 * - of coord_t object been changed. | |
830 * - of children coord_t objects. | |
831 * - redraw members of coord_t objects. | |
832 * - redraw shape objects they are overlaid with members. | |
833 * - find out overlaid shape objects. | |
834 * - geo_t of a coord_t object | |
835 * - can make finding more efficiency. | |
836 * - fill overlay geo_t objects of members. | |
837 * | |
838 * Change a shape object | |
839 * - redraw changed object. | |
840 * - redraw shape objects they are overlaid with changed object. | |
841 * - find out overlaid shape objects. | |
842 * | |
843 * That coord and geo of shape objects are setted by user code | |
844 * give user code a chance to collect coord and geo objects together | |
845 * and gain interest of higher cache hit rate. | |
846 */ | |
847 | |
848 int rdman_add_shape(redraw_man_t *rdman, shape_t *shape, coord_t *coord) { | |
849 geo_t *geo; | |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
850 int r; |
12 | 851 |
852 geo = elmpool_elm_alloc(rdman->geo_pool); | |
853 if(geo == NULL) | |
854 return ERR; | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
855 |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
856 geo_init(geo); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
857 geo->mouse_event = subject_new(&rdman->ob_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
|
858 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
|
859 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
860 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
|
861 |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
862 /* 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
|
863 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
|
864 if(r != OK) |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
865 return ERR; |
13 | 866 |
12 | 867 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
|
868 sh_attach_geo(shape, geo); |
12 | 869 |
870 return OK; | |
871 } | |
872 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
873 /*! \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
|
874 * |
154 | 875 * \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
|
876 * \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
|
877 * is postponsed. |
58 | 878 * \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
|
879 */ |
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
|
880 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
|
881 geo_t *geo; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
882 int r; |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
883 |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
884 geo = shape->geo; |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
885 |
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
|
886 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
|
887 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
|
888 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
|
889 |
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
|
890 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
|
891 sh_hide(shape); |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
892 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
|
893 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
|
894 if(r != OK) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
895 return ERR; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
896 } |
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
|
897 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
|
898 if(r != OK) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
899 return ERR; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
900 return OK; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
901 } |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
902 |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
903 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
|
904 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
|
905 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
|
906 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
|
907 |
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
|
908 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
|
909 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
|
910 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
|
911 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
|
912 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
|
913 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
|
914 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
915 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
|
916 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
|
917 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
|
918 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
919 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
|
920 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
|
921 |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
922 |
12 | 923 return OK; |
924 } | |
925 | |
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
|
926 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
|
927 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
|
928 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
929 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
|
930 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
|
931 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
|
932 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
|
933 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
934 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
|
935 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
936 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
937 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
|
938 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
|
939 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
|
940 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
941 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
|
942 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
|
943 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
|
944 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
|
945 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
|
946 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
|
947 } |
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 /* 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
|
950 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
|
951 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
|
952 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
|
953 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
|
954 |
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 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
|
956 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
|
957 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
|
958 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
|
959 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
|
960 |
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
|
961 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
|
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 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
|
964 } |
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 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
|
966 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
|
967 |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
489
diff
changeset
|
968 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
|
969 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
|
970 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
|
971 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
|
972 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
|
973 |
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 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
|
975 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
976 |
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 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
|
978 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
|
979 } |
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 |
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 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
|
982 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
|
983 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
|
984 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
|
985 |
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 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
|
987 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
|
988 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
|
989 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
|
990 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
|
991 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
992 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
993 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
994 |
12 | 995 coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent) { |
13 | 996 coord_t *coord, *root_coord; |
997 coord_t *visit; | |
12 | 998 |
999 coord = elmpool_elm_alloc(rdman->coord_pool); | |
1000 if(coord == NULL) | |
1001 return NULL; | |
1002 | |
1003 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
|
1004 mb_prop_store_init(&coord->obj.props, rdman->pent_pool); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1005 coord->mouse_event = subject_new(&rdman->ob_factory, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1006 coord, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
1007 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
|
1008 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
|
1009 /*! \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
|
1010 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
|
1011 if(parent) |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1012 coord->canvas_info = parent->canvas_info; |
13 | 1013 rdman->n_coords++; |
1014 | |
1015 coord->order = ++rdman->next_coord_order; | |
1016 if(coord->order == 0) { | |
1017 rdman->next_coord_order = 0; | |
1018 root_coord = visit = rdman->root_coord; | |
1019 /* skip root coord. */ | |
1020 visit = preorder_coord_subtree(root_coord, visit); | |
1021 while(visit) { | |
1022 visit->order = ++rdman->next_coord_order; | |
1023 visit = preorder_coord_subtree(root_coord, visit); | |
1024 } | |
1025 } | |
12 | 1026 |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
1027 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
|
1028 |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1029 /* 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
|
1030 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
|
1031 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
|
1032 |
12 | 1033 return coord; |
1034 } | |
1035 | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1036 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
|
1037 int r; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1038 |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1039 if(coord->flags & COF_FREE) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1040 return ERR; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1041 |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1042 coord->flags |= COF_FREE; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1043 coord_hide(coord); |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1044 if(!(coord->flags & COF_DIRTY)) { |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1045 r = add_dirty_coord(rdman, coord); |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1046 if(r != OK) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1047 return ERR; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1048 } |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1049 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
|
1050 if(r != OK) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1051 return ERR; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1052 return OK; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1053 } |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1054 |
12 | 1055 /*! \brief Free a coord of a redraw_man_t object. |
1056 * | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1057 * 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
|
1058 * |
12 | 1059 * \param coord is a coord_t without children and members. |
1060 * \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
|
1061 * |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1062 * \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
|
1063 * or members postponsed for free. |
12 | 1064 */ |
1065 int rdman_coord_free(redraw_man_t *rdman, coord_t *coord) { | |
1066 coord_t *parent; | |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1067 coord_t *child; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1068 geo_t *member; |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1069 int cm_cnt; /* children & members counter */ |
12 | 1070 |
1071 parent = coord->parent; | |
1072 if(parent == NULL) | |
1073 return ERR; | |
1074 | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1075 cm_cnt = 0; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1076 FORCHILDREN(coord, child) { |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1077 cm_cnt++; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1078 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
|
1079 return ERR; |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1080 } |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1081 FORMEMBERS(coord, member) { |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1082 cm_cnt++; |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1083 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
|
1084 return ERR; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1085 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1086 |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1087 if(cm_cnt || rdman_is_dirty(rdman)) |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1088 return rdman_coord_free_postponse(rdman, coord); |
12 | 1089 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1090 /* Free canvas and canvas_info (\ref redraw) */ |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1091 if(coord_is_cached(coord)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1092 canvas_free(_coord_get_canvas(coord)); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1093 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
|
1094 } |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1095 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
1096 RM_CHILD(parent, coord); |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
1097 subject_free(coord->mouse_event); |
251
f08b3ba9c1d8
Remove potential memory address error.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
1098 mb_prop_store_destroy(&coord->obj.props); |
12 | 1099 elmpool_elm_free(rdman->coord_pool, coord); |
13 | 1100 rdman->n_coords--; |
1101 | |
1102 return OK; | |
1103 } | |
1104 | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
196
diff
changeset
|
1105 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
|
1106 geo_t *member; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1107 shape_t *shape; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1108 int r; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1109 |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1110 FORMEMBERS(coord, member) { |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1111 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
|
1112 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
|
1113 if(r != OK) |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1114 return ERR; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1115 } |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1116 return OK; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1117 } |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1118 |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1119 /*! \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
|
1120 * |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1121 * 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
|
1122 */ |
154 | 1123 int rdman_coord_subtree_free(redraw_man_t *rdman, coord_t *subtree) { |
1124 coord_t *coord, *prev_coord; | |
1125 int r; | |
1126 | |
1127 if(subtree == NULL) | |
1128 return OK; | |
1129 | |
1130 prev_coord = postorder_coord_subtree(subtree, NULL); | |
1131 for(coord = postorder_coord_subtree(subtree, prev_coord); | |
1132 coord != NULL; | |
1133 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
|
1134 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
|
1135 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
|
1136 if(r != OK) |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1137 return ERR; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1138 |
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
|
1139 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
|
1140 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
|
1141 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
|
1142 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1143 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
|
1144 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
1145 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
|
1146 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
|
1147 if(r != OK) |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1148 return ERR; |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
1149 |
154 | 1150 r = rdman_coord_free(rdman, prev_coord); |
1151 if(r != OK) | |
1152 return ERR; | |
1153 } | |
1154 | |
1155 return OK; | |
1156 } | |
1157 | |
13 | 1158 /*! \brief Mark a coord is changed. |
1159 * | |
1160 * 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
|
1161 * 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
|
1162 * 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
|
1163 * redraw shapes grouped by it. |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1164 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1165 * 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
|
1166 * dirty. |
13 | 1167 */ |
1168 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
|
1169 coord_t *child; |
13 | 1170 |
1171 if(coord->flags & COF_DIRTY) | |
1172 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
|
1173 |
152
2b316b5d65f9
Refactory code snippets for making coords dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
151
diff
changeset
|
1174 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
|
1175 |
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
|
1176 #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
|
1177 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
|
1178 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
|
1179 #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
|
1180 |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1181 /* 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
|
1182 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
|
1183 child != NULL; |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
1184 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
|
1185 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
|
1186 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
|
1187 continue; |
151
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1188 } |
d11aa8fc06c7
Fix bug of tanks do not show at right places.
Thinker K.F. Li <thinker@branda.to>
parents:
150
diff
changeset
|
1189 |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1190 if(coord_is_cached(child)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1191 preorder_coord_skip_subtree(child); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1192 continue; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1193 } |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1194 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1195 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
|
1196 } |
13 | 1197 |
1198 return OK; | |
1199 } | |
1200 | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1201 static int _rdman_shape_changed(redraw_man_t *rdman, shape_t *shape) { |
13 | 1202 geo_t *geo; |
1203 int r; | |
1204 | |
1205 geo = shape->geo; | |
1206 | |
1207 if(geo->flags & GEF_DIRTY) | |
1208 return OK; | |
1209 | |
1210 r = add_dirty_geo(rdman, geo); | |
1211 if(r == ERR) | |
1212 return ERR; | |
12 | 1213 |
1214 return OK; | |
1215 } | |
1216 | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1217 /*! \brief Mark a shape is changed. |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1218 * |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1219 * 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
|
1220 * put into dirty_geos list. |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1221 */ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1222 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
|
1223 return _rdman_shape_changed(rdman, shape); |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1224 } |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
1225 |
29 | 1226 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
|
1227 shnode_t *shnode; |
29 | 1228 int r; |
1229 | |
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
|
1230 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
|
1231 r = _rdman_shape_changed(rdman, shnode->shape); |
29 | 1232 if(r != OK) |
1233 return ERR; | |
1234 } | |
1235 return OK; | |
1236 } | |
1237 | |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1238 |
28 | 1239 /* Clean dirties */ |
1240 | |
57
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1241 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
|
1242 while(coord) { |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1243 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
|
1244 return 1; |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1245 coord = coord->parent; |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1246 } |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1247 return 0; |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1248 } |
ab028c9f0930
Ability to hidden shapes and action of visibility.
Thinker K.F. Li <thinker@branda.to>
parents:
38
diff
changeset
|
1249 |
28 | 1250 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
|
1251 switch(MBO_TYPE(shape)) { |
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
1252 case MBO_PATH: |
28 | 1253 sh_path_transform(shape); |
1254 break; | |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1255 #ifdef SH_TEXT |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
1256 case MBO_TEXT: |
28 | 1257 sh_text_transform(shape); |
1258 break; | |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1259 #endif |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
1260 case MBO_RECT: |
35
581a03196093
Support rectangle tag of SVG.
Thinker K.F. Li <thinker@branda.to>
parents:
33
diff
changeset
|
1261 sh_rect_transform(shape); |
581a03196093
Support rectangle tag of SVG.
Thinker K.F. Li <thinker@branda.to>
parents:
33
diff
changeset
|
1262 break; |
260
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
1263 case MBO_IMAGE: |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
1264 sh_image_transform(shape); |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
1265 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1266 #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
|
1267 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
|
1268 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
|
1269 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
1270 #endif |
28 | 1271 #ifdef UNITTEST |
1272 default: | |
1273 sh_dummy_transform(shape); | |
1274 break; | |
1275 #endif /* UNITTEST */ | |
1276 } | |
1277 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
|
1278 |
747
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
1279 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
|
1280 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
|
1281 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
|
1282 else |
747
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
1283 sh_clear_flags(shape, GEF_NOT_SHOWED); |
28 | 1284 } |
1285 | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1286 /*! \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
|
1287 * |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1288 * 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
|
1289 * \sa |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1290 * - \ref redraw |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1291 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1292 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
|
1293 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
|
1294 return; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1295 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
1296 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
|
1297 if(!coord_is_cached(coord)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1298 /* 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
|
1299 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
|
1300 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
|
1301 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1302 } else { |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1303 if(coord_is_cached(coord)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1304 canvas_free(_coord_get_canvas(coord)); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1305 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
|
1306 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
|
1307 } |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1308 /* 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
|
1309 * 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
|
1310 * 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
|
1311 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1312 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
|
1313 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1314 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
1315 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1316 /* \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
|
1317 */ |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1318 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
|
1319 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
|
1320 coord_t *parent; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1321 co_aix *aggr; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1322 co_aix *matrix, *paggr; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1323 co_aix scale_x, scale_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1324 co_aix shift_x, shift_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1325 co_aix canvas2p[6]; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1326 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1327 aggr = coord_get_aggr_matrix(coord); |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1328 matrix = coord->matrix; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1329 parent = coord->parent; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1330 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
|
1331 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1332 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
|
1333 scale_y = matrix[4] / aggr[4]; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1334 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
|
1335 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
|
1336 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1337 canvas2p[0] = scale_x; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1338 canvas2p[1] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1339 canvas2p[2] = shift_x; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1340 canvas2p[3] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1341 canvas2p[4] = scale_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1342 canvas2p[5] = shift_y; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1343 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1344 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
|
1345 |
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1346 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
|
1347 } |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1348 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1349 /*! \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
|
1350 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1351 * 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
|
1352 * 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
|
1353 * 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
|
1354 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1355 * 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
|
1356 * 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
|
1357 * 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
|
1358 * ancestral cached coord. |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1359 */ |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1360 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
|
1361 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
|
1362 int c_w, c_h; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1363 canvas_t *canvas; |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1364 coord_canvas_info_t *canvas_info; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1365 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
|
1366 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1367 canvas_info = coord->canvas_info; |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1368 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
|
1369 area_t *); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1370 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1371 canvas = _coord_get_canvas(coord); |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1372 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
|
1373 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1374 poses[0][0] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1375 poses[0][1] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1376 poses[1][0] = c_w; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1377 poses[1][1] = c_h; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1378 poses[2][0] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1379 poses[2][1] = c_h; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1380 poses[3][0] = c_w; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1381 poses[3][1] = 0; |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1382 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
|
1383 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
|
1384 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
|
1385 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
|
1386 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1387 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
|
1388 |
834
9f305d895e8f
Keep width and height of a canvas for mock of canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
833
diff
changeset
|
1389 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
|
1390 } |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1391 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1392 /*! \brief Compute area of a coord. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1393 */ |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1394 static int |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1395 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
|
1396 static co_aix (*poses)[2] = NULL; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1397 static int max_poses = 0; |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1398 geo_t *geo; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1399 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
|
1400 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1401 cnt = 0; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1402 FORMEMBERS(coord, geo) { |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1403 cnt++; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1404 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1405 |
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
|
1406 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
|
1407 if(poses) |
6eaeec6806f2
Fix the issue of potential to free a wild pointer
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1408 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
|
1409 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
|
1410 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
|
1411 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
|
1412 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
|
1413 } |
28 | 1414 |
1415 pos_cnt = 0; | |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
1416 FORMEMBERS(coord, geo) { |
28 | 1417 area_to_positions(geo->cur_area, poses + pos_cnt); |
1418 pos_cnt += 2; | |
1419 } | |
1420 | |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1421 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
|
1422 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1423 return OK; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1424 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1425 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1426 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
|
1427 geo_t *geo; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1428 int r; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1429 /*! \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
|
1430 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1431 /* Clean member shapes. */ |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1432 FORMEMBERS(coord, geo) { |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1433 clean_shape(geo->shape); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1434 } |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1435 |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1436 r = compute_area(coord); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1437 if(r != OK) |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1438 return ERR; |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1439 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1440 return OK; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1441 } |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1442 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1443 /*! \brief Clean dirty coords. |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1444 * |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1445 * 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
|
1446 * 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
|
1447 * 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
|
1448 * |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1449 * \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
|
1450 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1451 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
|
1452 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1453 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1454 setup_canvas_info(rdman, coord); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1455 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1456 compute_aggr(coord); |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1457 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1458 /* 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
|
1459 * 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
|
1460 * 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
|
1461 * 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
|
1462 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1463 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
|
1464 if(r != OK) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1465 return ERR; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1466 |
835
51da337879bd
Do not add dirty area for cached coords
Thinker K.F. Li <thinker@codemud.net>
parents:
834
diff
changeset
|
1467 /* 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
|
1468 */ |
839
a3be0162bf44
Move decision of dirty pcache_area to one place.
Thinker K.F. Li <thinker@codemud.net>
parents:
837
diff
changeset
|
1469 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
|
1470 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
|
1471 |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1472 coord_clear_flags(coord, COF_DIRTY); |
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1473 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
|
1474 |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1475 return OK; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1476 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1477 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1478 /*! \brief Clean coord_t objects. |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1479 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1480 * 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
|
1481 * |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1482 * 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
|
1483 * 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
|
1484 */ |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1485 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
|
1486 coord_t *coord; |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1487 coord_t **dirty_coords; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1488 int n_dirty_coords; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1489 int i, r; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1490 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1491 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
|
1492 if(n_dirty_coords > 0) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1493 dirty_coords = rdman->dirty_coords.ds; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1494 _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
|
1495 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
|
1496 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
|
1497 coord = dirty_coords[i]; |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1498 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
|
1499 continue; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1500 r = clean_coord(rdman, coord); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1501 if(r != OK) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1502 return ERR; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1503 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1504 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1505 return OK; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1506 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1507 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1508 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
|
1509 int i; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1510 int n_dirty_geos; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1511 geo_t **dirty_geos; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1512 geo_t *visit_geo; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1513 coord_t *coord; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1514 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1515 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
|
1516 if(n_dirty_geos > 0) { |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1517 dirty_geos = rdman->dirty_geos.ds; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1518 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
|
1519 visit_geo = dirty_geos[i]; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1520 if(!(visit_geo->flags & GEF_DIRTY)) |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1521 continue; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1522 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1523 clean_shape(visit_geo->shape); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1524 coord = geo_get_coord(visit_geo); |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1525 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
|
1526 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
|
1527 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1528 } |
327
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1529 |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1530 return OK; |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1531 } |
85b8bb36fe71
Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents:
322
diff
changeset
|
1532 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1533 /*! \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
|
1534 * |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1535 * 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
|
1536 * 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
|
1537 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1538 static |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1539 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
|
1540 coord_t *cur; |
769
7c73fbc8d700
Remove unused local variables
Thinker K.F. Li <thinker@codemud.net>
parents:
747
diff
changeset
|
1541 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
|
1542 geo_t *geo; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1543 co_aix min_x, min_y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1544 co_aix max_x, max_y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1545 co_aix x, y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1546 int w, h; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1547 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
|
1548 mbe_t *canvas; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1549 co_aix *aggr; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1550 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1551 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
|
1552 abort(); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1553 if(!(coord_is_zeroing(coord))) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1554 abort(); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1555 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1556 coord_clear_zeroing(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1557 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1558 /* |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1559 * 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
|
1560 */ |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1561 area = coord_get_area(coord); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1562 min_x = area->x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1563 min_y = area->y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1564 max_x = min_x + area->w; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1565 max_y = min_y + area->h; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1566 |
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
|
1567 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
|
1568 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
|
1569 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
|
1570 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
|
1571 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
|
1572 /* 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
|
1573 * 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
|
1574 * (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
|
1575 */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1576 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
|
1577 } else |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1578 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
|
1579 |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1580 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
|
1581 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
|
1582 |
ce6cd06adccf
Fix error on area of cached coords and draw on right canvas.
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
1583 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
|
1584 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
|
1585 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
|
1586 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
|
1587 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
|
1588 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
|
1589 } |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1590 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1591 if(area->x < min_x) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1592 min_x = area->x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1593 if(area->y < min_y) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1594 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
|
1595 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1596 x = area->x + area->w; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1597 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
|
1598 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1599 if(x > max_x) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1600 max_x = x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1601 if(y > max_y) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1602 max_y = y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1603 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1604 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1605 w = max_x - min_x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1606 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
|
1607 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1608 canvas = _coord_get_canvas(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1609 if(canvas) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1610 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
|
1611 else |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1612 c_w = c_h = 0; |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1613 |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1614 /* 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
|
1615 * 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
|
1616 * 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
|
1617 * and avoid redraw all descendants. |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1618 * |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1619 * 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
|
1620 * 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
|
1621 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1622 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
|
1623 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
|
1624 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
|
1625 /* Canvas fully cover sub-graphic. */ |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1626 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
|
1627 return; |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1628 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1629 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1630 /* |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1631 * 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
|
1632 * 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
|
1633 * zeroing coord. |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1634 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1635 FOR_COORDS_PREORDER(coord, cur) { |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1636 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
|
1637 /* |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1638 * 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
|
1639 * 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
|
1640 * level of cached. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1641 */ |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1642 preorder_coord_skip_subtree(cur); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1643 } |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1644 /* Shift space */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1645 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
|
1646 aggr[2] -= min_x; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1647 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
|
1648 |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1649 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
|
1650 /* \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
|
1651 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
|
1652 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
|
1653 } |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1654 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
|
1655 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1656 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1657 /* |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1658 * Setup canvas |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1659 * |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1660 * 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
|
1661 * 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
|
1662 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1663 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
|
1664 if(canvas) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1665 canvas_free(canvas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1666 canvas = canvas_new(w, h); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1667 _coord_set_canvas(coord, canvas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1668 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1669 |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
1670 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
|
1671 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1672 |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1673 /*! \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
|
1674 * |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1675 * 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
|
1676 * in its descendants. |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1677 * |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1678 * 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
|
1679 * 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
|
1680 * 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
|
1681 * 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
|
1682 * |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1683 * 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
|
1684 * 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
|
1685 * 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
|
1686 * 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
|
1687 * situation. |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1688 */ |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1689 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
|
1690 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1691 int n_dirty_geos; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1692 geo_t **dirty_geos, *geo; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1693 int n_dirty_coords; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1694 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
|
1695 coord_t *parent_coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1696 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1697 /* 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
|
1698 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
|
1699 dirty_geos = rdman->dirty_geos.ds; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1700 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
|
1701 geo = dirty_geos[i]; |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1702 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
|
1703 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
|
1704 if(coord_is_root(coord)) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1705 break; |
525
f9326e955417
Does not add root coord to zeroing list
Thinker K.F. Li <thinker@branda.to>
parents:
524
diff
changeset
|
1706 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
|
1707 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
|
1708 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1709 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1710 |
521
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1711 /* 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
|
1712 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
|
1713 dirty_coords = rdman->dirty_coords.ds; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1714 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
|
1715 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
|
1716 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
|
1717 if(coord_is_root(coord)) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1718 break; |
525
f9326e955417
Does not add root coord to zeroing list
Thinker K.F. Li <thinker@branda.to>
parents:
524
diff
changeset
|
1719 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
|
1720 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
|
1721 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1722 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1723 |
519
7a1b17ebb3b4
Change documentation for zeroing
Thinker K.F. Li <thinker@branda.to>
parents:
512
diff
changeset
|
1724 /* 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
|
1725 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
|
1726 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
|
1727 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
|
1728 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1729 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
|
1730 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
|
1731 /* 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
|
1732 * 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
|
1733 */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1734 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
|
1735 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
|
1736 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1737 preorder_coord_skip_subtree(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1738 continue; |
28 | 1739 } |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1740 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
|
1741 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1742 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
|
1743 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1744 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1745 return OK; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1746 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1747 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1748 /*! \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
|
1749 * |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1750 * \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
|
1751 * 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
|
1752 * descendants. |
314
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 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
|
1755 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1756 coords_t *all_zeroing; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1757 coord_t *coord; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1758 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1759 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
|
1760 /*! 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
|
1761 * |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
1762 * 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
|
1763 * 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
|
1764 * 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
|
1765 * 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
|
1766 * 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
|
1767 * 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
|
1768 * 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
|
1769 * 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
|
1770 */ |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1771 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
|
1772 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
|
1773 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
|
1774 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
|
1775 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
|
1776 /* 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
|
1777 * zeroing. |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1778 */ |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1779 compute_pcache_area(coord); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1780 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1781 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1782 return OK; |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1783 } |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1784 |
851
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1785 /*! \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
|
1786 * |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1787 * 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
|
1788 * 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
|
1789 * 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
|
1790 * coord. |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1791 */ |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1792 static int |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1793 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
|
1794 int i; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1795 coords_t *all_zeroing; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1796 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
|
1797 |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1798 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
|
1799 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
|
1800 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
|
1801 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
|
1802 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
|
1803 coord_get_2pdev(coord), |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1804 coord_get_aggr2pdev(coord)); |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1805 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
|
1806 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
|
1807 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
|
1808 } |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1809 |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1810 return OK; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1811 } |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
1812 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1813 /*! \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
|
1814 * |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1815 * 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
|
1816 * 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
|
1817 * 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
|
1818 */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1819 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
|
1820 coord_t *coord) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1821 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1822 int n_areas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1823 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
|
1824 co_aix *canvas2pdev_matrix; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1825 area_t **areas, *area; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1826 area_t *area0, *area1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1827 coord_t *parent, *pcached_coord; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1828 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1829 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
|
1830 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
|
1831 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
|
1832 /* 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
|
1833 * 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
|
1834 * 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
|
1835 */ |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1836 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
|
1837 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
|
1838 |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1839 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
|
1840 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
|
1841 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
|
1842 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
|
1843 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
|
1844 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
|
1845 return; |
960e2395973d
Fix the bug of crash by abort() when running testsvg.js.
Thinker K.F. Li <thinker@codemud.net>
parents:
887
diff
changeset
|
1846 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1847 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1848 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
|
1849 area1 = area0 + 1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1850 |
532 | 1851 /* TODO: Since both cur & last area of coords are added into dirty |
1852 * area list, position of both areas shoud be adjusted for | |
1853 * all descendants when zeroing a cached coord. | |
1854 */ | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1855 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
|
1856 area = areas[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1857 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
|
1858 break; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1859 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1860 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1861 if(i >= n_areas) |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1862 return; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1863 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1864 area = areas[i++]; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1865 poses0[0][0] = area->x; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1866 poses0[0][1] = area->y; |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1867 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
|
1868 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
|
1869 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1870 if(i < n_areas) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1871 area = areas[i++]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1872 poses1[0][0] = area->x; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1873 poses1[0][1] = area->y; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1874 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
|
1875 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
|
1876 } else { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1877 poses1[0][0] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1878 poses1[0][1] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1879 poses1[1][0] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1880 poses1[1][1] = 0; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1881 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1882 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1883 for(; i < n_areas - 1;) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1884 /* Even areas */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1885 area = areas[i++]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1886 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
|
1887 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
|
1888 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
|
1889 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
|
1890 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
|
1891 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1892 /* Odd areas */ |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1893 area = areas[i++]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1894 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
|
1895 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
|
1896 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
|
1897 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
|
1898 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
|
1899 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1900 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1901 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1902 if(i < n_areas) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1903 area = areas[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1904 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
|
1905 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
|
1906 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
|
1907 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
|
1908 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
|
1909 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1910 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1911 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1912 parent = coord_get_parent(coord); |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1913 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
|
1914 |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
1915 canvas2pdev_matrix = coord_get_2pdev(coord); |
532 | 1916 |
1917 /* 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
|
1918 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
|
1919 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
|
1920 area_init(area0, 2, poses0); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1921 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
|
1922 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1923 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
|
1924 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
|
1925 area_init(area1, 2, poses1); |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
1926 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
|
1927 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1928 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
|
1929 !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
|
1930 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
|
1931 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1932 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1933 /*! \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
|
1934 */ |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1935 #define IS_CACHE_REDRAW_ALL(co) \ |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1936 (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
|
1937 |
526
3f695a6177b2
Change typos in comment
Thinker K.F. Li <thinker@branda.to>
parents:
525
diff
changeset
|
1938 /* 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
|
1939 * |
fa2ccf39ba53
imported patch more_comment.diff
Thinker K.F. Li <thinker@branda.to>
parents:
520
diff
changeset
|
1940 * 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
|
1941 * 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
|
1942 * 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
|
1943 * 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
|
1944 * 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
|
1945 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1946 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
|
1947 int i; |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1948 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
|
1949 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
|
1950 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
|
1951 |
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
1952 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
|
1953 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
|
1954 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
|
1955 coord = zeroing_coords[i]; |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1956 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
|
1957 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
|
1958 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
|
1959 |
537
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1960 add_dirty_area(rdman, pcached_coord, |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1961 coord_get_pcache_area(coord)); |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1962 add_dirty_area(rdman, pcached_coord, |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1963 coord_get_pcache_last_area(coord)); |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1964 } else { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1965 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
|
1966 } |
3a7e3c1cd6e6
[mq]: propagate_areas.diff
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
1967 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
1968 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1969 return OK; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1970 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
1971 |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1972 /*! \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
|
1973 * |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1974 * 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
|
1975 * 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
|
1976 * 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
|
1977 * |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1978 * 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
|
1979 * 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
|
1980 * 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
|
1981 * 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
|
1982 * 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
|
1983 * 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
|
1984 * 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
|
1985 * expansive. |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1986 */ |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1987 #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
|
1988 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
|
1989 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
|
1990 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
|
1991 } |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
1992 |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
1993 /* \brief Clean dirty coords and shapes. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
1994 * |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
1995 * 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
|
1996 * |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
1997 * - Add dirty coords and shapes to rdman. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
1998 * - 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
|
1999 * descendants of cached descendants. |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2000 * - 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
|
2001 * for dirty coords. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2002 * - 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
|
2003 * different from other coords. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2004 * - Compute new area for every dirty coord. |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2005 * - 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
|
2006 * - 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
|
2007 * 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
|
2008 * 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
|
2009 * - 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
|
2010 * 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
|
2011 * parent coord. |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2012 * - 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
|
2013 * 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
|
2014 * 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
|
2015 * zeroing was performed after cleaning) |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2016 * - 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
|
2017 * recomputed when cleaning the coord. |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2018 * - 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
|
2019 * - dirty, is, |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2020 * - dirty descendants, has. |
534
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2021 * - 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
|
2022 * 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
|
2023 * |
9f2d07a60493
Document on clean_rdman_dirties()
Thinker K.F. Li <thinker@branda.to>
parents:
532
diff
changeset
|
2024 * 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
|
2025 * 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
|
2026 * 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
|
2027 * 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
|
2028 */ |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2029 static int rdman_clean_dirties(redraw_man_t *rdman) { |
29 | 2030 int r; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2031 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
|
2032 coord_t **coords, *coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2033 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
|
2034 geo_t *geo; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2035 |
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
|
2036 /* 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
|
2037 * 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
|
2038 * 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
|
2039 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2040 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
|
2041 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
|
2042 coord = coords[i]; |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2043 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
|
2044 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
|
2045 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
|
2046 } |
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
|
2047 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2048 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2049 /* 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
|
2050 */ |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2051 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
|
2052 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
|
2053 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
|
2054 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
|
2055 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2056 |
29 | 2057 r = clean_rdman_coords(rdman); |
2058 if(r != OK) | |
2059 return ERR; | |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2060 |
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2061 /* 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
|
2062 * 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
|
2063 */ |
29 | 2064 |
2065 r = clean_rdman_geos(rdman); | |
2066 if(r != OK) | |
2067 return ERR; | |
2068 | |
531
1ad6c6192a80
Skip root coord when propagate dirty area to parent cached
Thinker K.F. Li <thinker@branda.to>
parents:
530
diff
changeset
|
2069 /* 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
|
2070 * 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
|
2071 */ |
840
048cc704bef7
Merge dirty_pcache_area_coords and zeroing_coords.
Thinker K.F. Li <thinker@codemud.net>
parents:
839
diff
changeset
|
2072 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
|
2073 if(r != OK) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2074 return ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2075 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2076 r = zeroing_rdman_coords(rdman); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2077 if(r != OK) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2078 return ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2079 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2080 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
|
2081 if(r != OK) |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2082 return ERR; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2083 |
851
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
2084 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
|
2085 if(r != OK) |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
2086 return ERR; |
85f22a771e4a
Compute aggregated cache_2_pdev and reversed one
Thinker K.F. Li <thinker@codemud.net>
parents:
850
diff
changeset
|
2087 |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2088 /* |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2089 * 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
|
2090 */ |
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
|
2091 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
|
2092 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
|
2093 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
|
2094 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
|
2095 /* \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
|
2096 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
|
2097 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
|
2098 } |
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2099 } |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2100 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
|
2101 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
|
2102 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
|
2103 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
|
2104 |
541
f42419c08a65
Swap geo_t::cur_area and geo_t::last_area correctly.
Thinker K.F. Li <thinker@branda.to>
parents:
540
diff
changeset
|
2105 /* \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
|
2106 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
|
2107 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
|
2108 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
|
2109 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2110 |
29 | 2111 return OK; |
2112 } | |
2113 | |
2114 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2115 /* Drawing and Redrawing |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2116 * ============================================================ |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2117 */ |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2118 |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2119 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2120 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
|
2121 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
|
2122 } |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2123 |
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
|
2124 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
|
2125 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
|
2126 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2127 |
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
|
2128 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
|
2129 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
|
2130 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2131 |
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
|
2132 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
|
2133 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
|
2134 } |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2135 #else |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2136 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
|
2137 } |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2138 |
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
|
2139 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
|
2140 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2141 |
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
|
2142 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
|
2143 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2144 |
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
|
2145 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
|
2146 } |
26
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2147 #endif |
d50f33040de6
Set line width for path.
Thinker K.F. Li <thinker@branda.to>
parents:
25
diff
changeset
|
2148 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2149 static void draw_shape(redraw_man_t *rdman, mbe_t *cr, shape_t *shape) { |
22 | 2150 paint_t *fill, *stroke; |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
17
diff
changeset
|
2151 |
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
|
2152 /*! \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
|
2153 * 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
|
2154 */ |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2155 if(shape->fill || shape->stroke) { |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2156 switch(MBO_TYPE(shape)) { |
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2157 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
|
2158 sh_path_draw(shape, cr); |
19 | 2159 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2160 #ifdef SH_TEXT |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2161 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
|
2162 sh_text_draw(shape, cr); |
27 | 2163 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2164 #endif |
196
c234ee745ceb
Start moving to mb_obj_t
Thinker K.F. Li <thinker@branda.to>
parents:
194
diff
changeset
|
2165 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
|
2166 sh_rect_draw(shape, cr); |
35
581a03196093
Support rectangle tag of SVG.
Thinker K.F. Li <thinker@branda.to>
parents:
33
diff
changeset
|
2167 break; |
260
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
2168 case MBO_IMAGE: |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
2169 sh_image_draw(shape, cr); |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
2170 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2171 #ifdef SH_STEXT |
427
8f900da42eed
Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents:
424
diff
changeset
|
2172 case MBO_STEXT: |
8f900da42eed
Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents:
424
diff
changeset
|
2173 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
|
2174 break; |
435
2bdd4f5dd2ca
Make sh_text and sh_stext optional.
Thinker K.F. Li <thinker@branda.to>
parents:
430
diff
changeset
|
2175 #endif |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2176 #ifdef UNITTEST |
19 | 2177 default: |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2178 sh_dummy_fill(shape, cr); |
19 | 2179 break; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2180 #endif /* UNITTEST */ |
19 | 2181 } |
33
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2182 |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2183 fill = shape->fill; |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2184 if(shape->fill) { |
881
a17c4e231e54
Transform positions of radient paints.
Thinker K.F. Li <thinker@codemud.net>
parents:
873
diff
changeset
|
2185 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
|
2186 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
|
2187 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
|
2188 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
|
2189 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
|
2190 } |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2191 |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2192 stroke = shape->stroke; |
d82749f77108
Fix bug of demo and remove *_fill() and *_stroke().
Thinker K.F. Li <thinker@branda.to>
parents:
30
diff
changeset
|
2193 if(stroke) { |
881
a17c4e231e54
Transform positions of radient paints.
Thinker K.F. Li <thinker@codemud.net>
parents:
873
diff
changeset
|
2194 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
|
2195 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
|
2196 stroke_path(rdman, cr); |
22 | 2197 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2198 } |
13 | 2199 } |
2200 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2201 #ifndef UNITTEST |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2202 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
|
2203 mbe_clear(canvas); |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2204 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2205 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2206 static void make_clip(mbe_t *cr, int n_dirty_areas, |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2207 area_t **dirty_areas) { |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2208 int i; |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2209 area_t *area; |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2210 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2211 mbe_new_path(cr); |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2212 for(i = 0; i < n_dirty_areas; i++) { |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2213 area = dirty_areas[i]; |
524
dcf4673896f4
Skip very small dirty areas.
Thinker K.F. Li <thinker@branda.to>
parents:
523
diff
changeset
|
2214 if(area->w < 0.1 || area->h < 0.1) |
dcf4673896f4
Skip very small dirty areas.
Thinker K.F. Li <thinker@branda.to>
parents:
523
diff
changeset
|
2215 continue; |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2216 mbe_rectangle(cr, area->x, area->y, area->w, area->h); |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2217 } |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2218 mbe_clip(cr); |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2219 } |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2220 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2221 static void reset_clip(canvas_t *cr) { |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2222 mbe_reset_clip(cr); |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2223 } |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2224 |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2225 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
|
2226 area_t **dirty_areas) { |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2227 if(n_dirty_areas) |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2228 make_clip(rdman->backend, n_dirty_areas, dirty_areas); |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2229 |
512
d186d1e24458
Change prototype of mbe_copy_source().
Thinker K.F. Li <thinker@branda.to>
parents:
491
diff
changeset
|
2230 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
|
2231 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2232 #else /* UNITTEST */ |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2233 static void make_clip(mbe_t *cr, int n_dirty_areas, |
408
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
2234 area_t **dirty_areas) { |
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
2235 } |
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
2236 |
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
|
2237 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
|
2238 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2239 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2240 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
|
2241 } |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2242 |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2243 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
|
2244 area_t **dirty_areas) { |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2245 } |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2246 #endif /* UNITTEST */ |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2247 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2248 static void |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2249 _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
|
2250 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
|
2251 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
|
2252 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
|
2253 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
|
2254 |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2255 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
|
2256 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
|
2257 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
|
2258 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
|
2259 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
|
2260 } |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2261 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2262 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
|
2263 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
|
2264 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
|
2265 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
|
2266 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2267 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
|
2268 return; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2269 |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2270 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
|
2271 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2272 canvas = _coord_get_canvas(coord); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2273 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
|
2274 #ifndef UNITTEST |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2275 _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
|
2276 coord->opacity); |
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2277 #else |
850
33fd5fdc8b48
Keep cache to parent device matrix in canvas_info.
Thinker K.F. Li <thinker@codemud.net>
parents:
841
diff
changeset
|
2278 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
|
2279 sizeof(co_aix) * 6); |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
2280 #endif |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2281 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2282 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2283 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
|
2284 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
|
2285 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
|
2286 int r; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2287 area_t **areas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2288 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
|
2289 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
|
2290 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
|
2291 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
|
2292 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
|
2293 |
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
|
2294 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
|
2295 return OK; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2296 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2297 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
|
2298 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
|
2299 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
|
2300 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2301 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
|
2302 mem_idx = 0; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2303 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
|
2304 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
|
2305 if(child && child->before_pmem == mem_idx) { |
536
b6b3dbeaedf3
[mq]: pcached_area1.diff
Thinker K.F. Li <thinker@branda.to>
parents:
535
diff
changeset
|
2306 if(coord_is_cached(child)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2307 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
|
2308 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
|
2309 n_areas, areas)) { |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2310 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
|
2311 dirty = 1; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2312 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2313 } else { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2314 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
|
2315 dirty |= r; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2316 } |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2317 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
|
2318 } else { |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2319 ASSERT(member != NULL); |
747
d2f2ed27b84d
Separate GEF_NOT_SHOWED and GEF_HIDDEN flags.
Thinker K.F. Li <thinker@codemud.net>
parents:
541
diff
changeset
|
2320 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
|
2321 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
|
2322 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
|
2323 dirty = 1; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2324 } |
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
|
2325 |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2326 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
|
2327 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
|
2328 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2329 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2330 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2331 return dirty; |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2332 } |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2333 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2334 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
|
2335 coord_t *coord) { |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2336 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
|
2337 area_t full_area; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2338 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
|
2339 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
|
2340 mbe_surface_t *surface; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2341 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2342 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2343 |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2344 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
|
2345 |
539
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2346 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
|
2347 /* |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2348 * 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
|
2349 */ |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2350 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
|
2351 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
|
2352 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
|
2353 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
|
2354 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
|
2355 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
|
2356 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
|
2357 } |
ce11e889ea4e
Simplify dirty area for coords that should be totally redraw
Thinker K.F. Li <thinker@branda.to>
parents:
538
diff
changeset
|
2358 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2359 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
|
2360 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
|
2361 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2362 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
|
2363 area = areas[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2364 area->x = floorf(area->x); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2365 area->y = floorf(area->y); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2366 area->w = ceilf(area->w); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2367 area->h = ceilf(area->h); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2368 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2369 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2370 make_clip(canvas, n_areas, areas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2371 clear_canvas(canvas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2372 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2373 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
|
2374 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2375 reset_clip(canvas); |
441
94477e7d981e
Fix compile error: no return statement
john.cylee@gmail.com
parents:
435
diff
changeset
|
2376 |
94477e7d981e
Fix compile error: no return statement
john.cylee@gmail.com
parents:
435
diff
changeset
|
2377 return OK; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2378 } |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2379 |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2380 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
|
2381 int num; |
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2382 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
|
2383 coord_t *coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2384 int i; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2385 |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2386 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
|
2387 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
|
2388 /* 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
|
2389 * 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
|
2390 */ |
538
a1d49b6355c3
Clear flags for clearing procedure and draw dirty cached ones
Thinker K.F. Li <thinker@branda.to>
parents:
537
diff
changeset
|
2391 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
|
2392 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
|
2393 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
|
2394 continue; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2395 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
|
2396 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
|
2397 } |
887
8a2d676d9fa3
Fix bug of clearing COF_TEMP_MARK.
Thinker K.F. Li <thinker@codemud.net>
parents:
881
diff
changeset
|
2398 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
|
2399 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
|
2400 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
|
2401 } |
528
d687d3395264
Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents:
527
diff
changeset
|
2402 |
d687d3395264
Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents:
527
diff
changeset
|
2403 draw_dirty_cached_coord(rdman, rdman->root_coord); |
13 | 2404 } |
2405 | |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2406 |
13 | 2407 /*! \brief Re-draw all changed shapes or shapes affected by changed coords. |
2408 * | |
2409 * A coord object has a geo to keep track the range that it's members will | |
2410 * draw on. Geo of a coord should be recomputed when the coord is changed. | |
2411 * Geo of a coord used to accelerate finding overlay shape objects of | |
2412 * a specified geo. A coord object also must be recomputed when one of | |
2413 * it's members is changed. | |
2414 * | |
2415 * New and old geo values of a coord object that is recomputed for | |
2416 * changing of it-self must be used to find overlay shape objects. | |
2417 * New and old geo values of a shape should also be used to find | |
2418 * overlay shape objects, too. If a shape's coord is changed, shape's | |
2419 * geo object is not used to find overlay shape objects any more. | |
2420 * | |
2421 * steps: | |
2422 * - update chagned coord objects | |
14 | 2423 * - recompute area for changed coord objects |
13 | 2424 * - recompute geo for members shape objects |
14 | 2425 * - clear dirty of geo for members to prevent from |
2426 * recomputing for change of shape objects. | |
2427 * - add old and new area value to list of dirty areas. | |
13 | 2428 * - recompute geo for changed shape objects |
14 | 2429 * - only if a shape object is dirty. |
2430 * - put new and old value of area of geo to list of dirty areas. | |
2431 * - Scan all shapes and redraw shapes overlaid with dirty areas. | |
13 | 2432 * |
14 | 2433 * 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
|
2434 * 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
|
2435 * 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
|
2436 * corod objects. |
14 | 2437 * |
13 | 2438 */ |
2439 int rdman_redraw_changed(redraw_man_t *rdman) { | |
28 | 2440 int r; |
154 | 2441 event_t event; |
2442 subject_t *redraw; | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2443 int i; |
769
7c73fbc8d700
Remove unused local variables
Thinker K.F. Li <thinker@codemud.net>
parents:
747
diff
changeset
|
2444 coord_t *coord; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2445 int n_areas; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2446 area_t **areas; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2447 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2448 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
|
2449 if(r != OK) |
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2450 return ERR; |
13 | 2451 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2452 if(rdman->n_dirty_areas > 0) { |
135 | 2453 /*! \brief Draw shapes in preorder of coord tree and support opacity |
2454 * rules. | |
2455 */ | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2456 draw_shapes_in_dirty_areas(rdman); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2457 n_areas = _coord_get_dirty_areas(rdman->root_coord)->num; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2458 areas = _coord_get_dirty_areas(rdman->root_coord)->ds; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2459 copy_cr_2_backend(rdman, n_areas, areas); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2460 reset_clip(rdman->backend); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2461 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
|
2462 coord = rdman->zeroing_coords.ds[i]; |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2463 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
|
2464 } |
528
d687d3395264
Clear variables and draw root coord.
Thinker K.F. Li <thinker@branda.to>
parents:
527
diff
changeset
|
2465 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
|
2466 rdman->n_dirty_areas = 0; |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2467 } |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
2468 |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2469 DARRAY_CLEAN(&rdman->dirty_coords); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2470 DARRAY_CLEAN(&rdman->dirty_geos); |
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2471 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
|
2472 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
2473 /* 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
|
2474 free_free_objs(rdman); |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2475 |
154 | 2476 redraw = rdman_get_redraw_subject(rdman); |
2477 event.type = EVT_RDMAN_REDRAW; | |
2478 event.tgt = event.cur_tgt = redraw; | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
2479 subject_notify(redraw, &event); |
154 | 2480 |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2481 return OK; |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2482 } |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2483 |
38 | 2484 /* NOTE: Before redrawing, the canvas/surface must be cleaned. |
2485 * NOTE: After redrawing, the content must be copied to the backend surface. | |
2486 */ | |
2487 | |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2488 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
|
2489 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
|
2490 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2491 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
|
2492 #endif |
29 | 2493 int r; |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
2494 |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2495 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
|
2496 #ifndef UNITTEST |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2497 surface = mbe_get_target(rdman->cr); |
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2498 area.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
|
2499 area.h = mbe_image_surface_get_height(surface); |
138
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2500 #else |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2501 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
|
2502 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
|
2503 #endif |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2504 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
|
2505 |
9f4fc9ecfd1f
Make shapes and coords drawed in post-order of tree.
Thinker K.F. Li <thinker@branda.to>
parents:
135
diff
changeset
|
2506 r = rdman_redraw_changed(rdman); |
29 | 2507 if(r != OK) |
2508 return ERR; | |
16
e17e12b112c4
A simple animation using rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
15
diff
changeset
|
2509 |
13 | 2510 return OK; |
12 | 2511 } |
2512 | |
37 | 2513 int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y, |
2514 co_aix w, co_aix h) { | |
2515 area_t area; | |
2516 int r; | |
2517 | |
2518 area.x = x; | |
2519 area.y = y; | |
2520 area.w = w; | |
2521 area.h = h; | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2522 add_dirty_area(rdman, rdman->root_coord, &area); |
37 | 2523 |
2524 r = rdman_redraw_changed(rdman); | |
2525 | |
2526 return r; | |
2527 } | |
2528 | |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
289
diff
changeset
|
2529 /*! \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
|
2530 */ |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2531 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
|
2532 geo_t *next; |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2533 coord_t *coord; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2534 |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2535 if(last == NULL) { |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2536 coord = rdman->root_coord; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2537 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
|
2538 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
|
2539 if(coord == NULL) |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2540 return NULL; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2541 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
|
2542 } |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2543 |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2544 coord = last->shape->coord; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2545 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
|
2546 while(next == NULL) { |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2547 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
|
2548 if(coord == NULL) |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2549 return NULL; |
140
0de8fd11271e
Use macro to simplify the code.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
2550 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
|
2551 } |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2552 return next; |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2553 } |
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
138
diff
changeset
|
2554 |
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
|
2555 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
|
2556 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
|
2557 |
535
a545f126d2bf
pcached_area replaces owner_mems_area
Thinker K.F. Li <thinker@branda.to>
parents:
534
diff
changeset
|
2558 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
|
2559 |
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
|
2560 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
|
2561 } |
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
|
2562 |
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
|
2563 /*! \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
|
2564 * |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2565 * 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
|
2566 * 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
|
2567 * 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
|
2568 * 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
|
2569 * 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
|
2570 * 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
|
2571 * |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2572 * 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
|
2573 * 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
|
2574 * 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
|
2575 * 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
|
2576 * |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2577 * 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
|
2578 * 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
|
2579 * - 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
|
2580 * - 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
|
2581 * - 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
|
2582 * - 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
|
2583 */ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2584 |
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
|
2585 /* \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
|
2586 * |
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
|
2587 * 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
|
2588 * @{ |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2589 */ |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2590 static subject_t *ob_subject_alloc(ob_factory_t *factory) { |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2591 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2592 subject_t *subject; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2593 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2594 rdman = MEM2OBJ(factory, redraw_man_t, ob_factory); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2595 subject = elmpool_elm_alloc(rdman->subject_pool); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2596 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2597 return subject; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2598 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2599 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2600 static void ob_subject_free(ob_factory_t *factory, subject_t *subject) { |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2601 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2602 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2603 rdman = MEM2OBJ(factory, redraw_man_t, ob_factory); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2604 elmpool_elm_free(rdman->subject_pool, subject); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2605 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2606 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2607 static observer_t *ob_observer_alloc(ob_factory_t *factory) { |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2608 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2609 observer_t *observer; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2610 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2611 rdman = MEM2OBJ(factory, redraw_man_t, ob_factory); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2612 observer = elmpool_elm_alloc(rdman->observer_pool); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2613 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2614 return observer; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2615 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2616 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2617 static void ob_observer_free(ob_factory_t *factory, observer_t *observer) { |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2618 redraw_man_t *rdman; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2619 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2620 rdman = MEM2OBJ(factory, redraw_man_t, ob_factory); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2621 elmpool_elm_free(rdman->observer_pool, observer); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2622 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2623 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2624 static subject_t *ob_get_parent_subject(ob_factory_t *factory, |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2625 subject_t *cur_subject) { |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2626 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
|
2627 coord_t *coord, *parent_coord; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2628 geo_t *geo; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2629 subject_t *parent; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2630 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2631 rdman = MEM2OBJ(factory, redraw_man_t, ob_factory); |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2632 switch(cur_subject->obj_type) { |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2633 case OBJT_GEO: |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2634 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
|
2635 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
|
2636 parent = parent_coord->mouse_event; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2637 break; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2638 case OBJT_COORD: |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2639 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
|
2640 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
|
2641 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
|
2642 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
|
2643 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
|
2644 } |
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
|
2645 parent = parent_coord->mouse_event; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2646 break; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2647 default: |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2648 parent = NULL; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2649 break; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2650 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2651 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2652 return parent; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2653 } |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2654 |
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
|
2655 /* @} */ |
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
|
2656 |
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
|
2657 /*! \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
|
2658 */ |
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
|
2659 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
|
2660 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
|
2661 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
|
2662 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
|
2663 |
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
|
2664 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
|
2665 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
|
2666 return NULL; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2667 |
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
|
2668 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
|
2669 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
|
2670 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
|
2671 |
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
|
2672 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
|
2673 } |
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
|
2674 |
12 | 2675 #ifdef UNITTEST |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
58
diff
changeset
|
2676 /* Test cases */ |
12 | 2677 |
2678 #include <CUnit/Basic.h> | |
2679 | |
2680 struct _sh_dummy { | |
2681 shape_t shape; | |
2682 co_aix x, y; | |
2683 co_aix w, h; | |
119 | 2684 int trans_cnt; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2685 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
|
2686 mbe_t *last_draw; |
12 | 2687 }; |
2688 | |
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
|
2689 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
|
2690 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
|
2691 } |
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 |
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 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
|
2694 co_aix x, co_aix y, co_aix w, co_aix h) { |
12 | 2695 sh_dummy_t *dummy; |
2696 | |
2697 dummy = (sh_dummy_t *)malloc(sizeof(sh_dummy_t)); | |
2698 if(dummy == NULL) | |
2699 return NULL; | |
2700 | |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2701 memset(dummy, 0, sizeof(sh_dummy_t)); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2702 |
12 | 2703 dummy->x = x; |
2704 dummy->y = y; | |
2705 dummy->w = w; | |
2706 dummy->h = h; | |
119 | 2707 dummy->trans_cnt = 0; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2708 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
|
2709 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
|
2710 |
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
|
2711 rdman_shape_man(rdman, (shape_t *)dummy); |
12 | 2712 |
2713 return (shape_t *)dummy; | |
2714 } | |
2715 | |
2716 void sh_dummy_transform(shape_t *shape) { | |
2717 sh_dummy_t *dummy = (sh_dummy_t *)shape; | |
2718 co_aix poses[2][2]; | |
2719 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
|
2720 |
12 | 2721 if(shape->geo && shape->coord) { |
2722 x1 = dummy->x; | |
2723 y1 = dummy->y; | |
2724 x2 = x1 + dummy->w; | |
2725 y2 = y1 + dummy->h; | |
2726 | |
2727 coord_trans_pos(shape->coord, &x1, &y1); | |
2728 coord_trans_pos(shape->coord, &x2, &y2); | |
2729 poses[0][0] = x1; | |
2730 poses[0][1] = y1; | |
2731 poses[1][0] = x2; | |
2732 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
|
2733 |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2734 if(shape->geo) |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2735 geo_from_positions(shape->geo, 2, poses); |
12 | 2736 } |
119 | 2737 dummy->trans_cnt++; |
12 | 2738 } |
2739 | |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2740 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
|
2741 sh_dummy_t *dummy; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2742 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2743 dummy = (sh_dummy_t *)shape; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2744 dummy->draw_cnt++; |
825
e83956ba22d7
Make sure drawing on right cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
824
diff
changeset
|
2745 dummy->last_draw = cr; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2746 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2747 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
441
diff
changeset
|
2748 static void dummy_paint_prepare(paint_t *paint, mbe_t *cr) { |
19 | 2749 } |
2750 | |
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
|
2751 static void dummy_paint_free(redraw_man_t *rdman, paint_t *paint) { |
19 | 2752 if(paint) |
2753 free(paint); | |
2754 } | |
2755 | |
2756 paint_t *dummy_paint_new(redraw_man_t *rdman) { | |
2757 paint_t *paint; | |
2758 | |
2759 paint = (paint_t *)malloc(sizeof(paint_t)); | |
2760 if(paint == NULL) | |
2761 return NULL; | |
2762 | |
408
7f7855df2af0
Make unittest built by automake and autoconf.
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
2763 paint_init(paint, MBP_DUMMY, dummy_paint_prepare, dummy_paint_free); |
19 | 2764 |
2765 return paint; | |
2766 } | |
2767 | |
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
|
2768 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
|
2769 coord_t *coords[3]; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2770 shape_t *shapes[3]; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2771 sh_dummy_t **dummys; |
19 | 2772 paint_t *paint; |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2773 redraw_man_t *rdman; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2774 redraw_man_t _rdman; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2775 int i; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2776 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2777 dummys = (sh_dummy_t **)shapes; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2778 |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2779 rdman = &_rdman; |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
23
diff
changeset
|
2780 redraw_man_init(rdman, NULL, NULL); |
19 | 2781 paint = dummy_paint_new(rdman); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2782 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
|
2783 shapes[i] = sh_dummy_new(rdman, 0, 0, 50, 50); |
19 | 2784 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
|
2785 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
|
2786 coords[i]->matrix[2] = 10 + i * 100; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2787 coords[i]->matrix[5] = 10 + i * 100; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2788 rdman_coord_changed(rdman, coords[i]); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2789 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
|
2790 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2791 rdman_redraw_all(rdman); |
119 | 2792 CU_ASSERT(dummys[0]->trans_cnt == 1); |
2793 CU_ASSERT(dummys[1]->trans_cnt == 1); | |
2794 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
|
2795 CU_ASSERT(dummys[0]->draw_cnt == 1); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2796 CU_ASSERT(dummys[1]->draw_cnt == 1); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2797 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
|
2798 |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2799 coords[2]->matrix[2] = 100; |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2800 coords[2]->matrix[5] = 100; |
119 | 2801 rdman_coord_changed(rdman, coords[0]); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2802 rdman_coord_changed(rdman, coords[2]); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2803 rdman_redraw_changed(rdman); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2804 |
119 | 2805 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
|
2806 CU_ASSERT(dummys[1]->draw_cnt == 2); |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2807 CU_ASSERT(dummys[2]->draw_cnt == 2); |
19 | 2808 |
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
|
2809 rdman_paint_free(rdman, paint); |
19 | 2810 redraw_man_destroy(rdman); |
17
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2811 } |
41f0907b27ac
Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
2812 |
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
|
2813 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
|
2814 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2815 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
|
2816 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
|
2817 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2818 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2819 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
|
2820 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
|
2821 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
|
2822 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
|
2823 |
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 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
|
2825 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
|
2826 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2827 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
|
2828 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2829 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
|
2830 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
|
2831 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2832 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
|
2833 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
|
2834 } |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
2835 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2836 static void |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2837 test_setup_canvas_info(void) { |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2838 redraw_man_t *rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2839 redraw_man_t _rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2840 coord_t *coord; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2841 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2842 redraw_man_init(&_rdman, NULL, NULL); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2843 rdman = &_rdman; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2844 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2845 coord = rdman_coord_new(rdman, rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2846 CU_ASSERT(coord->parent == rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2847 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2848 coord_set_opacity(coord, 0.9); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2849 setup_canvas_info(rdman, coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2850 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2851 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
|
2852 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2853 coord_set_opacity(coord, 1); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2854 setup_canvas_info(rdman, coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2855 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2856 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
|
2857 } |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2858 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2859 static void |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2860 test_own_canvas_area(void) { |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2861 redraw_man_t *rdman; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2862 redraw_man_t _rdman; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2863 coord_t *coord1, *coord2; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2864 sh_dummy_t *sh; |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2865 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2866 redraw_man_init(&_rdman, NULL, NULL); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2867 rdman = &_rdman; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2868 |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2869 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
|
2870 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
|
2871 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2872 coord2 = rdman_coord_new(rdman, coord1); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2873 CU_ASSERT(coord2->parent == coord1); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2874 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2875 coord_set_opacity(coord2, 0.9); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2876 rdman_coord_changed(rdman, coord2); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2877 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2878 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
|
2879 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
|
2880 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
|
2881 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2882 clean_coord(rdman, coord2); |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2883 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2884 /* Parent cached coord must be updated */ |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2885 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
|
2886 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
|
2887 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
|
2888 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
|
2889 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2890 redraw_man_destroy(rdman); |
818
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2891 } |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2892 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2893 static void |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2894 test_own_canvas(void) { |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2895 redraw_man_t *rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2896 redraw_man_t _rdman; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2897 coord_t *coord1, *coord2; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2898 sh_dummy_t *sh; |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2899 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2900 redraw_man_init(&_rdman, NULL, NULL); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2901 rdman = &_rdman; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
818
diff
changeset
|
2902 |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2903 coord1 = rdman_coord_new(rdman, rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2904 CU_ASSERT(coord1->parent == rdman->root_coord); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2905 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2906 coord2 = rdman_coord_new(rdman, coord1); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2907 CU_ASSERT(coord2->parent == coord1); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2908 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2909 coord_set_opacity(coord2, 0.9); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2910 rdman_coord_changed(rdman, coord2); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2911 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2912 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
|
2913 rdman_add_shape(rdman, (shape_t *)sh, coord2); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2914 rdman_shape_changed(rdman, (shape_t *)sh); |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2915 |
817
387d1c597632
Change order of statements to fix bug of wild pointers.
Thinker K.F. Li <thinker@codemud.net>
parents:
816
diff
changeset
|
2916 rdman_clean_dirties(rdman); |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2917 |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2918 /* 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
|
2919 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
|
2920 |
86f2c59cef09
Fix typo on index of matrix
Thinker K.F. Li <thinker@codemud.net>
parents:
817
diff
changeset
|
2921 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
|
2922 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
|
2923 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
|
2924 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
|
2925 |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2926 redraw_man_destroy(rdman); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2927 } |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2928 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2929 static void |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2930 test_own_canvas_redraw(void) { |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2931 redraw_man_t *rdman; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2932 redraw_man_t _rdman; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2933 coord_t *coord1, *coord2; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2934 sh_dummy_t *sh; |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
2935 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
|
2936 co_aix *parent_2_cache; |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2937 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2938 redraw_man_init(&_rdman, NULL, NULL); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2939 rdman = &_rdman; |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2940 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2941 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
|
2942 CU_ASSERT(coord1->parent == rdman->root_coord); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2943 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2944 coord2 = rdman_coord_new(rdman, coord1); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2945 CU_ASSERT(coord2->parent == coord1); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2946 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2947 coord_set_opacity(coord2, 0.9); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2948 rdman_coord_changed(rdman, coord2); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2949 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2950 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
|
2951 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
|
2952 rdman_shape_changed(rdman, (shape_t *)sh); |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2953 |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
2954 paint = dummy_paint_new(rdman); |
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
2955 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
|
2956 |
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
2957 rdman_redraw_all(rdman); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2958 |
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2959 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
|
2960 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
|
2961 |
832
8ae1fb7b3104
Check transform from parent cached coord to descendant cached coord
Thinker K.F. Li <thinker@codemud.net>
parents:
826
diff
changeset
|
2962 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
|
2963 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
|
2964 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
|
2965 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
|
2966 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
|
2967 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
|
2968 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
|
2969 |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
2970 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
|
2971 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
|
2972 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
|
2973 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
|
2974 |
419c7de41bfa
Make sure transform matrix of a cached coord working
Thinker K.F. Li <thinker@codemud.net>
parents:
832
diff
changeset
|
2975 /* 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
|
2976 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
|
2977 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
|
2978 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
|
2979 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
|
2980 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
|
2981 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
|
2982 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
|
2983 |
824
93c54322d4d8
Do not copy canvas for unittest
Thinker K.F. Li <thinker@codemud.net>
parents:
823
diff
changeset
|
2984 rdman_paint_free(rdman, paint); |
823
ea544a68f55d
Testcase for redrawing cached canvas
Thinker K.F. Li <thinker@codemud.net>
parents:
818
diff
changeset
|
2985 redraw_man_destroy(rdman); |
816
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2986 } |
0e56a1ca19b2
Testcases for caching coords
Thinker K.F. Li <thinker@codemud.net>
parents:
815
diff
changeset
|
2987 |
12 | 2988 CU_pSuite get_redraw_man_suite(void) { |
2989 CU_pSuite suite; | |
2990 | |
2991 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
|
2992 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
|
2993 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
|
2994 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
|
2995 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
|
2996 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
|
2997 CU_ADD_TEST(suite, test_own_canvas_redraw); |
12 | 2998 |
2999 return suite; | |
3000 } | |
3001 | |
3002 #endif /* UNITTEST */ |