00001 #ifndef __REDRAW_MAN_H_
00002 #define __REDRAW_MAN_H_
00003
00004 #include <cairo.h>
00005 #include "mb_tools.h"
00006 #include "mb_types.h"
00007 #include "mb_observer.h"
00008
00009 typedef struct _redraw_man redraw_man_t;
00010
00011 typedef void (*free_func_t)(redraw_man_t *rdman, void *obj);
00012 struct _free_obj {
00013 void *obj;
00014 free_func_t free_func;
00015 };
00016 typedef struct _free_obj free_obj_t;
00017 struct _free_objs {
00018 int num, max;
00019 free_obj_t *objs;
00020 };
00021 typedef struct _free_objs free_objs_t;
00022
00023 DARRAY(coords, coord_t *);
00024 DARRAY(geos, geo_t *);
00025 DARRAY(areas, area_t *);
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 struct _redraw_man {
00043 unsigned int next_coord_order;
00044 int n_coords;
00045 coord_t *root_coord;
00046
00047 elmpool_t *geo_pool;
00048 elmpool_t *coord_pool;
00049 elmpool_t *shnode_pool;
00050 elmpool_t *observer_pool;
00051 elmpool_t *subject_pool;
00052 elmpool_t *paint_color_pool;
00053
00054 coords_t dirty_coords;
00055 geos_t dirty_geos;
00056 areas_t dirty_areas;
00057
00058 geos_t gen_geos;
00059
00060 STAILQ(shape_t) shapes;
00061 STAILQ(paint_t) paints;
00062
00063 free_objs_t free_objs;
00064
00065 cairo_t *cr;
00066 cairo_t *backend;
00067
00068 ob_factory_t ob_factory;
00069
00070 subject_t *redraw;
00071 };
00072
00073 extern int redraw_man_init(redraw_man_t *rdman, cairo_t *cr,
00074 cairo_t *backend);
00075 extern void redraw_man_destroy(redraw_man_t *rdman);
00076 extern int rdman_find_overlaid_shapes(redraw_man_t *rdman,
00077 geo_t *geo,
00078 geo_t ***overlays);
00079 extern int rdman_add_shape(redraw_man_t *rdman,
00080 shape_t *shape, coord_t *coord);
00081
00082 #define rdman_shape_man(rdman, shape) \
00083 STAILQ_INS_TAIL(rdman->shapes, shape_t, sh_next, shape)
00084 extern int rdman_shape_free(redraw_man_t *rdman, shape_t *shape);
00085
00086 #define rdman_paint_man(rdman, paint) \
00087 STAILQ_INS_TAIL(rdman->paints, paint_t, pnt_next, shape)
00088 extern int rdman_paint_free(redraw_man_t *rdman, paint_t *paint);
00089
00090 extern coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent);
00091 extern int rdman_coord_free(redraw_man_t *rdman, coord_t *coord);
00092 extern int rdman_coord_subtree_free(redraw_man_t *rdman, coord_t *subtree);
00093 extern int rdman_coord_changed(redraw_man_t *rdman, coord_t *coord);
00094 extern int rdman_shape_changed(redraw_man_t *rdman, shape_t *shape);
00095 extern int rdman_redraw_changed(redraw_man_t *rdman);
00096 extern int rdman_redraw_all(redraw_man_t *rdman);
00097 extern int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y,
00098 co_aix w, co_aix h);
00099 extern geo_t *rdman_geos(redraw_man_t *rdman, geo_t *last);
00100 extern int rdman_force_clean(redraw_man_t *rdman);
00101 extern shnode_t *shnode_new(redraw_man_t *rdman, shape_t *shape);
00102 #define shnode_free(rdman, node) elmpool_elm_free((rdman)->shnode_pool, node)
00103 #define shnode_list_free(rdman, q) \
00104 do { \
00105 shnode_t *__node, *__last; \
00106 __last = STAILQ_HEAD(q); \
00107 if(__last == NULL) break; \
00108 for(__node = STAILQ_NEXT(shnode_t, next, __last); \
00109 __node != NULL; \
00110 __node = STAILQ_NEXT(shnode_t, next, __node)) { \
00111 shnode_free(rdman, __last); \
00112 __last = __node; \
00113 } \
00114 shnode_free(rdman, __last); \
00115 } while(0)
00116 #define _rdman_paint_child(rdman, paint, shape) \
00117 do { \
00118 shnode_t *__node; \
00119 if((shape)->fill != (paint) && \
00120 (shape)->stroke != (paint)) { \
00121 __node = shnode_new(rdman, shape); \
00122 STAILQ_INS_TAIL((paint)->members, \
00123 shnode_t, next, __node); \
00124 } \
00125 } while(0)
00126 extern void _rdman_paint_real_remove_child(redraw_man_t *rdman,
00127 paint_t *paint,
00128 shape_t *shape);
00129 #define _rdman_paint_remove_child(rdman, paint, shape) \
00130 do { \
00131 if((shape)->fill == (shape)->stroke && \
00132 (shape)->stroke == paint) \
00133 break; \
00134 _rdman_paint_real_remove_child(rdman, paint, shape); \
00135 } while(0)
00136 #define rdman_paint_fill(rdman, paint, shape) \
00137 do { \
00138 if((shape)->fill == paint) \
00139 break; \
00140 _rdman_paint_remove_child(rdman, paint, shape); \
00141 _rdman_paint_child(rdman, paint, shape); \
00142 (shape)->fill = paint; \
00143 } while(0)
00144 #define rdman_paint_stroke(rdman, paint, shape) \
00145 do { \
00146 if((shape)->stroke == paint) \
00147 break; \
00148 _rdman_paint_remove_child(rdman, paint, shape); \
00149 _rdman_paint_child(rdman, paint, shape); \
00150 (shape)->stroke = paint; \
00151 } while(0)
00152 extern int rdman_paint_changed(redraw_man_t *rdman, paint_t *paint);
00153
00154 extern shape_t *find_shape_at_pos(redraw_man_t *rdman,
00155 co_aix x, co_aix y, int *in_stroke);
00156 #define rdman_get_ob_factory(rdman) (&(rdman)->ob_factory)
00157 #define rdman_get_redraw_subject(rdman) ((rdman)->redraw)
00158
00159
00160 #endif