Mercurial > MadButterfly
diff src/mb_types.h @ 12:79e9edf4c00a
Add redraw manager
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Mon, 28 Jul 2008 17:45:36 +0800 |
parents | 128af06c876c |
children | ed55009d96d3 |
line wrap: on
line diff
--- a/src/mb_types.h Sat Jul 26 06:34:15 2008 +0800 +++ b/src/mb_types.h Mon Jul 28 17:45:36 2008 +0800 @@ -1,8 +1,11 @@ #ifndef __MB_TYPES_H_ #define __MB_TYPES_H_ +#include "tools.h" + typedef float co_aix; typedef struct _shape shape_t; +typedef struct _geo geo_t; /*! \brief A coordination system. * @@ -11,28 +14,82 @@ * Source space is where the contained is drawed, and target space * is where the coordination of parent container of the element * represented by this coord object. + * + * \dot + * digraph G { + * graph [rankdir=LR]; + * root -> child00 -> child10 -> child20 [label="children" color="blue"]; + * child00 -> child01 -> child02 [label="sibling"]; + * child10 -> child11 [label="sibling"]; + * } + * \enddot */ typedef struct _coord { - int seq; + unsigned int seq; co_aix matrix[6]; co_aix aggr_matrix[6]; struct _coord *parent; - struct _coord *children, *sibling; - shape_t *members; + STAILQ(struct _coord) children; + struct _coord *sibling; + STAILQ(shape_t) members; /*!< All shape objects in this coord. */ } coord_t; - -typedef struct _geo geo_t; -struct _shape { - int sh_type; - geo_t *geo; - struct _shape *sibling; -}; - -enum { SHT_UNKNOW, SHT_PATH, SHT_TEXT }; - extern void coord_init(coord_t *co, coord_t *parent); extern void coord_trans_pos(coord_t *co, co_aix *x, co_aix *y); extern void update_aggr_matrix(coord_t *start); +extern coord_t *preorder_coord_tree(coord_t *last); + + +/*! \brief A grahpic shape. + * + * \dot + * digraph G { + * "shape" -> "coord"; + * "shape" -> "geo"; + * "geo" -> "shape"; + * "coord" -> "shape" [label="members"] + * "shape" -> "shape" [label="sibling"]; + * } + * \enddot + */ +struct _shape { + int sh_type; + geo_t *geo; + coord_t *coord; + shape_t *coord_mem_next; + struct _shape *sibling; +}; +enum { SHT_UNKNOW, SHT_PATH, SHT_TEXT }; + +#define sh_attach_geo(sh, g) \ + do { \ + (sh)->geo = g; \ + (g)->shape = (shape_t *)(sh); \ + } while(0) +#define sh_detach_geo(sh) \ + do { \ + (sh)->geo->shape = NULL; \ + (sh)->geo = NULL; \ + } while(0) +extern void sh_attach_coord(shape_t *sh, coord_t *coord); +extern void sh_detach_coord(shape_t *sh); + + +/*! \brief Geometry data of a shape or a group of shape. + */ +struct _geo { + shape_t *shape; + co_aix x, y; + co_aix w, h; + geo_t *next; /*!< \brief Link geo_t objects. */ + unsigned int seq; +}; + +extern int is_overlay(geo_t *r1, geo_t *r2); +extern void geo_init(geo_t *g, int n_pos, co_aix pos[][2]); +extern void geo_mark_overlay(geo_t *g, int n_others, geo_t **others, + int *n_overlays, geo_t **overlays); +#define geo_get_shape(g) ((g)->shape) +#define geo_set_shape(g, sh) do {(g)->shape = sh;} while(0) #endif /* __MB_TYPES_H_ */