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