diff options
author | Simon Steiner <ssteiner@apache.org> | 2024-09-04 12:37:38 +0100 |
---|---|---|
committer | Simon Steiner <ssteiner@apache.org> | 2024-09-04 12:37:38 +0100 |
commit | 6ef241f67c4bd27a698c56cdb8edbfade5d8aea4 (patch) | |
tree | cc52ec67d87bf37075c875f23185bdbd44f20a04 | |
parent | c11f43c9dbf529b87820d77ef501aa10699fc9d8 (diff) | |
download | xmlgraphics-fop-6ef241f67c4bd27a698c56cdb8edbfade5d8aea4.tar.gz xmlgraphics-fop-6ef241f67c4bd27a698c56cdb8edbfade5d8aea4.zip |
FOP-3204: Missing content for last page with change ipd
5 files changed, 80 insertions, 2 deletions
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/RestartAtLM.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/RestartAtLM.java index 08189cba9..80b1487a4 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/RestartAtLM.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/RestartAtLM.java @@ -23,6 +23,7 @@ import java.util.Iterator; import java.util.LinkedList; import org.apache.fop.events.EventBroadcaster; +import org.apache.fop.layoutmgr.table.TableContentPosition; /** * Class to find the restart layoutmanager for changing IPD @@ -39,6 +40,9 @@ class RestartAtLM { optimalBreak = null; } int positionIndex = findPositionIndex(breaker, optimalBreak, alg, start); + if (breaker.positionAtBreak.getLM() instanceof BlockLayoutManager) { + positionIndex = findPositionIndex(breaker, optimalBreak, alg, 0); + } if (ipdChangesOnNextPage || (breaker.positionAtBreak != null && breaker.positionAtBreak.getIndex() > -1)) { breaker.firstElementsForRestart = Collections.EMPTY_LIST; if (ipdChangesOnNextPage) { @@ -112,9 +116,20 @@ class RestartAtLM { if (onLastPageAndIPDChanges && !visitedBefore && breaker.positionAtBreak.getPosition() != null) { restartAtLM = breaker.positionAtBreak.getPosition().getLM(); } + findLeafPosition(breaker); return restartAtLM; } + private void findLeafPosition(AbstractBreaker breaker) { + while (breaker.positionAtBreak instanceof NonLeafPosition) { + Position pos = breaker.positionAtBreak.getPosition(); + if (pos instanceof TableContentPosition) { + break; + } + breaker.positionAtBreak = pos; + } + } + private int findPositionIndex(AbstractBreaker breaker, BreakingAlgorithm.KnuthNode optimalBreak, PageBreakingAlgorithm alg, int start) { int positionIndex = (optimalBreak != null) ? optimalBreak.position : start; diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java index ddffde3e1..2fff6c494 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java @@ -660,7 +660,9 @@ public class LineLayoutManager extends InlineStackingLayoutManager } for (int i = 0; i < parIndex; i++) { - knuthParagraphs.remove(0); + if (knuthParagraphs.size() > 1) { + knuthParagraphs.remove(0); + } } parIndex = 0; diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableContentPosition.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableContentPosition.java index 98d474f8e..3f1236d4d 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableContentPosition.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableContentPosition.java @@ -30,7 +30,7 @@ import org.apache.fop.layoutmgr.Position; * This class represents a Position specific to TableContentLayoutManager. Used for normal * content cases. */ -class TableContentPosition extends Position { +public class TableContentPosition extends Position { /** The position is the first of the row group. */ public static final int FIRST_IN_ROWGROUP = 1; diff --git a/fop/test/layoutengine/standard-testcases/flow_changing-ipd_last-page_12.xml b/fop/test/layoutengine/standard-testcases/flow_changing-ipd_last-page_12.xml index 10fb45e5a..d3918fcaa 100644 --- a/fop/test/layoutengine/standard-testcases/flow_changing-ipd_last-page_12.xml +++ b/fop/test/layoutengine/standard-testcases/flow_changing-ipd_last-page_12.xml @@ -60,5 +60,6 @@ </fo> <checks> <eval expected="url(a.TIFF)" xpath="//pageViewport[2]//image/@url"/> + <eval expected="2" xpath="count(//pageViewport)"/> </checks> </testcase> diff --git a/fop/test/layoutengine/standard-testcases/flow_changing-ipd_last-page_19.xml b/fop/test/layoutengine/standard-testcases/flow_changing-ipd_last-page_19.xml new file mode 100755 index 000000000..a854fe8ab --- /dev/null +++ b/fop/test/layoutengine/standard-testcases/flow_changing-ipd_last-page_19.xml @@ -0,0 +1,60 @@ +<?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 that the definition of a special page-master for the last page with a + different width that the previous "rest" page causes FOP to redo the line breaking layout. + </p> + </info> + <fo> +<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="Portrait" page-width="8.5in" page-height="11in" margin-bottom="0pt" margin-right="0pt" margin-top="0pt" margin-left="0pt"> + <fo:region-body margin-bottom="0pt" margin-right="0pt" margin-top="0pt" margin-left="0pt" region-name="Body"/> + </fo:simple-page-master> + <fo:simple-page-master master-name="Landscape" page-width="11in" page-height="8.5in" margin-bottom="0pt" margin-right="0pt" margin-top="0pt" margin-left="0pt"> + <fo:region-body region-name="Body" margin-bottom="0pt" margin-right="0pt" margin-top="0pt" margin-left="0pt"/> + </fo:simple-page-master> + <fo:page-sequence-master master-name="LetterPages"> + <fo:repeatable-page-master-alternatives> + <fo:conditional-page-master-reference page-position="first" master-reference="Portrait"/> + <fo:conditional-page-master-reference page-position="rest" master-reference="Portrait"/> + <fo:conditional-page-master-reference page-position="last" master-reference="Landscape"/> + </fo:repeatable-page-master-alternatives> + </fo:page-sequence-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="LetterPages"> + <fo:flow flow-name="Body"> + <fo:block> + <fo:block>test</fo:block> + <fo:block break-before="page">test2</fo:block> + <fo:block>test3</fo:block> + </fo:block> + </fo:flow> + </fo:page-sequence> +</fo:root> + </fo> + <checks> + <eval expected="2" xpath="count(//pageViewport)"/> + <eval expected="test" xpath="//pageViewport[1]//word"/> + <eval expected="test2" xpath="//pageViewport[2]//block/block[1]//word"/> + <eval expected="test3" xpath="//pageViewport[2]//block/block[2]//word"/> + </checks> +</testcase> |