]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Correct a few more problems related to leaders: text-align was not handled correctly...
authorManuel Mall <manuel@apache.org>
Mon, 14 Nov 2005 05:05:35 +0000 (05:05 +0000)
committerManuel Mall <manuel@apache.org>
Mon, 14 Nov 2005 05:05:35 +0000 (05:05 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@344037 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/area/inline/FilledArea.java
src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java
src/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java
test/layoutengine/disabled-testcases.txt
test/layoutengine/standard-testcases/leader_border_padding.xml
test/layoutengine/standard-testcases/leader_leader-pattern_use-content.xml
test/layoutengine/standard-testcases/leader_leader-pattern_use-content_bug.xml [new file with mode: 0755]
test/layoutengine/standard-testcases/leader_text-align.xml [new file with mode: 0755]

index 9c3bcf4ca5dff2a518c985602c28598a7f308cfc..214e4110a0c44c1f6a4d63f33bb608772ba804b6 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.fop.area.inline;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.ArrayList;
+import java.util.Iterator;
 
 /**
  * Filled area.
@@ -84,7 +85,21 @@ public class FilledArea extends InlineParent {
     }
 
     /**
-     * Get the child areas for this filed area.
+     * @see org.apache.fop.area.Area#getBPD
+     */
+    public int getBPD() {
+        int bpd = 0;
+        for (Iterator childAreaIt = getChildAreas().iterator(); childAreaIt.hasNext();) {
+            InlineArea area = (InlineArea)childAreaIt.next();
+            if (bpd < area.getBPD()) {
+                bpd = area.getBPD();
+            }
+        }
+        return bpd;
+    }
+    
+    /**
+     * Get the child areas for this filled area.
      * This copies the references of the inline areas so that
      * it fills the total width of the area a whole number of times
      * for the unit width.
index ea1eb11a02d359323a33d0b6c3c1f7d7f3ccec0a..c24245f79b83fc0218e6db12fddd6feca769dd57 100755 (executable)
@@ -98,18 +98,13 @@ public class InlineLayoutManager extends InlineStackingLayoutManager {
     
     /** @see LayoutManager#initialize */
     public void initialize() {
-        inlineProps = fobj.getCommonMarginInline();
-        borderProps = fobj.getCommonBorderPaddingBackground();
-
-        int padding = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
-        padding += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE,
-                                             false);
-        padding += borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false, this);
-        padding += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
-        extraBPD = new MinOptMax(padding);
+        int padding = 0;
         font = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo(), this);
         lineHeight = fobj.getLineHeight();
