aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/fop/area/MainReference.java29
-rw-r--r--src/java/org/apache/fop/area/Span.java23
-rw-r--r--status.xml3
-rw-r--r--test/layoutengine/standard-testcases/region-body_column-count_bug38054.xml50
4 files changed, 80 insertions, 25 deletions
diff --git a/src/java/org/apache/fop/area/MainReference.java b/src/java/org/apache/fop/area/MainReference.java
index bdba40f1e..f3d1ac7d2 100644
--- a/src/java/org/apache/fop/area/MainReference.java
+++ b/src/java/org/apache/fop/area/MainReference.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-/* $Id: MainReference.java,v 1.2 2004/02/27 17:41:26 jeremias Exp $ */
+/* $Id$ */
package org.apache.fop.area;
@@ -31,7 +31,6 @@ public class MainReference extends Area {
private BodyRegion parent;
private List spanAreas = new java.util.ArrayList();
- private int width;
private boolean isEmpty = true;
/**
@@ -51,7 +50,7 @@ public class MainReference extends Area {
* @return the created span area.
*/
public Span createSpan(boolean spanAll) {
- if (spanAreas.size() > 0 && getCurrentSpan().getBPD() == 0) {
+ if (spanAreas.size() > 0 && getCurrentSpan().isEmpty()) {
//Remove the current one if it is empty
spanAreas.remove(spanAreas.size() - 1);
}
@@ -90,22 +89,15 @@ public class MainReference extends Area {
*/
public boolean isEmpty() {
if (isEmpty) {
- int areaCount = 0;
+ boolean nonEmptyFound = false;
if (spanAreas != null) {
for (Iterator spaniter = spanAreas.iterator(); spaniter.hasNext();) {
Span spanArea = (Span) spaniter.next();
- for (int i = 0; i < spanArea.getColumnCount(); i++) {
- NormalFlow flow = spanArea.getNormalFlow(i);
- if (flow != null) {
- if (flow.getChildAreas() != null) {
- areaCount += flow.getChildAreas().size();
- }
- }
- }
+ nonEmptyFound |= !spanArea.isEmpty();
}
}
- isEmpty = (areaCount == 0);
+ isEmpty = !nonEmptyFound;
}
return isEmpty;
}
@@ -120,14 +112,5 @@ public class MainReference extends Area {
return parent.getColumnGap();
}
- /**
- * Get the width of this reference area.
- *
- * @return the width
- */
- public int getWidth() {
- return width;
- }
-
}
diff --git a/src/java/org/apache/fop/area/Span.java b/src/java/org/apache/fop/area/Span.java
index bbe9b6db5..d1ba95190 100644
--- a/src/java/org/apache/fop/area/Span.java
+++ b/src/java/org/apache/fop/area/Span.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -153,13 +153,32 @@ public class Span extends Area {
* its own BPD extent.
*/
public void notifyFlowsFinished() {
- int maxFlowBPD = 0;
+ int maxFlowBPD = Integer.MIN_VALUE;
for (int i = 0; i < colCount; i++) {
maxFlowBPD = Math.max(maxFlowBPD, getNormalFlow(i).getAllocBPD());
}
bpd = maxFlowBPD;
}
+ /**
+ * Indicates whether any child areas have been added to this span area.
+ *
+ * This is achieved by looping through each flow.
+ * @return true if no child areas have been added yet.
+ */
+ public boolean isEmpty() {
+ int areaCount = 0;
+ for (int i = 0; i < getColumnCount(); i++) {
+ NormalFlow flow = getNormalFlow(i);
+ if (flow != null) {
+ if (flow.getChildAreas() != null) {
+ areaCount += flow.getChildAreas().size();
+ }
+ }
+ }
+ return (areaCount == 0);
+ }
+
/** @see java.lang.Object#toString() */
public String toString() {
StringBuffer sb = new StringBuffer(super.toString());
diff --git a/status.xml b/status.xml
index 79a098f3f..0befa8487 100644
--- a/status.xml
+++ b/status.xml
@@ -27,6 +27,9 @@
<changes>
<release version="FOP Trunk">
+ <action context="Code" dev="JM" type="fix" fixes-bug="38054">
+ Bugfix: Spans that end up with a negative height don't get swallowed anymore.
+ </action>
<action context="Code" dev="MM" type="add" fixes-bug="36729">
Relative URLs for the font configuration attributes metrics-url and embed-url
are now supported. A new configuration property font-base has been added. It
diff --git a/test/layoutengine/standard-testcases/region-body_column-count_bug38054.xml b/test/layoutengine/standard-testcases/region-body_column-count_bug38054.xml
new file mode 100644
index 000000000..46cc23f02
--- /dev/null
+++ b/test/layoutengine/standard-testcases/region-body_column-count_bug38054.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2005 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+ <info>
+ <p>
+ This test checks multi-column documents. Checks a problem described in Bugzilla #38054.
+ Some content is swallowed. Cause: The second span has a negative overall height and was
+ removed due to a bug in the area tree.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="normal" page-width="5in" page-height="5in">
+ <fo:region-body column-count="2"/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="normal">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>
+ <fo:block>line 1</fo:block>
+ <fo:block>line 2</fo:block>
+ <fo:block>line 3</fo:block>
+ <fo:block>line 4</fo:block>
+ </fo:block>
+ <fo:block span="all" font-weight="bold" space-before="-20pt" space-after="2.5pt" space-after.conditionality="retain" space-before.conditionality="retain" border="solid 0.1pt black">spanned</fo:block>
+ <fo:block>blah blah blah</fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <eval expected="3" xpath="count(//span)"/>
+ </checks>
+</testcase>