diff options
author | Keiron Liddle <keiron@apache.org> | 2002-07-23 11:06:51 +0000 |
---|---|---|
committer | Keiron Liddle <keiron@apache.org> | 2002-07-23 11:06:51 +0000 |
commit | f6a0559f5fe65405fa202434fe514de7a0f372bc (patch) | |
tree | 95c06a67fc1eae9b0f36bf885994ec04b415b96d /src/org/apache/fop/layout | |
parent | 7f263c27804a4882f33f5a423150d5cc52448361 (diff) | |
download | xmlgraphics-fop-f6a0559f5fe65405fa202434fe514de7a0f372bc.tar.gz xmlgraphics-fop-f6a0559f5fe65405fa202434fe514de7a0f372bc.zip |
cleaned up the font state a bit
exception only thrown after setup as exception indicates invalid setup
only font name key and size are set on the area tree
FontState used as handler to get metric info
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@195024 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop/layout')
-rw-r--r-- | src/org/apache/fop/layout/FontInfo.java | 133 | ||||
-rw-r--r-- | src/org/apache/fop/layout/FontState.java | 37 |
2 files changed, 98 insertions, 72 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); } - } + diff --git a/src/org/apache/fop/layout/FontState.java b/src/org/apache/fop/layout/FontState.java index 147e1198d..3ff676bd7 100644 --- a/src/org/apache/fop/layout/FontState.java +++ b/src/org/apache/fop/layout/FontState.java @@ -9,18 +9,16 @@ package org.apache.fop.layout; import java.util.HashMap; -import org.apache.fop.apps.FOPException; import org.apache.fop.fo.properties.FontVariant; import org.apache.fop.render.pdf.CodePointMapping; public class FontState { - private FontInfo _fontInfo; private String _fontName; private int _fontSize; private String _fontFamily; private String _fontStyle; - private String _fontWeight; + private int _fontWeight; private int _fontVariant; private FontMetric _metric; @@ -28,17 +26,10 @@ public class FontState { private static HashMap EMPTY_HASHMAP = new HashMap(); - public FontState(FontInfo fontInfo, String fontFamily, String fontStyle, - String fontWeight, int fontSize, - int fontVariant) throws FOPException { - _fontInfo = fontInfo; - _fontFamily = fontFamily; - _fontStyle = fontStyle; - _fontWeight = fontWeight; + public FontState(String key, FontMetric met, int fontSize) { _fontSize = fontSize; - _fontName = fontInfo.fontLookup(fontFamily, fontStyle, fontWeight); - _metric = fontInfo.getMetricsFor(_fontName); - _fontVariant = fontVariant; + _fontName = key; + _metric = met; } public int getAscender() { @@ -61,26 +52,6 @@ public class FontState { return _fontSize; } - public String getFontWeight() { - return _fontWeight; - } - - public String getFontFamily() { - return _fontFamily; - } - - public String getFontStyle() { - return _fontStyle; - } - - public int getFontVariant() { - return _fontVariant; - } - - public FontInfo getFontInfo() { - return _fontInfo; - } - public int getXHeight() { return _metric.getXHeight(_fontSize) / 1000; } |