diff options
author | Tor Andersson <tor@ghostscript.com> | 2004-11-24 06:42:52 +0100 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2004-11-24 06:42:52 +0100 |
commit | 4b2218b903da6de40e8a82b9e2a69157d415637c (patch) | |
tree | ca489110e7ee0dad118a8c13244ec3f8ab31492a /tree | |
parent | b48de7618e25bc2cef9d9db4f9b49e1d546e438a (diff) | |
download | mupdf-4b2218b903da6de40e8a82b9e2a69157d415637c.tar.xz |
added shade code skeleton
Diffstat (limited to 'tree')
-rw-r--r-- | tree/debug.c | 7 | ||||
-rw-r--r-- | tree/node1.c | 6 | ||||
-rw-r--r-- | tree/node2.c | 32 | ||||
-rw-r--r-- | tree/optimize.c | 56 | ||||
-rw-r--r-- | tree/shade.c | 26 | ||||
-rw-r--r-- | tree/tree.c | 66 |
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; +} + |