blob: afb22a8831664e3ffc352cae7ddf032e9cfa475a [file] [log] [blame]
/*
* 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.java2d;
import java.awt.GraphicsEnvironment;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.fonts.Font;
import org.apache.fop.fonts.FontCollection;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.FontTriplet;
import org.apache.fop.fonts.FontUtil;
/**
* A custom AWT font collection
*/
public class InstalledFontCollection implements FontCollection {
private static Log log = LogFactory.getLog(InstalledFontCollection.class);
private static final Set<String> HARDCODED_FONT_NAMES;
static {
HARDCODED_FONT_NAMES = new java.util.HashSet<String>();
HARDCODED_FONT_NAMES.add("any");
HARDCODED_FONT_NAMES.add("sans-serif");
HARDCODED_FONT_NAMES.add("serif");
HARDCODED_FONT_NAMES.add("monospace");
HARDCODED_FONT_NAMES.add("Helvetica");
HARDCODED_FONT_NAMES.add("Times");
HARDCODED_FONT_NAMES.add("Courier");
HARDCODED_FONT_NAMES.add("Symbol");
HARDCODED_FONT_NAMES.add("ZapfDingbats");
HARDCODED_FONT_NAMES.add("Times Roman");
HARDCODED_FONT_NAMES.add("Times-Roman");
HARDCODED_FONT_NAMES.add("Computer-Modern-Typewriter");
}
/** Required by new instances of FontMetricsMapper */
private final Java2DFontMetrics java2DFontMetrics;
/**
* Main constructor
*
* @param java2DFontMetrics required by new instances of FontMetricsMapper
*/
public InstalledFontCollection(Java2DFontMetrics java2DFontMetrics) {
this.java2DFontMetrics = java2DFontMetrics;
}
/**
* {@inheritDoc}
*/
public int setup(int start, FontInfo fontInfo) {
int num = start;
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
java.awt.Font[] fonts = env.getAllFonts();
for (int i = 0; i < fonts.length; i++) {
java.awt.Font f = fonts[i];
if (HARDCODED_FONT_NAMES.contains(f.getName())) {
continue; //skip
}
if (log.isTraceEnabled()) {
log.trace("AWT Font: " + f.getFontName()
+ ", family: " + f.getFamily()
+ ", PS: " + f.getPSName()
+ ", Name: " + f.getName()
+ ", Angle: " + f.getItalicAngle()
+ ", Style: " + f.getStyle());
}
String searchName = FontUtil.stripWhiteSpace(f.getName()).toLowerCase();
String guessedStyle = FontUtil.guessStyle(searchName);
int guessedWeight = FontUtil.guessWeight(searchName);
num++;
String fontKey = "F" + num;
int style = convertToAWTFontStyle(guessedStyle, guessedWeight);
addFontMetricsMapper(fontInfo, f.getName(), fontKey, java2DFontMetrics, style);
//Register appropriate font triplets matching the font. Two different strategies:
//Example: "Arial Bold", normal, normal
addFontTriplet(fontInfo, f.getName(),
Font.STYLE_NORMAL, Font.WEIGHT_NORMAL, fontKey);
if (!f.getName().equals(f.getFamily())) {
//Example: "Arial", bold, normal
addFontTriplet(fontInfo, f.getFamily(),
guessedStyle, guessedWeight, fontKey);
}
}
return num;
}
private static void addFontTriplet(FontInfo fontInfo, String fontName, String fontStyle,
int fontWeight, String fontKey) {
FontTriplet triplet = FontInfo.createFontKey(fontName, fontStyle, fontWeight);
fontInfo.addFontProperties(fontKey, triplet);
}
private static void addFontMetricsMapper(FontInfo fontInfo, String family, String fontKey,
Java2DFontMetrics java2DFontMetrics, int style) {
FontMetricsMapper metric = new SystemFontMetricsMapper(family, style, java2DFontMetrics);
fontInfo.addMetrics(fontKey, metric);
}
private static int convertToAWTFontStyle(String fontStyle, int fontWeight) {
int style = java.awt.Font.PLAIN;
if (fontWeight >= Font.WEIGHT_BOLD) {
style |= java.awt.Font.BOLD;
}
if (!"normal".equals(fontStyle)) {
style |= java.awt.Font.ITALIC;
}
return style;
}
}