aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java')
-rw-r--r--src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java b/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
index 1ad7db986..a0f58db13 100644
--- a/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
+++ b/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
@@ -1010,19 +1010,29 @@ public abstract class BreakingAlgorithm {
}
/**
- * Remove the first active node registered for the given line. If there is no more active node
+ * Remove the given active node registered for the given line. If there are no more active nodes
* for this line, adjust the startLine accordingly.
* @param line number of the line ending at the node's corresponding breakpoint
* @param node the node to deactivate
*/
protected void removeNode(int line, KnuthNode node) {
+ int headIdx = line * 2;
KnuthNode n = getNode(line);
if (n != node) {
- log.error("Should be first");
+ // nodes could be rightly deactivated in a different order
+ KnuthNode prevNode = null;
+ while (n != node) {
+ prevNode = n;
+ n = n.next;
+ }
+ prevNode.next = n.next;
+ if (prevNode.next == null) {
+ activeLines[headIdx + 1] = prevNode;
+ }
} else {
- activeLines[line * 2] = node.next;
+ activeLines[headIdx] = node.next;
if (node.next == null) {
- activeLines[line * 2 + 1] = null;
+ activeLines[headIdx + 1] = null;
}
while (startLine < endLine && getNode(startLine) == null) {
startLine++;