diff options
Diffstat (limited to 'tree/tree.c')
-rw-r--r-- | tree/tree.c | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/tree/tree.c b/tree/tree.c index f07e564f..e59d0413 100644 --- a/tree/tree.c +++ b/tree/tree.c @@ -43,7 +43,23 @@ fz_boundtree(fz_tree *tree, fz_matrix ctm) } void -fz_insertnode(fz_node *parent, fz_node *child) +fz_insertnodefirst(fz_node *parent, fz_node *child) +{ + assert(fz_istransformnode(parent) || + fz_isovernode(parent) || + fz_ismasknode(parent) || + fz_isblendnode(parent) || + fz_ismetanode(parent)); + + child->parent = parent; + child->next = parent->first; + parent->first = child; + if (!parent->last) + parent->last = child; +} + +void +fz_insertnodelast(fz_node *parent, fz_node *child) { assert(fz_istransformnode(parent) || fz_isovernode(parent) || @@ -59,3 +75,51 @@ fz_insertnode(fz_node *parent, fz_node *child) parent->last = child; } +void +fz_insertnodeafter(fz_node *prev, fz_node *child) +{ + fz_node *parent = prev->parent; + + assert(fz_istransformnode(parent) || + fz_isovernode(parent) || + fz_ismasknode(parent) || + fz_isblendnode(parent) || + fz_ismetanode(parent)); + + child->parent = parent; + + if (parent->last == prev) + parent->last = child; + + child->next = prev->next; + prev->next = child; +} + +void +fz_removenode(fz_node *child) +{ + fz_node *parent = child->parent; + fz_node *prev; + fz_node *node; + + if (parent->first == child) + { + parent->first = child->next; + } + + prev = parent->first; + node = prev->next; + + while (node) + { + if (node == child) + { + prev->next = child->next; + } + prev = node; + node = node->next; + } + + parent->last = prev; +} + |