Browse Source

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
tags/fop-0_95beta
Jeremias Maerki 16 years ago
parent
commit
74b2adc7eb

+ 3
- 6
src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java View File

@@ -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);
}

+ 14
- 0
src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java View File

@@ -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;

+ 7
- 3
src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java View File

@@ -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) {

+ 1
- 3
test/layoutengine/standard-testcases/block-container_content_size_percentage.xml View File

@@ -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>

+ 53
- 0
test/layoutengine/standard-testcases/block-container_overflow_2.xml View File

@@ -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>

+ 62
- 0
test/layoutengine/standard-testcases/static-content_overflow_1.xml View File

@@ -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>

Loading…
Cancel
Save