aboutsummaryrefslogtreecommitdiffstats
path: root/fop-core
diff options
context:
space:
mode:
authorSimon Steiner <ssteiner@apache.org>2025-03-11 12:05:26 +0000
committerSimon Steiner <ssteiner@apache.org>2025-03-11 12:05:26 +0000
commit3fef61278ba033c6dada9a592621528f483df3e7 (patch)
tree9ab83536fff7b65b1bc7d6a6de8fd9894962360a /fop-core
parenta9ed4bd1e19ccce3ebe8354301083fa20e24eaa8 (diff)
downloadxmlgraphics-fop-main.tar.gz
xmlgraphics-fop-main.zip
FOP-3242: Copy footnote data when page breaking restartedHEADmain
Diffstat (limited to 'fop-core')
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java2
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/BalancingColumnBreakingAlgorithm.java2
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java33
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java11
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;
}