diff options
author | Simon Steiner <ssteiner@apache.org> | 2025-03-11 12:05:26 +0000 |
---|---|---|
committer | Simon Steiner <ssteiner@apache.org> | 2025-03-11 12:05:26 +0000 |
commit | 3fef61278ba033c6dada9a592621528f483df3e7 (patch) | |
tree | 9ab83536fff7b65b1bc7d6a6de8fd9894962360a /fop-core | |
parent | a9ed4bd1e19ccce3ebe8354301083fa20e24eaa8 (diff) | |
download | xmlgraphics-fop-main.tar.gz xmlgraphics-fop-main.zip |
Diffstat (limited to 'fop-core')
4 files changed, 32 insertions, 16 deletions
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java index e1e6ee538..9f8f9d4f7 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java @@ -406,7 +406,7 @@ public abstract class AbstractBreaker { PageBreakingAlgorithm alg = new PageBreakingAlgorithm(getTopLevelLM(), getPageProvider(), createLayoutListener(), alignment, alignmentLast, footnoteSeparatorLength, - isPartOverflowRecoveryActivated(), autoHeight, isSinglePartFavored()); + isPartOverflowRecoveryActivated(), autoHeight, isSinglePartFavored(), childLC); alg.setConstantLineWidth(flowBPD); int optimalPageCount = alg.findBreakingPoints(blockList, 1, true, diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/BalancingColumnBreakingAlgorithm.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/BalancingColumnBreakingAlgorithm.java index 375153f98..838b6b005 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/BalancingColumnBreakingAlgorithm.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/BalancingColumnBreakingAlgorithm.java @@ -44,7 +44,7 @@ public class BalancingColumnBreakingAlgorithm extends PageBreakingAlgorithm { int columnCount) { super(topLevelLM, pageProvider, layoutListener, alignment, alignmentLast, - footnoteSeparatorLength, partOverflowRecovery, false, false); + footnoteSeparatorLength, partOverflowRecovery, false, false, null); this.columnCount = columnCount; this.considerTooShort = true; //This is important! } diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java index 3f90d033a..fddd6c3c6 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java @@ -444,7 +444,7 @@ public class PageBreaker extends AbstractBreaker { getTopLevelLM(), getPageProvider(), createLayoutListener(), alg.getAlignment(), alg.getAlignmentLast(), footnoteSeparatorLength, - isPartOverflowRecoveryActivated(), false, false); + isPartOverflowRecoveryActivated(), false, false, null); log.debug("==================================================="); } @@ -959,16 +959,27 @@ public class PageBreaker extends AbstractBreaker { relayedFirstNewFootnoteIndex, relayedFootnoteListIndex, relayedFootnoteElementIndex, relayedFootnoteSeparatorLength, previousFootnoteListIndex, previousFootnoteElementIndex); - relayedFootnotesList = null; - relayedLengthList = null; - relayedTotalFootnotesLength = 0; - relayedInsertedFootnotesLength = 0; - relayedFootnotesPending = false; - relayedNewFootnotes = false; - relayedFirstNewFootnoteIndex = 0; - relayedFootnoteListIndex = 0; - relayedFootnoteElementIndex = -1; - relayedFootnoteSeparatorLength = null; + if (alg.handlingFloat()) { + relayedFootnotesList = null; + relayedLengthList = null; + relayedTotalFootnotesLength = 0; + relayedInsertedFootnotesLength = 0; + relayedFootnotesPending = false; + relayedNewFootnotes = false; + relayedFirstNewFootnoteIndex = 0; + relayedFootnoteListIndex = 0; + relayedFootnoteElementIndex = -1; + relayedFootnoteSeparatorLength = null; + } + } + } + + protected void addAreas(PageBreakingAlgorithm alg, int startPart, int partCount, + BlockSequence originalList, BlockSequence effectiveList, final LayoutContext childLC) { + super.addAreas(alg, startPart, partCount, originalList, effectiveList, childLC); + if (!alg.handlingFloat()) { + PageSequenceLayoutManager pslm = (PageSequenceLayoutManager) getTopLevelLM(); + alg.relayFootnotes(pslm); } } } diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java index 93eeaf0e8..f8bb162f3 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java @@ -110,6 +110,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { private int previousFootnoteListIndex = -2; private int previousFootnoteElementIndex = -2; private boolean relayingFootnotes; + private LayoutContext childLC; /** * Construct a page breaking algorithm. @@ -136,7 +137,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { int alignment, int alignmentLast, MinOptMax footnoteSeparatorLength, boolean partOverflowRecovery, boolean autoHeight, - boolean favorSinglePart) { + boolean favorSinglePart, LayoutContext childLC) { super(alignment, alignmentLast, true, partOverflowRecovery, 0); this.topLevelLM = topLevelLM; this.pageProvider = pageProvider; @@ -145,6 +146,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { this.footnoteSeparatorLength = footnoteSeparatorLength; this.autoHeight = autoHeight; this.favorSinglePart = favorSinglePart; + this.childLC = childLC; } /** @@ -249,7 +251,8 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { footnoteElementIndex = -1; if (topLevelLM instanceof PageSequenceLayoutManager) { PageSequenceLayoutManager pslm = (PageSequenceLayoutManager) topLevelLM; - if (pslm.handlingStartOfFloat() || pslm.handlingEndOfFloat()) { + boolean spanAll = childLC != null && childLC.getCurrentSpan() == Constants.EN_ALL; + if (pslm.handlingStartOfFloat() || pslm.handlingEndOfFloat() || spanAll) { pslm.retrieveFootnotes(this); } if (pslm.handlingStartOfFloat()) { @@ -257,6 +260,8 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { } if (pslm.handlingEndOfFloat()) { totalWidth += pslm.getOffsetDueToFloat() + insertedFootnotesLength; + } else if (spanAll) { + totalWidth += insertedFootnotesLength; } } } @@ -1362,7 +1367,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm { } public void relayFootnotes(PageSequenceLayoutManager pslm) { - if (!relayingFootnotes) { + if (!relayingFootnotes && bestFloatEdgeNode != null) { previousFootnoteListIndex = ((KnuthPageNode) bestFloatEdgeNode.previous).footnoteListIndex; previousFootnoteElementIndex = ((KnuthPageNode) bestFloatEdgeNode.previous).footnoteElementIndex; } |