From fa0b09e3a0c696069033195a394b09d30a8c0573 Mon Sep 17 00:00:00 2001 From: Tor Andersson <tor@ghostscript.com> Date: Mon, 29 Nov 2004 15:15:20 +0100 Subject: remove white fills on empty page --- tree/optimize.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'tree') diff --git a/tree/optimize.c b/tree/optimize.c index d052d51d..b65a37ca 100644 --- a/tree/optimize.c +++ b/tree/optimize.c @@ -1,5 +1,76 @@ #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; -- cgit v1.2.3