summaryrefslogtreecommitdiff
path: root/tree
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-11-29 15:15:20 +0100
committerTor Andersson <tor@ghostscript.com>2004-11-29 15:15:20 +0100
commitfa0b09e3a0c696069033195a394b09d30a8c0573 (patch)
tree6864fca37db72bebc16f11741eb41c71183c2b88 /tree
parent1eb972606ddbdf0d17e4bc08bf06cfd78b1a143f (diff)
downloadmupdf-fa0b09e3a0c696069033195a394b09d30a8c0573.tar.xz
remove white fills on empty page
Diffstat (limited to 'tree')
-rw-r--r--tree/optimize.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/tree/optimize.c b/tree/optimize.c
index d052d51d..b65a37ca 100644
--- a/tree/optimize.c
+++ b/tree/optimize.c
@@ -1,6 +1,77 @@
#include <fitz.h>
/*
+ * Remove (mask ... white) until we get something not white
+ */
+
+static int iswhitenode(fz_colornode *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_iscolornode(current))
+ {
+ if (!iswhitenode((fz_colornode*)current))
+ return 1;
+ }
+
+ else if (fz_ismasknode(current))
+ {
+ shape = current->first;
+ color = shape->next;
+ if (fz_iscolornode(color))
+ {
+ if (iswhitenode((fz_colornode*)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.
*/
@@ -144,6 +215,7 @@ fz_optimizetree(fz_tree *tree)
{
if (getenv("DONTOPT"))
return nil;
+ cleanwhite(tree->root);
cleanovers(tree->root);
cleanmasks(tree->root);
return nil;