diff options
-rw-r--r-- | src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java | 9 | ||||
-rw-r--r-- | src/java/org/apache/fop/layoutmgr/LayoutContext.java | 26 | ||||
-rw-r--r-- | status.xml | 3 | ||||
-rw-r--r-- | test/layoutengine/standard-testcases/block_break-before_bug46240.xml | 59 |
4 files changed, 87 insertions, 10 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java index 293d6dbe0..42f08a42d 100644 --- a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java @@ -50,8 +50,6 @@ public class FlowLayoutManager extends BlockStackingLayoutManager /** Array of areas currently being filled stored by area class */ private BlockParent[] currentAreas = new BlockParent[Area.CLASS_MAX]; - private int currentSpan = EN_NONE; - /** * This is the top level layout manager. * It is created by the PageSequence FO. @@ -89,10 +87,11 @@ public class FlowLayoutManager extends BlockStackingLayoutManager } else if (curLM instanceof BlockContainerLayoutManager) { span = ((BlockContainerLayoutManager)curLM).getBlockContainerFO().getSpan(); } + + int currentSpan = context.getCurrentSpan(); if (currentSpan != span) { log.debug("span change from " + currentSpan + " to " + span); context.signalSpanChange(span); - currentSpan = span; SpaceResolver.resolveElementList(returnList); return returnList; } @@ -228,7 +227,7 @@ public class FlowLayoutManager extends BlockStackingLayoutManager oldElement = (KnuthElement)oldListIterator.next(); if (oldElement.getPosition() instanceof NonLeafPosition) { // oldElement was created by a descendant of this FlowLM - oldElement.setPosition(((NonLeafPosition)oldElement.getPosition()).getPosition()); + oldElement.setPosition((oldElement.getPosition()).getPosition()); } else { // thisElement was created by this FlowLM, remove it oldListIterator.remove(); @@ -344,7 +343,7 @@ public class FlowLayoutManager extends BlockStackingLayoutManager * @return the BPD of the content area */ public int getContentAreaBPD() { - return (int) getCurrentPV().getBodyRegion().getBPD(); + return getCurrentPV().getBodyRegion().getBPD(); } } diff --git a/src/java/org/apache/fop/layoutmgr/LayoutContext.java b/src/java/org/apache/fop/layoutmgr/LayoutContext.java index 8b716dfde..3526ed239 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutContext.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutContext.java @@ -88,7 +88,8 @@ public class LayoutContext { */ private MinOptMax stackLimitIP; - /** True if current element list is spanning in multi-column layout. */ + /** to keep track of spanning in multi-column layout */ + private int currentSpan = Constants.NOT_SET; private int nextSpan = Constants.NOT_SET; /** inline-progression-dimension of nearest ancestor reference area */ @@ -522,22 +523,37 @@ public class LayoutContext { } /** - * @return true if the current element list ends early because of a span change - * in multi-column layout. + * @return one of: {@link Constants#NOT_SET}, {@link Constants#EN_NONE} + * {@link Constants#EN_ALL} */ public int getNextSpan() { return nextSpan; } /** + * @return one of: {@link Constants#NOT_SET}, {@link Constants#EN_NONE} + * {@link Constants#EN_ALL} + */ + public int getCurrentSpan() { + return (currentSpan == Constants.NOT_SET) + ? Constants.EN_NONE : currentSpan; + } + + /** * Used to signal the PSLM that the element list ends early because of a span change in * multi-column layout. * @param span the new span value (legal values: NOT_SET, EN_NONE, EN_ALL) */ public void signalSpanChange(int span) { - if (span == Constants.NOT_SET || span == Constants.EN_NONE || span == Constants.EN_ALL) { + switch (span) { + case Constants.NOT_SET: + case Constants.EN_NONE: + case Constants.EN_ALL: + this.currentSpan = this.nextSpan; this.nextSpan = span; - } else { + break; + default: + assert false; throw new IllegalArgumentException("Illegal value on signalSpanChange() for span: " + span); } diff --git a/status.xml b/status.xml index aa86a08c0..2a951cb42 100644 --- a/status.xml +++ b/status.xml @@ -53,6 +53,9 @@ <changes> <release version="FOP Trunk" date="TBD"> + <action context="Layout" dev="AD" type="fix" fixes-bug="46240"> + Fixed a bug when combining break-before with a span change. + </action> <action context="Code" dev="AD" type="fix" fixes-bug="46211" due-to="rogov.AT.devexperts.com"> Fixed some multi-threading issues in FontCache.java: <ul> diff --git a/test/layoutengine/standard-testcases/block_break-before_bug46240.xml b/test/layoutengine/standard-testcases/block_break-before_bug46240.xml new file mode 100644 index 000000000..c59dbb42e --- /dev/null +++ b/test/layoutengine/standard-testcases/block_break-before_bug46240.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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> + Test for Bugzilla #46240: break-before breaks span-change. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master page-height="841.8898pt" page-width="595.27563pt" master-name="page"> + <fo:region-body margin-right="49.6063pt" margin-left="29.763779pt" margin-bottom="46.771652pt" margin-top="36.850395pt" column-count="2"/> + </fo:simple-page-master> + <fo:page-sequence-master master-name="contents"> + <fo:single-page-master-reference master-reference="page"/> + </fo:page-sequence-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="contents" initial-page-number="2"> + <fo:flow flow-name="xsl-region-body"> + <fo:block id="block-1" span="all" break-before="odd-page" break-after="even-page"> + <fo:inline font-size="16.0pt">xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx </fo:inline> + </fo:block> + <fo:block /> + </fo:flow> + </fo:page-sequence> + <fo:page-sequence master-reference="contents"> + <fo:flow flow-name="xsl-region-body"> + <fo:block id="block-2" span="all" break-before="even-page"> + <fo:inline font-size="16.0pt">xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx </fo:inline> + </fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <eval expected="5" xpath="count(//pageViewport)" /> + <eval expected="3" xpath="count(//pageSequence[1]/pageViewport)" /> + <eval expected="1" xpath="count(//block[@prod-id='block-1']/lineArea)" /> + <eval expected="2" xpath="count(//pageSequence[2]/pageViewport)" /> + <eval expected="1" xpath="count(//block[@prod-id='block-2']/lineArea)" /> + </checks> +</testcase> |