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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
3 #include <stdio.h>
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
4 #include <stdlib.h>
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
327 #define OK 0
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
328 #define ERR -1
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
332 #define SWAP(a, b, t) do { t c; c = a; a = b; b = c; } while(0)
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
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
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 231
diff changeset
405 int rdman_add_gen_geos(redraw_man_t *rdman, geo_t *geo) {
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 231
diff changeset
406 int r;
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 231
diff changeset
407
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 231
diff changeset
408 r = geos_add(rdman_get_gen_geos(rdman), geo);
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 231
diff changeset
409 return r;
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 231
diff changeset
410 }
65cabbdd5284 termporary revision
Thinker K.F. Li <thinker@branda.to>
parents: 231
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
655
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
656 memset(rdman, 0, sizeof(redraw_man_t));
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
663 rdman->geo_pool = elmpool_new(sizeof(geo_t), 128);
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
687 rdman->redraw =
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
700
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
701 rdman->root_coord = elmpool_elm_alloc(rdman->coord_pool);
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
702 if(rdman->root_coord == NULL)
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
703 redraw_man_destroy(rdman);
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
704 rdman->n_coords = 1;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
763 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
764
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
804 elmpool_free(rdman->coord_pool);
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
822 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
823
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
824
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
825 #define ASSERT(x)
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
826 /*
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
827 * Change transformation matrix
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
828 * - update aggregated transformation matrix
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
829 * - of coord_t object been changed.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
830 * - of children coord_t objects.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
831 * - redraw members of coord_t objects.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
832 * - redraw shape objects they are overlaid with members.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
833 * - find out overlaid shape objects.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
834 * - geo_t of a coord_t object
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
835 * - can make finding more efficiency.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
836 * - fill overlay geo_t objects of members.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
837 *
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
838 * Change a shape object
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
839 * - redraw changed object.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
840 * - redraw shape objects they are overlaid with changed object.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
841 * - find out overlaid shape objects.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
842 *
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
843 * That coord and geo of shape objects are setted by user code
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
844 * give user code a chance to collect coord and geo objects together
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
845 * and gain interest of higher cache hit rate.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
846 */
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
847
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
848 int rdman_add_shape(redraw_man_t *rdman, shape_t *shape, coord_t *coord) {
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
851
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
852 geo = elmpool_elm_alloc(rdman->geo_pool);
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
853 if(geo == NULL)
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
866
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
869
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
870 return OK;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
871 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 57
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
923 return OK;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
924 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
995 coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent) {
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
996 coord_t *coord, *root_coord;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
997 coord_t *visit;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
998
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
999 coord = elmpool_elm_alloc(rdman->coord_pool);
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1000 if(coord == NULL)
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1001 return NULL;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1002
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1013 rdman->n_coords++;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1014
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1015 coord->order = ++rdman->next_coord_order;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1016 if(coord->order == 0) {
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1017 rdman->next_coord_order = 0;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1018 root_coord = visit = rdman->root_coord;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1019 /* skip root coord. */
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1020 visit = preorder_coord_subtree(root_coord, visit);
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1021 while(visit) {
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1022 visit->order = ++rdman->next_coord_order;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1023 visit = preorder_coord_subtree(root_coord, visit);
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1024 }
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1025 }
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1033 return coord;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1034 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1055 /*! \brief Free a coord of a redraw_man_t object.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1059 * \param coord is a coord_t without children and members.
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1064 */
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1065 int rdman_coord_free(redraw_man_t *rdman, coord_t *coord) {
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1070
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1071 parent = coord->parent;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1072 if(parent == NULL)
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1073 return ERR;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1099 elmpool_elm_free(rdman->coord_pool, coord);
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1100 rdman->n_coords--;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1101
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1102 return OK;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1103 }
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1123 int rdman_coord_subtree_free(redraw_man_t *rdman, coord_t *subtree) {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1124 coord_t *coord, *prev_coord;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1125 int r;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1126
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1127 if(subtree == NULL)
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1128 return OK;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1129
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1130 prev_coord = postorder_coord_subtree(subtree, NULL);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1131 for(coord = postorder_coord_subtree(subtree, prev_coord);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1132 coord != NULL;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1150 r = rdman_coord_free(rdman, prev_coord);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1151 if(r != OK)
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1152 return ERR;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1153 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1155 return OK;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1156 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
1157
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1158 /*! \brief Mark a coord is changed.
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1159 *
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1167 */
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1170
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1171 if(coord->flags & COF_DIRTY)
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1197
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1198 return OK;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1199 }
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1202 geo_t *geo;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1203 int r;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1204
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1205 geo = shape->geo;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1206
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1207 if(geo->flags & GEF_DIRTY)
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1208 return OK;
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1209
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1210 r = add_dirty_geo(rdman, geo);
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1211 if(r == ERR)
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
1212 return ERR;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1213
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1214 return OK;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1215 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
1228 int r;
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
1232 if(r != OK)
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
1233 return ERR;
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
1234 }
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
1235 return OK;
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
1236 }
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
1237
327
85b8bb36fe71 Move and update in source documents
Thinker K.F. Li <thinker@branda.to>
parents: 322
diff changeset
1238
28
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1239 /* Clean dirties */
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1253 sh_path_transform(shape);
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1257 sh_text_transform(shape);
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1271 #ifdef UNITTEST
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1272 default:
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1273 sh_dummy_transform(shape);
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1274 break;
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1275 #endif /* UNITTEST */
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1276 }
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1284 }
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1414
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1417 area_to_positions(geo->cur_area, poses + pos_cnt);
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1418 pos_cnt += 2;
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
1419 }
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
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
5711059b9642 Add todo
Thinker K.F. Li <thinker@branda.to>
parents: 531
diff changeset
1851 /* TODO: Since both cur & last area of coords are added into dirty
5711059b9642 Add todo
Thinker K.F. Li <thinker@branda.to>
parents: 531
diff changeset
1852 * area list, position of both areas shoud be adjusted for
5711059b9642 Add todo
Thinker K.F. Li <thinker@branda.to>
parents: 531
diff changeset
1853 * all descendants when zeroing a cached coord.
5711059b9642 Add todo
Thinker K.F. Li <thinker@branda.to>
parents: 531
diff changeset
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
5711059b9642 Add todo
Thinker K.F. Li <thinker@branda.to>
parents: 531
diff changeset
1916
5711059b9642 Add todo
Thinker K.F. Li <thinker@branda.to>
parents: 531
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2057 r = clean_rdman_coords(rdman);
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2058 if(r != OK)
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2064
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2065 r = clean_rdman_geos(rdman);
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2066 if(r != OK)
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2067 return ERR;
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2111 return OK;
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2112 }
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2113
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
8fcf2d878ecd shapes with stroke
Thinker K.F. Li <thinker@branda.to>
parents: 20
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
19c603dd6ff9 Add text shape.
Thinker K.F. Li <thinker@branda.to>
parents: 26
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2179 break;
17
41f0907b27ac Unittest for rdman_redraw_changed().
Thinker K.F. Li <thinker@branda.to>
parents: 16
diff changeset
2180 #endif /* UNITTEST */
19
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
8fcf2d878ecd shapes with stroke
Thinker K.F. Li <thinker@branda.to>
parents: 20
diff changeset
2197 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 818
diff changeset
2198 }
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2199 }
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2404 }
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2405
24
e598bc809c0f No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents: 23
diff changeset
2406
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2407 /*! \brief Re-draw all changed shapes or shapes affected by changed coords.
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2408 *
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2409 * A coord object has a geo to keep track the range that it's members will
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2410 * draw on. Geo of a coord should be recomputed when the coord is changed.
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2411 * Geo of a coord used to accelerate finding overlay shape objects of
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2412 * a specified geo. A coord object also must be recomputed when one of
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2413 * it's members is changed.
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2414 *
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2415 * New and old geo values of a coord object that is recomputed for
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2416 * changing of it-self must be used to find overlay shape objects.
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2417 * New and old geo values of a shape should also be used to find
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2418 * overlay shape objects, too. If a shape's coord is changed, shape's
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2419 * geo object is not used to find overlay shape objects any more.
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2420 *
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2421 * steps:
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2422 * - update chagned coord objects
14
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2423 * - recompute area for changed coord objects
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2424 * - recompute geo for members shape objects
14
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2425 * - clear dirty of geo for members to prevent from
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2426 * recomputing for change of shape objects.
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2427 * - add old and new area value to list of dirty areas.
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2428 * - recompute geo for changed shape objects
14
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2429 * - only if a shape object is dirty.
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2430 * - put new and old value of area of geo to list of dirty areas.
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2431 * - Scan all shapes and redraw shapes overlaid with dirty areas.
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2432 *
14
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 13
diff changeset
2437 *
13
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2438 */
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2439 int rdman_redraw_changed(redraw_man_t *rdman) {
28
604bc90d509d Refactory
Thinker K.F. Li <thinker@branda.to>
parents: 27
diff changeset
2440 int r;
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
2441 event_t event;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 133
diff changeset
2453 /*! \brief Draw shapes in preorder of coord tree and support opacity
Thinker K.F. Li <thinker@branda.to>
parents: 133
diff changeset
2454 * rules.
Thinker K.F. Li <thinker@branda.to>
parents: 133
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
2476 redraw = rdman_get_redraw_subject(rdman);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
2477 event.type = EVT_RDMAN_REDRAW;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 152
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 37
diff changeset
2484 /* NOTE: Before redrawing, the canvas/surface must be cleaned.
Thinker K.F. Li <thinker@branda.to>
parents: 37
diff changeset
2485 * NOTE: After redrawing, the content must be copied to the backend surface.
Thinker K.F. Li <thinker@branda.to>
parents: 37
diff changeset
2486 */
Thinker K.F. Li <thinker@branda.to>
parents: 37
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
2507 if(r != OK)
Thinker K.F. Li <thinker@branda.to>
parents: 28
diff changeset
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
ed55009d96d3 refactory for redrawing
Thinker K.F. Li <thinker@branda.to>
parents: 12
diff changeset
2510 return OK;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2511 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2512
37
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2513 int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y,
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2514 co_aix w, co_aix h) {
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2515 area_t area;
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2516 int r;
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2517
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2518 area.x = x;
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2519 area.y = y;
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2520 area.w = w;
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
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
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2523
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2524 r = rdman_redraw_changed(rdman);
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2525
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2526 return r;
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
2527 }
943acee7f346 update exposed area
Thinker K.F. Li <thinker@branda.to>
parents: 35
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2675 #ifdef UNITTEST
73
9ab15ebc9061 Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents: 58
diff changeset
2676 /* Test cases */
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2677
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2678 #include <CUnit/Basic.h>
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2679
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2680 struct _sh_dummy {
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2681 shape_t shape;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2682 co_aix x, y;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2683 co_aix w, h;
119
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2687 };
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2695 sh_dummy_t *dummy;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2696
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2697 dummy = (sh_dummy_t *)malloc(sizeof(sh_dummy_t));
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2698 if(dummy == NULL)
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2699 return NULL;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2703 dummy->x = x;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2704 dummy->y = y;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2705 dummy->w = w;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2706 dummy->h = h;
119
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2712
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2713 return (shape_t *)dummy;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2714 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2715
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2716 void sh_dummy_transform(shape_t *shape) {
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2717 sh_dummy_t *dummy = (sh_dummy_t *)shape;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2718 co_aix poses[2][2];
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2721 if(shape->geo && shape->coord) {
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2722 x1 = dummy->x;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2723 y1 = dummy->y;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2724 x2 = x1 + dummy->w;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2725 y2 = y1 + dummy->h;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2726
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2727 coord_trans_pos(shape->coord, &x1, &y1);
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2728 coord_trans_pos(shape->coord, &x2, &y2);
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2729 poses[0][0] = x1;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2730 poses[0][1] = y1;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2731 poses[1][0] = x2;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2736 }
119
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
2737 dummy->trans_cnt++;
12
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2738 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2749 }
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2752 if(paint)
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2753 free(paint);
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2754 }
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2755
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2756 paint_t *dummy_paint_new(redraw_man_t *rdman) {
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2757 paint_t *paint;
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2758
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2759 paint = (paint_t *)malloc(sizeof(paint_t));
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2760 if(paint == NULL)
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2761 return NULL;
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2764
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2765 return paint;
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
2766 }
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
2792 CU_ASSERT(dummys[0]->trans_cnt == 1);
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
2793 CU_ASSERT(dummys[1]->trans_cnt == 1);
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
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
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
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
257a1d314bcd Bug of insert sort
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
cf6d65398619 More animation demo
Thinker K.F. Li <thinker@branda.to>
parents: 18
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2988 CU_pSuite get_redraw_man_suite(void) {
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2989 CU_pSuite suite;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2990
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2998
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2999 return suite;
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
3000 }
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
3001
79e9edf4c00a Add redraw manager
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
3002 #endif /* UNITTEST */