From: Jeremias Maerki Date: Thu, 20 Oct 2005 13:30:19 +0000 (+0000) Subject: Fix for the two problems raised by Simon: X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=7bb607f9c844db40133a3782bc25b7784d71efd4;p=xmlgraphics-fop.git Fix for the two problems raised by Simon: In some cases the element lists were processed in the wrong direction. Fixed by not reversing the list itself anymore but teaching the conditional handling to process the lists backwards. The problem is now covered by block_space-before_space-after_9 and 9a. While fixing this another problem surfaced with hard breaks where two element lists are generated. The problem is now covered by block_space-before_space-after_9a. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_SpaceResolution@326900 13f79535-47bb-0310-9956-ffa450edef68 --- 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". - - 3 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". - - 3 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 @@ + + + + + +

+ 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. +

+
+ + + + + + + + + + + + + Apache FOP! + + + + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + +
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 @@ + + + + + +

+ 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. +

+
+ + + + + + + + + + + + + Apache FOP! + + Apache FOP!!! + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + +
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". - - 3 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 @@ - 3 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". - - 3