+
         if (fobj instanceof Inline) {
+            inlineProps = fobj.getCommonMarginInline();
+            borderProps = fobj.getCommonBorderPaddingBackground();
             alignmentAdjust = ((Inline)fobj).getAlignmentAdjust();
             alignmentBaseline = ((Inline)fobj).getAlignmentBaseline();
             baselineShift = ((Inline)fobj).getBaselineShift();
@@ -120,42 +115,57 @@ public class InlineLayoutManager extends InlineStackingLayoutManager {
             baselineShift = ((Leader)fobj).getBaselineShift();
             dominantBaseline = ((Leader)fobj).getDominantBaseline();
         }
+        if (borderProps != null) {
+            padding = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
+            padding += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE,
+                                                 false);
+            padding += borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false, this);
+            padding += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
+        }
+        extraBPD = new MinOptMax(padding);
 
     }
 
     /** @see InlineStackingLayoutManager#getExtraIPD(boolean, boolean) */
     protected MinOptMax getExtraIPD(boolean isNotFirst, boolean isNotLast) {
-        int borderAndPadding 
-            = borderProps.getPadding(CommonBorderPaddingBackground.START, isNotFirst, this);
-        borderAndPadding 
-            += borderProps.getBorderWidth(CommonBorderPaddingBackground.START, isNotFirst);
-        borderAndPadding 
-            += borderProps.getPadding(CommonBorderPaddingBackground.END, isNotLast, this);
-        borderAndPadding 
-            += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, isNotLast);
+        int borderAndPadding = 0;
+        if (borderProps != null) {
+            borderAndPadding 
+                = borderProps.getPadding(CommonBorderPaddingBackground.START, isNotFirst, this);
+            borderAndPadding 
+                += borderProps.getBorderWidth(CommonBorderPaddingBackground.START, isNotFirst);
+            borderAndPadding 
+                += borderProps.getPadding(CommonBorderPaddingBackground.END, isNotLast, this);
+            borderAndPadding 
+                += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, isNotLast);
+        }
         return new MinOptMax(borderAndPadding);
     }
 
 
     /** @see InlineStackingLayoutManager#hasLeadingFence(boolean) */
     protected boolean hasLeadingFence(boolean isNotFirst) {
-        return borderProps.getPadding(CommonBorderPaddingBackground.START, isNotFirst, this) > 0
-            || borderProps.getBorderWidth(CommonBorderPaddingBackground.START, isNotFirst) > 0;
+        return borderProps != null
+            && (borderProps.getPadding(CommonBorderPaddingBackground.START, isNotFirst, this) > 0
+                || borderProps.getBorderWidth(CommonBorderPaddingBackground.START, isNotFirst) > 0
+               );
     }
 
     /** @see InlineStackingLayoutManager#hasTrailingFence(boolean) */
     protected boolean hasTrailingFence(boolean isNotLast) {
-        return borderProps.getPadding(CommonBorderPaddingBackground.END, isNotLast, this) > 0
-            || borderProps.getBorderWidth(CommonBorderPaddingBackground.END, isNotLast) > 0;
+        return borderProps != null
+            && (borderProps.getPadding(CommonBorderPaddingBackground.END, isNotLast, this) > 0
+                || borderProps.getBorderWidth(CommonBorderPaddingBackground.END, isNotLast) > 0
+               );
     }
 
     /** @see InlineStackingLayoutManager#getSpaceStart */
     protected SpaceProperty getSpaceStart() {
-        return inlineProps.spaceStart;
+        return inlineProps != null ? inlineProps.spaceStart : null;
     }
     /** @see InlineStackingLayoutManager#getSpaceEnd */
     protected SpaceProperty getSpaceEnd() {
-        return inlineProps.spaceEnd;
+        return inlineProps != null ? inlineProps.spaceEnd : null;
     }
     
     /** @see org.apache.fop.layoutmgr.inline.InlineLayoutManager#createArea(boolean) */
index ede040d213746d67f574bc07d2635238cafd6bee..9731cc9607cedc4832adb40adc7340202ef0db95 100644 (file)
@@ -201,6 +201,14 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
 
             widthAdjustArea(curArea, context);
 
+            if (commonBorderPaddingBackground != null) {
+                // Add border and padding to area
+                TraitSetter.setBorderPaddingTraits(curArea,
+                                                   commonBorderPaddingBackground,
+                                                   false, false, this);
+                TraitSetter.addBackground(curArea, commonBorderPaddingBackground, this);
+            }
+
             // add content areas
             KnuthPossPosIter contentIter = new KnuthPossPosIter(contentList, 0, contentList.size());
             clm.addAreas(contentIter, context);
@@ -251,11 +259,19 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
                                     new LeafPosition(this, -1), true));
         seq.add(new KnuthPenalty(0, KnuthElement.INFINITE, false,
                                         new LeafPosition(this, -1), true));
-        seq.add
-            (new KnuthGlue(areaInfo.ipdArea.opt,
-                           areaInfo.ipdArea.max - areaInfo.ipdArea.opt,
-                           areaInfo.ipdArea.opt - areaInfo.ipdArea.min, 
-                           new LeafPosition(this, 0), false));
+        if (alignment == EN_JUSTIFY || alignment == 0) {
+            seq.add
+                (new KnuthGlue(areaInfo.ipdArea.opt,
+                               areaInfo.ipdArea.max - areaInfo.ipdArea.opt,
+                               areaInfo.ipdArea.opt - areaInfo.ipdArea.min, 
+                               new LeafPosition(this, 0), false));
+        } else {
+            seq.add
+                (new KnuthGlue(areaInfo.ipdArea.opt,
+                               0,
+                               0, 
+                               new LeafPosition(this, 0), false));
+        }
         seq.add(new KnuthInlineBox(0, alignmentContext,
                                     new LeafPosition(this, -1), true));
 
@@ -294,11 +310,19 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
                                     new LeafPosition(this, -1), true));
         returnList.add(new KnuthPenalty(0, KnuthElement.INFINITE, false,
                                         new LeafPosition(this, -1), true));
