From 1b03a90eb44c5090c357c38c7606f795a63bb3f0 Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Sun, 4 Jan 2009 12:59:29 +0000 Subject: Added support for forcing single-byte encodings for TrueType fonts without creating an XML font metric file (see "encoding-mode" attribute on "font" element in updated documentation). See also Acrobat PDF merge performance problem on fop-users: http://markmail.org/message/dbbaaht4qshhqs3v git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@731248 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/fop/fonts/EmbedFontInfo.java | 29 +++++++- src/java/org/apache/fop/fonts/EncodingMode.java | 82 ++++++++++++++++++++++ src/java/org/apache/fop/fonts/FontLoader.java | 19 +++-- src/java/org/apache/fop/fonts/LazyFont.java | 4 +- .../fop/fonts/autodetect/FontInfoFinder.java | 5 +- .../apache/fop/fonts/truetype/TTFFontLoader.java | 16 ++++- .../fop/render/PrintRendererConfigurator.java | 4 ++ .../render/java2d/ConfiguredFontCollection.java | 3 +- 8 files changed, 146 insertions(+), 16 deletions(-) create mode 100644 src/java/org/apache/fop/fonts/EncodingMode.java (limited to 'src/java/org') diff --git a/src/java/org/apache/fop/fonts/EmbedFontInfo.java b/src/java/org/apache/fop/fonts/EmbedFontInfo.java index 3c4964b97..aa464c21d 100644 --- a/src/java/org/apache/fop/fonts/EmbedFontInfo.java +++ b/src/java/org/apache/fop/fonts/EmbedFontInfo.java @@ -29,7 +29,7 @@ import java.util.List; public class EmbedFontInfo implements Serializable { /** Serialization Version UID */ - private static final long serialVersionUID = 8755432068669997367L; + private static final long serialVersionUID = 8755432068669997368L; /** filename of the metrics file */ protected String metricsFile; @@ -37,6 +37,8 @@ public class EmbedFontInfo implements Serializable { protected String embedFile; /** false, to disable kerning */ protected boolean kerning; + /** the requested encoding mode for the font */ + protected EncodingMode encodingMode = EncodingMode.AUTO; /** the PostScript name of the font */ protected String postScriptName = null; @@ -142,6 +144,25 @@ public class EmbedFontInfo implements Serializable { this.embedded = value; } + /** + * Returns the requested encoding mode for this font. + * @return the encoding mode + */ + public EncodingMode getEncodingMode() { + return this.encodingMode; + } + + /** + * Sets the requested encoding mode for this font. + * @param mode the new encoding mode + */ + public void setEncodingMode(EncodingMode mode) { + if (mode == null) { + throw new NullPointerException("mode must not be null"); + } + this.encodingMode = mode; + } + private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); @@ -150,8 +171,10 @@ public class EmbedFontInfo implements Serializable { /** {@inheritDoc} */ public String toString() { - return "metrics-url=" + metricsFile + ",embed-url=" + embedFile - + ", kerning=" + kerning + ", " + "font-triplet=" + fontTriplets + return "metrics-url=" + metricsFile + ", embed-url=" + embedFile + + ", kerning=" + kerning + + ", enc-mode=" + encodingMode + + ", font-triplet=" + fontTriplets + (getSubFontName() != null ? ", sub-font=" + getSubFontName() : "") + (isEmbedded() ? "" : ", NOT embedded"); } diff --git a/src/java/org/apache/fop/fonts/EncodingMode.java b/src/java/org/apache/fop/fonts/EncodingMode.java new file mode 100644 index 000000000..734292c54 --- /dev/null +++ b/src/java/org/apache/fop/fonts/EncodingMode.java @@ -0,0 +1,82 @@ +/* + * 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.ObjectStreamException; +import java.io.Serializable; + + +/** + * This class enumerates all supported encoding modes for fonts: auto, single-byte and CID. + */ +public final class EncodingMode implements Serializable { + + private static final long serialVersionUID = 8311486102457779529L; + + /** Automatic selection of encoding mode. */ + public static final EncodingMode AUTO = new EncodingMode("auto"); + + /** Single-byte encoding */ + public static final EncodingMode SINGLE_BYTE = new EncodingMode("single-byte"); + + /** CID encoding */ + public static final EncodingMode CID = new EncodingMode("cid"); + + private String name; + + private EncodingMode(String name) { + this.name = name; + } + + /** + * Returns the encoding mode name. + * @return the encoding mode name + */ + public String getName() { + return this.name; + } + + /** + * Returns the {@link EncodingMode} by name. + * @param name the name of the encoding mode to look up + * @return the encoding mode constant + */ + public static EncodingMode valueOf(String name) { + if (name.equalsIgnoreCase(EncodingMode.AUTO.getName())) { + return EncodingMode.AUTO; + } else if (name.equalsIgnoreCase(EncodingMode.SINGLE_BYTE.getName())) { + return EncodingMode.SINGLE_BYTE; + } else if (name.equalsIgnoreCase(EncodingMode.CID.getName())) { + return EncodingMode.CID; + } else { + throw new IllegalArgumentException("Invalid encoding mode: " + name); + } + } + + private Object readResolve() throws ObjectStreamException { + return valueOf(getName()); + } + + /** {@inheritDoc} */ + public String toString() { + return "EncodingMode:" + getName(); + } + +} diff --git a/src/java/org/apache/fop/fonts/FontLoader.java b/src/java/org/apache/fop/fonts/FontLoader.java index 6d2593fad..b3d32e38d 100644 --- a/src/java/org/apache/fop/fonts/FontLoader.java +++ b/src/java/org/apache/fop/fonts/FontLoader.java @@ -75,13 +75,14 @@ public abstract class FontLoader { * @param fontFile the File representation of the font * @param subFontName the sub-fontname of a font (for TrueType Collections, null otherwise) * @param embedded indicates whether the font is embedded or referenced + * @param encodingMode the requested encoding mode * @param resolver the font resolver to use when resolving URIs * @return the newly loaded font * @throws IOException In case of an I/O error */ public static CustomFont loadFont(File fontFile, String subFontName, - boolean embedded, FontResolver resolver) throws IOException { - return loadFont(fontFile.getAbsolutePath(), subFontName, embedded, resolver); + boolean embedded, EncodingMode encodingMode, FontResolver resolver) throws IOException { + return loadFont(fontFile.getAbsolutePath(), subFontName, embedded, encodingMode, resolver); } /** @@ -89,13 +90,14 @@ public abstract class FontLoader { * @param fontUrl the URL representation of the font * @param subFontName the sub-fontname of a font (for TrueType Collections, null otherwise) * @param embedded indicates whether the font is embedded or referenced + * @param encodingMode the requested encoding mode * @param resolver the font resolver to use when resolving URIs * @return the newly loaded font * @throws IOException In case of an I/O error */ public static CustomFont loadFont(URL fontUrl, String subFontName, - boolean embedded, FontResolver resolver) throws IOException { - return loadFont(fontUrl.toExternalForm(), subFontName, embedded, resolver); + boolean embedded, EncodingMode encodingMode, FontResolver resolver) throws IOException { + return loadFont(fontUrl.toExternalForm(), subFontName, embedded, encodingMode, resolver); } /** @@ -103,19 +105,24 @@ public abstract class FontLoader { * @param fontFileURI the URI to the font * @param subFontName the sub-fontname of a font (for TrueType Collections, null otherwise) * @param embedded indicates whether the font is embedded or referenced + * @param encodingMode the requested encoding mode * @param resolver the font resolver to use when resolving URIs * @return the newly loaded font * @throws IOException In case of an I/O error */ public static CustomFont loadFont(String fontFileURI, String subFontName, - boolean embedded, FontResolver resolver) throws IOException { + boolean embedded, EncodingMode encodingMode, FontResolver resolver) throws IOException { fontFileURI = fontFileURI.trim(); boolean type1 = isType1(fontFileURI); 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, resolver); } else { - loader = new TTFFontLoader(fontFileURI, subFontName, embedded, resolver); + loader = new TTFFontLoader(fontFileURI, subFontName, embedded, encodingMode, resolver); } return loader.getFont(); } diff --git a/src/java/org/apache/fop/fonts/LazyFont.java b/src/java/org/apache/fop/fonts/LazyFont.java index ebf31f258..c18ed6965 100644 --- a/src/java/org/apache/fop/fonts/LazyFont.java +++ b/src/java/org/apache/fop/fonts/LazyFont.java @@ -44,6 +44,7 @@ public class LazyFont extends Typeface implements FontDescriptor { private String metricsFileName = null; private String fontEmbedPath = null; private boolean useKerning = false; + private EncodingMode encodingMode = EncodingMode.AUTO; private boolean embedded = true; private String subFontName = null; @@ -63,6 +64,7 @@ public class LazyFont extends Typeface implements FontDescriptor { this.metricsFileName = fontInfo.getMetricsFile(); this.fontEmbedPath = fontInfo.getEmbedFile(); this.useKerning = fontInfo.getKerning(); + this.encodingMode = fontInfo.getEncodingMode(); this.subFontName = fontInfo.getSubFontName(); this.embedded = fontInfo.isEmbedded(); this.resolver = resolver; @@ -130,7 +132,7 @@ public class LazyFont extends Typeface implements FontDescriptor { throw new RuntimeException("Cannot load font. No font URIs available."); } realFont = FontLoader.loadFont(fontEmbedPath, this.subFontName, - this.embedded, resolver); + this.embedded, this.encodingMode, resolver); } if (realFont instanceof FontDescriptor) { realFontDescriptor = (FontDescriptor) realFont; diff --git a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java index d0ff4a287..951ebdcff 100644 --- a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java +++ b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java @@ -33,6 +33,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.fop.fonts.CustomFont; import org.apache.fop.fonts.EmbedFontInfo; +import org.apache.fop.fonts.EncodingMode; import org.apache.fop.fonts.Font; import org.apache.fop.fonts.FontCache; import org.apache.fop.fonts.FontEventListener; @@ -224,7 +225,7 @@ public class FontInfoFinder { } try { TTFFontLoader ttfLoader = new TTFFontLoader( - fontFileURI, fontName, true, resolver); + fontFileURI, fontName, true, EncodingMode.AUTO, resolver); customFont = ttfLoader.getFont(); if (this.eventListener != null) { customFont.setEventListener(this.eventListener); @@ -248,7 +249,7 @@ public class FontInfoFinder { } else { // The normal case try { - customFont = FontLoader.loadFont(fontUrl, null, true, resolver); + customFont = FontLoader.loadFont(fontUrl, null, true, EncodingMode.AUTO, resolver); if (this.eventListener != null) { customFont.setEventListener(this.eventListener); } diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java index e14514b51..cbf9c9d17 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java @@ -31,6 +31,7 @@ import org.apache.xmlgraphics.fonts.Glyphs; import org.apache.fop.fonts.BFEntry; import org.apache.fop.fonts.CIDFontType; +import org.apache.fop.fonts.EncodingMode; import org.apache.fop.fonts.FontLoader; import org.apache.fop.fonts.FontResolver; import org.apache.fop.fonts.FontType; @@ -46,6 +47,7 @@ public class TTFFontLoader extends FontLoader { private MultiByteFont multiFont; private SingleByteFont singleFont; private String subFontName; + private EncodingMode encodingMode; /** * Default constructor @@ -53,7 +55,7 @@ public class TTFFontLoader extends FontLoader { * @param resolver the FontResolver for font URI resolution */ public TTFFontLoader(String fontFileURI, FontResolver resolver) { - this(fontFileURI, null, true, resolver); + this(fontFileURI, null, true, EncodingMode.AUTO, resolver); } /** @@ -62,12 +64,17 @@ public class TTFFontLoader extends FontLoader { * @param subFontName the sub-fontname of a font in a TrueType Collection (or null for normal * TrueType fonts) * @param embedded indicates whether the font is embedded or referenced + * @param encodingMode the requested encoding mode * @param resolver the FontResolver for font URI resolution */ public TTFFontLoader(String fontFileURI, String subFontName, - boolean embedded, FontResolver resolver) { + boolean embedded, EncodingMode encodingMode, FontResolver resolver) { super(fontFileURI, embedded, resolver); this.subFontName = subFontName; + this.encodingMode = encodingMode; + if (this.encodingMode == EncodingMode.AUTO) { + this.encodingMode = EncodingMode.CID; //Default to CID mode for TrueType + } } /** {@inheritDoc} */ @@ -105,6 +112,9 @@ public class TTFFontLoader extends FontLoader { } boolean isCid = this.embedded; + if (this.encodingMode == EncodingMode.SINGLE_BYTE) { + isCid = false; + } if (isCid) { multiFont = new MultiByteFont(); @@ -156,7 +166,7 @@ public class TTFFontLoader extends FontLoader { copyKerning(ttf, isCid); if (this.embedded && ttf.isEmbeddable()) { - multiFont.setEmbedFileName(this.fontFileURI); + returnFont.setEmbedFileName(this.fontFileURI); } } diff --git a/src/java/org/apache/fop/render/PrintRendererConfigurator.java b/src/java/org/apache/fop/render/PrintRendererConfigurator.java index e8127ae34..14c75c698 100644 --- a/src/java/org/apache/fop/render/PrintRendererConfigurator.java +++ b/src/java/org/apache/fop/render/PrintRendererConfigurator.java @@ -42,6 +42,7 @@ import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.FopFactory; import org.apache.fop.fonts.EmbedFontInfo; +import org.apache.fop.fonts.EncodingMode; import org.apache.fop.fonts.FontCache; import org.apache.fop.fonts.FontEventAdapter; import org.apache.fop.fonts.FontEventListener; @@ -410,8 +411,11 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator } boolean useKerning = fontCfg.getAttributeAsBoolean("kerning", true); + EncodingMode encodingMode = EncodingMode.valueOf( + fontCfg.getAttribute("encoding-mode", EncodingMode.AUTO.getName())); EmbedFontInfo embedFontInfo = new EmbedFontInfo(metricsUrl, useKerning, tripletList, embedUrl, subFont); + embedFontInfo.setEncodingMode(encodingMode); if (fontCache != null) { if (!fontCache.containsFont(embedFontInfo)) { fontCache.addFont(embedFontInfo); diff --git a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java index 26d64af74..9f96087b9 100644 --- a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java +++ b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java @@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.fop.fonts.CustomFont; import org.apache.fop.fonts.EmbedFontInfo; +import org.apache.fop.fonts.EncodingMode; import org.apache.fop.fonts.FontCollection; import org.apache.fop.fonts.FontInfo; import org.apache.fop.fonts.FontLoader; @@ -87,7 +88,7 @@ public class ConfiguredFontCollection implements FontCollection { font = new CustomFontMetricsMapper(fontMetrics, fontSource); } else { CustomFont fontMetrics = FontLoader.loadFont( - fontFile, null, true, fontResolver); + fontFile, null, true, EncodingMode.AUTO, fontResolver); font = new CustomFontMetricsMapper(fontMetrics); } -- cgit v1.2.3