blob: 5c95c81bfd4042dd3a72e0440193b33aa547dcf0 [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.fonts;
/**
* Font utilities.
*/
public final class FontUtil {
private FontUtil() {
}
/**
* Parses an CSS2 (SVG and XSL-FO) font weight (normal, bold, 100-900) to
* an integer.
* See http://www.w3.org/TR/REC-CSS2/fonts.html#propdef-font-weight
* TODO: Implement "lighter" and "bolder".
* @param text the font weight to parse
* @return an integer between 100 and 900 (100, 200, 300...)
*/
public static int parseCSS2FontWeight(String text) {
int weight = 400;
try {
weight = Integer.parseInt(text);
weight = (weight / 100) * 100;
weight = Math.max(weight, 100);
weight = Math.min(weight, 900);
} catch (NumberFormatException nfe) {
//weight is no number, so convert symbolic name to number
if (text.equals("normal")) {
weight = 400;
} else if (text.equals("bold")) {
weight = 700;
} else {
throw new IllegalArgumentException(
"Illegal value for font weight: '"
+ text
+ "'. Use one of: 100, 200, 300, "
+ "400, 500, 600, 700, 800, 900, "
+ "normal (=400), bold (=700)");
}
}
return weight;
}
/**
* Removes all white space from a string (used primarily for font names)
* @param str the string
* @return the processed result
*/
public static String stripWhiteSpace(String str) {
if (str != null) {
StringBuffer stringBuffer = new StringBuffer(str.length());
for (int i = 0, strLen = str.length(); i < strLen; i++) {
final char ch = str.charAt(i);
if (ch != ' ' && ch != '\r' && ch != '\n' && ch != '\t') {
stringBuffer.append(ch);
}
}
return stringBuffer.toString();
}
return str;
}
/** font constituent names which identify a font as being of "italic" style */
private static final String[] ITALIC_WORDS = {
Font.STYLE_ITALIC, Font.STYLE_OBLIQUE, Font.STYLE_INCLINED
};
/** font constituent names which identify a font as being of "light" weight */
private static final String[] LIGHT_WORDS = {"light"};
/** font constituent names which identify a font as being of "medium" weight */
private static final String[] MEDIUM_WORDS = {"medium"};
/** font constituent names which identify a font as being of "demi/semi" weight */
private static final String[] DEMI_WORDS = {"demi", "semi"};
/** font constituent names which identify a font as being of "bold" weight */
private static final String[] BOLD_WORDS = {"bold"};
/** font constituent names which identify a font as being of "extra bold" weight */
private static final String[] EXTRA_BOLD_WORDS = {"extrabold", "extra bold", "black",
"heavy", "ultra", "super"};
/**
* Guesses the font style of a font using its name.
* @param fontName the font name
* @return "normal" or "italic"
*/
public static String guessStyle(String fontName) {
if (fontName != null) {
for (String word : ITALIC_WORDS) {
if (fontName.indexOf(word) != -1) {
return Font.STYLE_ITALIC;
}
}
}
return Font.STYLE_NORMAL;
}
/**
* Guesses the font weight of a font using its name.
* @param fontName the font name
* @return an integer between 100 and 900
*/
public static int guessWeight(String fontName) {
// weight
int weight = Font.WEIGHT_NORMAL;
for (String word : BOLD_WORDS) {
if (fontName.indexOf(word) != -1) {
weight = Font.WEIGHT_BOLD;
break;
}
}
for (String word : MEDIUM_WORDS) {
if (fontName.indexOf(word) != -1) {
weight = Font.WEIGHT_NORMAL + 100; //500
break;
}
}
//Search for "semi/demi" before "light", but after "bold"
//(normally semi/demi-bold is meant, but it can also be semi/demi-light)
for (String word : DEMI_WORDS) {
if (fontName.indexOf(word) != -1) {
weight = Font.WEIGHT_BOLD - 100; //600
break;
}
}
for (String word : EXTRA_BOLD_WORDS) {
if (fontName.indexOf(word) != -1) {
weight = Font.WEIGHT_EXTRA_BOLD;
break;
}
}
for (String word : LIGHT_WORDS) {
if (fontName.indexOf(word) != -1) {
weight = Font.WEIGHT_LIGHT;
break;
}
}
return weight;
}
}