Mercurial > MadButterfly
annotate src/redraw_man.h @ 146:e96a584487af
Use elmpool to manage paint_color_t objects.
- Add a paint_color_pool member for redraw_man_t.
- Initialize and free when redraw_man_init() and redraw_man_destroy().
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Thu, 25 Sep 2008 09:53:05 +0800 |
parents | 1695a4b02b14 |
children | 6ce68c1f7405 |
rev | line source |
---|---|
12 | 1 #ifndef __REDRAW_MAN_H_ |
2 #define __REDRAW_MAN_H_ | |
3 | |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
4 #include <cairo.h> |
12 | 5 #include "tools.h" |
6 #include "mb_types.h" | |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
7 #include "observer.h" |
12 | 8 |
13 | 9 /*! \brief Manage redrawing of shapes (graphic elements). |
10 * | |
11 * Every coord_t and geo_t object is assigned with a unique | |
12 * incremental order. The order is a unsigned integer. | |
13 * Every time a new coord_t or geo_t object is added, it is | |
14 * assigned with a order number that 1 bigger than last one | |
15 * until reaching maximum of unsigned integer. | |
16 * When a maximum is meet, all coord_t or geo_t objects | |
17 * are reasigned with a new order number from 1. It means | |
18 * order numbers that have been assigned and then removed | |
19 * later are recycled. | |
20 * | |
21 * Dirty flag is clear when the transformation matrix of a coord | |
22 * object been recomputed or when a geo_t objects been redrawed. | |
23 */ | |
12 | 24 typedef struct _redraw_man { |
13 | 25 unsigned int next_coord_order; |
26 int n_coords; | |
12 | 27 coord_t *root_coord; |
13 | 28 |
12 | 29 elmpool_t *geo_pool; |
30 elmpool_t *coord_pool; | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
31 elmpool_t *shnode_pool; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
32 elmpool_t *observer_pool; |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
33 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
|
34 elmpool_t *paint_color_pool; |
13 | 35 |
36 int max_dirty_coords; | |
37 int n_dirty_coords; | |
133 | 38 coord_t **dirty_coords; /*!< coordinates their transform |
39 * matric are chagned. | |
40 */ | |
13 | 41 |
14 | 42 int max_dirty_geos; |
43 int n_dirty_geos; | |
133 | 44 geo_t **dirty_geos; /*!< geometries that need re-computed */ |
13 | 45 |
46 int max_dirty_areas; | |
47 int n_dirty_areas; | |
133 | 48 area_t **dirty_areas; /*!< \brief are areas need to redraw. */ |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
49 |
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
|
50 int max_gen_geos; |
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
|
51 int n_gen_geos; |
133 | 52 geo_t **gen_geos; /* general geo list (for temporary store) */ |
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
|
53 |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
54 cairo_t *cr; |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
22
diff
changeset
|
55 cairo_t *backend; |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
56 |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
57 ob_factory_t ob_factory; |
12 | 58 } redraw_man_t; |
59 | |
24
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
22
diff
changeset
|
60 extern int redraw_man_init(redraw_man_t *rdman, cairo_t *cr, |
e598bc809c0f
No more flash when animation.
Thinker K.F. Li <thinker@branda.to>
parents:
22
diff
changeset
|
61 cairo_t *backend); |
12 | 62 extern void redraw_man_destroy(redraw_man_t *rdman); |
63 extern int rdman_find_overlaid_shapes(redraw_man_t *rdman, | |
64 geo_t *geo, | |
65 geo_t ***overlays); | |
66 extern int rdman_add_shape(redraw_man_t *rdman, | |
67 shape_t *shape, coord_t *coord); | |
68 extern int rdman_remove_shape(redraw_man_t *rdman, shape_t *shape); | |
69 extern coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent); | |
70 extern int rdman_coord_free(redraw_man_t *rdman, coord_t *coord); | |
15
c2ce186a5c37
X_main uses rdman_redraw_all()
Thinker K.F. Li <thinker@branda.to>
parents:
14
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 extern int rdman_redraw_all(redraw_man_t *rdman); |
37 | 75 extern int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y, |
76 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
|
77 extern geo_t *rdman_geos(redraw_man_t *rdman, geo_t *last); |
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
|
78 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
|
79 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
|
80 #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
|
81 #define shnode_list_free(rdman, q) \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
82 do { \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
83 shnode_t *__node, *__last; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
84 __last = STAILQ_HEAD(q); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
85 if(__last == NULL) break; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
86 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
|
87 __node != NULL; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
88 __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
|
89 shnode_free(rdman, __last); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
90 __last = __node; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
91 } \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
92 shnode_free(rdman, __last); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
93 } while(0) |
22 | 94 #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
|
95 do { \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
96 shnode_t *__node; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
97 if((shape)->fill != (paint) && \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
98 (shape)->stroke != (paint)) { \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
99 __node = shnode_new(rdman, shape); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
100 STAILQ_INS_TAIL((paint)->members, \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
101 shnode_t, next, __node); \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
102 } \ |
22 | 103 } while(0) |
104 #define rdman_paint_fill(rdman, paint, shape) \ | |
105 do { \ | |
106 _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
|
107 shape->fill = paint; \ |
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
108 } while(0) |
22 | 109 #define rdman_paint_stroke(rdman, paint, shape) \ |
110 do { \ | |
111 _rdman_paint_child(rdman, paint, shape); \ | |
112 shape->stroke = paint; \ | |
113 } while(0) | |
18
0f3baa488a62
Support solid color paint for fill.
Thinker K.F. Li <thinker@branda.to>
parents:
16
diff
changeset
|
114 extern int rdman_paint_changed(redraw_man_t *rdman, paint_t *paint); |
12 | 115 |
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
|
116 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
|
117 co_aix x, co_aix y, int *in_stroke); |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
37
diff
changeset
|
118 #define rdman_get_ob_factory(rdman) (&(rdman)->ob_factory) |
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
|
119 |
12 | 120 |
121 #endif /* __REDRAW_MAN_H_ */ |