/*
* $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
+ * Copyright (C) 2001-2003 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.layout;
-import java.util.HashMap;
+// Java
+import java.util.Map;
+
+// FOP
+import org.apache.fop.fonts.FontMetrics;
/**
- * The fontinfo for the layout and rendering of a fo document.
+ * The FontInfo for the layout and rendering of a fo document.
* This stores the list of available fonts that are setup by
* the renderer. The font name can be retrieved for the
* family style and weight.
+ * <br>
* Currently font supported font-variant small-caps is not
* implemented.
*/
public class FontInfo {
+
+ /** Default fallback key */
public static final String DEFAULT_FONT = "any,normal,400";
+ /** Normal font weight */
public static final int NORMAL = 400;
+ /** Bold font weight */
public static final int BOLD = 700;
- private HashMap usedFonts;
- private HashMap triplets; // look up a font-triplet to find a font-name
- private HashMap fonts; // look up a font-name to get a font (that implements FontMetric at least)
+ /** Map containing fonts that have been used */
+ private Map usedFonts;
+
+ /** look up a font-triplet to find a font-name */
+ private Map triplets;
+
+ /** look up a font-name to get a font (that implements FontMetrics at least) */
+ private Map fonts;
+ /**
+ * Main constructor
+ */
public FontInfo() {
- this.triplets = new HashMap();
- this.fonts = new HashMap();
- this.usedFonts = new HashMap();
+ this.triplets = new java.util.HashMap();
+ this.fonts = new java.util.HashMap();
+ this.usedFonts = new java.util.HashMap();
}
+ /**
+ * Checks if the font setup is valid (At least the ultimate fallback font
+ * must be registered.)
+ * @return True if valid
+ */
public boolean isSetupValid() {
return triplets.containsKey(DEFAULT_FONT);
}
+ /**
+ * Adds a new font triplet.
+ * @param name internal key
+ * @param family font family name
+ * @param style font style (normal, italic, oblique...)
+ * @param weight font weight
+ */
public void addFontProperties(String name, String family, String style,
int weight) {
/*
this.triplets.put(key, name);
}
- public void addMetrics(String name, FontMetric metrics) {
+ /**
+ * Adds font metrics for a specific font.
+ * @param name internal key
+ * @param metrics metrics to register
+ */
+ public void addMetrics(String name, FontMetrics metrics) {
// add the given metrics as a font with the given name
this.fonts.put(name, metrics);
/**
* Lookup a font.
- * Locate the font name for a given familyi, style and weight.
+ * <br>
+ * Locate the font name for a given family, style and weight.
* The font name can then be used as a key as it is unique for
* the associated document.
* This also adds the font to the list of used fonts.
+ * @param family font family
+ * @param style font style
+ * @param weight font weight
+ * @return internal key
*/
public String fontLookup(String family, String style,
int weight) {
// first try given parameters
key = createFontKey(family, style, weight);
String f = (String)triplets.get(key);
- if(f == null) {
+ if (f == null) {
// then adjust weight, favouring normal or bold
f = findAdjustWeight(family, style, weight);
// then try any family with orig weight
- if(f == null) {
+ if (f == null) {
key = createFontKey("any", style, weight);
f = (String)triplets.get(key);
}
// then try any family with adjusted weight
- if(f == null) {
+ if (f == null) {
f = findAdjustWeight(family, style, weight);
}
/**
* Find a font with a given family and style by trying
* different font weights according to the spec.
+ * @param family font family
+ * @param style font style
+ * @param weight font weight
+ * @return internal key
*/
public String findAdjustWeight(String family, String style,
int weight) {
String key;
String f = null;
int newWeight = weight;
- if(newWeight < 400) {
- while(f == null && newWeight > 0) {
+ if (newWeight < 400) {
+ while (f == null && newWeight > 0) {
newWeight -= 100;
key = createFontKey(family, style, newWeight);
f = (String)triplets.get(key);
}
- } else if(newWeight == 500) {
+ } else if (newWeight == 500) {
key = createFontKey(family, style, 400);
f = (String)triplets.get(key);
- } else if(newWeight > 500) {
- while(f == null && newWeight < 1000) {
+ } else if (newWeight > 500) {
+ while (f == null && newWeight < 1000) {
newWeight += 100;
key = createFontKey(family, style, newWeight);
f = (String)triplets.get(key);
}
newWeight = weight;
- while(f == null && newWeight > 400) {
+ while (f == null && newWeight > 400) {
newWeight -= 100;
key = createFontKey(family, style, newWeight);
f = (String)triplets.get(key);
}
}
- if(f == null) {
+ if (f == null) {
key = createFontKey(family, style, 400);
f = (String)triplets.get(key);
}
return f;
}
+ /**
+ * Determines if a particular font is available.
+ * @param family font family
+ * @param style font style
+ * @param weight font weight
+ * @return True if available
+ */
public boolean hasFont(String family, String style, int weight) {
String key = createFontKey(family, style, weight);
return this.triplets.containsKey(key);
}
/**
- * Creates a key from the given strings
+ * Creates a key from the given strings.
+ * @param family font family
+ * @param style font style
+ * @param weight font weight
+ * @return internal key
*/
public static String createFontKey(String family, String style,
int weight) {
return family + "," + style + "," + weight;
}
- public HashMap getFonts() {
- return this.fonts;
+ /**
+ * Gets a Map of all registred fonts.
+ * @return a read-only Map with font key/FontMetrics pairs
+ */
+ public Map getFonts() {
+ return java.util.Collections.unmodifiableMap(this.fonts);
}
/**
* This is used by the renderers to retrieve all the
* fonts used in the document.
* This is for embedded font or creating a list of used fonts.
+ * @return a read-only Map with font key/FontMetrics pairs
*/
- public HashMap getUsedFonts() {
+ public Map getUsedFonts() {
return this.usedFonts;
}
- public FontMetric getMetricsFor(String fontName) {
+ /**
+ * Returns the FontMetrics for a particular font
+ * @param fontName internal key
+ * @return font metrics
+ */
+ public FontMetrics getMetricsFor(String fontName) {
usedFonts.put(fontName, fonts.get(fontName));
- return (FontMetric)fonts.get(fontName);
+ return (FontMetrics)fonts.get(fontName);
}
}
/*
* $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
+ * Copyright (C) 2001-2003 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.layout;
-import java.util.HashMap;
-import org.apache.fop.render.pdf.CodePointMapping;
+import java.util.Map;
+import org.apache.fop.fonts.CodePointMapping;
+import org.apache.fop.fonts.FontMetrics;
+
+/**
+ * This class holds font state information and provides access to the font
+ * metrics.
+ */
public class FontState {
- private String _fontName;
- private int _fontSize;
- private String _fontFamily;
- private String _fontStyle;
- private int _fontWeight;
+ private String fontName;
+ private int fontSize;
+ //private String fontFamily;
+ //private String fontStyle;
+ //private int fontWeight;
/**
* normal or small-caps font
*/
- private int _fontVariant;
-
- private FontMetric _metric;
-
- private static HashMap EMPTY_HASHMAP = new HashMap();
+ //private int fontVariant;
+ private FontMetrics metric;
- public FontState(String key, FontMetric met, int fontSize) {
- _fontSize = fontSize;
- _fontName = key;
- _metric = met;
+ /**
+ * Main constructor
+ * @param key key of the font
+ * @param met font metrics
+ * @param fontSize font size
+ */
+ public FontState(String key, FontMetrics met, int fontSize) {
+ this.fontName = key;
+ this.metric = met;
+ this.fontSize = fontSize;
}
+ /**
+ * Returns the font's ascender.
+ * @return the ascender
+ */
public int getAscender() {
- return _metric.getAscender(_fontSize) / 1000;
+ return metric.getAscender(fontSize) / 1000;
}
+ /**
+ * Returns the font's CapHeight.
+ * @return the capital height
+ */
public int getCapHeight() {
- return _metric.getCapHeight(_fontSize) / 1000;
+ return metric.getCapHeight(fontSize) / 1000;
}
+ /**
+ * Returns the font's Descender.
+ * @return the descender
+ */
public int getDescender() {
- return _metric.getDescender(_fontSize) / 1000;
+ return metric.getDescender(fontSize) / 1000;
}
+ /**
+ * Returns the font's name.
+ * @return the font name
+ */
public String getFontName() {
- return _fontName;
+ return fontName;
}
+ /**
+ * Returns the font size
+ * @return the font size
+ */
public int getFontSize() {
- return _fontSize;
+ return fontSize;
}
+ /**
+ * Returns the XHeight
+ * @return the XHeight
+ */
public int getXHeight() {
- return _metric.getXHeight(_fontSize) / 1000;
+ return metric.getXHeight(fontSize) / 1000;
}
- public HashMap getKerning() {
- if (_metric instanceof FontDescriptor) {
- HashMap ret = ((FontDescriptor)_metric).getKerningInfo();
- if (ret != null)
- return ret;
+ /**
+ * Returns the font's kerning table
+ * @return the kerning table
+ */
+ public Map getKerning() {
+ Map ret = metric.getKerningInfo();
+ if (ret != null) {
+ return ret;
+ } else {
+ return java.util.Collections.EMPTY_MAP;
}
- return EMPTY_HASHMAP;
}
- public int width(int charnum) {
+ /**
+ * Returns the width of a character
+ * @param charnum character to look up
+ * @return width of the character
+ */
+ public int getWidth(int charnum) {
// returns width of given character number in millipoints
- return (_metric.width(charnum, _fontSize) / 1000);
+ return (metric.getWidth(charnum, fontSize) / 1000);
}
/**
- * Map a java character (unicode) to a font character
- * Default uses CodePointMapping
+ * Map a java character (unicode) to a font character.
+ * Default uses CodePointMapping.
+ * @param c character to map
+ * @return the mapped character
*/
public char mapChar(char c) {
- if (_metric instanceof org.apache.fop.render.pdf.Font) {
- return ((org.apache.fop.render.pdf.Font)_metric).mapChar(c);
+ if (metric instanceof org.apache.fop.fonts.Font) {
+ return ((org.apache.fop.fonts.Font)metric).mapChar(c);
}
// Use default CodePointMapping
return c;
}
+ /**
+ * @see java.lang.Object#toString()
+ */
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append('(');
- sbuf.append(_fontFamily);
- sbuf.append(',');
- sbuf.append(_fontName);
+ /*
+ sbuf.append(fontFamily);
+ sbuf.append(',');*/
+ sbuf.append(fontName);
sbuf.append(',');
- sbuf.append(_fontSize);
+ sbuf.append(fontSize);
+ /*
sbuf.append(',');
- sbuf.append(_fontStyle);
+ sbuf.append(fontStyle);
sbuf.append(',');
- sbuf.append(_fontWeight);
+ sbuf.append(fontWeight);*/
sbuf.append(')');
return sbuf.toString();
}