diff options
-rw-r--r-- | src/java/org/apache/fop/area/MainReference.java | 29 | ||||
-rw-r--r-- | src/java/org/apache/fop/area/Span.java | 23 | ||||
-rw-r--r-- | status.xml | 3 | ||||
-rw-r--r-- | test/layoutengine/standard-testcases/region-body_column-count_bug38054.xml | 50 |
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> |