aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/fop/layoutmgr/AbstractBreaker.java17
-rw-r--r--src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java13
-rw-r--r--src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java32
-rw-r--r--src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java2
-rw-r--r--src/java/org/apache/fop/layoutmgr/KnuthSequence.java12
-rw-r--r--src/java/org/apache/fop/layoutmgr/SpaceResolver.java110
-rw-r--r--src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java5
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java5
-rw-r--r--test/layoutengine/testcases/block-container_space-before_space-after_1.xml2
-rw-r--r--test/layoutengine/testcases/block_space-before_space-after_2.xml2
-rw-r--r--test/layoutengine/testcases/block_space-before_space-after_9.xml69
-rw-r--r--test/layoutengine/testcases/block_space-before_space-after_9a.xml90
-rw-r--r--test/layoutengine/testcases/list-block_space-before_space-after_1.xml2
-rw-r--r--test/layoutengine/testcases/region_side_space-resolution.xml1
-rw-r--r--test/layoutengine/testcases/table_space-before_space-after_1.xml2
15 files changed, 284 insertions, 80 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java b/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
index 9c82728e5..743d30574 100644
--- a/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
+++ b/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
@@ -76,8 +76,8 @@ public abstract class AbstractBreaker {
return this.startOn;
}
- public BlockSequence endBlockSequence() {
- KnuthSequence temp = super.endSequence();
+ public BlockSequence endBlockSequence(Position breakPosition) {
+ KnuthSequence temp = super.endSequence(breakPosition);
if (temp != null) {
BlockSequence returnSequence = new BlockSequence(startOn);
returnSequence.addAll(temp);
@@ -308,6 +308,10 @@ public abstract class AbstractBreaker {
int displayAlign = getCurrentDisplayAlign();
+ //The following is needed by SpaceResolver.performConditionalsNotification()
+ //further down as there may be important Position elements in the element list trailer
+ int notificationEndElementIndex = endElementIndex;
+
// ignore the last elements added by the
// PageSequenceLayoutManager
endElementIndex -= (endElementIndex == (originalList.size() - 1))
@@ -329,12 +333,13 @@ public abstract class AbstractBreaker {
while (effectiveListIterator.hasNext()
&& !(firstElement = (KnuthElement) effectiveListIterator.next())
.isBox()) {
+ /*
if (firstElement.isGlue() && firstElement.getLayoutManager() != null) {
// discard the space representd by the glue element
((BlockLevelLayoutManager) firstElement
.getLayoutManager())
.discardSpace((KnuthGlue) firstElement);
- }
+ }*/
startElementIndex++;
}
@@ -380,7 +385,7 @@ public abstract class AbstractBreaker {
// Handle SpaceHandling(Break)Positions, see SpaceResolver!
SpaceResolver.performConditionalsNotification(effectiveList,
- startElementIndex, endElementIndex, lastBreak);
+ startElementIndex, notificationEndElementIndex, lastBreak);
// Add areas now!
addAreas(new KnuthPossPosIter(effectiveList,
@@ -439,10 +444,12 @@ public abstract class AbstractBreaker {
//Only implemented by the PSLM
nextSequenceStartsOn = handleSpanChange(childLC, nextSequenceStartsOn);
+ Position breakPosition = null;
if (((KnuthElement) returnedList.getLast()).isPenalty()
&& ((KnuthPenalty) returnedList.getLast()).getP() == -KnuthElement.INFINITE) {
KnuthPenalty breakPenalty = (KnuthPenalty) returnedList
.removeLast();
+ breakPosition = breakPenalty.getPosition();
switch (breakPenalty.getBreakClass()) {
case Constants.EN_PAGE:
log.debug("PLM> break - PAGE");
@@ -468,7 +475,7 @@ public abstract class AbstractBreaker {
}
blockList.addAll(returnedList);
BlockSequence seq = null;
- seq = blockList.endBlockSequence();
+ seq = blockList.endBlockSequence(breakPosition);
if (seq != null) {
blockLists.add(seq);
}
diff --git a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
index d8183bcb8..50281ef44 100644
--- a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
@@ -229,12 +229,10 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager
}
}
- if (!bSpaceBeforeServed) {
- addKnuthElementsForSpaceBefore(returnList, alignment);
- bSpaceBeforeServed = true;
- }
+ addKnuthElementsForSpaceBefore(returnList, alignment);
- addKnuthElementsForBorderPaddingBefore(returnList);
+ addKnuthElementsForBorderPaddingBefore(returnList, !firstVisibleMarkServed);
+ firstVisibleMarkServed = true;
if (autoHeight) {
//Spaces, border and padding to be repeated at each break
@@ -256,6 +254,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager
if (returnedList.size() == 1
&& ((KnuthElement)returnedList.getFirst()).isForcedBreak()) {
// a descendant of this block has break-before
+ /*
if (returnList.size() == 0) {
// the first child (or its first child ...) has
// break-before;
@@ -263,7 +262,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager
// the
// following page
bSpaceBeforeServed = false;
- }
+ }*/
contentList.addAll(returnedList);
// "wrap" the Position inside each element
@@ -352,7 +351,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager
}
}
}
- addKnuthElementsForBorderPaddingAfter(returnList);
+ addKnuthElementsForBorderPaddingAfter(returnList, true);
addKnuthElementsForSpaceAfter(returnList, alignment);
addKnuthElementsForBreakAfter(returnList, context);
diff --git a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java
index ac0abc26e..b3ad7225b 100644
--- a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java
@@ -55,8 +55,8 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
protected LinkedList storedList = null;
/** Indicates whether break before has been served or not */
protected boolean bBreakBeforeServed = false;
- /** Indicates whether space before has been served or not */
- protected boolean bSpaceBeforeServed = false;
+ /** Indicates whether the first visible mark has been returned by this LM, yet */
+ protected boolean firstVisibleMarkServed = false;
/** Reference IPD available */
protected int referenceIPD = 0;
/**
@@ -218,12 +218,10 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
}
}
- if (!bSpaceBeforeServed) {
- addKnuthElementsForSpaceBefore(returnList, alignment);
- bSpaceBeforeServed = true;
- }
+ addKnuthElementsForSpaceBefore(returnList, alignment);
- addKnuthElementsForBorderPaddingBefore(returnList);
+ addKnuthElementsForBorderPaddingBefore(returnList, !firstVisibleMarkServed);
+ firstVisibleMarkServed = true;
//Spaces, border and padding to be repeated at each break
addPendingMarks(context);
@@ -257,6 +255,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
&& returnedList.size() == 1
&& ((ListElement) returnedList.getFirst()).isForcedBreak()) {
// a descendant of this block has break-before
+ /*
if (returnList.size() == 0) {
// the first child (or its first child ...) has
// break-before;
@@ -264,7 +263,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
// the
// following page
bSpaceBeforeServed = false;
- }
+ }*/
contentList.addAll(returnedList);
/* extension: conversione di tutta la sequenza fin'ora ottenuta */
@@ -369,7 +368,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
returnList.add(new KnuthBox(0, notifyPos(new Position(this)), true));
}
- addKnuthElementsForBorderPaddingAfter(returnList);
+ addKnuthElementsForBorderPaddingAfter(returnList, true);
addKnuthElementsForSpaceAfter(returnList, alignment);
addKnuthElementsForBreakAfter(returnList, context);
@@ -858,7 +857,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
* Creates Knuth elements for before border padding and adds them to the return list.
* @param returnList return list to add the additional elements to
*/
- protected void addKnuthElementsForBorderPaddingBefore(LinkedList returnList) {
+ protected void addKnuthElementsForBorderPaddingBefore(LinkedList returnList, boolean isFirst) {
//Border and Padding (before)
CommonBorderPaddingBackground borderAndPadding = getBorderPaddingBackground();
if (borderAndPadding != null) {
@@ -866,14 +865,15 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
returnList.add(new BorderElement(
getAuxiliaryPosition(),
borderAndPadding.getBorderInfo(CommonBorderPaddingBackground.BEFORE)
- .getWidth(), RelSide.BEFORE, true, false, this));
+ .getWidth(),
+ RelSide.BEFORE, isFirst, false, this));
}
if (borderAndPadding.getPaddingBefore(false, this) > 0) {
returnList.add(new PaddingElement(
getAuxiliaryPosition(),
borderAndPadding.getPaddingLengthProperty(
CommonBorderPaddingBackground.BEFORE),
- RelSide.BEFORE, true, false, this));
+ RelSide.BEFORE, isFirst, false, this));
}
//TODO Handle conditionality
/*
@@ -889,7 +889,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
* Creates Knuth elements for after border padding and adds them to the return list.
* @param returnList return list to add the additional elements to
*/
- protected void addKnuthElementsForBorderPaddingAfter(LinkedList returnList) {
+ protected void addKnuthElementsForBorderPaddingAfter(LinkedList returnList, boolean isLast) {
//Border and Padding (after)
CommonBorderPaddingBackground borderAndPadding = getBorderPaddingBackground();
if (borderAndPadding != null) {
@@ -897,13 +897,15 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
returnList.add(new PaddingElement(
getAuxiliaryPosition(),
borderAndPadding.getPaddingLengthProperty(
- CommonBorderPaddingBackground.AFTER), RelSide.AFTER, false, true, this));
+ CommonBorderPaddingBackground.AFTER),
+ RelSide.AFTER, false, isLast, this));
}
if (borderAndPadding.getBorderAfterWidth(false) > 0) {
returnList.add(new BorderElement(
getAuxiliaryPosition(),
borderAndPadding.getBorderInfo(CommonBorderPaddingBackground.AFTER)
- .getWidth(), RelSide.AFTER, false, true, this));
+ .getWidth(),
+ RelSide.AFTER, false, isLast, this));
}
//TODO Handle conditionality
/*
diff --git a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
index 62f5e2af6..3ec814bd2 100644
--- a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
@@ -132,7 +132,7 @@ public class FlowLayoutManager extends BlockStackingLayoutManager
}
if (returnedList.size() > 0) {
returnList.addAll(returnedList);
- if (ElementListUtils.endsWithForcedBreak(returnedList)) {
+ if (ElementListUtils.endsWithForcedBreak(returnList)) {
// a descendant of this flow has break-after
SpaceResolver.resolveElementList(returnList);
return returnList;
diff --git a/src/java/org/apache/fop/layoutmgr/KnuthSequence.java b/src/java/org/apache/fop/layoutmgr/KnuthSequence.java
index 77f30f1c5..15a61a182 100644
--- a/src/java/org/apache/fop/layoutmgr/KnuthSequence.java
+++ b/src/java/org/apache/fop/layoutmgr/KnuthSequence.java
@@ -53,9 +53,19 @@ public class KnuthSequence extends ArrayList {
}
/**
+ * Finalizes a Knuth sequence.
* @return a finalized sequence.
*/
public KnuthSequence endSequence() {
+ return endSequence(null);
+ }
+
+ /**
+ * Finalizes a Knuth sequence.
+ * @param breakPosition a Position instance for the last penalty (may be null)
+ * @return a finalized sequence.
+ */
+ public KnuthSequence endSequence(Position breakPosition) {
// remove glue and penalty item at the end of the paragraph
while (this.size() > ignoreAtStart
&& !((KnuthElement)this.get(this.size() - 1)).isBox()) {
@@ -66,7 +76,7 @@ public class KnuthSequence extends ArrayList {
// and the forced break
this.add(new KnuthPenalty(0, KnuthElement.INFINITE, false, null, false));
this.add(new KnuthGlue(0, 10000000, 0, null, false));
- this.add(new KnuthPenalty(0, -KnuthElement.INFINITE, false, null, false));
+ this.add(new KnuthPenalty(0, -KnuthElement.INFINITE, false, breakPosition, false));
ignoreAtEnd = 3;
return this;
} else {
diff --git a/src/java/org/apache/fop/layoutmgr/SpaceResolver.java b/src/java/org/apache/fop/layoutmgr/SpaceResolver.java
index 49e416119..45e9990ea 100644
--- a/src/java/org/apache/fop/layoutmgr/SpaceResolver.java
+++ b/src/java/org/apache/fop/layoutmgr/SpaceResolver.java
@@ -18,6 +18,7 @@
package org.apache.fop.layoutmgr;
+import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
@@ -74,9 +75,9 @@ public class SpaceResolver {
int i = 0;
ListIterator iter;
if (first != null) {
- iter = first.listIterator(first.size());
- while (iter.hasPrevious()) {
- noBreak[i] = (UnresolvedListElementWithLength)iter.previous();
+ iter = first.listIterator();
+ while (iter.hasNext()) {
+ noBreak[i] = (UnresolvedListElementWithLength)iter.next();
noBreakLengths[i] = noBreak[i].getLength();
i++;
}
@@ -152,15 +153,21 @@ public class SpaceResolver {
}
private void removeConditionalBorderAndPadding(
- UnresolvedListElement[] elems, MinOptMax[] lengths) {
+ UnresolvedListElement[] elems, MinOptMax[] lengths, boolean reverse) {
for (int i = 0; i < elems.length; i++) {
- if (elems[i] instanceof BorderOrPaddingElement) {
- BorderOrPaddingElement bop = (BorderOrPaddingElement)elems[i];
+ int effIndex;
+ if (reverse) {
+ effIndex = elems.length - 1 - i;
+ } else {
+ effIndex = i;
+ }
+ if (elems[effIndex] instanceof BorderOrPaddingElement) {
+ BorderOrPaddingElement bop = (BorderOrPaddingElement)elems[effIndex];
if (bop.isConditional() && !(bop.isFirst() || bop.isLast())) {
if (log.isDebugEnabled()) {
log.debug("Nulling conditional element: " + bop);
}
- lengths[i] = null;
+ lengths[effIndex] = null;
}
}
}
@@ -169,21 +176,28 @@ public class SpaceResolver {
}
}
- private void performSpaceResolutionRule1(UnresolvedListElement[] elems, MinOptMax[] lengths) {
+ private void performSpaceResolutionRule1(UnresolvedListElement[] elems, MinOptMax[] lengths,
+ boolean reverse) {
for (int i = 0; i < elems.length; i++) {
- if (lengths[i] == null) {
+ int effIndex;
+ if (reverse) {
+ effIndex = elems.length - 1 - i;
+ } else {
+ effIndex = i;
+ }
+ if (lengths[effIndex] == null) {
//Zeroed border or padding doesn't create a fence
continue;
- } else if (elems[i] instanceof BorderOrPaddingElement) {
+ } else if (elems[effIndex] instanceof BorderOrPaddingElement) {
//Border or padding form fences!
break;
- } else if (!elems[i].isConditional()) {
+ } else if (!elems[effIndex].isConditional()) {
break;
}
if (log.isDebugEnabled()) {
- log.debug("Nulling conditional element using 4.3.1, rule 1: " + elems[i]);
+ log.debug("Nulling conditional element using 4.3.1, rule 1: " + elems[effIndex]);
}
- lengths[i] = null;
+ lengths[effIndex] = null;
}
if (log.isTraceEnabled() && elems.length > 0) {
log.trace("-->Resulting list: " + toString(elems, lengths));
@@ -341,24 +355,55 @@ public class SpaceResolver {
}
}
+ private boolean hasFirstPart() {
+ return firstPart != null && firstPart.length > 0;
+ }
+
+ private boolean hasSecondPart() {
+ return secondPart != null && secondPart.length > 0;
+ }
+
private void resolve() {
if (breakPoss != null) {
- if (firstPart != null) {
- removeConditionalBorderAndPadding(firstPart, firstPartLengths);
- performSpaceResolutionRule1(firstPart, firstPartLengths);
+ if (hasFirstPart()) {
+ removeConditionalBorderAndPadding(firstPart, firstPartLengths, true);
+ performSpaceResolutionRule1(firstPart, firstPartLengths, true);
performSpaceResolutionRules2to3(firstPart, firstPartLengths);
}
- if (secondPart != null) {
- removeConditionalBorderAndPadding(secondPart, secondPartLengths);
- performSpaceResolutionRule1(secondPart, secondPartLengths);
+ if (hasSecondPart()) {
+ removeConditionalBorderAndPadding(secondPart, secondPartLengths, false);
+ performSpaceResolutionRule1(secondPart, secondPartLengths, false);
performSpaceResolutionRules2to3(secondPart, secondPartLengths);
}
if (noBreak != null) {
performSpaceResolutionRules2to3(noBreak, noBreakLengths);
}
} else {
- if (isFirst || isLast) {
- performSpaceResolutionRule1(secondPart, secondPartLengths);
+ if (isFirst) {
+ removeConditionalBorderAndPadding(secondPart, secondPartLengths, false);
+ performSpaceResolutionRule1(secondPart, secondPartLengths, false);
+ }
+ if (isLast) {
+ removeConditionalBorderAndPadding(firstPart, firstPartLengths, true);
+ performSpaceResolutionRule1(firstPart, firstPartLengths, true);
+ }
+
+ if (hasFirstPart()) {
+ //Now that we've handled isFirst/isLast conditions, we need to look at the
+ //active part in its normal order so swap it back.
+ log.trace("Swapping first and second parts.");
+ UnresolvedListElementWithLength[] tempList;
+ MinOptMax[] tempLengths;
+ tempList = secondPart;
+ tempLengths = secondPartLengths;
+ secondPart = firstPart;
+ secondPartLengths = firstPartLengths;
+ firstPart = tempList;
+ firstPartLengths = tempLengths;
+ if (hasFirstPart()) {
+ throw new IllegalStateException("Didn't expect more than one parts in a"
+ + "no-break condition.");
+ }
}
performSpaceResolutionRules2to3(secondPart, secondPartLengths);
}
@@ -396,7 +441,7 @@ public class SpaceResolver {
glue2shrink -= glue1.opt - glue1.min;
glue2shrink -= glue3.opt - glue3.min;
-
+ boolean hasPrecedingNonBlock = false;
if (log.isDebugEnabled()) {
log.debug("noBreakLength=" + noBreakLength
+ ", glue1=" + glue1
@@ -439,8 +484,9 @@ public class SpaceResolver {
false, (Position)null, true));
iter.add(new KnuthGlue(glue3.opt, glue3.max - glue3.opt, glue3.opt - glue3.min,
(Position)null, true));
+ hasPrecedingNonBlock = true;
}
- if (isLast) {
+ if (isLast && hasPrecedingNonBlock) {
//Otherwise, the preceding penalty and glue will be cut off
iter.add(new KnuthBox(0, (Position)null, true));
}
@@ -494,9 +540,7 @@ public class SpaceResolver {
}
} else {
for (int i = 0; i < resolver.noBreak.length; i++) {
- if (resolver.noBreak[i] instanceof SpaceElement) {
- resolver.noBreak[i].notifyLayoutManager(resolver.noBreakLengths[i]);
- }
+ resolver.noBreak[i].notifyLayoutManager(resolver.noBreakLengths[i]);
}
}
}
@@ -550,9 +594,7 @@ public class SpaceResolver {
throw new IllegalStateException("Only applicable to no-break situations");
}
for (int i = 0; i < resolver.secondPart.length; i++) {
- if (resolver.secondPart[i] instanceof SpaceElement) {
- resolver.secondPart[i].notifyLayoutManager(resolver.secondPartLengths[i]);
- }
+ resolver.secondPart[i].notifyLayoutManager(resolver.secondPartLengths[i]);
}
}
@@ -619,18 +661,14 @@ public class SpaceResolver {
}
}
//last = !iter.hasNext();
- if (breakPoss == null & unresolvedSecond.size() == 0) {
+ if (breakPoss == null && unresolvedSecond.size() == 0 && !last) {
+ log.trace("Swap first and second parts in no-break condition,"
+ + " second part is empty.");
//The first list is reversed, so swap if this shouldn't happen
List swapList = unresolvedSecond;
unresolvedSecond = unresolvedFirst;
unresolvedFirst = swapList;
}
- //Need to reverse the order of the first part
- //From here on further down, the first part in the unresolved list is
- //always the one nearest to the break.
- if (unresolvedFirst.size() > 0) {
- Collections.reverse(unresolvedFirst);
- }
log.debug("----start space resolution (first=" + first + ", last=" + last + ")...");
SpaceResolver resolver = new SpaceResolver(
diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
index e7478fe75..c8cedb0bb 100644
--- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
@@ -184,10 +184,7 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager
LinkedList returnList = new LinkedList();
- if (!bSpaceBeforeServed) {
- addKnuthElementsForSpaceBefore(returnList, alignment);
- bSpaceBeforeServed = true;
- }
+ addKnuthElementsForSpaceBefore(returnList, alignment);
//Spaces, border and padding to be repeated at each break
addPendingMarks(context);
diff --git a/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java
index 4d551743c..f805fe9c7 100644
--- a/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java
@@ -181,7 +181,8 @@ public class TableLayoutManager extends BlockStackingLayoutManager
addKnuthElementsForSpaceBefore(returnList, alignment);
if (getTable().isSeparateBorderModel()) {
- addKnuthElementsForBorderPaddingBefore(returnList);
+ addKnuthElementsForBorderPaddingBefore(returnList, !firstVisibleMarkServed);
+ firstVisibleMarkServed = true;
}
//Spaces, border and padding to be repeated at each break
@@ -283,7 +284,7 @@ public class TableLayoutManager extends BlockStackingLayoutManager
}
wrapPositionElements(contentList, returnList);
if (getTable().isSeparateBorderModel()) {
- addKnuthElementsForBorderPaddingAfter(returnList);
+ addKnuthElementsForBorderPaddingAfter(returnList, true);
}
addKnuthElementsForSpaceAfter(returnList, alignment);
addKnuthElementsForBreakAfter(returnList, context);
diff --git a/test/layoutengine/testcases/block-container_space-before_space-after_1.xml b/test/layoutengine/testcases/block-container_space-before_space-after_1.xml
index ed4615b9a..37b7b87c2 100644
--- a/test/layoutengine/testcases/block-container_space-before_space-after_1.xml
+++ b/test/layoutengine/testcases/block-container_space-before_space-after_1.xml
@@ -154,8 +154,6 @@ Two blocks, testing conditionality="discard".
<box w="0"/> <!-- SpaceHandlingPosition-bearing helper box -->
- <box w="0"/> <!-- This is used to make sure the preceding glue is not cut off -->
-
<skip>3</skip>
</element-list>
</checks>
diff --git a/test/layoutengine/testcases/block_space-before_space-after_2.xml b/test/layoutengine/testcases/block_space-before_space-after_2.xml
index 14944f232..0676277f9 100644
--- a/test/layoutengine/testcases/block_space-before_space-after_2.xml
+++ b/test/layoutengine/testcases/block_space-before_space-after_2.xml
@@ -150,8 +150,6 @@ Two blocks, testing conditionality="discard".
<box w="0"/> <!-- SpaceHandlingPosition-bearing helper box -->
- <box w="0"/> <!-- This is used to make sure the preceding glue is not cut off -->
-
<skip>3</skip>
</element-list>
</checks>
diff --git a/test/layoutengine/testcases/block_space-before_space-after_9.xml b/test/layoutengine/testcases/block_space-before_space-after_9.xml
new file mode 100644
index 000000000..4df459117
--- /dev/null
+++ b/test/layoutengine/testcases/block_space-before_space-after_9.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2005 The Apache Software Foundation
+
+ Licensed 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 if the isLast case is properly handled. In this case the part list has to be
+ reversed to do the conditionals removal, but then has to be reversed again to its natural order
+ so space resolution rules 2 and 3 are properly performed.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="normal" page-width="5in" page-height="1in">
+ <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 space-before="11pt" space-after="11pt">
+ <fo:block space-before="12pt" space-after="12pt">
+ <fo:block space-before="13pt" space-after="13pt" border="solid 1pt">
+ Apache FOP!
+ </fo:block>
+ </fo:block>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <element-list category="breaker">
+ <box w="0"/>
+ <penalty w="0" p="INF"/>
+ <glue w="1000"/>
+
+ <box w="14400"/>
+
+ <box w="0"/>
+ <penalty w="0" p="INF"/>
+ <glue w="1000"/>
+
+ <box w="0"/>
+ <skip>3</skip>
+ </element-list>
+ <true xpath="not(boolean(//flow/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//flow/block[1]/@space-after))"/>
+ <true xpath="not(boolean(//flow/block[1]/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//flow/block[1]/block[1]/@space-after))"/>
+ <true xpath="not(boolean(//flow/block[1]/block[1]/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//flow/block[1]/block[1]/block[1]/@space-after))"/>
+ <eval expected="1000 1000 1000 1000" xpath="//flow/block[1]/block[1]/block[1]/@bap"/>
+ </checks>
+</testcase>
diff --git a/test/layoutengine/testcases/block_space-before_space-after_9a.xml b/test/layoutengine/testcases/block_space-before_space-after_9a.xml
new file mode 100644
index 000000000..07f378368
--- /dev/null
+++ b/test/layoutengine/testcases/block_space-before_space-after_9a.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2005 The Apache Software Foundation
+
+ Licensed 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 if the isLast case is properly handled. In this case the part list has to be
+ reversed to do the conditionals removal, but then has to be reversed again to its natural order
+ so space resolution rules 2 and 3 are properly performed.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="normal" page-width="5in" page-height="1in">
+ <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 space-before="11pt" space-after="11pt">
+ <fo:block space-before="12pt" space-after="12pt">
+ <fo:block space-before="13pt" space-after="13pt" border="solid 1pt">
+ Apache FOP!
+ <fo:block break-before="page"/>
+ Apache FOP!!!
+ </fo:block>
+ </fo:block>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <element-list category="breaker" index="0">
+ <box w="0"/> <!-- SpaceHandlingPosition -->
+ <penalty w="0" p="INF"/>
+ <glue w="1000"/>
+
+ <box w="14400"/>
+
+ <skip>3</skip> <!-- the last of the three holds a SpaceHandlingBreakPosition -->
+ </element-list>
+ <element-list category="breaker" index="1">
+ <box w="0"/> <!-- SpaceHandlingPosition -->
+
+ <box w="0"/> <!-- empty block used to cause the break-before -->
+ <penalty w="0" p="0"/>
+
+ <box w="14400"/>
+
+ <box w="0"/>
+ <penalty w="0" p="INF"/>
+ <glue w="1000"/>
+ <box w="0"/> <!-- SpaceHandlingPosition -->
+
+ <skip>3</skip>
+ </element-list>
+
+ <true xpath="not(boolean(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/@space-after))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@space-after))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block[1]/@space-after))"/>
+ <eval expected="1000 1000 1000 0" xpath="//pageViewport[@nr=1]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block[1]/@bap"/>
+
+ <true xpath="not(boolean(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/@space-after))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@space-after))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block[1]/@space-before))"/>
+ <true xpath="not(boolean(//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block[1]/@space-after))"/>
+ <eval expected="1000 1000 0 1000" xpath="//pageViewport[@nr=2]/page/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/block[1]/@bap"/>
+ </checks>
+</testcase>
diff --git a/test/layoutengine/testcases/list-block_space-before_space-after_1.xml b/test/layoutengine/testcases/list-block_space-before_space-after_1.xml
index 4c77cc01a..82af9d20d 100644
--- a/test/layoutengine/testcases/list-block_space-before_space-after_1.xml
+++ b/test/layoutengine/testcases/list-block_space-before_space-after_1.xml
@@ -196,8 +196,6 @@ Two blocks, testing conditionality="discard".
<box w="0"/> <!-- SpaceHandlingPosition-bearing helper box -->
- <box w="0"/> <!-- This is used to make sure the preceding glue is not cut off -->
-
<skip>3</skip>
</element-list>
diff --git a/test/layoutengine/testcases/region_side_space-resolution.xml b/test/layoutengine/testcases/region_side_space-resolution.xml
index a7e8af0ec..912fa6e16 100644
--- a/test/layoutengine/testcases/region_side_space-resolution.xml
+++ b/test/layoutengine/testcases/region_side_space-resolution.xml
@@ -52,7 +52,6 @@
<box w="14400"/>
<box w="0"/> <!-- SpaceHandlingPosition -->
- <box w="0"/>
<skip>3</skip>
</element-list>
diff --git a/test/layoutengine/testcases/table_space-before_space-after_1.xml b/test/layoutengine/testcases/table_space-before_space-after_1.xml
index 2d3041041..430d8689a 100644
--- a/test/layoutengine/testcases/table_space-before_space-after_1.xml
+++ b/test/layoutengine/testcases/table_space-before_space-after_1.xml
@@ -178,8 +178,6 @@ Two blocks, testing conditionality="discard".
<box w="0"/> <!-- SpaceHandlingPosition-bearing helper box -->
- <box w="0"/> <!-- This is used to make sure the preceding glue is not cut off -->
-
<skip>3</skip>
</element-list>