-        returnList.add
-            (new KnuthGlue(areaInfo.ipdArea.opt,
-                           areaInfo.ipdArea.max - areaInfo.ipdArea.opt,
-                           areaInfo.ipdArea.opt - areaInfo.ipdArea.min, 
-                           new LeafPosition(this, 0), false));
+        if (alignment == EN_JUSTIFY || alignment == 0) {
+            returnList.add
+                (new KnuthGlue(areaInfo.ipdArea.opt,
+                               areaInfo.ipdArea.max - areaInfo.ipdArea.opt,
+                               areaInfo.ipdArea.opt - areaInfo.ipdArea.min, 
+                               new LeafPosition(this, 0), false));
+        } else {
+            returnList.add
+                (new KnuthGlue(areaInfo.ipdArea.opt,
+                               0,
+                               0, 
+                               new LeafPosition(this, 0), false));
+        }
         returnList.add(new KnuthInlineBox(0, areaInfo.alignmentContext,
                                     new LeafPosition(this, -1), true));
 
index 86ba9003144d7e741c752e07b1b63ce051949f64..7fc92925859c187715a4f464ff45ec053f5cdd78 100644 (file)
@@ -19,6 +19,7 @@ inline_letter-spacing.xml
 inline_word-spacing.xml
 inline_word-spacing_text-align_justify.xml
 leader-alignment.xml
+leader_leader-pattern_use-content_bug.xml
 list-block_keep-with-previous.xml
 list-item_block_keep-with-previous.xml
 page-breaking_4.xml
index aa89bcbfa24126431c9746ec97ee16d0cf46c0b6..a51514635ac4049855e6b233d8ea530a59b923e7 100755 (executable)
                space solid 1pt red border
           </fo:block>
           <fo:block>
-          <!-- use content currently causes a ClassCastException
             <fo:leader leader-length="36pt" leader-pattern="use-content" border="solid 1pt red">x</fo:leader>
                use-content x solid 1pt red border
-          -->
           </fo:block>
           <fo:block margin="10pt 0pt 10pt 0pt">
             <fo:leader leader-length="36pt" leader-pattern="dots" border="solid 5pt red" padding="5pt"/>
                space solid 5pt red border 5pt padding
           </fo:block>
           <fo:block margin="10pt 0pt 10pt 0pt">
-          <!-- use content currently causes a ClassCastException
             <fo:leader leader-length="36pt" leader-pattern="use-content" border="solid 5pt red" padding="5pt">x</fo:leader>
                use-content x solid 5pt red border 5pt padding
-          -->
           </fo:block>
           <fo:block margin="2pt 0pt 2pt 0pt">
             <fo:leader leader-length="36pt" leader-pattern="dots" border-style="solid" border-width="1pt 2pt 3pt 4pt" border-color="red" padding="1pt 2pt 3pt 4pt"/>
                space uneven border and padding
           </fo:block>
           <fo:block margin="2pt 0pt 2pt 0pt">
-          <!-- use content currently causes a ClassCastException
             <fo:leader leader-length="36pt" leader-pattern="use-content" border-style="solid" border-width="1pt 2pt 3pt 4pt" border-color="red" padding="1pt 2pt 3pt 4pt">x</fo:leader>
                use-content x uneven border and padding
-          -->
           </fo:block>
         </fo:flow>
       </fo:page-sequence>
     <eval expected="(solid,#ff0000,1000)" xpath="//flow/block[4]/lineArea/space/@border-end"/>
     <eval expected="(solid,#ff0000,1000)" xpath="//flow/block[4]/lineArea/space/@border-start"/>
 
+    <eval expected="11100" xpath="//flow/block[5]/lineArea/@bpd"/>
+    <eval expected="360000" xpath="//flow/block[5]/lineArea/@ipd"/>
+    <eval expected="34000" xpath="//flow/block[5]/lineArea/inlineparent/@ipd"/>
+    <eval expected="36000" xpath="//flow/block[5]/lineArea/inlineparent/@ipda"/>
+    <eval expected="0" xpath="//flow/block[5]/lineArea/inlineparent/@offset"/>
+    <eval expected="(solid,#ff0000,1000)" xpath="//flow/block[5]/lineArea/inlineparent/@border-after"/>
+    <eval expected="(solid,#ff0000,1000)" xpath="//flow/block[5]/lineArea/inlineparent/@border-before"/>
+    <eval expected="(solid,#ff0000,1000)" xpath="//flow/block[5]/lineArea/inlineparent/@border-end"/>
+    <eval expected="(solid,#ff0000,1000)" xpath="//flow/block[5]/lineArea/inlineparent/@border-start"/>
+
     <eval expected="11100" xpath="//flow/block[6]/lineArea/@bpd"/>
     <eval expected="360000" xpath="//flow/block[6]/lineArea/@ipd"/>
     <eval expected="16000" xpath="//flow/block[6]/lineArea/inlineparent/@ipd"/>
     <eval expected="5000" xpath="//flow/block[9]/lineArea/space/@padding-end"/>
     <eval expected="5000" xpath="//flow/block[9]/lineArea/space/@padding-start"/>
 
