瀏覽代碼

Fixed a problem where the BPD or a block area could be wrong if there is a nested, absolutely positioned area (for example a block-container).

This was most probably introduced by rev 618992.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@707631 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-1_0
Jeremias Maerki 15 年之前
父節點
當前提交
46c9aca22b

+ 1
- 1
src/java/org/apache/fop/area/Block.java 查看文件

@@ -79,7 +79,7 @@ public class Block extends BlockParent {
* @param autoHeight increase the height of the block.
*/
public void addBlock(Block block, boolean autoHeight) {
if (autoHeight && allowBPDUpdate) {
if (autoHeight && allowBPDUpdate && block.isStacked()) {
bpd += block.getAllocBPD();
}
addChildArea(block);

+ 7
- 10
src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java 查看文件

@@ -26,6 +26,7 @@ import java.util.ListIterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
import org.apache.fop.fo.flow.ListItem;
@@ -537,14 +538,6 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager
label.addAreas(labelIter, lc);
}

// reset the area bpd after adding the label areas and before adding the body areas
int savedBPD = 0;
if (labelFirstIndex <= labelLastIndex
&& bodyFirstIndex <= bodyLastIndex) {
savedBPD = curBlockArea.getBPD();
curBlockArea.setBPD(0);
}

// add body areas
if (bodyFirstIndex <= bodyLastIndex) {
KnuthPossPosIter bodyIter = new KnuthPossPosIter(bodyList,
@@ -559,9 +552,13 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager
}

// after adding body areas, set the maximum area bpd
if (curBlockArea.getBPD() < savedBPD) {
curBlockArea.setBPD(savedBPD);
int childCount = curBlockArea.getChildAreas().size();
assert childCount >= 1 && childCount <= 2;
int itemBPD = ((Block)curBlockArea.getChildAreas().get(0)).getAllocBPD();
if (childCount == 2) {
itemBPD = Math.max(itemBPD, ((Block)curBlockArea.getChildAreas().get(1)).getAllocBPD());
}
curBlockArea.setBPD(itemBPD);

addMarkersToPage(false, isFirst(firstPos), isLast(lastPos));


+ 4
- 0
status.xml 查看文件

@@ -53,6 +53,10 @@

<changes>
<release version="FOP Trunk" date="TBD">
<action context="Layout" dev="JM" type="fix">
Fixed a problem where the BPD or a block area could be wrong if there is a nested,
absolutely positioned area (for example a block-container).
</action>
<action context="Layout" dev="AD" type="fix" fixes-bug="40798">
Bugzilla 40798: A conditional-page-master-reference with page-position="last" qualifies
for a first page, if it is also the last. Additionally: also added support for

+ 59
- 0
test/layoutengine/standard-testcases/block-container_area-bpd.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>
This test checks bpd values on block-containers.
</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/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="normal">
<fo:flow flow-name="xsl-region-body">
<fo:block>Testing area BPDs...</fo:block>
<fo:block-container id="bc1" absolute-position="absolute" top="0.15cm" left="0.25cm">
<fo:block>
<fo:inline background-color="grey">bc1</fo:inline>
</fo:block>
</fo:block-container>
<fo:block background-color="orange">
<fo:block color="red" background-color="yellow">Below
<fo:block-container id="bc2" absolute-position="absolute" top="0.35cm" left="0.25cm">
<fo:block>
<fo:inline background-color="grey">Above</fo:inline>
</fo:block>
</fo:block-container>
</fo:block>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</fo>
<checks>
<eval expected="28800" xpath="//flow/@bpd"/>
<eval expected="14400" xpath="//block[@prod-id='bc1']/@bpd"/>
<eval expected="14400" xpath="//block[@prod-id='bc2']/@bpd"/>
<eval expected="14400" xpath="//block[@prod-id='bc2']/../@bpd"/>
</checks>
</testcase>

Loading…
取消
儲存