diff options
author | Andreas L. Delmelle <adelmelle@apache.org> | 2008-02-10 12:50:47 +0000 |
---|---|---|
committer | Andreas L. Delmelle <adelmelle@apache.org> | 2008-02-10 12:50:47 +0000 |
commit | 2d84b6d1ed7b09a95cad0305e8377f397e455f8f (patch) | |
tree | a6cee7a46d07923c45b66f012f51c408a5c3ceca | |
parent | 7ee30cf256088a4cc15e94915e84ba9b7fb8c790 (diff) | |
download | xmlgraphics-fop-2d84b6d1ed7b09a95cad0305e8377f397e455f8f.tar.gz xmlgraphics-fop-2d84b6d1ed7b09a95cad0305e8377f397e455f8f.zip |
Revisit background-position shorthand implementation: always convert to percentages (more possibilities/precision).
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@620276 13f79535-47bb-0310-9956-ffa450edef68
4 files changed, 171 insertions, 76 deletions
diff --git a/src/java/org/apache/fop/fo/FOPropertyMapping.java b/src/java/org/apache/fop/fo/FOPropertyMapping.java index 434d4acaf..b78ec49c4 100644 --- a/src/java/org/apache/fop/fo/FOPropertyMapping.java +++ b/src/java/org/apache/fop/fo/FOPropertyMapping.java @@ -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 index 000000000..ba2ee7c60 --- /dev/null +++ b/src/java/org/apache/fop/fo/properties/BackgroundPositionShorthand.java @@ -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‘rcentBase() { + 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 index 76c934234..000000000 --- a/src/java/org/apache/fop/fo/properties/BackgroundPositionShorthandParser.java +++ /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; - } -} diff --git a/test/fotree/testcases/background-position-shorthand-test.fo b/test/fotree/testcases/background-position-shorthand-test.fo index 6ef374544..6bc793535 100644 --- a/test/fotree/testcases/background-position-shorthand-test.fo +++ b/test/fotree/testcases/background-position-shorthand-test.fo @@ -25,48 +25,60 @@ <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> |