summaryrefslogtreecommitdiff
path: root/tree/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'tree/tree.c')
-rw-r--r--tree/tree.c66
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;
+}
+