diff options
author | Jeremias Maerki <jeremias@apache.org> | 2007-05-28 14:31:24 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2007-05-28 14:31:24 +0000 |
commit | 8c1aba3f976127d33ec50b67d760f56364c08487 (patch) | |
tree | adfdca730f41c1b9029324bf53535aa25bf16d27 /src/java/org/apache/fop/render/afp | |
parent | 7ada0a06fe2b9ce0e1867d2c9c47f71ea47a43b2 (diff) | |
download | xmlgraphics-fop-8c1aba3f976127d33ec50b67d760f56364c08487.tar.gz xmlgraphics-fop-8c1aba3f976127d33ec50b67d760f56364c08487.zip |
Bugzilla #41831:
- Add support font auto-detection (easier font configuration) including a font cache to speed up the auto-detection process.
- Refactoring of the configuration code: All Avalon configuration stuff is extracted into separate "Configurator" classes.
- Refactoring of the FOURIResolver.
Submitted by: Adrian Cumiskey <fop-dev.at.cumiskey.com>
Changes to the patch by jeremias during the review:
- Font cache simplified (Java object serialization instead of XML), functionality fixed and moved to the fonts.package.
- Relocated default cache file location to user directory.
- Fixed the font configuration for PDFDocumentGraphics2D/PDFTranscoder that got lost with the patch.
- Fixed a problem with having a non-file URL as font base URL.
- Simplified RendererContextInfo stuff to make it easier to understand.
- Fixed handling of Type 1 fonts in auto-detection.
- Reduced verbosity of font-related log output.
- Updated Jakarta Commons IO to version 1.3.1 (the patch depends on it)
- Various javadocs improvements
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@542237 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop/render/afp')
3 files changed, 265 insertions, 195 deletions
diff --git a/src/java/org/apache/fop/render/afp/AFPRenderer.java b/src/java/org/apache/fop/render/afp/AFPRenderer.java index 78d8b7d0a..ea1087893 100644 --- a/src/java/org/apache/fop/render/afp/AFPRenderer.java +++ b/src/java/org/apache/fop/render/afp/AFPRenderer.java @@ -33,8 +33,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; @@ -57,8 +55,6 @@ import org.apache.fop.fo.extensions.ExtensionAttachment; import org.apache.fop.fonts.FontInfo; import org.apache.fop.fonts.FontMetrics; import org.apache.fop.fonts.FontTriplet; -import org.apache.fop.fonts.FontUtil; -import org.apache.fop.fonts.Typeface; import org.apache.fop.fonts.base14.Courier; import org.apache.fop.fonts.base14.Helvetica; import org.apache.fop.fonts.base14.TimesRoman; @@ -76,7 +72,6 @@ import org.apache.fop.render.afp.fonts.AFPFont; import org.apache.fop.render.afp.fonts.CharacterSet; import org.apache.fop.render.afp.fonts.FopCharacterSet; import org.apache.fop.render.afp.fonts.OutlineFont; -import org.apache.fop.render.afp.fonts.RasterFont; import org.apache.fop.render.afp.modca.AFPConstants; import org.apache.fop.render.afp.modca.AFPDataStream; import org.apache.fop.render.afp.modca.ImageObject; @@ -303,195 +298,6 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { } /** - */ - private AFPFontInfo buildFont(Configuration fontCfg, String _path) - throws ConfigurationException { - - Configuration[] triple = fontCfg.getChildren("font-triplet"); - List tripleList = new java.util.ArrayList(); - if (triple.length == 0) { - log.error("Mandatory font configuration element '<font-triplet...' is missing"); - return null; - } - for (int j = 0; j < triple.length; j++) { - int weight = FontUtil.parseCSS2FontWeight(triple[j].getAttribute("weight")); - tripleList.add(new FontTriplet(triple[j].getAttribute("name"), - triple[j].getAttribute("style"), - weight)); - } - - //build the fonts - Configuration afpFontCfg = fontCfg.getChild("afp-font"); - if (afpFontCfg == null) { - log.error("Mandatory font configuration element '<afp-font...' is missing"); - return null; - } - String path = afpFontCfg.getAttribute("path", _path); - String type = afpFontCfg.getAttribute("type"); - if (type == null) { - log.error("Mandatory afp-font configuration attribute 'type=' is missing"); - return null; - } - String codepage = afpFontCfg.getAttribute("codepage"); - if (codepage == null) { - log.error("Mandatory afp-font configuration attribute 'code=' is missing"); - return null; - } - String encoding = afpFontCfg.getAttribute("encoding"); - if (encoding == null) { - log.error("Mandatory afp-font configuration attribute 'encoding=' is missing"); - return null; - } - - if ("raster".equalsIgnoreCase(type)) { - - String name = afpFontCfg.getAttribute("name", "Unknown"); - - // Create a new font object - RasterFont font = new RasterFont(name); - - Configuration[] rasters = afpFontCfg.getChildren("afp-raster-font"); - if (rasters.length == 0) { - log.error("Mandatory font configuration elements '<afp-raster-font...' are missing"); - return null; - } - for (int j = 0; j < rasters.length; j++) { - Configuration rasterCfg = rasters[j]; - - String characterset = rasterCfg.getAttribute("characterset"); - if (characterset == null) { - log.error("Mandatory afp-raster-font configuration attribute 'characterset=' is missing"); - return null; - } - int size = rasterCfg.getAttributeAsInteger("size"); - String base14 = rasterCfg.getAttribute("base14-font", null); - - if (base14 != null) { - try { - Class clazz = Class.forName("org.apache.fop.fonts.base14." - + base14); - try { - Typeface tf = (Typeface)clazz.newInstance(); - font.addCharacterSet(size, new FopCharacterSet( - codepage, encoding, characterset, size, tf)); - } catch (Exception ie) { - String msg = "The base 14 font class " + clazz.getName() - + " could not be instantiated"; - log.error(msg); - } - } catch (ClassNotFoundException cnfe) { - String msg = "The base 14 font class for " + characterset - + " could not be found"; - log.error(msg); - } - } else { - font.addCharacterSet(size, new CharacterSet( - codepage, encoding, characterset, path)); - } - } - return new AFPFontInfo(font, tripleList); - - } else if ("outline".equalsIgnoreCase(type)) { - - String characterset = afpFontCfg.getAttribute("characterset"); - if (characterset == null) { - log.error("Mandatory afp-font configuration attribute 'characterset=' is missing"); - return null; - } - String name = afpFontCfg.getAttribute("name", characterset); - - CharacterSet characterSet = null; - - String base14 = afpFontCfg.getAttribute("base14-font", null); - - if (base14 != null) { - try { - Class clazz = Class.forName("org.apache.fop.fonts.base14." - + base14); - try { - Typeface tf = (Typeface)clazz.newInstance(); - characterSet = new FopCharacterSet( - codepage, encoding, characterset, 1, tf); - } catch (Exception ie) { - String msg = "The base 14 font class " + clazz.getName() - + " could not be instantiated"; - log.error(msg); - } - } catch (ClassNotFoundException cnfe) { - String msg = "The base 14 font class for " + characterset - + " could not be found"; - log.error(msg); - } - } else { - characterSet = new CharacterSet(codepage, encoding, characterset, path); - } - // Create a new font object - OutlineFont font = new OutlineFont(name, characterSet); - return new AFPFontInfo(font, tripleList); - } else { - log.error("No or incorrect type attribute"); - } - return null; - } - - /** - * Builds a list of AFPFontInfo objects for use with the setup() method. - * @param cfg Configuration object - * @return List the newly created list of fonts - * @throws ConfigurationException if something's wrong with the config data - */ - public List buildFontListFromConfiguration(Configuration cfg) - throws ConfigurationException { - List fontList = new java.util.ArrayList(); - Configuration[] font = cfg.getChild("fonts").getChildren("font"); - for (int i = 0; i < font.length; i++) { - AFPFontInfo afi = buildFont(font[i], null); - if (afi != null) { - if (log.isDebugEnabled()) { - log.debug("Adding font " + afi.getAFPFont().getFontName()); - for (int j = 0; j < afi.getFontTriplets().size(); ++j) { - FontTriplet triplet = (FontTriplet) afi.getFontTriplets().get(j); - log.debug("Font triplet " - + triplet.getName() + ", " - + triplet.getStyle() + ", " - + triplet.getWeight()); - } - } - - fontList.add(afi); - } - } - return fontList; - } - - /** - * Configure the AFP renderer. - * Get the configuration to be used for fonts etc. - * @see org.apache.avalon.framework.configuration.Configurable#configure(Configuration) - */ - public void configure(Configuration cfg) throws ConfigurationException { - //Font configuration - this.fontList = buildFontListFromConfiguration(cfg); - Configuration images = cfg.getChild("images"); - if (!"color".equalsIgnoreCase(images.getAttribute("mode", "b+w"))) { - bitsPerPixel = images.getAttributeAsInteger("bits-per-pixel", 8); - switch (bitsPerPixel) { - case 1: - case 4: - case 8: - break; - default: - log.warn("Invalid bits_per_pixel value, must be 1, 4 or 8."); - bitsPerPixel = 8; - break; - } - } else { - colorImages = true; - } - - } - - /** * @see org.apache.fop.render.Renderer#setUserAgent(FOUserAgent) */ public void setUserAgent(FOUserAgent agent) { @@ -1765,5 +1571,22 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { } } + public void setBitsPerPixel(int bitsPerPixel) { + this.bitsPerPixel = bitsPerPixel; + switch (bitsPerPixel) { + case 1: + case 4: + case 8: + break; + default: + log.warn("Invalid bits_per_pixel value, must be 1, 4 or 8."); + bitsPerPixel = 8; + break; + } + } + + public void setColorImages(boolean colorImages) { + this.colorImages = colorImages; + } } diff --git a/src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java b/src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java new file mode 100644 index 000000000..aebabd97b --- /dev/null +++ b/src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java @@ -0,0 +1,241 @@ +/* + * 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.render.afp; + +import java.util.List; + +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.fop.apps.FOPException; +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.fonts.FontTriplet; +import org.apache.fop.fonts.FontUtil; +import org.apache.fop.fonts.Typeface; +import org.apache.fop.render.PrintRendererConfigurator; +import org.apache.fop.render.Renderer; +import org.apache.fop.render.afp.fonts.AFPFontInfo; +import org.apache.fop.render.afp.fonts.CharacterSet; +import org.apache.fop.render.afp.fonts.FopCharacterSet; +import org.apache.fop.render.afp.fonts.OutlineFont; +import org.apache.fop.render.afp.fonts.RasterFont; +import org.apache.fop.util.LogUtil; + +/** + * AFP Renderer configurator + */ +public class AFPRendererConfigurator extends PrintRendererConfigurator { + + /** + * Default constructor + * @param userAgent user agent + */ + public AFPRendererConfigurator(FOUserAgent userAgent) { + super(userAgent); + } + + private AFPFontInfo buildFont(Configuration fontCfg, String fontPath) + throws ConfigurationException { + + Configuration[] triple = fontCfg.getChildren("font-triplet"); + List tripleList = new java.util.ArrayList(); + if (triple.length == 0) { + log.error("Mandatory font configuration element '<font-triplet...' is missing"); + return null; + } + for (int j = 0; j < triple.length; j++) { + int weight = FontUtil.parseCSS2FontWeight(triple[j].getAttribute("weight")); + tripleList.add(new FontTriplet(triple[j].getAttribute("name"), + triple[j].getAttribute("style"), + weight)); + } + + //build the fonts + Configuration afpFontCfg = fontCfg.getChild("afp-font"); + if (afpFontCfg == null) { + log.error("Mandatory font configuration element '<afp-font...' is missing"); + return null; + } + String path = afpFontCfg.getAttribute("path", fontPath); + String type = afpFontCfg.getAttribute("type"); + if (type == null) { + log.error("Mandatory afp-font configuration attribute 'type=' is missing"); + return null; + } + String codepage = afpFontCfg.getAttribute("codepage"); + if (codepage == null) { + log.error("Mandatory afp-font configuration attribute 'code=' is missing"); + return null; + } + String encoding = afpFontCfg.getAttribute("encoding"); + if (encoding == null) { + log.error("Mandatory afp-font configuration attribute 'encoding=' is missing"); + return null; + } + + if ("raster".equalsIgnoreCase(type)) { + + String name = afpFontCfg.getAttribute("name", "Unknown"); + + // Create a new font object + RasterFont font = new RasterFont(name); + + Configuration[] rasters = afpFontCfg.getChildren("afp-raster-font"); + if (rasters.length == 0) { + log.error( + "Mandatory font configuration elements '<afp-raster-font...' are missing"); + return null; + } + for (int j = 0; j < rasters.length; j++) { + Configuration rasterCfg = rasters[j]; + + String characterset = rasterCfg.getAttribute("characterset"); + if (characterset == null) { + log.error( + "Mandatory afp-raster-font configuration attribute 'characterset=' is missing"); + return null; + } + int size = rasterCfg.getAttributeAsInteger("size"); + String base14 = rasterCfg.getAttribute("base14-font", null); + + if (base14 != null) { + try { + Class clazz = Class.forName("org.apache.fop.fonts.base14." + + base14); + try { + Typeface tf = (Typeface)clazz.newInstance(); + font.addCharacterSet(size, new FopCharacterSet( + codepage, encoding, characterset, size, tf)); + } catch (Exception ie) { + String msg = "The base 14 font class " + clazz.getName() + + " could not be instantiated"; + log.error(msg); + } + } catch (ClassNotFoundException cnfe) { + String msg = "The base 14 font class for " + characterset + + " could not be found"; + log.error(msg); + } + } else { + font.addCharacterSet(size, new CharacterSet( + codepage, encoding, characterset, path)); + } + } + return new AFPFontInfo(font, tripleList); + + } else if ("outline".equalsIgnoreCase(type)) { + + String characterset = afpFontCfg.getAttribute("characterset"); + if (characterset == null) { + log.error("Mandatory afp-font configuration attribute 'characterset=' is missing"); + return null; + } + String name = afpFontCfg.getAttribute("name", characterset); + + CharacterSet characterSet = null; + + String base14 = afpFontCfg.getAttribute("base14-font", null); + + if (base14 != null) { + try { + Class clazz = Class.forName("org.apache.fop.fonts.base14." + + base14); + try { + Typeface tf = (Typeface)clazz.newInstance(); + characterSet = new FopCharacterSet( + codepage, encoding, characterset, 1, tf); + } catch (Exception ie) { + String msg = "The base 14 font class " + clazz.getName() + + " could not be instantiated"; + log.error(msg); + } + } catch (ClassNotFoundException cnfe) { + String msg = "The base 14 font class for " + characterset + + " could not be found"; + log.error(msg); + } + } else { + characterSet = new CharacterSet(codepage, encoding, characterset, path); + } + // Create a new font object + OutlineFont font = new OutlineFont(name, characterSet); + return new AFPFontInfo(font, tripleList); + } else { + log.error("No or incorrect type attribute"); + } + return null; + } + + /** + * Builds a list of AFPFontInfo objects for use with the setup() method. + * @param cfg Configuration object + * @return List the newly created list of fonts + * @throws ConfigurationException if something's wrong with the config data + */ + private List buildFontListFromConfiguration(Configuration cfg) + throws ConfigurationException { + List fontList = new java.util.ArrayList(); + Configuration[] font = cfg.getChild("fonts").getChildren("font"); + for (int i = 0; i < font.length; i++) { + AFPFontInfo afi = buildFont(font[i], null); + if (afi != null) { + if (log.isDebugEnabled()) { + log.debug("Adding font " + afi.getAFPFont().getFontName()); + for (int j = 0; j < afi.getFontTriplets().size(); ++j) { + FontTriplet triplet = (FontTriplet) afi.getFontTriplets().get(j); + log.debug(" Font triplet " + + triplet.getName() + ", " + + triplet.getStyle() + ", " + + triplet.getWeight()); + } + } + + fontList.add(afi); + } + } + return fontList; + } + + /** + * Configure the AFP renderer. + * @param renderer AFP renderer + * @throws FOPException fop exception + * @see org.apache.fop.render.PrintRendererConfigurator#configure(Renderer) + */ + public void configure(Renderer renderer) throws FOPException { + Configuration cfg = super.getRendererConfig(renderer); + if (cfg != null) { + AFPRenderer afpRenderer = (AFPRenderer)renderer; + try { + List fontList = buildFontListFromConfiguration(cfg); + afpRenderer.setFontList(fontList); + } catch (ConfigurationException e) { + LogUtil.handleException(log, e, + userAgent.getFactory().validateUserConfigStrictly()); + } + + Configuration images = cfg.getChild("images"); + if (!"color".equalsIgnoreCase(images.getAttribute("mode", "b+w"))) { + afpRenderer.setBitsPerPixel(images.getAttributeAsInteger("bits-per-pixel", 8)); + } else { + afpRenderer.setColorImages(true); + } + } + } +} diff --git a/src/java/org/apache/fop/render/afp/AFPRendererMaker.java b/src/java/org/apache/fop/render/afp/AFPRendererMaker.java index 2d6d5711d..70bbe9076 100644 --- a/src/java/org/apache/fop/render/afp/AFPRendererMaker.java +++ b/src/java/org/apache/fop/render/afp/AFPRendererMaker.java @@ -23,6 +23,7 @@ import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; import org.apache.fop.render.AbstractRendererMaker; import org.apache.fop.render.Renderer; +import org.apache.fop.render.RendererConfigurator; /** * RendererMaker for the AFP Renderer. @@ -35,10 +36,15 @@ public class AFPRendererMaker extends AbstractRendererMaker { /**@see org.apache.fop.render.AbstractRendererMaker */ - public Renderer makeRenderer(FOUserAgent ua) { + public Renderer makeRenderer(FOUserAgent userAgent) { return new AFPRenderer(); } + /** @see org.apache.fop.render.AbstractRendererMaker#getConfigurator(FOUserAgent) */ + public RendererConfigurator getConfigurator(FOUserAgent userAgent) { + return new AFPRendererConfigurator(userAgent); + } + /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */ public boolean needsOutputStream() { return true; |