+    <eval expected="11100" xpath="//flow/block[10]/lineArea/@bpd"/>
+    <eval expected="360000" xpath="//flow/block[10]/lineArea/@ipd"/>
+    <eval expected="16000" xpath="//flow/block[10]/lineArea/inlineparent/@ipd"/>
+    <eval expected="36000" xpath="//flow/block[10]/lineArea/inlineparent/@ipda"/>
+    <eval expected="0" xpath="//flow/block[10]/lineArea/inlineparent/@offset"/>
+    <eval expected="(solid,#ff0000,5000)" xpath="//flow/block[10]/lineArea/inlineparent/@border-after"/>
+    <eval expected="(solid,#ff0000,5000)" xpath="//flow/block[10]/lineArea/inlineparent/@border-before"/>
+    <eval expected="(solid,#ff0000,5000)" xpath="//flow/block[10]/lineArea/inlineparent/@border-end"/>
+    <eval expected="(solid,#ff0000,5000)" xpath="//flow/block[10]/lineArea/inlineparent/@border-start"/>
+    <eval expected="5000" xpath="//flow/block[10]/lineArea/inlineparent/@padding-after"/>
+    <eval expected="5000" xpath="//flow/block[10]/lineArea/inlineparent/@padding-before"/>
+    <eval expected="5000" xpath="//flow/block[10]/lineArea/inlineparent/@padding-end"/>
+    <eval expected="5000" xpath="//flow/block[10]/lineArea/inlineparent/@padding-start"/>
+
     <eval expected="11100" xpath="//flow/block[11]/lineArea/@bpd"/>
     <eval expected="360000" xpath="//flow/block[11]/lineArea/@ipd"/>
     <eval expected="24000" xpath="//flow/block[11]/lineArea/inlineparent/@ipd"/>
     <eval expected="1000" xpath="//flow/block[14]/lineArea/space/@padding-before"/>
     <eval expected="2000" xpath="//flow/block[14]/lineArea/space/@padding-end"/>
     <eval expected="4000" xpath="//flow/block[14]/lineArea/space/@padding-start"/>
+
+    <eval expected="11100" xpath="//flow/block[15]/lineArea/@bpd"/>
+    <eval expected="360000" xpath="//flow/block[15]/lineArea/@ipd"/>
+    <eval expected="24000" xpath="//flow/block[15]/lineArea/inlineparent/@ipd"/>
+    <eval expected="36000" xpath="//flow/block[15]/lineArea/inlineparent/@ipda"/>
+    <eval expected="0" xpath="//flow/block[15]/lineArea/inlineparent/@offset"/>
+    <eval expected="(solid,#ff0000,3000)" xpath="//flow/block[15]/lineArea/inlineparent/@border-after"/>
+    <eval expected="(solid,#ff0000,1000)" xpath="//flow/block[15]/lineArea/inlineparent/@border-before"/>
+    <eval expected="(solid,#ff0000,2000)" xpath="//flow/block[15]/lineArea/inlineparent/@border-end"/>
+    <eval expected="(solid,#ff0000,4000)" xpath="//flow/block[15]/lineArea/inlineparent/@border-start"/>
+    <eval expected="3000" xpath="//flow/block[15]/lineArea/inlineparent/@padding-after"/>
+    <eval expected="1000" xpath="//flow/block[15]/lineArea/inlineparent/@padding-before"/>
+    <eval expected="2000" xpath="//flow/block[15]/lineArea/inlineparent/@padding-end"/>
+    <eval expected="4000" xpath="//flow/block[15]/lineArea/inlineparent/@padding-start"/>
   </checks>
 </testcase>
index a27218736c9817b9ebac08e251520a845b0c0cbc..9b8306bbdd3f86fdc782312df82e966d2643f008 100644 (file)
               Content is svg 10 x 10
           </fo:block>
           <fo:block>
