aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/layout/FontInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/apache/fop/layout/FontInfo.java')
-rw-r--r--src/org/apache/fop/layout/FontInfo.java133
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);
}
-
}
+