diff options
Diffstat (limited to 'src/java/org/apache/fop')
15 files changed, 481 insertions, 23 deletions
diff --git a/src/java/org/apache/fop/apps/FopFactory.java b/src/java/org/apache/fop/apps/FopFactory.java index a0acb36a3..152d75829 100644 --- a/src/java/org/apache/fop/apps/FopFactory.java +++ b/src/java/org/apache/fop/apps/FopFactory.java @@ -22,17 +22,23 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.net.MalformedURLException; -import java.util.List; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; +import org.xml.sax.SAXException; + import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.apache.fop.fo.ElementMapping; import org.apache.fop.fo.ElementMappingRegistry; import org.apache.fop.hyphenation.HyphenationTreeResolver; @@ -41,7 +47,6 @@ import org.apache.fop.layoutmgr.LayoutManagerMaker; import org.apache.fop.render.RendererFactory; import org.apache.fop.render.XMLHandlerRegistry; import org.apache.fop.util.ContentHandlerFactoryRegistry; -import org.xml.sax.SAXException; /** * Factory class which instantiates new Fop and FOUserAgent instances. This class also holds @@ -110,6 +115,8 @@ public class FopFactory { /** Optional overriding LayoutManagerMaker */ private LayoutManagerMaker lmMakerOverride = null; + + private Set ignoredNamespaces = new java.util.HashSet(); /** * Main constructor. @@ -431,6 +438,40 @@ public class FopFactory { this.pageWidth = pageWidth; } + /** + * Adds a namespace to the set of ignored namespaces. + * If FOP encounters a namespace which it cannot handle, it issues a warning except if this + * namespace is in the ignored set. + * @param namespaceURI the namespace URI + */ + public void ignoreNamespace(String namespaceURI) { + this.ignoredNamespaces.add(namespaceURI); + } + + /** + * Adds a collection of namespaces to the set of ignored namespaces. + * If FOP encounters a namespace which it cannot handle, it issues a warning except if this + * namespace is in the ignored set. + * @param namespaceURIs the namespace URIs + */ + public void ignoreNamespaces(Collection namespaceURIs) { + this.ignoredNamespaces.addAll(namespaceURIs); + } + + /** + * Indicates whether a namespace URI is on the ignored list. + * @param namespaceURI the namespace URI + * @return true if the namespace is ignored by FOP + */ + public boolean isNamespaceIgnored(String namespaceURI) { + return this.ignoredNamespaces.contains(namespaceURI); + } + + /** @return the set of namespaces that are ignored by FOP */ + public Set getIgnoredNamespace() { + return Collections.unmodifiableSet(this.ignoredNamespaces); + } + //------------------------------------------- Configuration stuff /** diff --git a/src/java/org/apache/fop/area/Area.java b/src/java/org/apache/fop/area/Area.java index b0916abda..51c95f0ca 100644 --- a/src/java/org/apache/fop/area/Area.java +++ b/src/java/org/apache/fop/area/Area.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. + * Copyright 1999-2006 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. @@ -20,13 +20,15 @@ package org.apache.fop.area; import java.io.Serializable; +import java.util.Collections; +import java.util.Iterator; import java.util.Map; -import java.util.HashMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.datatypes.ColorType; import org.apache.fop.traits.BorderProps; +import org.apache.fop.util.QName; // If the area appears more than once in the output // or if the area has external data it is cached @@ -129,8 +131,11 @@ public class Area implements Serializable { /** * Traits for this area stored in a HashMap */ - protected HashMap props = null; + protected Map props = null; + /** Foreign attributes */ + protected Map foreignAttributes = null; + /** * logging instance */ @@ -462,6 +467,57 @@ public class Area implements Serializable { } } + /** + * Sets a foreign attribute. + * @param name the qualified name of the attribute + * @param value the attribute value + */ + public void setForeignAttribute(QName name, String value) { + if (this.foreignAttributes == null) { + this.foreignAttributes = new java.util.HashMap(); + } + this.foreignAttributes.put(name, value); + } + + /** + * Set foreign attributes from a Map. + * @param atts a Map with attributes (keys: QName, values: String) + */ + public void setForeignAttributes(Map atts) { + if (atts.size() == 0) { + return; + } + Iterator iter = atts.keySet().iterator(); + while (iter.hasNext()) { + QName qName = (QName)iter.next(); + String value = (String)atts.get(qName); + //The casting is only to ensure type safety (too bad we can't use generics, yet) + setForeignAttribute(qName, value); + } + } + + /** + * Returns the value of a foreign attribute on the area. + * @param name the qualified name of the attribute + * @return the attribute value or null if it isn't set + */ + public String getForeignAttributeValue(QName name) { + if (this.foreignAttributes != null) { + return (String)this.foreignAttributes.get(name); + } else { + return null; + } + } + + /** @return the foreign attributes associated with this area */ + public Map getForeignAttributes() { + if (this.foreignAttributes != null) { + return Collections.unmodifiableMap(this.foreignAttributes); + } else { + return Collections.EMPTY_MAP; + } + } + /** @see java.lang.Object#toString() */ public String toString() { StringBuffer sb = new StringBuffer(super.toString()); diff --git a/src/java/org/apache/fop/area/RegionViewport.java b/src/java/org/apache/fop/area/RegionViewport.java index ff3146e17..23017fded 100644 --- a/src/java/org/apache/fop/area/RegionViewport.java +++ b/src/java/org/apache/fop/area/RegionViewport.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2006 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. @@ -115,7 +115,10 @@ public class RegionViewport extends Area implements Cloneable { RegionViewport rv = new RegionViewport((Rectangle2D)viewArea.clone()); rv.regionReference = (RegionReference)regionReference.clone(); if (props != null) { - rv.props = (HashMap)props.clone(); + rv.props = new HashMap(props); + } + if (foreignAttributes != null) { + rv.foreignAttributes = new HashMap(foreignAttributes); } return rv; } diff --git a/src/java/org/apache/fop/fo/ElementMappingRegistry.java b/src/java/org/apache/fop/fo/ElementMappingRegistry.java index 8ab5a3d98..9bb0ab19b 100644 --- a/src/java/org/apache/fop/fo/ElementMappingRegistry.java +++ b/src/java/org/apache/fop/fo/ElementMappingRegistry.java @@ -163,4 +163,12 @@ public class ElementMappingRegistry { return mapping.getDOMImplementation(); } + /** + * Indicates whether a namespace is known to FOP. + * @param namespaceURI the namespace URI + * @return true if the namespace is known. + */ + public boolean isKnownNamespace(String namespaceURI) { + return this.namespaces.containsKey(namespaceURI); + } } diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java index 2711bd169..f64bae87a 100644 --- a/src/java/org/apache/fop/fo/FOTreeBuilder.java +++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java @@ -304,6 +304,10 @@ public class FOTreeBuilder extends DefaultHandler { try { foNode = fobjMaker.make(currentFObj); + if (rootFObj == null) { + rootFObj = (Root) foNode; + rootFObj.setFOEventHandler(foEventHandler); + } propertyList = foNode.createPropertyList(currentPropertyList, foEventHandler); foNode.processNode(localName, getEffectiveLocator(), attlist, propertyList); foNode.startOfNode(); @@ -325,10 +329,7 @@ public class FOTreeBuilder extends DefaultHandler { delegate = subHandler; } - if (rootFObj == null) { - rootFObj = (Root) foNode; - rootFObj.setFOEventHandler(foEventHandler); - } else { + if (currentFObj != null) { currentFObj.addChildNode(foNode); } diff --git a/src/java/org/apache/fop/fo/FObj.java b/src/java/org/apache/fop/fo/FObj.java index af45735e6..44da27900 100644 --- a/src/java/org/apache/fop/fo/FObj.java +++ b/src/java/org/apache/fop/fo/FObj.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. + * Copyright 1999-2006 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. @@ -19,6 +19,7 @@ package org.apache.fop.fo; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; @@ -29,6 +30,7 @@ import org.apache.fop.apps.FOPException; import org.apache.fop.fo.extensions.ExtensionAttachment; import org.apache.fop.fo.flow.Marker; import org.apache.fop.fo.properties.PropertyMaker; +import org.apache.fop.util.QName; import org.xml.sax.Attributes; import org.xml.sax.Locator; @@ -46,6 +48,9 @@ public abstract class FObj extends FONode implements Constants { /** The list of extension attachments, null if none */ private List extensionAttachments = null; + /** The map of foreign attributes, null if none */ + private Map foreignAttributes = null; + /** Used to indicate if this FO is either an Out Of Line FO (see rec) or a descendant of one. Used during validateChildNode() FO validation. @@ -473,6 +478,40 @@ public abstract class FObj extends FONode implements Constants { return extensionAttachments; } } + + /** + * Adds a foreign attribute to this FObj. + * @param uri the namespace URI + * @param qName the fully qualified name + * @param value the attribute value + * @todo Handle this over FOP's property mechanism so we can use inheritance. + */ + public void addForeignAttribute(String uri, + String qName, String value) { + if (qName == null) { + throw new NullPointerException("Parameter qName must not be null"); + } + if (foreignAttributes == null) { + foreignAttributes = new java.util.HashMap(); + } + String localName = qName; + String prefix = null; + int p = localName.indexOf(':'); + if (p > 0) { + prefix = localName.substring(0, p); + localName = localName.substring(p + 1); + } + foreignAttributes.put(new QName(uri, prefix, localName), value); + } + + /** @return the map of foreign attributes */ + public Map getForeignAttributes() { + if (foreignAttributes == null) { + return Collections.EMPTY_MAP; + } else { + return foreignAttributes; + } + } } diff --git a/src/java/org/apache/fop/fo/PropertyList.java b/src/java/org/apache/fop/fo/PropertyList.java index 7d4b0132d..5bf00346a 100644 --- a/src/java/org/apache/fop/fo/PropertyList.java +++ b/src/java/org/apache/fop/fo/PropertyList.java @@ -24,7 +24,7 @@ import org.xml.sax.Attributes; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.fop.apps.FOPException; +import org.apache.fop.apps.FopFactory; import org.apache.fop.fo.expr.PropertyException; import org.apache.fop.fo.properties.CommonAbsolutePosition; import org.apache.fop.fo.properties.CommonAccessibility; @@ -295,13 +295,20 @@ public abstract class PropertyList { } String attributeNS; + FopFactory factory = getFObj().getUserAgent().getFactory(); for (int i = 0; i < attributes.getLength(); i++) { /* convert all attributes with the same namespace as the fo element for this fObj */ - attributeNS = attributes.getURI(i); - if (attributeNS.length() == 0 || attributeNS.equals(fobj.getNamespaceURI())) { - attributeName = attributes.getQName(i); - attributeValue = attributes.getValue(i); + attributeNS = attributes.getURI(i); + attributeName = attributes.getQName(i); + attributeValue = attributes.getValue(i); + if (attributeNS.length() == 0) { convertAttributeToProperty(attributes, attributeName, attributeValue); + } else if (!factory.isNamespaceIgnored(attributeNS)) { + if (factory.getElementMappingRegistry().isKnownNamespace(attributeNS)) { + getFObj().addForeignAttribute(attributeNS, attributeName, attributeValue); + } else { + handleInvalidProperty(attributeName); + } } } } diff --git a/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java b/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java index 310b61550..5f823d2a3 100644 --- a/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java +++ b/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2006 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. @@ -19,16 +19,17 @@ package org.apache.fop.fo.extensions; import org.apache.fop.fo.ElementMapping; +import org.apache.fop.fo.UnknownXMLObj; import java.util.HashMap; /** - * Element mapping for the pdf bookmark extension. - * This sets up the mapping for the classes that handle the - * pdf bookmark extension. + * Element mapping for FOP's proprietary extension to XSL-FO. */ public class ExtensionElementMapping extends ElementMapping { - public static String URI = "http://xml.apache.org/fop/extensions"; + + /** The FOP extension namespace URI */ + public static final String URI = "http://xmlgraphics.apache.org/fop/extensions"; /** * Constructor. @@ -43,6 +44,8 @@ public class ExtensionElementMapping extends ElementMapping { protected void initialize() { if (foObjs == null) { foObjs = new HashMap(); + foObjs.put("outline", new UnknownXMLObj.Maker(URI)); + foObjs.put("label", new UnknownXMLObj.Maker(URI)); } } } diff --git a/src/java/org/apache/fop/fo/extensions/OldExtensionElementMapping.java b/src/java/org/apache/fop/fo/extensions/OldExtensionElementMapping.java new file mode 100644 index 000000000..40ff485e5 --- /dev/null +++ b/src/java/org/apache/fop/fo/extensions/OldExtensionElementMapping.java @@ -0,0 +1,36 @@ +/* + * Copyright 1999-2006 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$ */ + +package org.apache.fop.fo.extensions; + +/** + * Element mapping for the old FOP extension namespace. It is simply mapped to the new namespace. + */ +public class OldExtensionElementMapping extends ExtensionElementMapping { + + /** The old FOP extension namespace URI (FOP 0.20.5 and earlier) */ + public static final String URI = "http://xml.apache.org/fop/extensions"; + + /** + * Constructor. + */ + public OldExtensionElementMapping() { + namespaceURI = URI; + } + +} diff --git a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java index 5fc39972a..d8ded23fe 100644 --- a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. + * Copyright 1999-2006 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. @@ -373,4 +373,12 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager && isFinished()); } + /** + * Transfers foreign attributes from the formatting object to the area. + * @param targetArea the area to set the attributes on + */ + protected void transferForeignAttributes(Area targetArea) { + Map atts = getFObj().getForeignAttributes(); + targetArea.setForeignAttributes(atts); + } } diff --git a/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java index a02e2363d..cfe74ae4f 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java @@ -209,6 +209,7 @@ public abstract class AbstractGraphicsLayoutManager extends LeafNodeLayoutManage Area viewportArea = getChildArea(); TraitSetter.setProducerID(viewportArea, fobj.getId()); + transferForeignAttributes(viewportArea); Viewport vp = new Viewport(viewportArea); TraitSetter.setProducerID(vp, fobj.getId()); diff --git a/src/java/org/apache/fop/render/RendererContextConstants.java b/src/java/org/apache/fop/render/RendererContextConstants.java index c744a82a1..742d56f68 100644 --- a/src/java/org/apache/fop/render/RendererContextConstants.java +++ b/src/java/org/apache/fop/render/RendererContextConstants.java @@ -44,4 +44,10 @@ public interface RendererContextConstants { /** The configuration for the XMLHandler. */ String HANDLER_CONFIGURATION = "cfg"; + /** + * An optional Map (keys: QName, values: String) with attributes containing additional hints + * for rendering. + */ + String FOREIGN_ATTRIBUTES = "foreign-attributes"; + } diff --git a/src/java/org/apache/fop/render/xml/XMLRenderer.java b/src/java/org/apache/fop/render/xml/XMLRenderer.java index 00b204ee0..e97068968 100644 --- a/src/java/org/apache/fop/render/xml/XMLRenderer.java +++ b/src/java/org/apache/fop/render/xml/XMLRenderer.java @@ -45,6 +45,7 @@ import org.apache.fop.render.PrintRenderer; import org.apache.fop.render.Renderer; import org.apache.fop.render.RendererContext; import org.apache.fop.render.XMLHandler; +import org.apache.fop.util.QName; import org.apache.fop.util.XMLizable; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.FOPException; @@ -279,6 +280,16 @@ public class XMLRenderer extends PrintRenderer { * @param name name of the attribute * @param value value of the attribute */ + protected void addAttribute(QName name, String value) { + atts.addAttribute(name.getNamespaceURI(), name.getLocalName(), name.getQName(), + CDATA, value); + } + + /** + * Adds a new attribute to the protected member variable "atts". + * @param name name of the attribute + * @param value value of the attribute + */ protected void addAttribute(String name, int value) { addAttribute(name, Integer.toString(value)); } @@ -376,6 +387,13 @@ public class XMLRenderer extends PrintRenderer { } } } + + //Transfer foreign attributes + Iterator iter = area.getForeignAttributes().entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry)iter.next(); + addAttribute((QName)entry.getKey(), (String)entry.getValue()); + } } private String createString(Rectangle2D rect) { diff --git a/src/java/org/apache/fop/util/QName.java b/src/java/org/apache/fop/util/QName.java new file mode 100644 index 000000000..ccfe05638 --- /dev/null +++ b/src/java/org/apache/fop/util/QName.java @@ -0,0 +1,113 @@ +/* + * Copyright 2006 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$ */ + +package org.apache.fop.util; + +import java.io.Serializable; + +/** + * Represents a qualified name of an XML element or an XML attribute. + * <p> + * Note: This class allows to carry a namespace prefix but it is not used in the equals() and + * hashCode() methods. + */ +public class QName implements Serializable { + + private static final long serialVersionUID = -5225376740044770690L; + + private String namespaceURI; + private String localName; + private String prefix; + private int hashCode; + + /** + * Main constructor. + * @param namespaceURI the namespace URI + * @param prefix the namespace prefix, may be null + * @param localName the local name + */ + public QName(String namespaceURI, String prefix, String localName) { + if (localName == null) { + throw new NullPointerException("Parameter localName must not be null"); + } + if (localName.length() == 0) { + throw new IllegalArgumentException("Parameter localName must not be empty"); + } + this.namespaceURI = namespaceURI; + this.prefix = prefix; + this.localName = localName; + this.hashCode = toHashString().hashCode(); + } + + /** @return the namespace URI */ + public String getNamespaceURI() { + return this.namespaceURI; + } + + /** @return the namespace prefix */ + public String getPrefix() { + return this.prefix; + } + + /** @return the local name */ + public String getLocalName() { + return this.localName; + } + + /** @return the fully qualified name */ + public String getQName() { + return getPrefix() != null ? getPrefix() + ':' + getLocalName() : getLocalName(); + } + + /** @see java.lang.Object#hashCode() */ + public int hashCode() { + return this.hashCode; + } + + /** @see java.lang.Object#equals(java.lang.Object) */ + public boolean equals(Object obj) { + if (obj == null) { + return false; + } else if (obj == this) { + return true; + } else { + if (obj instanceof QName) { + QName other = (QName)obj; + if ((getNamespaceURI() == null && other.getNamespaceURI() == null) + || getNamespaceURI().equals(other.getNamespaceURI())) { + return getLocalName().equals(other.getLocalName()); + } + } + } + return false; + } + + /** @see java.lang.Object#toString() */ + public String toString() { + return prefix != null + ? (prefix + ":" + localName) + : toHashString(); + } + + private String toHashString() { + return (namespaceURI != null + ? ("{" + namespaceURI + "}" + localName) + : localName); + } + +} diff --git a/src/java/org/apache/fop/util/UnitConv.java b/src/java/org/apache/fop/util/UnitConv.java new file mode 100644 index 000000000..0c16cdc3f --- /dev/null +++ b/src/java/org/apache/fop/util/UnitConv.java @@ -0,0 +1,118 @@ +/* + * Copyright 2006 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: FixedLength.java 279656 2005-09-08 22:06:48Z pietsch $ */ + +package org.apache.fop.util; + +/** + * Utility class for unit conversions. + */ +public final class UnitConv { + + /** conversion factory from millimeters to inches. */ + public static final float IN2MM = 25.4f; + + /** conversion factory from centimeters to inches. */ + public static final float IN2CM = 2.54f; + + /** conversion factory from inches to points. */ + public static final int IN2PT = 72; + + /** + * Converts millimeters (mm) to points (pt) + * @param mm the value in mm + * @return the value in pt + */ + public static double mm2pt(double mm) { + return mm * IN2PT / IN2MM; + } + + /** + * Converts millimeters (mm) to millipoints (mpt) + * @param mm the value in mm + * @return the value in mpt + */ + public static double mm2mpt(double mm) { + return mm * 1000 * IN2PT / IN2MM; + } + + /** + * Converts points (pt) to millimeters (mm) + * @param pt the value in pt + * @return the value in mm + */ + public static double pt2mm(double pt) { + return pt * IN2MM / IN2PT; + } + + /** + * Converts millimeters (mm) to inches (in) + * @param mm the value in mm + * @return the value in inches + */ + public static double mm2in(double mm) { + return mm / IN2MM; + } + + /** + * Converts inches (in) to millimeters (mm) + * @param in the value in inches + * @return the value in mm + */ + public static double in2mm(double in) { + return in * IN2MM; + } + + /** + * Converts inches (in) to millipoints (mpt) + * @param in the value in inches + * @return the value in mpt + */ + public static double in2mpt(double in) { + return in * IN2PT * 1000; + } + + /** + * Converts millipoints (mpt) to inches (in) + * @param mpt the value in mpt + * @return the value in inches + */ + public static double mpt2in(double mpt) { + return mpt / IN2PT / 1000; + } + + /** + * Converts millimeters (mm) to pixels (px) + * @param mm the value in mm + * @param resolution the resolution in dpi (dots per inch) + * @return the value in pixels + */ + public static int mm2px(double mm, int resolution) { + return (int)Math.round(mm2in(mm) * resolution); + } + + /** + * Converts millipoints (mpt) to pixels (px) + * @param mpt the value in mpt + * @param resolution the resolution in dpi (dots per inch) + * @return the value in pixels + */ + public static int mpt2px(double mpt, int resolution) { + return (int)Math.round(mpt2in(mpt) * resolution); + } + +} |