-            <fo:leader leader-pattern="use-content">
-              <fo:instream-foreign-object>
+            <fo:leader leader-pattern="use-content"><fo:instream-foreign-object>
                 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="10">
                 <rect x="0" y="0" width="10" height="5" style="fill:red"/>
-                <rect x="5" y="5" width="10" height="5" style="fill:black"/>
+                <rect x="10" y="5" width="10" height="5" style="fill:black"/>
                 </svg>
-                </fo:instream-foreign-object>
-            </fo:leader>
-              Content is svg 20 x 10 which is wider than the default leader-length
+                </fo:instream-foreign-object></fo:leader>
+              Content is svg 20 x 10 which is wider than the leader-length
           </fo:block>
         </fo:flow>
       </fo:page-sequence>
     <eval expected="0 0 0 0" xpath="//flow/block[6]/lineArea/inlineparent/inlineparent[3]/viewport/@bap"/>
  
     <eval expected="11100" xpath="//flow/block[7]/lineArea/@bpd"/>
-    <eval expected="23336" xpath="//flow/block[7]/lineArea/inlineparent/@ipd"/>
+    <eval expected="20000" xpath="//flow/block[7]/lineArea/inlineparent/@ipd"/>
     <eval expected="0" xpath="//flow/block[7]/lineArea/inlineparent/@offset"/>
-    <eval expected="23336" xpath="//flow/block[7]/lineArea/inlineparent/inlineparent[1]/@ipd"/>
+    <eval expected="20000" xpath="//flow/block[7]/lineArea/inlineparent/inlineparent[1]/@ipd"/>
     <eval expected="0" xpath="//flow/block[7]/lineArea/inlineparent/inlineparent[1]/@offset"/>
     <eval expected="20000" xpath="//flow/block[7]/lineArea/inlineparent/inlineparent[1]/viewport/@ipd"/>
     <eval expected="-1384" xpath="//flow/block[7]/lineArea/inlineparent/inlineparent[1]/viewport/@offset"/>
