diff options
Diffstat (limited to 'src/org/apache/fop/layout/FontInfo.java')
-rw-r--r-- | src/org/apache/fop/layout/FontInfo.java | 133 |
1 files changed, 94 insertions, 39 deletions
diff --git a/src/org/apache/fop/layout/FontInfo.java b/src/org/apache/fop/layout/FontInfo.java index c8b6fa955..a6df5f54a 100644 --- a/src/org/apache/fop/layout/FontInfo.java +++ b/src/org/apache/fop/layout/FontInfo.java @@ -9,9 +9,19 @@ package org.apache.fop.layout; import java.util.HashMap; -import org.apache.fop.apps.FOPException; - +/** + * 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. + * Currently font supported font-variant small-caps is not + * implemented. + */ public class FontInfo { + public static final String DEFAULT_FONT = "any,normal,400"; + public static final int NORMAL = 400; + public static final int BOLD = 700; + HashMap usedFonts; HashMap triplets; // look up a font-triplet to find a font-name HashMap fonts; // look up a font-name to get a font (that implements FontMetric at least) @@ -22,8 +32,12 @@ public class FontInfo { this.usedFonts = new HashMap(); } + public boolean isSetupValid() { + return triplets.containsKey(DEFAULT_FONT); + } + public void addFontProperties(String name, String family, String style, - String weight) { + int weight) { /* * add the given family, style and weight as a lookup for the font * with the given name @@ -39,56 +53,92 @@ public class FontInfo { this.fonts.put(name, metrics); } + /** + * Lookup a font. + * Locate the font name for a given familyi, 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. + */ public String fontLookup(String family, String style, - String weight) throws FOPException { - return fontLookup(createFontKey(family, style, weight)); - } + int weight) { + String key; + // first try given parameters + key = createFontKey(family, style, weight); + String f = (String)triplets.get(key); + 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) { + key = createFontKey("any", style, weight); + f = (String)triplets.get(key); + } - public String fontLookup(String key) throws FOPException { - - String f = (String)this.triplets.get(key); - if (f == null) { - int i = key.indexOf(','); - String s = "any" + key.substring(i); - f = (String)this.triplets.get(s); - if (f == null) { - f = (String)this.triplets.get("any,normal,normal"); - if (f == null) { - throw new FOPException("no default font defined by OutputConverter"); - } - //log.error("defaulted font to any,normal,normal"); + // then try any family with adjusted weight + if(f == null) { + f = findAdjustWeight(family, style, weight); } - //log.error("unknown font " + key - // + " so defaulted font to any"); + + // then use default + f = (String)triplets.get(DEFAULT_FONT); + } usedFonts.put(f, fonts.get(f)); return f; } - public boolean hasFont(String family, String style, String weight) { + /** + * Find a font with a given family and style by trying + * different font weights according to the spec. + */ + 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) { + newWeight -= 100; + key = createFontKey(family, style, newWeight); + f = (String)triplets.get(key); + } + } else if(newWeight == 500) { + key = createFontKey(family, style, 400); + f = (String)triplets.get(key); + } 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) { + newWeight -= 100; + key = createFontKey(family, style, newWeight); + f = (String)triplets.get(key); + } + } + if(f == null) { + key = createFontKey(family, style, 400); + f = (String)triplets.get(key); + } + + return f; + } + + public boolean hasFont(String family, String style, int weight) { String key = createFontKey(family, style, weight); - return this.triplets.get(key) != null; + return this.triplets.containsKey(key); } /** * Creates a key from the given strings */ public static String createFontKey(String family, String style, - String weight) { - int i; - - try { - i = Integer.parseInt(weight); - } catch (NumberFormatException e) { - i = 0; - } - - if (i > 600) - weight = "bold"; - else if (i > 0) - weight = "normal"; - + int weight) { return family + "," + style + "," + weight; } @@ -96,13 +146,18 @@ public class FontInfo { return 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. + */ public HashMap getUsedFonts() { return this.usedFonts; } - public FontMetric getMetricsFor(String fontName) throws FOPException { + public FontMetric getMetricsFor(String fontName) { usedFonts.put(fontName, fonts.get(fontName)); return (FontMetric)fonts.get(fontName); } - } + |