summaryrefslogtreecommitdiff
path: root/tree/optimize.c
diff options
context:
space:
mode:
Diffstat (limited to 'tree/optimize.c')
-rw-r--r--tree/optimize.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/tree/optimize.c b/tree/optimize.c
new file mode 100644
index 00000000..14d98232
--- /dev/null
+++ b/tree/optimize.c
@@ -0,0 +1,56 @@
+#include <fitz.h>
+
+/*
+ * Remove useless overs that only have one child.
+ */
+
+static void cleanovers(fz_node *node)
+{
+ fz_node *prev;
+ fz_node *over;
+ fz_node *child;
+
+ prev = nil;
+ for (over = node->first; over; over = prev->next)
+ {
+ cleanovers(over);
+
+ if (fz_isovernode(over))
+ {
+ if (over->first == over->last)
+ {
+ printf(" remove unused over node\n");
+ child = over->first;
+ fz_removenode(over);
+ if (child)
+ {
+ if (prev)
+ fz_insertnodeafter(prev, child);
+ else
+ fz_insertnodefirst(node, child);
+ }
+ over = nil;
+ }
+ }
+
+ if (over)
+ prev = over;
+ }
+}
+
+fz_error *
+fz_optimizetree(fz_tree *tree)
+{
+ printf("optimizing tree\n");
+
+//printf("before:\n");
+//fz_debugtree(tree);
+
+ cleanovers(tree->root);
+
+//printf("after:\n");
+//fz_debugtree(tree);
+
+ return nil;
+}
+