Mercurial > MadButterfly
annotate include/mb_redraw_man.h @ 1275:776b024ae8f9
Fix the buggy implementation of reset()
- old implementation is too buggy to make a lot wrong assumption.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 12 Jan 2011 21:41:26 +0800 |
parents | a8d20bc8ce40 |
children | 36cbe73813a8 |
rev | line source |
---|---|
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
757
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:
757
diff
changeset
|
2 // vim: sw=4:ts=8:sts=4 |
12 | 3 #ifndef __REDRAW_MAN_H_ |
4 #define __REDRAW_MAN_H_ | |
5 | |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
6 #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
|
7 #include "mb_tools.h" |
12 | 8 #include "mb_types.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
|
9 #include "mb_observer.h" |
260
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
10 #include "mb_img_ldr.h" |
12 | 11 |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
12 /*! \defgroup rdman Redraw Manager |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
13 * @{ |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
14 */ |
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
|
15 typedef struct _redraw_man redraw_man_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
|
16 |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
17 /*! \defgroup rdman_private Private Types of Redraw Manager |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
18 * @{ |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
19 */ |
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
|
20 typedef void (*free_func_t)(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
|
21 struct _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
|
22 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
|
23 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
|
24 }; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
25 typedef struct _free_obj 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
|
26 struct _free_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
|
27 int num, 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
|
28 free_obj_t *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
|
29 }; |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
30 typedef struct _free_objs free_objs_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
|
31 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
32 DARRAY(coords, coord_t *); |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
33 DARRAY(geos, geo_t *); |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
34 /* @} */ |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
35 |
13 | 36 /*! \brief Manage redrawing of shapes (graphic elements). |
37 * | |
38 * Every coord_t and geo_t object is assigned with a unique | |
39 * incremental order. The order is a unsigned integer. | |
40 * Every time a new coord_t or geo_t object is added, it is | |
41 * assigned with a order number that 1 bigger than last one | |
42 * until reaching maximum of unsigned integer. | |
43 * When a maximum is meet, all coord_t or geo_t objects | |
44 * are reasigned with a new order number from 1. It means | |
45 * order numbers that have been assigned and then removed | |
46 * later are recycled. | |
47 * | |
48 * Dirty flag is clear when the transformation matrix of a coord | |
49 * object been recomputed or when a geo_t objects been redrawed. | |
50 */ | |
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
|
51 struct _redraw_man { |
13 | 52 unsigned int next_coord_order; |
53 int n_coords; | |
12 | 54 coord_t *root_coord; |
13 | 55 |
12 | 56 elmpool_t *geo_pool; |
57 elmpool_t *coord_pool; | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
58 elmpool_t *shnode_pool; |
865
48df0f97f09e
Allocate sh_path_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
840
diff
changeset
|
59 elmpool_t *sh_path_pool; |
866
9a7ac4487849
Allocate sh_rect_t objects from an elmpool
Thinker K.F. Li <thinker@codemud.net>
parents:
865
diff
changeset
|
60 elmpool_t *sh_rect_pool; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
61 elmpool_t *observer_pool; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
62 elmpool_t *subject_pool; |
146
e96a584487af
Use elmpool to manage paint_color_t objects.
Thinker K.F. Li <thinker@branda.to>
parents:
139
diff
changeset
|
63 elmpool_t *paint_color_pool; |
867
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
64 elmpool_t *paint_linear_pool; |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
65 elmpool_t *paint_radial_pool; |
4f8d53be9488
Allocate linear, radial, image paints from elmpools
Thinker K.F. Li <thinker@codemud.net>
parents:
866
diff
changeset
|
66 elmpool_t *paint_image_pool; |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
67 elmpool_t *pent_pool; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
68 elmpool_t *coord_canvas_pool; |
13 | 69 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
70 coords_t dirty_coords; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
71 geos_t dirty_geos; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
72 int n_dirty_areas; /*!< \brief Number of all dirty areas. */ |
13 | 73 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
74 geos_t gen_geos; |
314
6c350fc92ae3
Cache rednering result is now workable.
Thinker K.F. Li <thinker@branda.to>
parents:
270
diff
changeset
|
75 coords_t zeroing_coords; |
13 | 76 |
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
|
77 STAILQ(shape_t) shapes; /*!< \brief All managed shapes. */ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
78 STAILQ(paint_t) paints; /*!< \brief All managed 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
|
79 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
80 free_objs_t free_objs; |
30
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
24
diff
changeset
|
81 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
82 mbe_t *cr; |
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
83 mbe_t *backend; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
84 |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
85 observer_factory_t observer_factory; |
154 | 86 |
87 subject_t *redraw; /*!< \brief Notified after redrawing. */ | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
88 subject_t *addrm_monitor; /*!< \brief Monitor adding/removing observers |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
89 * to/from mouse event subjects. |
231
2637519e2bd7
Move mouse event handler and interpreter to src/mouse.c.
Thinker K.F. Li <thinker@branda.to>
parents:
227
diff
changeset
|
90 * \see addrm_monitor_hdlr() |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
91 */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
92 mb_obj_t *last_mouse_over; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
757
diff
changeset
|
93 void *rt; /*!< \brief This is a pointer to the current |
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
757
diff
changeset
|
94 * graphic backend. |
249
ab8284c8dcee
* Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents:
235
diff
changeset
|
95 * \see rdman_attach_backend() |
ab8284c8dcee
* Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents:
235
diff
changeset
|
96 */ |
257
50d253d0fcba
Simple image loader and image shape.
Thinker K.F. Li <thinker@branda.to>
parents:
253
diff
changeset
|
97 mb_prop_store_t props; |
260
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
98 mb_img_ldr_t *img_ldr; /*!< \brief Image Loader. |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
99 * This is initialized by backend. |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
100 */ |
270
cd6af7da32c9
Fix the problem that clean_canvas() can not clean canvas cleanly.
Thinker K.F. Li <thinker@branda.to>
parents:
265
diff
changeset
|
101 co_aix w, h; /*!< \brief Size of viewport |
cd6af7da32c9
Fix the problem that clean_canvas() can not clean canvas cleanly.
Thinker K.F. Li <thinker@branda.to>
parents:
265
diff
changeset
|
102 * This is initialized by backend. |
cd6af7da32c9
Fix the problem that clean_canvas() can not clean canvas cleanly.
Thinker K.F. Li <thinker@branda.to>
parents:
265
diff
changeset
|
103 */ |
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
|
104 }; |
12 | 105 |
448
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
106 extern int redraw_man_init(redraw_man_t *rdman, mbe_t *cr, |
16116d84bc5e
Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents:
356
diff
changeset
|
107 mbe_t *backend); |
12 | 108 extern void redraw_man_destroy(redraw_man_t *rdman); |
109 extern int rdman_find_overlaid_shapes(redraw_man_t *rdman, | |
110 geo_t *geo, | |
111 geo_t ***overlays); | |
112 extern int rdman_add_shape(redraw_man_t *rdman, | |
113 shape_t *shape, coord_t *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
|
114 /*! \brief Make a shape been managed by a redraw manager. */ |
1062
a8d20bc8ce40
Rename rdman_shape_man() to rdman_man_shape() to mean managing a shape
Thinker K.F. Li <thinker@codemud.net>
parents:
1060
diff
changeset
|
115 #define rdman_man_shape(rdman, shape) \ |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
116 do { \ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
117 mb_prop_store_init(&((mb_obj_t *)(shape))->props, \ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
118 (rdman)->pent_pool); \ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
119 STAILQ_INS_TAIL(rdman->shapes, shape_t, sh_next, shape); \ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
120 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:
186
diff
changeset
|
121 rdman->last_mouse_over = NULL; \ |
672
cbad519226d4
Make sh_image_t managed, and init property store for managed shapes
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
122 mb_prop_store_init(&((mb_obj_t *)(shape))->props, \ |
cbad519226d4
Make sh_image_t managed, and init property store for managed shapes
Thinker K.F. Li <thinker@branda.to>
parents:
536
diff
changeset
|
123 (rdman)->pent_pool); \ |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
124 } while(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
|
125 extern int rdman_shape_free(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
|
126 |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
127 extern 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
|
128 |
12 | 129 extern coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent); |
130 extern int rdman_coord_free(redraw_man_t *rdman, coord_t *coord); | |
154 | 131 extern int rdman_coord_subtree_free(redraw_man_t *rdman, coord_t *subtree); |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
132 extern 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
|
133 extern int rdman_shape_changed(redraw_man_t *rdman, shape_t *shape); |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
134 extern int rdman_redraw_changed(redraw_man_t *rdman); |
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
135 extern int rdman_redraw_all(redraw_man_t *rdman); |
37 | 136 extern int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y, |
137 co_aix w, co_aix h); | |
139
1695a4b02b14
Members of coords are geos instead of shapes, now.
Thinker K.F. Li <thinker@branda.to>
parents:
133
diff
changeset
|
138 extern geo_t *rdman_geos(redraw_man_t *rdman, geo_t *last); |
235 | 139 #define rdman_shapes(rdman, last_shape) \ |
140 geo_get_shape_safe(rdman_geos(rdman, sh_get_geo_safe(last_shape))) | |
30
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
24
diff
changeset
|
141 extern int rdman_force_clean(redraw_man_t *rdman); |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
142 extern shnode_t *shnode_new(redraw_man_t *rdman, shape_t *shape); |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
143 #define shnode_free(rdman, node) elmpool_elm_free((rdman)->shnode_pool, node) |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
144 #define shnode_list_free(rdman, q) \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
145 do { \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
146 shnode_t *__node, *__last; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
147 __last = STAILQ_HEAD(q); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
148 if(__last == NULL) break; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
149 for(__node = STAILQ_NEXT(shnode_t, next, __last); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
150 __node != NULL; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
151 __node = STAILQ_NEXT(shnode_t, next, __node)) { \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
152 shnode_free(rdman, __last); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
153 __last = __node; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
154 } \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
155 shnode_free(rdman, __last); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
156 } while(0) |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
157 |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
158 /*! \defgroup rdman_paints Paints Supporting of Redraw Manger |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
159 * @{ |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
160 */ |
22 | 161 #define _rdman_paint_child(rdman, paint, shape) \ |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
162 do { \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
163 shnode_t *__node; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
164 if((shape)->fill != (paint) && \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
165 (shape)->stroke != (paint)) { \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
166 __node = shnode_new(rdman, shape); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
167 STAILQ_INS_TAIL((paint)->members, \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
168 shnode_t, next, __node); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
169 } \ |
22 | 170 } while(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
|
171 extern 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
|
172 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
|
173 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
|
174 #define _rdman_paint_remove_child(rdman, paint, 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
|
175 do { \ |
b90abd31a281
Postponse free of coords, shapes, and paints when the rdman is dirty.
Thinker K.F. Li <thinker@branda.to>
parents:
158
diff
changeset
|
176 if((shape)->fill == (shape)->stroke && \ |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
177 (shape)->stroke == (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
|
178 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
|
179 _rdman_paint_real_remove_child(rdman, paint, 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
|
180 } while(0) |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
181 #define rdman_paint_fill(rdman, paint, shape) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
182 do { \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
183 if((shape)->fill == paint) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
184 break; \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
185 if((shape)->fill) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
186 _rdman_paint_remove_child(rdman, (shape)->fill, \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
187 shape); \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
188 if(paint) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
189 _rdman_paint_child(rdman, paint, shape); \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
190 (shape)->fill = paint; \ |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
191 } while(0) |
490
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
192 #define rdman_paint_stroke(rdman, paint, shape) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
193 do { \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
194 if((shape)->stroke == paint) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
195 break; \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
196 if((shape)->stroke) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
197 _rdman_paint_remove_child(rdman, (shape)->stroke, \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
198 shape); \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
199 if(paint) \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
200 _rdman_paint_child(rdman, paint, shape); \ |
5d0b2761f89c
Reset stroke and fill for shapes when a paint is freed.
Thinker K.F. Li <thinker@branda.to>
parents:
462
diff
changeset
|
201 (shape)->stroke = paint; \ |
22 | 202 } while(0) |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
203 extern int rdman_paint_changed(redraw_man_t *rdman, paint_t *paint); |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
204 /* @} */ |
12 | 205 |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
206 /*! \defgroup rdman_pos Position/Overlay Detection for Managed Objects |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
207 * @{ |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
208 */ |
30
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
24
diff
changeset
|
209 extern shape_t *find_shape_at_pos(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:
24
diff
changeset
|
210 co_aix x, co_aix y, int *in_stroke); |
232
527894c2ad39
Add functions for collision test.
Thinker K.F. Li <thinker@branda.to>
parents:
231
diff
changeset
|
211 extern int mb_obj_pos_is_in(redraw_man_t *rdman, mb_obj_t *obj, |
527894c2ad39
Add functions for collision test.
Thinker K.F. Li <thinker@branda.to>
parents:
231
diff
changeset
|
212 co_aix x, co_aix y, int *in_stroke); |
253
99a9cca4bbd0
Fix typo in mb_redraw_man.h
Thinker K.F. Li <thinker@branda.to>
parents:
249
diff
changeset
|
213 extern int mb_objs_are_overlay(redraw_man_t *rdman, |
99a9cca4bbd0
Fix typo in mb_redraw_man.h
Thinker K.F. Li <thinker@branda.to>
parents:
249
diff
changeset
|
214 mb_obj_t *obj1, mb_obj_t *obj2); |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
215 /* @} */ |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
216 |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
217 /*! \defgroup rdman_accessors Accessors of Redraw Manager |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
218 * @{ |
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
219 */ |
1060
e415c55b4a0d
Stop using ob as acronym observer
Thinker K.F. Li <thinker@codemud.net>
parents:
1059
diff
changeset
|
220 #define rdman_get_observer_factory(rdman) (&(rdman)->observer_factory) |
154 | 221 #define rdman_get_redraw_subject(rdman) ((rdman)->redraw) |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
222 #define rdman_get_root(rdman) ((rdman)->root_coord) |
235 | 223 #define rdman_get_cr(rdman) ((rdman)->cr) |
224 #define rdman_get_gen_geos(rdman) (&(rdman)->gen_geos) | |
225 extern int rdman_add_gen_geos(redraw_man_t *rdman, geo_t *geo); | |
226 #define rdman_get_shape_gl(rdman, idx) \ | |
227 geo_get_shape(rdman_get_gen_geos(rdman)->ds[idx]) | |
228 #define rdman_add_shape_gl(rdman, shape) \ | |
229 rdman_add_gen_geos(rdman, sh_get_geo(shape)) | |
230 #define rdman_shape_gl_len(rdman) \ | |
231 rdman_get_gen_geos(rdman)->num | |
232 #define rdman_clear_shape_gl(rdman) \ | |
233 DARRAY_CLEAN(rdman_get_gen_geos(rdman)) | |
1059
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
1052
diff
changeset
|
234 #define _coord_get_canvas(coord) ((coord)->canvas_info->canvas) |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
1052
diff
changeset
|
235 #define _coord_set_canvas(coord, _canvas) \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
1052
diff
changeset
|
236 do { \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
1052
diff
changeset
|
237 (coord)->canvas_info->canvas = _canvas; \ |
36aef79d68e4
Move macros privated used by redraw manager to redraw_man.c
Thinker K.F. Li <thinker@codemud.net>
parents:
1052
diff
changeset
|
238 } while(0) |
260
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
239 #define rdman_prop_store(rdman) ((rdman)->props) |
29acbd8a0dd0
Integrate sh_image with svg2code.py.
Thinker K.F. Li <thinker@branda.to>
parents:
257
diff
changeset
|
240 #define rdman_img_ldr(rdman) ((rdman)->img_ldr) |
265
b42ee279669e
Change function name and add comments.
Thinker K.F. Li <thinker@branda.to>
parents:
260
diff
changeset
|
241 #define rdman_set_img_ldr(rdman, ldr) \ |
b42ee279669e
Change function name and add comments.
Thinker K.F. Li <thinker@branda.to>
parents:
260
diff
changeset
|
242 do { (rdman)->img_ldr = ldr; } while(0) |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
243 /* @} */ |
30
e06a4a667ce2
Accept mouse/pointer event and hint the shape that the pointer is over.
Thinker K.F. Li <thinker@branda.to>
parents:
24
diff
changeset
|
244 |
249
ab8284c8dcee
* Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents:
235
diff
changeset
|
245 /*! \brief Attach backend to the redraw manager so that we can hide the backend from the users. |
ab8284c8dcee
* Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents:
235
diff
changeset
|
246 * |
ab8284c8dcee
* Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents:
235
diff
changeset
|
247 */ |
ab8284c8dcee
* Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents:
235
diff
changeset
|
248 #define rdman_attach_backend(rdman,backend) (((rdman)->rt)=(backend)) |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
314
diff
changeset
|
249 |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
314
diff
changeset
|
250 extern paint_t *rdman_img_ldr_load_paint(redraw_man_t *rdman, |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
314
diff
changeset
|
251 const char *img_id); |
1052
1f93f38688c2
Define doxygen groups for symbols of rdman.
Thinker K.F. Li <thinker@codemud.net>
parents:
1051
diff
changeset
|
252 /* @} */ |
12 | 253 |
254 #endif /* __REDRAW_MAN_H_ */ |