blob: 149b15c15f8d9fc1768a769f7efe492ae5770312 [file] [log] [blame]
/*
* Copyright 1999-2004 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.fonts;
//Java
import java.util.Map;
//FOP
/**
* This class is used to defer the loading of a font until it is really used.
*/
public class LazyFont extends Typeface implements FontDescriptor {
private String metricsFileName = null;
private String fontEmbedPath = null;
private boolean useKerning = false;
private boolean isMetricsLoaded = false;
private Typeface realFont = null;
private FontDescriptor realFontDescriptor = null;
/**
* Main constructor
* @param fontEmbedPath path to embeddable file (may be null)
* @param metricsFileName path to the metrics XML file
* @param useKerning True, if kerning should be enabled
*/
public LazyFont(String fontEmbedPath, String metricsFileName, boolean useKerning) {
this.metricsFileName = metricsFileName;
this.fontEmbedPath = fontEmbedPath;
this.useKerning = useKerning;
}
private void load() {
if (!isMetricsLoaded) {
isMetricsLoaded = true;
try {
/**@todo Possible thread problem here */
FontReader reader = new FontReader(metricsFileName);
reader.setKerningEnabled(useKerning);
reader.setFontEmbedPath(fontEmbedPath);
realFont = reader.getFont();
if (realFont instanceof FontDescriptor) {
realFontDescriptor = (FontDescriptor) realFont;
}
// System.out.println("Metrics " + metricsFileName + " loaded.");
} catch (Exception ex) {
ex.printStackTrace();
/**@todo Log this exception */
//log.error("Failed to read font metrics file "
// + metricsFileName
// + " : " + ex.getMessage());
}
}
}
/**
* Gets the real font.
* @return the real font
*/
public Typeface getRealFont() {
load();
return realFont;
}
// ---- Font ----
/**
* @see org.apache.fop.fonts.Typeface#getEncoding()
*/
public String getEncoding() {
load();
return realFont.getEncoding();
}
/**
* @see org.apache.fop.fonts.Typeface#mapChar(char)
*/
public char mapChar(char c) {
load();
return realFont.mapChar(c);
}
/**
* @see org.apache.fop.fonts.Typeface#hasChar(char)
*/
public boolean hasChar(char c) {
load();
return realFont.hasChar(c);
}
/**
* @see org.apache.fop.fonts.Typeface#isMultiByte()
*/
public boolean isMultiByte() {
return realFont.isMultiByte();
}
// ---- FontMetrics interface ----
/**
* @see org.apache.fop.fonts.FontMetrics#getFontName()
*/
public String getFontName() {
load();
return realFont.getFontName();
}
/**
* @see org.apache.fop.fonts.FontMetrics#getAscender(int)
*/
public int getAscender(int size) {
load();
return realFont.getAscender(size);
}
/**
* @see org.apache.fop.fonts.FontMetrics#getCapHeight(int)
*/
public int getCapHeight(int size) {
load();
return realFont.getCapHeight(size);
}
/**
* @see org.apache.fop.fonts.FontMetrics#getDescender(int)
*/
public int getDescender(int size) {
load();
return realFont.getDescender(size);
}
/**
* @see org.apache.fop.fonts.FontMetrics#getXHeight(int)
*/
public int getXHeight(int size) {
load();
return realFont.getXHeight(size);
}
/**
* @see org.apache.fop.fonts.FontMetrics#getWidth(int, int)
*/
public int getWidth(int i, int size) {
load();
return realFont.getWidth(i, size);
}
/**
* @see org.apache.fop.fonts.FontMetrics#getWidths()
*/
public int[] getWidths() {
load();
return realFont.getWidths();
}
/**
* @see org.apache.fop.fonts.FontMetrics#hasKerningInfo()
*/
public boolean hasKerningInfo() {
load();
return realFont.hasKerningInfo();
}
/**
* @see org.apache.fop.fonts.FontMetrics#getKerningInfo()
*/
public Map getKerningInfo() {
load();
return realFont.getKerningInfo();
}
// ---- FontDescriptor interface ----
/**
* @see org.apache.fop.fonts.FontDescriptor#getCapHeight()
*/
public int getCapHeight() {
load();
return realFontDescriptor.getCapHeight();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#getDescender()
*/
public int getDescender() {
load();
return realFontDescriptor.getDescender();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#getAscender()
*/
public int getAscender() {
load();
return realFontDescriptor.getAscender();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#getFlags()
*/
public int getFlags() {
load();
return realFontDescriptor.getFlags();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#getFontBBox()
*/
public int[] getFontBBox() {
load();
return realFontDescriptor.getFontBBox();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#getItalicAngle()
*/
public int getItalicAngle() {
load();
return realFontDescriptor.getItalicAngle();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#getStemV()
*/
public int getStemV() {
load();
return realFontDescriptor.getStemV();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#getFontType()
*/
public FontType getFontType() {
load();
return realFontDescriptor.getFontType();
}
/**
* @see org.apache.fop.fonts.FontDescriptor#isEmbeddable()
*/
public boolean isEmbeddable() {
load();
return realFontDescriptor.isEmbeddable();
}
}