summaryrefslogtreecommitdiff
path: root/tree
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-11-24 06:42:52 +0100
committerTor Andersson <tor@ghostscript.com>2004-11-24 06:42:52 +0100
commit4b2218b903da6de40e8a82b9e2a69157d415637c (patch)
treeca489110e7ee0dad118a8c13244ec3f8ab31492a /tree
parentb48de7618e25bc2cef9d9db4f9b49e1d546e438a (diff)
downloadmupdf-4b2218b903da6de40e8a82b9e2a69157d415637c.tar.xz
added shade code skeleton
Diffstat (limited to 'tree')
-rw-r--r--tree/debug.c7
-rw-r--r--tree/node1.c6
-rw-r--r--tree/node2.c32
-rw-r--r--tree/optimize.c56
-rw-r--r--tree/shade.c26
-rw-r--r--tree/tree.c66
6 files changed, 192 insertions, 1 deletions
diff --git a/tree/debug.c b/tree/debug.c
index 0f4edada..a61872c4 100644
--- a/tree/debug.c
+++ b/tree/debug.c
@@ -155,6 +155,12 @@ static void lispimage(fz_imagenode *node, int level)
printf("(image)\n");
}
+static void lispshade(fz_shadenode *node, int level)
+{
+ indent(level);
+ printf("(shade)\n");
+}
+
static void lispnode(fz_node *node, int level)
{
if (!node)
@@ -175,6 +181,7 @@ static void lispnode(fz_node *node, int level)
case FZ_NPATH: lisppath((fz_pathnode*)node, level); break;
case FZ_NTEXT: lisptext((fz_textnode*)node, level); break;
case FZ_NIMAGE: lispimage((fz_imagenode*)node, level); break;
+ case FZ_NSHADE: lispshade((fz_shadenode*)node, level); break;
case FZ_NLINK: lisplink((fz_linknode*)node, level); break;
}
}
diff --git a/tree/node1.c b/tree/node1.c
index 2587077c..c2d6e876 100644
--- a/tree/node1.c
+++ b/tree/node1.c
@@ -5,6 +5,7 @@ void fz_droplinknode(fz_linknode* node);
void fz_droppathnode(fz_pathnode* node);
void fz_droptextnode(fz_textnode* node);
void fz_dropimagenode(fz_imagenode* node);
+void fz_dropshadenode(fz_shadenode* node);
fz_rect fz_boundtransformnode(fz_transformnode* node, fz_matrix ctm);
fz_rect fz_boundovernode(fz_overnode* node, fz_matrix ctm);
@@ -53,6 +54,9 @@ fz_dropnode(fz_node *node)
case FZ_NIMAGE:
fz_dropimagenode((fz_imagenode *) node);
break;
+ case FZ_NSHADE:
+ fz_dropshadenode((fz_shadenode *) node);
+ break;
case FZ_NLINK:
fz_droplinknode((fz_linknode *) node);
break;
@@ -85,6 +89,8 @@ fz_boundnode(fz_node *node, fz_matrix ctm)
return fz_boundtextnode((fz_textnode *) node, ctm);
case FZ_NIMAGE:
return fz_boundimagenode((fz_imagenode *) node, ctm);
+ case FZ_NSHADE:
+ return fz_boundshadenode((fz_shadenode *) node, ctm);
case FZ_NLINK:
return fz_boundlinknode((fz_linknode *) node, ctm);
case FZ_NMETA:
diff --git a/tree/node2.c b/tree/node2.c
index 5c3e3931..ceb59ad6 100644
--- a/tree/node2.c
+++ b/tree/node2.c
@@ -274,3 +274,35 @@ fz_boundimagenode(fz_imagenode *node, fz_matrix ctm)
return fz_transformaabb(ctm, bbox);
}
+/*
+ * Shade node
+ */
+
+fz_error *
+fz_newshadenode(fz_node **nodep, fz_shade *shade)
+{
+ fz_shadenode *node;
+
+ node = fz_malloc(sizeof (fz_shadenode));
+ if (!node)
+ return fz_outofmem;
+ *nodep = (fz_node*)node;
+
+ fz_initnode((fz_node*)node, FZ_NSHADE);
+ node->shade = shade;
+
+ return nil;
+}
+
+void
+fz_dropshadenode(fz_shadenode *node)
+{
+ fz_dropshade(node->shade);
+}
+
+fz_rect
+fz_boundshadenode(fz_shadenode *node, fz_matrix ctm)
+{
+ return fz_boundshade(node->shade, ctm);
+}
+
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;
+}
+
diff --git a/tree/shade.c b/tree/shade.c
new file mode 100644
index 00000000..cb33072e
--- /dev/null
+++ b/tree/shade.c
@@ -0,0 +1,26 @@
+#include <fitz.h>
+
+fz_shade *
+fz_keepshade(fz_shade *shade)
+{
+ shade->refs ++;
+ return shade;
+}
+
+void
+fz_dropshade(fz_shade *shade)
+{
+ if (--shade->refs == 0)
+ {
+ if (shade->cs)
+ fz_dropcolorspace(shade->cs);
+ fz_free(shade);
+ }
+}
+
+fz_rect
+fz_boundshade(fz_shade *shade, fz_matrix ctm)
+{
+ return fz_infiniterect;
+}
+
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;
+}
+