diff options
author | Sebastian Rasmussen <sebras@hotmail.com> | 2009-12-01 01:13:29 +0100 |
---|---|---|
committer | Sebastian Rasmussen <sebras@hotmail.com> | 2009-12-01 01:13:29 +0100 |
commit | 12482b4d82fb7bd8e2a4e5782c21250cb3af0d96 (patch) | |
tree | 828553e09add23b0a63bc10c04cd644279fea8db /fitz | |
parent | 79cb093e6db0fa12070a28ea913a77642b2c98e4 (diff) | |
download | mupdf-12482b4d82fb7bd8e2a4e5782c21250cb3af0d96.tar.xz |
Removed leaky optimizations.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/fitz_tree.h | 2 | ||||
-rw-r--r-- | fitz/node_optimize.c | 235 |
2 files changed, 0 insertions, 237 deletions
diff --git a/fitz/fitz_tree.h b/fitz/fitz_tree.h index b9d4e01a..68cfe6d7 100644 --- a/fitz/fitz_tree.h +++ b/fitz/fitz_tree.h @@ -31,8 +31,6 @@ void fz_insertnodelast(fz_node *parent, fz_node *child); void fz_insertnodeafter(fz_node *prev, fz_node *child); void fz_removenode(fz_node *child); -fz_error fz_optimizetree(fz_tree *tree); - /* node types */ typedef struct fz_transformnode_s fz_transformnode; diff --git a/fitz/node_optimize.c b/fitz/node_optimize.c deleted file mode 100644 index 056fc782..00000000 --- a/fitz/node_optimize.c +++ /dev/null @@ -1,235 +0,0 @@ -#include "fitz_base.h" -#include "fitz_tree.h" - -/* - * Remove (mask ... white) until we get something not white - */ - -static int iswhitenode(fz_solidnode *node) -{ - if (!strcmp(node->cs->name, "DeviceGray")) - return fabs(node->samples[0] - 1.0) < FLT_EPSILON; - if (!strcmp(node->cs->name, "DeviceRGB")) - return fabs(node->samples[0] - 1.0) < FLT_EPSILON && - fabs(node->samples[1] - 1.0) < FLT_EPSILON && - fabs(node->samples[2] - 1.0) < FLT_EPSILON; - if (!strcmp(node->cs->name, "DeviceCMYK")) - return fabs(node->samples[0]) < FLT_EPSILON && - fabs(node->samples[1]) < FLT_EPSILON && - fabs(node->samples[2]) < FLT_EPSILON && - fabs(node->samples[3]) < FLT_EPSILON; - return 0; -} - -static int cleanwhite(fz_node *node) -{ - fz_node *current; - fz_node *next; - fz_node *shape; - fz_node *color; - - for (current = node->first; current; current = next) - { - next = current->next; - - if (fz_islinknode(current)) - return 1; - else if (fz_isimagenode(current)) - return 1; - else if (fz_isshadenode(current)) - return 1; - else if (fz_issolidnode(current)) - { - if (!iswhitenode((fz_solidnode*)current)) - return 1; - } - - else if (fz_ismasknode(current)) - { - shape = current->first; - color = shape->next; - if (fz_issolidnode(color)) - { - if (iswhitenode((fz_solidnode*)color)) - fz_removenode(current); - else - return 1; - } - else - { - if (cleanwhite(current)) - return 1; - } - } - - else - { - if (cleanwhite(current)) - return 1; - } - } - - return 0; -} - -/* - * Remove useless overs that only have one child. - */ - -static void cleanovers(fz_node *node) -{ - fz_node *prev; - fz_node *next; - fz_node *current; - fz_node *child; - - prev = nil; - for (current = node->first; current; current = next) - { - next = current->next; - - if (fz_isovernode(current)) - { - if (current->first == current->last) - { - child = current->first; - fz_removenode(current); - if (child) - { - if (prev) - fz_insertnodeafter(prev, child); - else - fz_insertnodefirst(node, child); - } - current = child; - } - } - - if (current) - prev = current; - } - - for (current = node->first; current; current = current->next) - cleanovers(current); -} - -/* - * Remove rectangular clip-masks whose contents fit... - */ - -static int getrect(fz_pathnode *path, fz_rect *bboxp) -{ - float x, y, w, h; - - /* move x y, line x+w y, line x+w y+h, line x y+h, close */ - - if (path->len != 13) - return 0; - - if (path->els[0].k != FZ_MOVETO) return 0; - x = path->els[1].v; - y = path->els[2].v; - - if (path->els[3].k != FZ_LINETO) return 0; - w = path->els[4].v - x; - if (path->els[5].v != y) return 0; - - if (path->els[6].k != FZ_LINETO) return 0; - if (path->els[7].v != x + w) return 0; - h = path->els[8].v - y; - - if (path->els[9].k != FZ_LINETO) return 0; - if (path->els[10].v != x) return 0; - if (path->els[11].v != y + h) return 0; - - if (path->els[12].k != FZ_CLOSEPATH) return 0; - - bboxp->x0 = MIN(x, x + w); - bboxp->y0 = MIN(y, y + h); - bboxp->x1 = MAX(x, x + w); - bboxp->y1 = MAX(y, y + h); - - return 1; -} - -static int fitsinside(fz_node *node, fz_rect clip) -{ - fz_rect bbox; - bbox = fz_boundnode(node, fz_identity()); - if (fz_isinfiniterect(bbox)) return 0; - if (fz_isemptyrect(bbox)) return 1; - if (bbox.x0 < clip.x0) return 0; - if (bbox.x1 > clip.x1) return 0; - if (bbox.y0 < clip.y0) return 0; - if (bbox.y1 > clip.y1) return 0; - return 1; -} - -static void cleanmasks(fz_node *node) -{ - fz_node *prev; - fz_node *current; - fz_node *shape; - fz_node *color; - fz_rect bbox; - - for (current = node->first; current; current = current->next) - cleanmasks(current); - - prev = nil; - for (current = node->first; current; current = current->next) - { -retry: - if (!current) - break; - - if (fz_ismasknode(current)) - { - shape = current->first; - color = shape->next; - - if (color == nil) - { - fz_removenode(current); - prev = nil; - current = node->first; - goto retry; - } - - if (fz_ispathnode(shape)) - { - if (getrect((fz_pathnode*)shape, &bbox)) - { - if (fitsinside(color, bbox)) - { - fz_removenode(current); - if (prev) - fz_insertnodeafter(prev, color); - else - fz_insertnodefirst(node, color); - current = color; - goto retry; - } - } - } - } - - prev = current; - } -} - -/* - * - */ - -fz_error -fz_optimizetree(fz_tree *tree) -{ - if (getenv("DONTOPT")) - return fz_okay; - cleanwhite(tree->root); - cleanovers(tree->root); - cleanmasks(tree->root); - return fz_okay; -} - |