]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Revisit background-position shorthand implementation: always convert to percentages...
authorAndreas L. Delmelle <adelmelle@apache.org>
Sun, 10 Feb 2008 12:50:47 +0000 (12:50 +0000)
committerAndreas L. Delmelle <adelmelle@apache.org>
Sun, 10 Feb 2008 12:50:47 +0000 (12:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@620276 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/FOPropertyMapping.java
src/java/org/apache/fop/fo/properties/BackgroundPositionShorthand.java [new file with mode: 0644]
src/java/org/apache/fop/fo/properties/BackgroundPositionShorthandParser.java [deleted file]
test/fotree/testcases/background-position-shorthand-test.fo

index 434d4acaf171f6c32f3f7e885f047259ab1e666d..b78ec49c4682f025d0ab36a04246b03fd57dd3b5 100644 (file)
@@ -26,7 +26,7 @@ import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.datatypes.LengthBase;
 import org.apache.fop.fo.expr.PropertyException;
 import org.apache.fop.fo.flow.table.TableFObj.ColumnNumberPropertyMaker;
-import org.apache.fop.fo.properties.BackgroundPositionShorthandParser;
+import org.apache.fop.fo.properties.BackgroundPositionShorthand;
 import org.apache.fop.fo.properties.BorderSpacingShorthandParser;
 import org.apache.fop.fo.properties.BorderWidthPropertyMaker;
 import org.apache.fop.fo.properties.BoxPropShorthandParser;
@@ -2534,15 +2534,33 @@ public final class FOPropertyMapping implements Constants {
         addPropertyMaker("background", m);
 
         // background-position
-        m  = new ListProperty.Maker(PR_BACKGROUND_POSITION);
+        m  = new BackgroundPositionShorthand.Maker(PR_BACKGROUND_POSITION);
         m.setInherited(false);
         m.addKeyword("left", "0% 50%");
+        m.addKeyword("left center", "0% 50%");
+        m.addKeyword("center left", "0% 50%");
         m.addKeyword("right", "100% 50%");
+        m.addKeyword("right center", "100% 50%");
+        m.addKeyword("center right", "100% 50%");
         m.addKeyword("center", "50% 50%");
+        m.addKeyword("center center", "50% 50%");
         m.addKeyword("top", "50% 0%");
+        m.addKeyword("top center", "50% 0%");
+        m.addKeyword("center top", "50% 0%");
         m.addKeyword("bottom", "50% 100%");
+        m.addKeyword("bottom center", "50% 100%");
+        m.addKeyword("center bottom", "50% 100%");
+        m.addKeyword("top left", "0% 0%");
+        m.addKeyword("left top", "0% 0%");
+        m.addKeyword("top right", "100% 0%");
+        m.addKeyword("right top", "100% 0%");
+        m.addKeyword("bottom left", "0% 100%");
+        m.addKeyword("left bottom", "0% 100%");
+        m.addKeyword("bottom right", "100% 100%");
+        m.addKeyword("right bottom", "100% 100%");
         m.setDefault("0% 0%");
-        m.setDatatypeParser(new BackgroundPositionShorthandParser());
+        m.setPercentBase(LengthBase.CUSTOM_BASE);
+        m.setDatatypeParser(new BackgroundPositionShorthand.Parser());
         addPropertyMaker("background-position", m);
 
         // border
diff --git a/src/java/org/apache/fop/fo/properties/BackgroundPositionShorthand.java b/src/java/org/apache/fop/fo/properties/BackgroundPositionShorthand.java
new file mode 100644 (file)
index 0000000..ba2ee7c
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * 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$ */
+
+package org.apache.fop.fo.properties;
+
+import java.util.List;
+
+import org.apache.fop.datatypes.PercentBase;
+import org.apache.fop.datatypes.PercentBaseContext;
+import org.apache.fop.fo.Constants;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.PropertyList;
+import org.apache.fop.fo.expr.PropertyException;
+
+/**
+ * Class encapsulating functionality for the <a href="http://www.w3.org/TR/xsl/#background-position>
+ * <code>background-position</code></a> shorthand.
+ */
+
+public class BackgroundPositionShorthand extends ListProperty {
+
+    /**
+     * Inner class for creating instances of this property
+     *
+     */
+    public static class Maker extends ListProperty.Maker {
+
+        /** {@inheritDoc} */
+        public Maker(int propId) {
+            super(propId);
+        }
+        
+        
+        /** 
+         * {@inheritDoc} 
+         * If only <code>background-position-horizontal</code> is
+         * specified, <code>background-position-vertical</code> is set
+         * to "50%".
+         */
+        public Property make(PropertyList propertyList, String value, FObj fo) throws PropertyException {
+            Property p = super.make(propertyList, value, fo);
+            if (p.getList().size() == 1) {
+                /* only background-position-horizontal specified 
+                 * through the shorthand, as a length or percentage:
+                 * background-position-vertical=50% (see: XSL-FO 1.1 -- 7.31.2)
+                 */
+                PropertyMaker m = FObj.getPropertyMakerFor(
+                                    Constants.PR_BACKGROUND_POSITION_VERTICAL);
+                p.getList().add(1, m.make(propertyList, "50%", fo));
+            }
+            return p;
+        }
+
+        /** 
+         * {@inheritDoc} 
+         * Returns a {@link org.apache.fop.datatypes.PercentBase} whose
+         * <code>getDimension()</code> returns 1.
+         */
+        public PercentBase getP\91rcentBase() {
+            return new PercentBase() {
+                /** {@inheritDoc} */
+                public int getBaseLength(PercentBaseContext context) throws PropertyException {
+                    return 0;
+                }
+
+                /** {@inheritDoc} */
+                public double getBaseValue() {
+                    return 0;
+                }
+
+                /** {@inheritDoc} */
+                public int getDimension() {
+                    return 1;
+                }
+                
+            };
+        }
+    }
+    
+    /**
+     * Inner class to provide shorthand parsing capabilities
+     *
+     */
+    public static class Parser extends GenericShorthandParser {
+
+        /** {@inheritDoc} */
+        public Property getValueForProperty(int propId,
+                                            Property property,
+                                            PropertyMaker maker,
+                                            PropertyList propertyList)
+                        throws PropertyException {
+            
+            int index = -1;
+            List propList = property.getList();
+            if (propId == Constants.PR_BACKGROUND_POSITION_HORIZONTAL) {
+                index = 0;
+            } else if (propId == Constants.PR_BACKGROUND_POSITION_VERTICAL) {
+                index = 1;
+            }
+            if (index >= 0) {
+                return maker.convertProperty(
+                        (Property) propList.get(index), 
+                        propertyList, 
+                        propertyList.getFObj());
+            } // else: invalid index? shouldn't happen...
+            return null;
+        }
+    }
+
+}
diff --git a/src/java/org/apache/fop/fo/properties/BackgroundPositionShorthandParser.java b/src/java/org/apache/fop/fo/properties/BackgroundPositionShorthandParser.java
deleted file mode 100644 (file)
index 76c9342..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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$ */
-
-package org.apache.fop.fo.properties;
-
-import java.util.List;
-import org.apache.fop.fo.Constants;
-import org.apache.fop.fo.PropertyList;
-import org.apache.fop.fo.expr.PropertyException;
-
-/**
- * A shorthand parser for the background-position shorthand
- */
-
-public class BackgroundPositionShorthandParser extends GenericShorthandParser {
-
-    /**
-     * {@inheritDoc} 
-     */
-    public Property getValueForProperty(int propId,
-                                        Property property,
-                                        PropertyMaker maker,
-                                        PropertyList propertyList)
-                    throws PropertyException {
-        
-        int index = -1;
-        List propList = property.getList();
-        if (propId == Constants.PR_BACKGROUND_POSITION_HORIZONTAL) {
-            index = 0;
-        } else if (propId == Constants.PR_BACKGROUND_POSITION_VERTICAL) {
-            index = 1;
-            if (propList.size() == 1) {
-                /* only background-position-horizontal specified 
-                 * through the shorthand:
-                 * background-position-vertical=50% (see: XSL-FO 1.0 -- 7.29.2)
-                 */
-                return maker.make(propertyList, "50%", propertyList.getParentFObj());
-            }
-        }
-        if (index >= 0) {
-            return (Property) propList.get(index);
-        } // else: invalid index? shouldn't happen...
-        return null;
-    }
-}
index 6ef374544febdf2f7fdb638b2939358ec86b27fa..6bc793535ecdea1c4533b37393874ad611824ac0 100644 (file)
   <fo:page-sequence master-reference="simpleA4">
     <fo:flow flow-name="xsl-region-body">
       <fo:block background-image="../../resources/images/bgimg72dpi.jpg">
-        <test:assert property="background-position-horizontal" expected="0.0%"/>
-        <test:assert property="background-position-vertical" expected="0.0%"/>
+        <test:assert property="background-position-horizontal" expected="0mpt"/>
+        <test:assert property="background-position-vertical" expected="0mpt"/>
         Test background-position shorthand: initial values
       </fo:block>
       <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
                 background-position="50% 50%">
-        <test:assert property="background-position-horizontal" expected="0.5"/>
-        <test:assert property="background-position-vertical" expected="0.5"/>
+        <test:assert property="background-position-horizontal" expected="50.0%"/>
+        <test:assert property="background-position-vertical" expected="50.0%"/>
         Test background-position shorthand: "50% 50%"
       </fo:block>
       <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
                 background-position="2in 50%">
         <test:assert property="background-position-horizontal" expected="144000mpt"/>
-        <test:assert property="background-position-vertical" expected="0.5"/>
+        <test:assert property="background-position-vertical" expected="50.0%"/>
         Test background-position shorthand: "2in 50%"
       </fo:block>
       <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
                 background-position="100%">
-        <test:assert property="background-position-horizontal" expected="1.0"/>
+        <test:assert property="background-position-horizontal" expected="100.0%"/>
         <test:assert property="background-position-vertical" expected="50.0%"/>
         Test background-position shorthand: "100%"
       </fo:block>
       <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
                 background-position="top center">
-        <test:assert property="background-position-horizontal" expected="top"/>
-        <test:assert property="background-position-vertical" expected="center"/>
+        <test:assert property="background-position-horizontal" expected="50.0%"/>
+        <test:assert property="background-position-vertical" expected="0mpt"/>
         Test background-position shorthand: "top center"
       </fo:block>
       <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
                 background-position="right bottom">
-        <test:assert property="background-position-horizontal" expected="right"/>
-        <test:assert property="background-position-vertical" expected="bottom"/>
+        <test:assert property="background-position-horizontal" expected="100.0%"/>
+        <test:assert property="background-position-vertical" expected="100.0%"/>
         Test background-position shorthand: "right bottom"
       </fo:block>
       <fo:block background-position="right bottom">
         <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
                   background-position="inherit">
-          <test:assert property="background-position-horizontal" expected="right"/>
-          <test:assert property="background-position-vertical" expected="bottom"/>
+          <test:assert property="background-position-horizontal" expected="100.0%"/>
+          <test:assert property="background-position-vertical" expected="100.0%"/>
           Test background-position shorthand: "inherit"
         </fo:block>
       </fo:block>
+      <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
+                background-position="top right">
+        <test:assert property="background-position-horizontal" expected="100.0%"/>
+        <test:assert property="background-position-vertical" expected="0mpt"/>
+        Test background-position shorthand: "top right"
+      </fo:block>
+      <fo:block background-image="../../resources/images/bgimg72dpi.jpg"
+                background-position="center">
+        <test:assert property="background-position-horizontal" expected="50.0%"/>
+        <test:assert property="background-position-vertical" expected="50.0%"/>
+        Test background-position shorthand: "center"
+      </fo:block>
     </fo:flow>
   </fo:page-sequence>
 </fo:root>