/*
 * 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: FontManager.java 1761020 2016-09-16 11:17:35Z ssteiner $ */

package org.apache.fop.fonts;

import java.net.URI;
import java.util.List;

import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.io.InternalResourceResolver;
import org.apache.fop.fonts.FontTriplet.Matcher;
import org.apache.fop.fonts.substitute.FontSubstitutions;

// TODO: Refactor fonts package so major font activities (autodetection etc)
// are all centrally managed and delegated from this class

The manager of fonts. The class holds a reference to the font cache and information about font substitution, referenced fonts and similar.
/** * The manager of fonts. The class holds a reference to the font cache and information about * font substitution, referenced fonts and similar. */
public class FontManager {
The resource resolver
/** The resource resolver */
private InternalResourceResolver resourceResolver; private final FontDetector fontDetector; private FontCacheManager fontCacheManager;
Font substitutions
/** Font substitutions */
private FontSubstitutions fontSubstitutions;
Allows enabling kerning on the base 14 fonts, default is false
/** Allows enabling kerning on the base 14 fonts, default is false */
private boolean enableBase14Kerning;
FontTriplet matcher for fonts that shall be referenced rather than embedded.
/** FontTriplet matcher for fonts that shall be referenced rather than embedded. */
private FontTriplet.Matcher referencedFontsMatcher;
Main constructor
Params:
  • resourceResolver – the URI resolver
  • fontDetector – the font detector
  • fontCacheManager – the font cache manager
/** * Main constructor * * @param resourceResolver the URI resolver * @param fontDetector the font detector * @param fontCacheManager the font cache manager */
public FontManager(InternalResourceResolver resourceResolver, FontDetector fontDetector, FontCacheManager fontCacheManager) { this.resourceResolver = resourceResolver; this.fontDetector = fontDetector; this.fontCacheManager = fontCacheManager; }
Sets the font resource resolver
Params:
  • resourceResolver – resource resolver
/** * Sets the font resource resolver * @param resourceResolver resource resolver */
public void setResourceResolver(InternalResourceResolver resourceResolver) { this.resourceResolver = resourceResolver; } public InternalResourceResolver getResourceResolver() { return this.resourceResolver; }
Returns:true if kerning on base 14 fonts is enabled
/** @return true if kerning on base 14 fonts is enabled */
public boolean isBase14KerningEnabled() { return this.enableBase14Kerning; }
Controls whether kerning is activated on base 14 fonts.
Params:
  • value – true if kerning should be activated
/** * Controls whether kerning is activated on base 14 fonts. * @param value true if kerning should be activated */
public void setBase14KerningEnabled(boolean value) { this.enableBase14Kerning = value; }
Sets the font substitutions
Params:
  • substitutions – font substitutions
/** * Sets the font substitutions * @param substitutions font substitutions */
public void setFontSubstitutions(FontSubstitutions substitutions) { this.fontSubstitutions = substitutions; }
Returns the font substitution catalog
Returns:the font substitution catalog
/** * Returns the font substitution catalog * @return the font substitution catalog */
protected FontSubstitutions getFontSubstitutions() { if (fontSubstitutions == null) { this.fontSubstitutions = new FontSubstitutions(); } return fontSubstitutions; }
Sets the font cache file
Params:
  • cacheFileURI – the URI of the font cache file
/** * Sets the font cache file * @param cacheFileURI the URI of the font cache file */
public void setCacheFile(URI cacheFileURI) { fontCacheManager.setCacheFile(resourceResolver.resolveFromBase(cacheFileURI)); }
Whether or not to cache results of font triplet detection/auto-config
/** * Whether or not to cache results of font triplet detection/auto-config */
public void disableFontCache() { fontCacheManager = FontCacheManagerFactory.createDisabled(); }
Returns the font cache instance used by this font manager.
Returns:the font cache
/** * Returns the font cache instance used by this font manager. * @return the font cache */
public FontCache getFontCache() { return fontCacheManager.load(); }
Saves the FontCache as necessary
Throws:
  • FOPException – fop exception
/** * Saves the FontCache as necessary * * @throws FOPException fop exception */
public void saveCache() throws FOPException { fontCacheManager.save(); }
Deletes the current FontCache file
Throws:
  • FOPException – if an error was thrown while deleting the cache
/** * Deletes the current FontCache file * @throws FOPException if an error was thrown while deleting the cache */
public void deleteCache() throws FOPException { fontCacheManager.delete(); }
Sets up the fonts on a given FontInfo object. The fonts to setup are defined by an array of FontCollection objects.
Params:
  • fontInfo – the FontInfo object to set up
  • fontCollections – the array of font collections/sources
/** * Sets up the fonts on a given FontInfo object. The fonts to setup are defined by an * array of {@link FontCollection} objects. * @param fontInfo the FontInfo object to set up * @param fontCollections the array of font collections/sources */
public void setup(FontInfo fontInfo, FontCollection[] fontCollections) { int startNum = 1; for (FontCollection fontCollection : fontCollections) { startNum = fontCollection.setup(startNum, fontInfo); } // Make any defined substitutions in the font info getFontSubstitutions().adjustFontInfo(fontInfo); }
Sets the Matcher that can be used to identify the fonts that shall be referenced rather than embedded.
Params:
  • matcher – the font triplet matcher
/** * Sets the {@link FontTriplet.Matcher} that can be used to identify the fonts that shall * be referenced rather than embedded. * @param matcher the font triplet matcher */
public void setReferencedFontsMatcher(FontTriplet.Matcher matcher) { this.referencedFontsMatcher = matcher; }
Gets the Matcher that can be used to identify the fonts that shall be referenced rather than embedded.
Returns:the font triplet matcher (or null if none is set)
/** * Gets the {@link FontTriplet.Matcher} that can be used to identify the fonts that shall * be referenced rather than embedded. * @return the font triplet matcher (or null if none is set) */
public Matcher getReferencedFontsMatcher() { return this.referencedFontsMatcher; }
Updates the referenced font list using the FontManager's referenced fonts matcher (getReferencedFontsMatcher()).
Params:
  • fontInfoList – a font info list
/** * Updates the referenced font list using the FontManager's referenced fonts matcher * ({@link #getReferencedFontsMatcher()}). * @param fontInfoList a font info list */
public void updateReferencedFonts(List<EmbedFontInfo> fontInfoList) { Matcher matcher = getReferencedFontsMatcher(); updateReferencedFonts(fontInfoList, matcher); }
Updates the referenced font list.
Params:
  • fontInfoList – a font info list
  • matcher – the font triplet matcher to use
/** * Updates the referenced font list. * @param fontInfoList a font info list * @param matcher the font triplet matcher to use */
public void updateReferencedFonts(List<EmbedFontInfo> fontInfoList, Matcher matcher) { if (matcher == null) { return; //No referenced fonts } for (EmbedFontInfo fontInfo : fontInfoList) { for (FontTriplet triplet : fontInfo.getFontTriplets()) { if (matcher.matches(triplet)) { fontInfo.setEmbedded(false); break; } } } }
Detect fonts from the operating system via FOPs autodetect mechanism.
Params:
  • autoDetectFonts – if autodetect has been enabled
  • fontAdder – the font adding mechanism
  • strict – whether to enforce strict validation
  • listener – the listener for font related events
  • fontInfoList – a list of font info objects
Throws:
  • FOPException – if an exception was thrown auto-detecting fonts
/** * Detect fonts from the operating system via FOPs autodetect mechanism. * * @param autoDetectFonts if autodetect has been enabled * @param fontAdder the font adding mechanism * @param strict whether to enforce strict validation * @param listener the listener for font related events * @param fontInfoList a list of font info objects * @throws FOPException if an exception was thrown auto-detecting fonts */
public void autoDetectFonts(boolean autoDetectFonts, FontAdder fontAdder, boolean strict, FontEventListener listener, List<EmbedFontInfo> fontInfoList) throws FOPException { if (autoDetectFonts) { fontDetector.detect(this, fontAdder, strict, listener, fontInfoList); } } }