diff --git a/test/layoutengine/standard-testcases/leader_leader-pattern_use-content_bug.xml b/test/layoutengine/standard-testcases/leader_leader-pattern_use-content_bug.xml
new file mode 100755 (executable)
index 0000000..9a77666
--- /dev/null
@@ -0,0 +1,57 @@
+<?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 demonstrates a bug with fo:leader use-content
+    </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="5in">
+          <fo:region-body/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="normal" white-space-collapse="true">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>
+            <fo:leader leader-length="36pt" leader-pattern="use-content" font-size="24pt">x</fo:leader>
+               use-content x font-size="24pt"
+          </fo:block>
+          <fo:block margin="10pt 0pt 10pt 0pt">
+            <fo:leader leader-length="36pt" leader-pattern="use-content" border="solid 5pt red" padding="5pt">x</fo:leader>
+               use-content x solid 5pt red border 5pt padding
+          </fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="22200" xpath="//flow/block[1]/lineArea/@bpd"/>
+    <eval expected="360000" xpath="//flow/block[1]/lineArea/@ipd"/>
+    <eval expected="16000" xpath="//flow/block[1]/lineArea/inlineparent/@ipd"/>
+    <eval expected="8616" xpath="//flow/block[1]/lineArea/text/@offset"/>
+
+    <eval expected="11100" xpath="//flow/block[2]/lineArea/@bpd"/>
+    <eval expected="360000" xpath="//flow/block[2]/lineArea/@ipd"/>
+    <eval expected="11100" xpath="//flow/block[2]/lineArea/inlineparent/@bpd"/>
+    <eval expected="16000" xpath="//flow/block[2]/lineArea/inlineparent/@ipd"/>
+    <eval expected="36000" xpath="//flow/block[2]/lineArea/inlineparent/@ipda"/>
+  </checks>
+</testcase>
diff --git a/test/layoutengine/standard-testcases/leader_text-align.xml b/test/layoutengine/standard-testcases/leader_text-align.xml
new file mode 100755 (executable)
index 0000000..086090f
--- /dev/null
@@ -0,0 +1,158 @@
+<?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 fo:leader with different text-align
+    </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="5in">
+          <fo:region-body/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="normal" white-space-collapse="true">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>
+            <fo:leader leader-pattern="dots"/>
+               dots
+          </fo:block>
+          <fo:block>
+            <fo:leader leader-pattern="rule" rule-style="double"/>
+               rule double
+          </fo:block>
+          <fo:block>
+            <fo:leader leader-pattern="space"/>
+               space
+          </fo:block>
+          <fo:block>
+            <fo:leader leader-pattern="use-content">x</fo:leader>
+               use-content x
+          </fo:block>
+          <fo:block text-align-last="justify">
+            <fo:leader leader-pattern="dots"/>
+               dots text-align-last="justify"
+          </fo:block>
+          <fo:block text-align-last="justify">
+            <fo:leader leader-pattern="rule" rule-style="double"/>
+               rule double text-align-last="justify"
+          </fo:block>
+          <fo:block text-align-last="justify">
+            <fo:leader leader-pattern="space"/>
+               space text-align-last="justify"
+          </fo:block>
+          <fo:block text-align-last="justify">
+            <fo:leader leader-pattern="use-content">x</fo:leader>
+               use-content x text-align-last="justify"
+          </fo:block>
+          <fo:block text-align-last="end">
+            <fo:leader leader-pattern="dots"/>
+               dots text-align-last="end"
+          </fo:block>
+          <fo:block text-align-last="end">
+            <fo:leader leader-pattern="rule" rule-style="double"/>
+               rule double text-align-last="end"
+          </fo:block>
+          <fo:block text-align-last="end">
+            <fo:leader leader-pattern="space"/>
+               space text-align-last="end"
+          </fo:block>
+          <fo:block text-align-last="end">
+            <fo:leader leader-pattern="use-content">x</fo:leader>
+               use-content x text-align-last="end"
+          </fo:block>
+          <fo:block text-align-last="center">
+            <fo:leader leader-pattern="dots"/>
+               dots text-align-last="center"
+          </fo:block>
+          <fo:block text-align-last="center">
+            <fo:leader leader-pattern="rule" rule-style="double"/>
+               rule double text-align-last="center"
+          </fo:block>
+          <fo:block text-align-last="center">
+            <fo:leader leader-pattern="space"/>
+               space text-align-last="center"
+          </fo:block>
+          <fo:block text-align-last="center">
+            <fo:leader leader-pattern="use-content">x</fo:leader>
+               use-content x text-align-last="center"
+          </fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="360000" xpath="//flow/block[1]/lineArea/@ipd"/>
+    <eval expected="12000" xpath="//flow/block[1]/lineArea/inlineparent/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[2]/lineArea/@ipd"/>
+    <eval expected="12000" xpath="//flow/block[2]/lineArea/leader/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[3]/lineArea/@ipd"/>
+    <eval expected="12000" xpath="//flow/block[3]/lineArea/space/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[4]/lineArea/@ipd"/>
+    <eval expected="12000" xpath="//flow/block[4]/lineArea/inlineparent/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[5]/lineArea/@ipd"/>
+    <eval expected="215456" xpath="//flow/block[5]/lineArea/inlineparent/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[6]/lineArea/@ipd"/>
+    <eval expected="178155" xpath="//flow/block[6]/lineArea/leader/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[7]/lineArea/@ipd"/>
+    <eval expected="206165" xpath="//flow/block[7]/lineArea/space/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[8]/lineArea/@ipd"/>
+    <eval expected="161589" xpath="//flow/block[8]/lineArea/inlineparent/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[9]/lineArea/@ipd"/>
+    <eval expected="215088" xpath="//flow/block[9]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[9]/lineArea/inlineparent/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[10]/lineArea/@ipd"/>
+    <eval expected="178404" xpath="//flow/block[10]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[10]/lineArea/leader/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[11]/lineArea/@ipd"/>
+    <eval expected="205752" xpath="//flow/block[11]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[11]/lineArea/space/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[12]/lineArea/@ipd"/>
+    <eval expected="162396" xpath="//flow/block[12]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[12]/lineArea/inlineparent/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[13]/lineArea/@ipd"/>
+    <eval expected="100878" xpath="//flow/block[13]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[13]/lineArea/inlineparent/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[14]/lineArea/@ipd"/>
+    <eval expected="82536" xpath="//flow/block[14]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[14]/lineArea/leader/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[15]/lineArea/@ipd"/>
+    <eval expected="96210" xpath="//flow/block[15]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[15]/lineArea/space/@ipd"/>
+
+    <eval expected="360000" xpath="//flow/block[16]/lineArea/@ipd"/>
+    <eval expected="74532" xpath="//flow/block[16]/lineArea/@start-indent"/>
+    <eval expected="12000" xpath="//flow/block[16]/lineArea/inlineparent/@ipd"/>
+  </checks>
+</testcase>