diff options
author | Jeremias Maerki <jeremias@apache.org> | 2008-01-28 10:32:46 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2008-01-28 10:32:46 +0000 |
commit | 74b2adc7ebb1c898d17bc5778de412522512d4c8 (patch) | |
tree | 3f904cf51e7a20816ba8a50439adab17cb82efd1 | |
parent | 4476c5bed846a37d7ffcc77349eb7256a420f7c5 (diff) | |
download | xmlgraphics-fop-74b2adc7ebb1c898d17bc5778de412522512d4c8.tar.gz xmlgraphics-fop-74b2adc7ebb1c898d17bc5778de412522512d4c8.zip |
Improve breaking for block-container and static-content so there are no more "breaking artifacts" (like additional border lines) in the overflowing part of the content anymore. This is done by removing all breaks from the result list prior to constructing the area tree. The presence of breaks simply indicates that there is an overflow.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@615845 13f79535-47bb-0310-9956-ffa450edef68
6 files changed, 140 insertions, 12 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java index ab153090b..3d9076efd 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java @@ -355,10 +355,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager MinOptMax range = new MinOptMax(relDims.ipd); BlockContainerBreaker breaker = new BlockContainerBreaker(this, range); breaker.doLayout(relDims.bpd, autoHeight); - boolean contentOverflows = false; - if (!breaker.isEmpty()) { - contentOverflows = (breaker.deferredAlg.getPageBreaks().size() > 1); - } + boolean contentOverflows = breaker.isOverflow(); Position bcPosition = new BlockContainerPosition(this, breaker); returnList.add(new KnuthBox(vpContentBPD, notifyPos(bcPosition), false)); @@ -648,9 +645,9 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager } //Rendering all parts (not just the first) at once for the case where the parts that //overflow should be visible. - //TODO Check if this has any unwanted side-effects. Feels a bit like a hack. + this.deferredAlg.removeAllPageBreaks(); this.addAreas(this.deferredAlg, - /*1*/ this.deferredAlg.getPageBreaks().size(), + this.deferredAlg.getPageBreaks().size(), this.deferredOriginalList, this.deferredEffectiveList); } diff --git a/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java b/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java index 32c2b8d3b..57fc4600e 100644 --- a/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java +++ b/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java @@ -734,6 +734,20 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { pageBreaks.addFirst(pageBreak); } + /** + * Removes all page breaks from the result list. This is used by block-containers and + * static-content when it is only desired to know where there is an overflow but later the + * whole content should be painted as one part. + */ + public void removeAllPageBreaks() { + if (pageBreaks == null) { + return; + } + while (pageBreaks.size() > 1) { + pageBreaks.removeFirst(); + } + } + private int getPartCount() { if (pageBreaks == null) { return 0; diff --git a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java index 92437a452..c8b89e6af 100644 --- a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java @@ -25,9 +25,10 @@ import java.util.ListIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.fop.area.RegionReference; + import org.apache.fop.area.Area; import org.apache.fop.area.Block; +import org.apache.fop.area.RegionReference; import org.apache.fop.fo.FONode; import org.apache.fop.fo.pagination.PageSequence; import org.apache.fop.fo.pagination.SideRegion; @@ -339,11 +340,14 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager { protected void doPhase3(PageBreakingAlgorithm alg, int partCount, BlockSequence originalList, BlockSequence effectiveList) { - //Directly add areas after finding the breaks - this.addAreas(alg, partCount, originalList, effectiveList); if (partCount > 1) { overflow = true; } + //Rendering all parts (not just the first) at once for the case where the parts that + //overflow should be visible. + alg.removeAllPageBreaks(); + //Directly add areas after finding the breaks + this.addAreas(alg, 1, originalList, effectiveList); } protected void finishPart(PageBreakingAlgorithm alg, PageBreakPosition pbp) { diff --git a/test/layoutengine/standard-testcases/block-container_content_size_percentage.xml b/test/layoutengine/standard-testcases/block-container_content_size_percentage.xml index 14d09a5d6..c3b11805c 100644 --- a/test/layoutengine/standard-testcases/block-container_content_size_percentage.xml +++ b/test/layoutengine/standard-testcases/block-container_content_size_percentage.xml @@ -78,9 +78,7 @@ <!-- The 10% are ignored in this case. --> <eval expected="57600" xpath="//flow/block[4]/@bpd"/> <!-- 4 lines --> <eval expected="100000" xpath="//flow/block[4]/@ipd"/> - <eval expected="28800" xpath="//flow/block[4]/block[1]/block[1]/@bpd"/> <!-- the first 2 lines ... --> + <eval expected="57600" xpath="//flow/block[4]/block[1]/block[1]/@bpd"/> <eval expected="50000" xpath="//flow/block[4]/block[1]/block[1]/@ipd"/> - <eval expected="28800" xpath="//flow/block[4]/block[1]/block[2]/@bpd"/> <!-- ... and the other 2 lines --> - <eval expected="50000" xpath="//flow/block[4]/block[1]/block[2]/@ipd"/> </checks> </testcase> diff --git a/test/layoutengine/standard-testcases/block-container_overflow_2.xml b/test/layoutengine/standard-testcases/block-container_overflow_2.xml new file mode 100644 index 000000000..5fe97e7c3 --- /dev/null +++ b/test/layoutengine/standard-testcases/block-container_overflow_2.xml @@ -0,0 +1,53 @@ +<?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> + This test checks behaviour with overflowing content on block-containers. + </p> + <p> + Visual check: If there's a red line between the second and third line, the + behaviour is wrong. + </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" margin="20pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal" text-align="justify"> + <fo:flow flow-name="xsl-region-body"> + <fo:block-container id="bc1" background-color="lightgray" block-progression-dimension="2em"> + <fo:block id="text" border="solid 1pt red" border-before-width.conditionality="retain">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque hendrerit euismod velit. Nulla facilisi. Etiam et risus at neque ultrices facilisis. Donec lectus est, nonummy quis, rhoncus bibendum, porta at, nisl.</fo:block> + </fo:block-container> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <!-- fo:block must not be broken into multiple parts! --> + <eval expected="1" xpath="count(//block[@prod-id='text'])"/> + + <!-- The following shows the overflow --> + <true expected="24000" xpath="//block[@prod-id='bc1' and @is-viewport-area='true']/@bpd"/> + <true expected="60600" xpath="//block[@prod-id='bc1' and @is-reference-area='true']/@bpd"/> + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/static-content_overflow_1.xml b/test/layoutengine/standard-testcases/static-content_overflow_1.xml new file mode 100644 index 000000000..b620f018c --- /dev/null +++ b/test/layoutengine/standard-testcases/static-content_overflow_1.xml @@ -0,0 +1,62 @@ +<?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> + This test checks behaviour with overflowing content on static-content. + </p> + <p> + Visual check: If there's a red line between the second and third line, the + behaviour is wrong. + </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" margin="20pt"> + <fo:region-body margin-top="2em" margin-bottom="2em"/> + <fo:region-before extent="2em" background-color="lightgray"/> + <fo:region-after extent="2em" background-color="lightgray"/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal" text-align="justify"> + <fo:static-content flow-name="xsl-region-before"> + <fo:block id="text-before" border="solid 1pt red" border-before-width.conditionality="retain">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque hendrerit euismod velit. Nulla facilisi. Etiam et risus at neque ultrices facilisis. Donec lectus est, nonummy quis, rhoncus bibendum, porta at, nisl.</fo:block> + </fo:static-content> + <fo:static-content flow-name="xsl-region-after"> + <fo:block id="text-after" border="solid 1pt red" border-before-width.conditionality="retain">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque hendrerit euismod velit. Nulla facilisi. Etiam et risus at neque ultrices facilisis. Donec lectus est, nonummy quis, rhoncus bibendum, porta at, nisl.</fo:block> + </fo:static-content> + <fo:flow flow-name="xsl-region-body"> + <fo:block>xsl-region-body</fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <!-- fo:block must not be broken into multiple parts! --> + <eval expected="1" xpath="count(//block[@prod-id='text-before'])"/> + <eval expected="1" xpath="count(//block[@prod-id='text-after'])"/> + + <!-- The following shows the overflow --> + <true expected="24000" xpath="//regionBefore/@bpd"/> + <true expected="24000" xpath="//regionAfter/@bpd"/> + <true expected="60600" xpath="sum(//block[@prod-id='text-before']/@bpda)"/> + <true expected="60600" xpath="sum(//block[@prod-id='text-after']/@bpda)"/> + </checks> +</testcase> |