diff options
author | Luis Bernardo <lbernardo@apache.org> | 2014-11-10 11:18:43 +0000 |
---|---|---|
committer | Luis Bernardo <lbernardo@apache.org> | 2014-11-10 11:18:43 +0000 |
commit | c446a6368fa7f88ef4efcdc1f17b195ece9b3836 (patch) | |
tree | af19be6a195e03530fa88c59ce96d083ff592226 /src/java | |
parent | fd6d7a7aef4f4154c1b587e5b87158eafe1d3c0f (diff) | |
download | xmlgraphics-fop-c446a6368fa7f88ef4efcdc1f17b195ece9b3836.tar.gz xmlgraphics-fop-c446a6368fa7f88ef4efcdc1f17b195ece9b3836.zip |
FOP-2424: Allow for type1 afm/pfm files to be in a different path than the pfb file
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1637817 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java')
9 files changed, 180 insertions, 59 deletions
diff --git a/src/java/org/apache/fop/fonts/DefaultFontConfig.java b/src/java/org/apache/fop/fonts/DefaultFontConfig.java index 375db34df..72d2280a8 100644 --- a/src/java/org/apache/fop/fonts/DefaultFontConfig.java +++ b/src/java/org/apache/fop/fonts/DefaultFontConfig.java @@ -108,11 +108,13 @@ public final class DefaultFontConfig implements FontConfig { strict); continue; } - Font font = new Font(fontCfg.getAttribute("metrics-url", null), embed, - fontCfg.getAttribute("sub-font", null), fontCfg.getAttributeAsBoolean( - "kerning", true), fontCfg.getAttributeAsBoolean("advanced", true), - fontCfg.getAttribute("encoding-mode", EncodingMode.AUTO.getName()), - fontCfg.getAttribute("embedding-mode", EncodingMode.AUTO.getName())); + Font font = new Font(fontCfg.getAttribute("metrics-url", null), embed, fontCfg.getAttribute( + "embed-url-afm", null), fontCfg.getAttribute("embed-url-pfm", null), + fontCfg.getAttribute("sub-font", null), + fontCfg.getAttributeAsBoolean("kerning", true), fontCfg.getAttributeAsBoolean( + "advanced", true), fontCfg.getAttribute("encoding-mode", + EncodingMode.AUTO.getName()), fontCfg.getAttribute("embedding-mode", + EncodingMode.AUTO.getName())); instance.fonts.add(font); boolean hasTriplets = false; for (Configuration tripletCfg : fontCfg.getChildren("font-triplet")) { @@ -269,6 +271,10 @@ public final class DefaultFontConfig implements FontConfig { private final String embedUri; + private String afm; + + private String pfm; + private final String subFont; private final boolean kerning; @@ -289,10 +295,12 @@ public final class DefaultFontConfig implements FontConfig { return Collections.unmodifiableList(tripletList); } - private Font(String metrics, String embed, String subFont, boolean kerning, + private Font(String metrics, String embed, String afm, String pfm, String subFont, boolean kerning, boolean advanced, String encodingMode, String embeddingMode) { this.metrics = metrics; this.embedUri = embed; + this.afm = afm; + this.pfm = pfm; this.subFont = subFont; this.kerning = kerning; this.advanced = advanced; @@ -339,5 +347,13 @@ public final class DefaultFontConfig implements FontConfig { public String getEmbeddingMode() { return embeddingMode; } + + public String getAfm() { + return afm; + } + + public String getPfm() { + return pfm; + } } } diff --git a/src/java/org/apache/fop/fonts/DefaultFontConfigurator.java b/src/java/org/apache/fop/fonts/DefaultFontConfigurator.java index 9534ef8ad..4a8b11f74 100644 --- a/src/java/org/apache/fop/fonts/DefaultFontConfigurator.java +++ b/src/java/org/apache/fop/fonts/DefaultFontConfigurator.java @@ -144,10 +144,16 @@ public class DefaultFontConfigurator implements FontConfigurator<EmbedFontInfo> throws FOPException, URISyntaxException { String embed = font.getEmbedURI(); String metrics = font.getMetrics(); - String subFont = font.getSubFont(); - URI metricsUri = metrics == null ? null : InternalResourceResolver.cleanURI(metrics); + String afm = font.getAfm(); + String pfm = font.getPfm(); URI embedUri = InternalResourceResolver.cleanURI(embed); + URI metricsUri = metrics == null ? null : InternalResourceResolver.cleanURI(metrics); + URI afmUri = (afm == null) ? null : InternalResourceResolver.cleanURI(afm); + URI pfmUri = (pfm == null) ? null : InternalResourceResolver.cleanURI(pfm); + FontUris fontUris = (afmUri != null || pfmUri != null) ? new FontUris(embedUri, metricsUri, afmUri, + pfmUri) : new FontUris(embedUri, metricsUri); + String subFont = font.getSubFont(); List<FontTriplet> tripletList = font.getTripletList(); // no font triplet info @@ -160,8 +166,8 @@ public class DefaultFontConfigurator implements FontConfigurator<EmbedFontInfo> } EncodingMode encodingMode = EncodingMode.getValue(font.getEncodingMode()); EmbeddingMode embeddingMode = EmbeddingMode.getValue(font.getEmbeddingMode()); - EmbedFontInfo embedFontInfo = new EmbedFontInfo(metricsUri, font.isKerning(), - font.isAdvanced(), tripletList, embedUri, subFont, encodingMode, embeddingMode); + EmbedFontInfo embedFontInfo = new EmbedFontInfo(fontUris, font.isKerning(), font.isAdvanced(), + tripletList, subFont, encodingMode, embeddingMode); if (fontCache != null) { if (!fontCache.containsFont(embedFontInfo)) { fontCache.addFont(embedFontInfo, resourceResolver); diff --git a/src/java/org/apache/fop/fonts/EmbedFontInfo.java b/src/java/org/apache/fop/fonts/EmbedFontInfo.java index 5af3fc5ba..24b218f8d 100644 --- a/src/java/org/apache/fop/fonts/EmbedFontInfo.java +++ b/src/java/org/apache/fop/fonts/EmbedFontInfo.java @@ -34,8 +34,6 @@ public class EmbedFontInfo implements Serializable { /** Serialization Version UID */ private static final long serialVersionUID = 8755432068669997369L; - protected final URI metricsURI; - protected final URI embedURI; /** false, to disable kerning */ protected final boolean kerning; /** false, to disable advanced typographic features */ @@ -55,6 +53,8 @@ public class EmbedFontInfo implements Serializable { private transient boolean embedded = true; + private FontUris fontUris; + /** * Main constructor * @param metricsURI the URI of the XML resource containing font metrics @@ -65,26 +65,42 @@ public class EmbedFontInfo implements Serializable { * @param subFontName the sub-fontname used for TrueType Collections (null otherwise) * @param encodingMode the encoding mode to use for this font */ - public EmbedFontInfo(URI metricsURI, boolean kerning, boolean advanced, - List<FontTriplet> fontTriplets, URI embedURI, String subFontName, + public EmbedFontInfo(FontUris fontUris, boolean kerning, boolean advanced, + List<FontTriplet> fontTriplets, String subFontName, EncodingMode encodingMode, EmbeddingMode embeddingMode) { - this.metricsURI = metricsURI; - this.embedURI = embedURI; this.kerning = kerning; this.advanced = advanced; this.fontTriplets = fontTriplets; this.subFontName = subFontName; this.encodingMode = encodingMode; this.embeddingMode = embeddingMode; + this.fontUris = fontUris; + } + + /** +<<<<<<< HEAD +======= + * Main constructor + * @param metricsURI the URI of the XML resource containing font metrics + * @param kerning True if kerning should be enabled + * @param fontTriplets List of font triplets to associate with this font + * @param embedURI Path to the embeddable font file (may be null) + * @param subFontName the sub-fontname used for TrueType Collections (null otherwise) + */ + public EmbedFontInfo(FontUris fontUris, boolean kerning, boolean advanced, + List<FontTriplet> fontTriplets, String subFontName) { + this(fontUris, kerning, advanced, fontTriplets, subFontName, EncodingMode.AUTO, + EmbeddingMode.AUTO); } /** +>>>>>>> 9c3c942... added uris for afm and pfm font files * Returns the URI of the metrics XML resource * * @return the metrics file path */ public URI getMetricsURI() { - return metricsURI; + return fontUris.getMetrics(); } /** @@ -93,7 +109,7 @@ public class EmbedFontInfo implements Serializable { * @return the font resource URI */ public URI getEmbedURI() { - return embedURI; + return fontUris.getEmbed(); } /** @@ -150,7 +166,7 @@ public class EmbedFontInfo implements Serializable { * @return true if the font is embedded, false if it is referenced. */ public boolean isEmbedded() { - if (embedURI == null) { + if (fontUris.getEmbed() == null) { return false; } else { return this.embedded; @@ -189,7 +205,7 @@ public class EmbedFontInfo implements Serializable { /** {@inheritDoc} */ public String toString() { - return "metrics-uri=" + metricsURI + ", embed-uri=" + embedURI + return "metrics-uri=" + fontUris.getMetrics() + ", embed-uri=" + fontUris.getEmbed() + ", kerning=" + kerning + ", advanced=" + advanced + ", enc-mode=" + encodingMode @@ -198,4 +214,7 @@ public class EmbedFontInfo implements Serializable { + (isEmbedded() ? "" : ", NOT embedded"); } + public FontUris getFontUris() { + return fontUris; + } } diff --git a/src/java/org/apache/fop/fonts/FontLoader.java b/src/java/org/apache/fop/fonts/FontLoader.java index a04ee6d5f..92656ca2d 100644 --- a/src/java/org/apache/fop/fonts/FontLoader.java +++ b/src/java/org/apache/fop/fonts/FontLoader.java @@ -89,20 +89,20 @@ public abstract class FontLoader { * @return the newly loaded font * @throws IOException In case of an I/O error */ - public static CustomFont loadFont(URI fontFileURI, String subFontName, + public static CustomFont loadFont(FontUris fontUris, String subFontName, boolean embedded, EmbeddingMode embeddingMode, EncodingMode encodingMode, boolean useKerning, boolean useAdvanced, InternalResourceResolver resourceResolver) throws IOException { - boolean type1 = isType1(fontFileURI); + boolean type1 = isType1(fontUris.getEmbed()); FontLoader loader; if (type1) { if (encodingMode == EncodingMode.CID) { throw new IllegalArgumentException( "CID encoding mode not supported for Type 1 fonts"); } - loader = new Type1FontLoader(fontFileURI, embedded, embeddingMode, useKerning, + loader = new Type1FontLoader(fontUris, embedded, embeddingMode, useKerning, resourceResolver); } else { - loader = new OFFontLoader(fontFileURI, subFontName, embedded, embeddingMode, + loader = new OFFontLoader(fontUris.getEmbed(), subFontName, embedded, embeddingMode, encodingMode, useKerning, useAdvanced, resourceResolver); } return loader.getFont(); diff --git a/src/java/org/apache/fop/fonts/FontUris.java b/src/java/org/apache/fop/fonts/FontUris.java new file mode 100644 index 000000000..fe0dfc21a --- /dev/null +++ b/src/java/org/apache/fop/fonts/FontUris.java @@ -0,0 +1,65 @@ +/* + * 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.fonts; + +import java.io.Serializable; +import java.net.URI; + +public class FontUris implements Serializable { + + private static final long serialVersionUID = 8571060588775532701L; + + private final URI embed; + private final URI metrics; + private final URI afm; + private final URI pfm; + + public FontUris(URI embed, URI metrics, URI afm, URI pfm) { + this.embed = embed; + this.metrics = metrics; + this.afm = afm; + this.pfm = pfm; + } + + public FontUris(URI embed, URI metrics) { + this.embed = embed; + this.metrics = metrics; + this.afm = null; + this.pfm = null; + } + + public URI getEmbed() { + return embed; + } + + public URI getMetrics() { + return metrics; + } + + public URI getAfm() { + return afm; + } + + public URI getPfm() { + return pfm; + } + +} + diff --git a/src/java/org/apache/fop/fonts/LazyFont.java b/src/java/org/apache/fop/fonts/LazyFont.java index 323a46cf1..06b106534 100644 --- a/src/java/org/apache/fop/fonts/LazyFont.java +++ b/src/java/org/apache/fop/fonts/LazyFont.java @@ -43,8 +43,8 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, private static Log log = LogFactory.getLog(LazyFont.class); - private final URI metricsURI; - private final URI fontEmbedURI; + private final FontUris fontUris; + private final boolean useKerning; private final boolean useAdvanced; private final EncodingMode encodingMode; @@ -64,8 +64,8 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, */ public LazyFont(EmbedFontInfo fontInfo, InternalResourceResolver resourceResolver, boolean useComplexScripts) { - this.metricsURI = fontInfo.getMetricsURI(); - this.fontEmbedURI = fontInfo.getEmbedURI(); + + this.fontUris = fontInfo.getFontUris(); this.useKerning = fontInfo.getKerning(); if (resourceResolver != null) { this.useAdvanced = useComplexScripts; @@ -85,8 +85,8 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, public String toString() { StringBuffer sbuf = new StringBuffer(super.toString()); sbuf.append('{'); - sbuf.append("metrics-url=" + metricsURI); - sbuf.append(",embed-url=" + fontEmbedURI); + sbuf.append("metrics-url=" + fontUris.getMetrics()); + sbuf.append(",embed-url=" + fontUris.getEmbed()); sbuf.append(",kerning=" + useKerning); sbuf.append(",advanced=" + useAdvanced); sbuf.append('}'); @@ -96,36 +96,36 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, private void load(boolean fail) { if (!isMetricsLoaded) { try { - if (metricsURI != null) { + if (fontUris.getMetrics() != null) { /**@todo Possible thread problem here */ FontReader reader = null; - InputStream in = resourceResolver.getResource(metricsURI); + InputStream in = resourceResolver.getResource(fontUris.getMetrics()); InputSource src = new InputSource(in); - src.setSystemId(metricsURI.toASCIIString()); + src.setSystemId(fontUris.getMetrics().toASCIIString()); reader = new FontReader(src, resourceResolver); reader.setKerningEnabled(useKerning); reader.setAdvancedEnabled(useAdvanced); if (this.embedded) { - reader.setFontEmbedURI(fontEmbedURI); + reader.setFontEmbedURI(fontUris.getEmbed()); } realFont = reader.getFont(); } else { - if (fontEmbedURI == null) { + if (fontUris.getEmbed() == null) { throw new RuntimeException("Cannot load font. No font URIs available."); } - realFont = FontLoader.loadFont(fontEmbedURI, subFontName, embedded, + realFont = FontLoader.loadFont(fontUris, subFontName, embedded, embeddingMode, encodingMode, useKerning, useAdvanced, resourceResolver); } if (realFont instanceof FontDescriptor) { realFontDescriptor = (FontDescriptor) realFont; } } catch (FOPException fopex) { - log.error("Failed to read font metrics file " + metricsURI, fopex); + log.error("Failed to read font metrics file " + fontUris.getMetrics(), fopex); if (fail) { throw new RuntimeException(fopex); } } catch (IOException ioex) { - log.error("Failed to read font metrics file " + metricsURI, ioex); + log.error("Failed to read font metrics file " + fontUris.getMetrics(), ioex); if (fail) { throw new RuntimeException(ioex); } @@ -498,6 +498,5 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, } return realFont.isMultiByte(); } - } diff --git a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java index 21ebd4937..a1d65459a 100644 --- a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java +++ b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java @@ -40,6 +40,7 @@ import org.apache.fop.fonts.FontCache; import org.apache.fop.fonts.FontEventListener; import org.apache.fop.fonts.FontLoader; import org.apache.fop.fonts.FontTriplet; +import org.apache.fop.fonts.FontUris; import org.apache.fop.fonts.FontUtil; import org.apache.fop.fonts.MultiByteFont; import org.apache.fop.fonts.truetype.FontFileReader; @@ -141,14 +142,15 @@ public class FontInfoFinder { */ private EmbedFontInfo getFontInfoFromCustomFont(URI fontUri, CustomFont customFont, FontCache fontCache, InternalResourceResolver resourceResolver) { + FontUris fontUris = new FontUris(fontUri, null); List<FontTriplet> fontTripletList = new java.util.ArrayList<FontTriplet>(); generateTripletsFromFont(customFont, fontTripletList); String subFontName = null; if (customFont instanceof MultiByteFont) { subFontName = ((MultiByteFont) customFont).getTTCName(); } - EmbedFontInfo fontInfo = new EmbedFontInfo(null, customFont.isKerningEnabled(), - customFont.isAdvancedEnabled(), fontTripletList, fontUri, subFontName, + EmbedFontInfo fontInfo = new EmbedFontInfo(fontUris, customFont.isKerningEnabled(), + customFont.isAdvancedEnabled(), fontTripletList, subFontName, EncodingMode.AUTO, EmbeddingMode.AUTO); fontInfo.setPostScriptName(customFont.getFontName()); if (fontCache != null) { @@ -248,8 +250,9 @@ public class FontInfoFinder { } else { // The normal case try { - customFont = FontLoader.loadFont(fontURI, null, true, EmbeddingMode.AUTO, - EncodingMode.AUTO, useKerning, useAdvanced, resourceResolver); + FontUris fontUris = new FontUris(fontURI, null); + customFont = FontLoader.loadFont(fontUris, null, true, EmbeddingMode.AUTO, EncodingMode.AUTO, + useKerning, useAdvanced, resourceResolver); if (this.eventListener != null) { customFont.setEventListener(this.eventListener); } diff --git a/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java b/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java index 802c3c033..d364462cc 100644 --- a/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java +++ b/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java @@ -22,7 +22,6 @@ package org.apache.fop.fonts.type1; import java.awt.geom.RectangularShape; import java.io.IOException; import java.io.InputStream; -import java.net.URI; import java.net.URISyntaxException; import java.util.HashSet; import java.util.List; @@ -37,6 +36,7 @@ import org.apache.fop.fonts.CodePointMapping; import org.apache.fop.fonts.EmbeddingMode; import org.apache.fop.fonts.FontLoader; import org.apache.fop.fonts.FontType; +import org.apache.fop.fonts.FontUris; import org.apache.fop.fonts.SingleByteEncoding; import org.apache.fop.fonts.SingleByteFont; @@ -51,6 +51,8 @@ public class Type1FontLoader extends FontLoader { private EmbeddingMode embeddingMode; + private final FontUris fontUris; + /** * Constructs a new Type 1 font loader. * @param fontFileURI the URI to the PFB file of a Type 1 font @@ -59,10 +61,11 @@ public class Type1FontLoader extends FontLoader { * @param resourceResolver the font resolver used to resolve URIs * @throws IOException In case of an I/O error */ - public Type1FontLoader(URI fontFileURI, boolean embedded, EmbeddingMode embeddingMode, + public Type1FontLoader(FontUris fontUris, boolean embedded, EmbeddingMode embeddingMode, boolean useKerning, InternalResourceResolver resourceResolver) throws IOException { - super(fontFileURI, embedded, useKerning, true, resourceResolver); + super(fontUris.getEmbed(), embedded, useKerning, true, resourceResolver); this.embeddingMode = embeddingMode; + this.fontUris = fontUris; } private String getPFMURI(String pfbURI) { @@ -83,18 +86,26 @@ public class Type1FontLoader extends FontLoader { InputStream afmIn = null; String fontFileStr = fontFileURI.toASCIIString(); String partialAfmUri = fontFileStr.substring(0, fontFileStr.length() - 4); - String afmUri = null; - for (String afmExtension : AFM_EXTENSIONS) { + String afmUri = (fontUris.getAfm() != null) ? fontUris.getAfm().toASCIIString() : null; + if (afmUri == null) { + for (String afmExtension : AFM_EXTENSIONS) { + try { + afmUri = partialAfmUri + afmExtension; + afmIn = resourceResolver.getResource(afmUri); + if (afmIn != null) { + break; + } + } catch (IOException ioe) { + // Ignore, AFM probably not available under the URI + } catch (URISyntaxException e) { + // Ignore, AFM probably not available under the URI + } + } + } else { try { - afmUri = partialAfmUri + afmExtension; afmIn = resourceResolver.getResource(afmUri); - if (afmIn != null) { - break; - } - } catch (IOException ioe) { - // Ignore, AFM probably not available under the URI } catch (URISyntaxException e) { - // Ignore, AFM probably not available under the URI + throw new IOException(e); } } if (afmIn != null) { @@ -106,7 +117,8 @@ public class Type1FontLoader extends FontLoader { } } - String pfmUri = getPFMURI(fontFileStr); + String pfmUri = (fontUris.getPfm() == null) ? getPFMURI(fontFileStr) : fontUris.getPfm() + .toASCIIString(); InputStream pfmIn = null; try { pfmIn = resourceResolver.getResource(pfmUri); diff --git a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java index 0b410873b..b9b7539fc 100644 --- a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java +++ b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java @@ -33,6 +33,7 @@ import org.apache.fop.fonts.FontCollection; import org.apache.fop.fonts.FontInfo; import org.apache.fop.fonts.FontLoader; import org.apache.fop.fonts.FontTriplet; +import org.apache.fop.fonts.FontUris; import org.apache.fop.fonts.LazyFont; /** @@ -81,10 +82,10 @@ public class ConfiguredFontCollection implements FontCollection { InputStream fontSource = resourceResolver.getResource(fontURI); font = new CustomFontMetricsMapper(fontMetrics, fontSource); } else { - CustomFont fontMetrics = FontLoader.loadFont(fontURI, null, true, + FontUris fontUris = new FontUris(fontURI, null); + CustomFont fontMetrics = FontLoader.loadFont(fontUris, null, true, configFontInfo.getEmbeddingMode(), configFontInfo.getEncodingMode(), - configFontInfo.getKerning(), configFontInfo.getAdvanced(), - resourceResolver); + configFontInfo.getKerning(), configFontInfo.getAdvanced(), resourceResolver); font = new CustomFontMetricsMapper(fontMetrics); } |