Author: acumiskey
Date: Fri Jul 18 02:11:10 2008
New Revision: 677863

URL: http://svn.apache.org/viewvc?rev=677863&view=rev
Log:
Ok, I am much happier with this fix now, it doesn't feel like a temporary hack 
anymore :).

I have revised the fontLookup() algorithm in FontInfo so it now first tries to 
find matching font triplets by iterating over all the font family names 
*without substitutions*, if this fails it then iterates over all the font 
family names looking for matching font triplets *with substitutions* rather 
then just take the last one in the font family name list with substitutions.

Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/fonts/AFPFontCollection.java

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java?rev=677863&r1=677862&r2=677863&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java Fri Jul 
18 02:11:10 2008
@@ -188,12 +188,12 @@
      * @param family font family
      * @param style font style
      * @param weight font weight
-     * @param substFont true if the font may be substituted with the
+     * @param substitutable true if the font may be substituted with the
      *                  default font if not found
      * @return internal font triplet key
      */
     private FontTriplet fontLookup(String family, String style,
-                             int weight, boolean substFont) {
+                             int weight, boolean substitutable) {
         if (log.isTraceEnabled()) {
             log.trace("Font lookup: " + family + " " + style + " " + weight);
         }
@@ -203,7 +203,7 @@
         // first try given parameters
         String internalFontKey = getInternalFontKey(fontTriplet);
         if (internalFontKey == null) {
-            fontTriplet = fuzzyFontLookup(family, style, weight, startKey, 
substFont);
+            fontTriplet = fuzzyFontLookup(family, style, weight, startKey, 
substitutable);
         }
 
         if (fontTriplet != null) {
@@ -345,6 +345,19 @@
         return fontLookup(family, style, weight, true);
     }
 
+    private List/*<FontTriplet>*/ fontLookup(String[] families, String style,
+            int weight, boolean substitutable) {
+        List matchingTriplets = new java.util.ArrayList();
+        FontTriplet triplet = null;
+        for (int i = 0; i < families.length; i++) {
+            triplet = fontLookup(families[i], style, weight, substitutable);
+            if (triplet != null) {
+                matchingTriplets.add(triplet);
+            }
+        }
+        return matchingTriplets;
+    }
+
     /**
      * Looks up a set of fonts.
      * <br>
@@ -363,28 +376,32 @@
         if (families.length == 0) {
             throw new IllegalArgumentException("Specify at least one font 
family");
         }
-        FontTriplet triplet;
-        List tmpTriplets = new java.util.ArrayList();
-        for (int i = 0, c = families.length; i < c; i++) {
-            boolean substitutable = (i >= families.length - 1);
-            triplet = fontLookup(families[i], style, weight, substitutable);
-            if (triplet != null) {
-                tmpTriplets.add(triplet);
-            }
-        }
-        if (tmpTriplets.size() != 0) {
-            return (FontTriplet[]) tmpTriplets.toArray(TRIPLETS_TYPE);
+        
+        // try matching without substitutions
+        List/*<FontTriplet>*/ matchedTriplets = fontLookup(families, style, 
weight, false);
+        
+        // if there are no matching font triplets found try with substitutions
+        if (matchedTriplets.size() == 0) {
+            matchedTriplets = fontLookup(families, style, weight, true);
         }
-        StringBuffer sb = new StringBuffer();
-        for (int i = 0, c = families.length; i < c; i++) {
-            if (i > 0) {
-                sb.append(", ");
+
+        // no matching font triplets found!
+        if (matchedTriplets.size() == 0) {
+            StringBuffer sb = new StringBuffer();
+            for (int i = 0, c = families.length; i < c; i++) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+                sb.append(families[i]);
             }
-            sb.append(families[i]);
+            throw new IllegalStateException(
+                        "fontLookup must return an array with at least one "
+                        + "FontTriplet on the last call. Lookup: " + 
sb.toString());
+            
         }
-        throw new IllegalStateException(
-                    "fontLookup must return an array with at least one "
-                    + "FontTriplet on the last call. Lookup: " + 
sb.toString());
+
+        // found some matching fonts so return them
+        return (FontTriplet[]) matchedTriplets.toArray(TRIPLETS_TYPE);
     }
 
     private Set/*<FontTriplet>*/ getLoggedFontKeys() {

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/fonts/AFPFontCollection.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/fonts/AFPFontCollection.java?rev=677863&r1=677862&r2=677863&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/fonts/AFPFontCollection.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/fonts/AFPFontCollection.java
 Fri Jul 18 02:11:10 2008
@@ -97,22 +97,6 @@
             fontInfo.addMetrics("F" + num, bf);
             num++;
         }
-        if (fontInfo.fontLookup("Symbol", Font.STYLE_NORMAL, 
Font.WEIGHT_NORMAL) == null) {
-            FontTriplet ft = fontInfo.fontLookup(
-                    "sans-serif", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
-            fontInfo.addFontProperties(
-                    fontInfo.getInternalFontKey(ft),
-                    "Symbol", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
-            num++;
-        }
-        if (fontInfo.fontLookup("ZapfDingbats", Font.STYLE_NORMAL, 
Font.WEIGHT_NORMAL) == null) {
-            FontTriplet ft = fontInfo.fontLookup(
-                    "sans-serif", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
-            fontInfo.addFontProperties(
-                    fontInfo.getInternalFontKey(ft),
-                    "ZapfDingbats", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
-            num++;
-        }
         if (fontInfo.fontLookup("any", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL) 
== null) {
             FontTriplet ft = fontInfo.fontLookup(
                     "sans-serif", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to