Mercurial > MadButterfly
diff src/coord.c @ 12:79e9edf4c00a
Add redraw manager
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Mon, 28 Jul 2008 17:45:36 +0800 |
parents | 9c331ec9e210 |
children | ed55009d96d3 |
line wrap: on
line diff
--- a/src/coord.c Sat Jul 26 06:34:15 2008 +0800 +++ b/src/coord.c Mon Jul 28 17:45:36 2008 +0800 @@ -6,6 +6,9 @@ #include <string.h> #include "mb_types.h" + +#define ASSERT(x) + /* To keep possibility of changing type of aix */ #define MUL(a, b) ((a) * (b)) #define ADD(a, b) ((a) + (b)) @@ -46,22 +49,22 @@ visit = start; while(visit) { - child = visit->children; + child = STAILQ_HEAD(visit->children); while(child) { compute_transform_function(child); - child = child->sibling; + child = STAILQ_NEXT(coord_t, sibling, child); } - if(visit->children) - visit = visit->children; - else if(visit->sibling) - visit = visit->sibling; + if(STAILQ_HEAD(visit->children)) + visit = STAILQ_HEAD(visit->children); + else if(STAILQ_NEXT(coord_t, sibling, visit)) + visit = STAILQ_NEXT(coord_t, sibling, visit); else { next = NULL; while(visit->parent && visit->parent != start) { visit = visit->parent; - if(visit->sibling) { - next = visit->sibling; + if(STAILQ_NEXT(coord_t, sibling, visit)) { + next = STAILQ_NEXT(coord_t, sibling, visit); break; } } @@ -70,12 +73,17 @@ } } +/*! \brief Initialize a coord object. + * + * The object is cleared and matrix was initialized to ID. + * The object is be a children of specified parent. + */ void coord_init(coord_t *co, coord_t *parent) { memset(co, 0, sizeof(coord_t)); if(parent) { + /* insert at tail of children list. */ co->parent = parent; - co->sibling = parent->children; - parent->children = co; + STAILQ_INS_TAIL(parent->children, coord_t, sibling, co); } co->matrix[0] = 1; co->matrix[4] = 1; @@ -94,6 +102,34 @@ *y = ny; } +coord_t *preorder_coord_tree(coord_t *last) { + coord_t *next; + + ASSERT(last == NULL); + + if(STAILQ_HEAD(last->children)) + next = STAILQ_HEAD(last->children); + else { + next = last; + while(next != NULL && STAILQ_NEXT(coord_t, sibling, next) == NULL) + next = next->parent; + if(next) + next = STAILQ_NEXT(coord_t, sibling, next); + } + + return next; +} + +void sh_attach_coord(shape_t *sh, coord_t *coord) { + STAILQ_INS_TAIL(coord->members, shape_t, coord_mem_next, sh); + sh->coord = coord; +} + +void sh_detach_coord(shape_t *sh) { + STAILQ_REMOVE(sh->coord->members, shape_t, coord_mem_next, sh); + sh->coord = NULL; +} + #ifdef UNITTEST #include <CUnit/Basic.h> @@ -157,11 +193,38 @@ CU_ASSERT(y == 99); } +void test_preorder_coord_tree(void) { + coord_t elms[6]; + coord_t *last; + + coord_init(elms, NULL); + coord_init(elms + 1, elms); + coord_init(elms + 2, elms); + coord_init(elms + 3, elms + 1); + coord_init(elms + 4, elms + 1); + coord_init(elms + 5, elms + 2); + + last = elms; + last = preorder_coord_tree(last); + CU_ASSERT(last == elms + 1); + last = preorder_coord_tree(last); + CU_ASSERT(last == elms + 3); + last = preorder_coord_tree(last); + CU_ASSERT(last == elms + 4); + last = preorder_coord_tree(last); + CU_ASSERT(last == elms + 2); + last = preorder_coord_tree(last); + CU_ASSERT(last == elms + 5); + last = preorder_coord_tree(last); + CU_ASSERT(last == NULL); +} + CU_pSuite get_coord_suite(void) { CU_pSuite suite; suite = CU_add_suite("Suite_coord", NULL, NULL); CU_ADD_TEST(suite, test_update_aggr_matrix); + CU_ADD_TEST(suite, test_preorder_coord_tree); return suite; }