]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Added support for alignment-baseline on fo:inline-container
authorVincent Hennebert <vhennebert@apache.org>
Thu, 7 Nov 2013 12:29:17 +0000 (12:29 +0000)
committerVincent Hennebert <vhennebert@apache.org>
Thu, 7 Nov 2013 12:29:17 +0000 (12:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_InlineContainer@1539611 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/layoutmgr/inline/InlineContainerLayoutManager.java
test/layoutengine/standard-testcases/inline-container_alignment-baseline.xml [new file with mode: 0644]

index 626ce8209a5af7043670d035ffa6d423a889ecfb..b043268bd8fb1b60c4a3b7a67b04366351fd6966 100644 (file)
@@ -57,7 +57,6 @@ import org.apache.fop.layoutmgr.TraitSetter;
 public class InlineContainerLayoutManager extends AbstractLayoutManager implements InlineLevelLayoutManager {
 
     private CommonBorderPaddingBackground borderProps;
-    private int alignmentBaseline = EN_BASELINE;
     private int contentAreaIPD;
     private int contentAreaBPD;
 
@@ -77,6 +76,11 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
         borderProps = node.getCommonBorderPaddingBackground();
     }
 
+    private InlineContainer getInlineContainer() {
+        assert fobj instanceof InlineContainer;
+        return (InlineContainer) fobj;
+    }
+
     @Override
     public List<KnuthSequence> getNextKnuthElements(LayoutContext context, int alignment) {
         determineIPD(context);
@@ -95,7 +99,7 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
     }
 
     private void determineIPD(LayoutContext layoutContext) {
-        LengthRangeProperty ipd = ((InlineContainer) fobj).getInlineProgressionDimension();
+        LengthRangeProperty ipd = getInlineContainer().getInlineProgressionDimension();
         Property optimum = ipd.getOptimum(this);
         if (optimum.isAuto()) {
             contentAreaIPD = layoutContext.getRefIPD();
@@ -114,7 +118,7 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
             LayoutContext childLC = LayoutContext.offspringOf(layoutContext); // TODO copyOf? newInstance?
             childLC.setRefIPD(layoutContext.getRefIPD());
             @SuppressWarnings("unchecked")
-            List<ListElement> childElements = childLM.getNextKnuthElements(childLC, alignmentBaseline);
+            List<ListElement> childElements = childLM.getNextKnuthElements(childLC, alignment);
             allChildElements.addAll(childElements);
             // TODO breaks, keeps, empty content
         }
@@ -127,7 +131,7 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
     }
 
     private void determineBPD() {
-        LengthRangeProperty bpd = ((InlineContainer) fobj).getBlockProgressionDimension();
+        LengthRangeProperty bpd = getInlineContainer().getBlockProgressionDimension();
         Property optimum = bpd.getOptimum(this);
         int actualBPD = ElementListUtils.calcContentLength(childElements);
         if (optimum.isAuto()) {
@@ -181,15 +185,15 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
     }
 
     private boolean canRecoverFromOverflow() {
-        return ((InlineContainer) fobj).getOverflow() != EN_ERROR_IF_OVERFLOW;
+        return getInlineContainer().getOverflow() != EN_ERROR_IF_OVERFLOW;
     }
 
     private int getAlignmentPoint() {
-        Length alignmentAdjust = ((InlineContainer) fobj).getAlignmentAdjust();
+        Length alignmentAdjust = getInlineContainer().getAlignmentAdjust();
         int baseline = alignmentAdjust.getEnum();
         if (baseline == Constants.EN_AUTO
                 || baseline == Constants.EN_BASELINE) {
-            return getInlineContainerBaselineOffset(alignmentBaseline);
+            return getInlineContainerBaselineOffset(getInlineContainer().getAlignmentBaseline());
         } else if (baseline != 0) {
             return getInlineContainerBaselineOffset(baseline);
         } else {
@@ -294,7 +298,7 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
     }
 
     private boolean needClip() {
-        int overflow = ((InlineContainer) fobj).getOverflow();
+        int overflow = getInlineContainer().getOverflow();
         return (overflow == EN_HIDDEN || overflow == EN_ERROR_IF_OVERFLOW);
     }
 
diff --git a/test/layoutengine/standard-testcases/inline-container_alignment-baseline.xml b/test/layoutengine/standard-testcases/inline-container_alignment-baseline.xml
new file mode 100644 (file)
index 0000000..53b9be0
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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>
+      Checks that the alignment-baseline property on inline-container behaves properly.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="page"
+          page-height="170pt" page-width="220pt" margin="10pt">
+          <fo:region-body/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+
+      <fo:page-sequence master-reference="page">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block space-after="10pt">alignment-baseline="before-edge":</fo:block>
+          <fo:block>The line before. The line before. Before: <fo:inline-container width="100pt" 
+              alignment-baseline="before-edge">
+              <fo:block>Inside the inline-container.</fo:block>
+            </fo:inline-container> After the inline-container.</fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+
+      <fo:page-sequence master-reference="page">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block space-after="10pt">alignment-baseline="central":</fo:block>
+          <fo:block>The line before. The line before. Before: <fo:inline-container width="100pt" 
+              alignment-baseline="central">
+              <fo:block>Inside the inline-container.</fo:block>
+            </fo:inline-container> After the inline-container.</fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+
+    </fo:root>
+  </fo>
+
+  <checks>
+
+    <!-- before-edge -->
+    <eval expected="28800" xpath="//pageSequence[1]//flow/block[2]/lineArea[2]/@bpd"/>
+    <eval expected="0"     xpath="//pageSequence[1]//flow/block[2]/lineArea[2]/text[1]/@offset"/>
+    <eval expected="8616"  xpath="//pageSequence[1]//flow/block[2]/lineArea[2]/text[1]/@baseline"/>
+    <eval expected="28800" xpath="//pageSequence[1]//flow/block[2]/lineArea[2]/viewport/@bpd"/>
+    <eval expected="0"     xpath="//pageSequence[1]//flow/block[2]/lineArea[2]/viewport/@offset"/>
+
+    <!-- central -->
+    <eval expected="28800" xpath="//pageSequence[2]//flow/block[2]/lineArea[2]/@bpd"/>
+    <eval expected="8850"  xpath="//pageSequence[2]//flow/block[2]/lineArea[2]/text[1]/@offset"/>
+    <eval expected="8616"  xpath="//pageSequence[2]//flow/block[2]/lineArea[2]/text[1]/@baseline"/>
+    <eval expected="28800" xpath="//pageSequence[2]//flow/block[2]/lineArea[2]/viewport/@bpd"/>
+    <eval expected="0"     xpath="//pageSequence[2]//flow/block[2]/lineArea[2]/viewport/@offset"/>
+
+  </checks>
+</testcase>