/*
 * 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: CustomFontMetricsMapper.java 1827168 2018-03-19 08:49:57Z ssteiner $ */

package org.apache.fop.render.java2d;

import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Rectangle;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.fop.complexscripts.fonts.Positionable;
import org.apache.fop.complexscripts.fonts.Substitutable;
import org.apache.fop.fonts.CustomFont;
import org.apache.fop.fonts.FontType;
import org.apache.fop.fonts.LazyFont;
import org.apache.fop.fonts.Typeface;

FontMetricsMapper that delegates most methods to an underlying FontMetrics instance. This class was designed to allow the underlying Font to be loaded from a user-configured file not registered in the current graphics environment.
/** * FontMetricsMapper that delegates most methods to an underlying * {@link org.apache.fop.fonts.FontMetrics} instance. This class was designed to allow * the underlying {@link Font} to be loaded from a * user-configured file not registered in the current graphics environment. */
public class CustomFontMetricsMapper extends Typeface implements FontMetricsMapper, Substitutable, Positionable {
Font metrics for the font this class models.
/** * Font metrics for the font this class models. */
private Typeface typeface;
The font required by the Java2D renderer.
/** * The font required by the Java2D renderer. */
private java.awt.Font font;
Maintains the most recently requested size.
/** * Maintains the most recently requested size. */
private float size = 1;
Construction of this class results in the immediate construction of the underlying Font.
Params:
  • fontMetrics – the metrics of the custom font
Throws:
/** * Construction of this class results in the immediate construction * of the underlying {@link java.awt.Font}. * @param fontMetrics the metrics of the custom font * @throws FontFormatException if a bad font is loaded * @throws IOException if an I/O error occurs */
public CustomFontMetricsMapper(final CustomFont fontMetrics) throws FontFormatException, IOException { this.typeface = fontMetrics; initialize(fontMetrics.getInputStream()); }
Construction of this class results in the immediate construction of the underlying Font.
Params:
  • fontMetrics – the font
  • fontSource – the font source to access the font
Throws:
/** * Construction of this class results in the immediate construction * of the underlying {@link java.awt.Font}. * @param fontMetrics the font * @param fontSource the font source to access the font * @throws FontFormatException if a bad font is loaded * @throws IOException if an I/O error occurs */
public CustomFontMetricsMapper(final LazyFont fontMetrics, final InputStream fontSource) throws FontFormatException, IOException { this.typeface = fontMetrics; initialize(fontSource); } private static final int TYPE1_FONT = 1; //Defined in Java 1.5
Loads the java.awt.Font
Params:
  • inStream –
Throws:
/** * Loads the java.awt.Font * @param inStream * @throws FontFormatException * @throws IOException */
private void initialize(final InputStream inStream) throws FontFormatException, IOException { int type = Font.TRUETYPE_FONT; if (FontType.TYPE1.equals(typeface.getFontType())) { type = TYPE1_FONT; //Font.TYPE1_FONT; only available in Java 1.5 } this.font = Font.createFont(type, inStream); inStream.close(); }
{@inheritDoc}
/** {@inheritDoc} */
public final String getEncodingName() { return null; //Not applicable to Java2D rendering }
{@inheritDoc}
/** {@inheritDoc} */
public final boolean hasChar(final char c) { return font.canDisplay(c); }
{@inheritDoc}
/** {@inheritDoc} */
public final char mapChar(final char c) { return typeface.mapChar(c); }
{@inheritDoc}
/** {@inheritDoc} */
public final Font getFont(final int size) { if (this.size == size) { return font; } this.size = size / 1000f; font = font.deriveFont(this.size); return font; }
{@inheritDoc}
/** {@inheritDoc} */
public final int getAscender(final int size) { return typeface.getAscender(size); }
{@inheritDoc}
/** {@inheritDoc} */
public final int getCapHeight(final int size) { return typeface.getCapHeight(size); }
{@inheritDoc}
/** {@inheritDoc} */
public final int getDescender(final int size) { return typeface.getDescender(size); }
{@inheritDoc}
/** {@inheritDoc} */
public final String getEmbedFontName() { return typeface.getEmbedFontName(); }
{@inheritDoc}
/** {@inheritDoc} */
public final Set<String> getFamilyNames() { return typeface.getFamilyNames(); }
{@inheritDoc}
/** {@inheritDoc} */
public final String getFontName() { return typeface.getFontName(); }
{@inheritDoc}
/** {@inheritDoc} */
public final URI getFontURI() { return typeface.getFontURI(); }
{@inheritDoc}
/** {@inheritDoc} */
public final FontType getFontType() { return typeface.getFontType(); }
{@inheritDoc}
/** {@inheritDoc} */
public final String getFullName() { return typeface.getFullName(); }
{@inheritDoc}
/** {@inheritDoc} */
public final Map getKerningInfo() { return typeface.getKerningInfo(); }
{@inheritDoc}
/** {@inheritDoc} */
public final int getWidth(final int i, final int size) { return typeface.getWidth(i, size); }
{@inheritDoc}
/** {@inheritDoc} */
public final int[] getWidths() { return typeface.getWidths(); } public Rectangle getBoundingBox(int glyphIndex, int size) { return typeface.getBoundingBox(glyphIndex, size); }
{@inheritDoc}
/** {@inheritDoc} */
public final int getXHeight(final int size) { return typeface.getXHeight(size); } public int getUnderlinePosition(int size) { return typeface.getUnderlinePosition(size); } public int getUnderlineThickness(int size) { return typeface.getUnderlineThickness(size); } public int getStrikeoutPosition(int size) { return typeface.getStrikeoutPosition(size); } public int getStrikeoutThickness(int size) { return typeface.getStrikeoutThickness(size); }
{@inheritDoc}
/** {@inheritDoc} */
public final boolean hasKerningInfo() { return typeface.hasKerningInfo(); }
{@inheritDoc}
/** {@inheritDoc} */
public boolean isMultiByte() { return typeface.isMultiByte(); }
{@inheritDoc}
/** * {@inheritDoc} */
public boolean performsPositioning() { if (typeface instanceof Positionable) { return ((Positionable) typeface).performsPositioning(); } else { return false; } }
{@inheritDoc}
/** * {@inheritDoc} */
public int[][] performPositioning(CharSequence cs, String script, String language, int fontSize) { if (typeface instanceof Positionable) { return ((Positionable) typeface).performPositioning(cs, script, language, fontSize); } else { return null; } }
{@inheritDoc}
/** * {@inheritDoc} */
public int[][] performPositioning(CharSequence cs, String script, String language) { if (typeface instanceof Positionable) { return ((Positionable) typeface).performPositioning(cs, script, language); } else { return null; } }
{@inheritDoc}
/** * {@inheritDoc} */
public boolean performsSubstitution() { if (typeface instanceof Substitutable) { return ((Substitutable) typeface).performsSubstitution(); } else { return false; } }
{@inheritDoc}
/** * {@inheritDoc} */
public CharSequence performSubstitution(CharSequence cs, String script, String language, List associations, boolean retainControls) { if (typeface instanceof Substitutable) { return ((Substitutable) typeface).performSubstitution(cs, script, language, associations, retainControls); } else { return cs; } }
{@inheritDoc}
/** * {@inheritDoc} */
public CharSequence reorderCombiningMarks(CharSequence cs, int[][] gpa, String script, String language, List associations) { if (typeface instanceof Substitutable) { return ((Substitutable) typeface).reorderCombiningMarks(cs, gpa, script, language, associations); } else { return cs; } } public Typeface getRealFont() { return typeface; } }