diff options
Diffstat (limited to 'tree/tree.c')
-rw-r--r-- | tree/tree.c | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/tree/tree.c b/tree/tree.c index 1a96ec38..7de88e11 100644 --- a/tree/tree.c +++ b/tree/tree.c @@ -9,18 +9,31 @@ fz_newtree(fz_tree **treep) if (!tree) return fz_outofmem; + tree->refcount = 1; tree->root = nil; tree->head = nil; return nil; } +fz_tree * +fz_keeptree(fz_tree *tree) +{ + tree->refcount ++; + return tree; +} + void -fz_freetree(fz_tree *tree) +fz_droptree(fz_tree *tree) { - if (tree->root) - fz_freenode(tree->root); - fz_free(tree); + tree->refcount --; + + if (tree->refcount == 0) + { + if (tree->root) + fz_freenode(tree->root); + fz_free(tree); + } } fz_rect @@ -32,32 +45,16 @@ fz_boundtree(fz_tree *tree, fz_matrix ctm) } void -fz_insertnode(fz_node *node, fz_node *child) +fz_insertnode(fz_node *parent, fz_node *child) { - child->parent = node; - - if (fz_isover(node)) - { - child->next = ((fz_over*)node)->child; - ((fz_over*)node)->child = child; - } - - if (fz_ismask(node)) - { - child->next = ((fz_mask*)node)->child; - ((fz_mask*)node)->child = child; - } - - if (fz_isblend(node)) - { - child->next = ((fz_blend*)node)->child; - ((fz_blend*)node)->child = child; - } - - if (fz_istransform(node)) - { - child->next = ((fz_transform*)node)->child; - ((fz_transform*)node)->child = child; - } + assert(fz_istransformnode(parent) || + fz_isovernode(parent) || + fz_ismasknode(parent) || + fz_isblendnode(parent) || + fz_ismetanode(parent)); + + child->parent = parent; + child->next = parent->child; + parent->child = child; } |