]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-2346: UnsupportedOperationException when handling an SVG containing a font-face
authorVincent Hennebert <vhennebert@apache.org>
Thu, 20 Feb 2014 21:45:20 +0000 (21:45 +0000)
committerVincent Hennebert <vhennebert@apache.org>
Thu, 20 Feb 2014 21:45:20 +0000 (21:45 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1570362 13f79535-47bb-0310-9956-ffa450edef68

lib/batik-all-trunk.jar
src/java/org/apache/fop/afp/svg/AFPFontFamilyResolver.java
src/java/org/apache/fop/svg/font/AggregatingFontFamilyResolver.java
src/java/org/apache/fop/svg/font/FOPFontFamilyResolverImpl.java
src/java/org/apache/fop/svg/font/FOPGVTFontFamily.java
src/java/org/apache/fop/svg/font/FilteringFontFamilyResolver.java
test/java/org/apache/fop/svg/font/FOPFontFamilyResolverTestCase.java

index 4641118f6a21caadf05d5257eab575efbd925e00..08c1a383aabef154d5f769a25351f7fd89b18308 100644 (file)
Binary files a/lib/batik-all-trunk.jar and b/lib/batik-all-trunk.jar differ
index 27026f4f32b318bd0f514663bc7768f43c6a1120..a8217088b31c965d3ef65342a514316117ac8a60 100644 (file)
@@ -22,6 +22,8 @@ package org.apache.fop.afp.svg;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.batik.gvt.font.GVTFontFace;
+
 import org.apache.fop.afp.AFPEventProducer;
 import org.apache.fop.afp.fonts.DoubleByteFont;
 import org.apache.fop.events.EventBroadcaster;
@@ -69,7 +71,8 @@ public class AFPFontFamilyResolver extends FilteringFontFamilyResolver {
                     notifyDBFontRejection(font.getFontName());
                 } else {
                     return new FOPGVTFontFamily(fontInfo, fontFamily,
-                            new FontTriplet(fontFamily, Font.STYLE_NORMAL, Font.WEIGHT_NORMAL));
+                            new FontTriplet(fontFamily, Font.STYLE_NORMAL, Font.WEIGHT_NORMAL),
+                            new GVTFontFace(fontFamily));
                 }
 
             }
index 313a6a74b472067e0399ff861f681781a7b4f1bd..a5a25c4cee067821c69a3d4d8166e41b0169885f 100644 (file)
 
 package org.apache.fop.svg.font;
 
+import java.io.InputStream;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.batik.bridge.FontFace;
 import org.apache.batik.gvt.font.FontFamilyResolver;
 import org.apache.batik.gvt.font.GVTFontFamily;
 
@@ -33,19 +35,19 @@ public class AggregatingFontFamilyResolver implements FontFamilyResolver {
         this.resolvers = Arrays.<FontFamilyResolver>asList(resolvers);
     }
 
-    public String lookup(String familyName) {
+    public GVTFontFamily resolve(String familyName) {
         for (FontFamilyResolver resolver : resolvers) {
-            String lookup = resolver.lookup(familyName);
-            if (lookup != null) {
-                return lookup;
+            GVTFontFamily family = resolver.resolve(familyName);
+            if (family != null) {
+                return family;
             }
         }
         return null;
     }
 
-    public GVTFontFamily resolve(String familyName) {
+    public GVTFontFamily resolve(String familyName, FontFace fontFace) {
         for (FontFamilyResolver resolver : resolvers) {
-            GVTFontFamily family = resolver.resolve(familyName);
+            GVTFontFamily family = resolver.resolve(familyName, fontFace);
             if (family != null) {
                 return family;
             }
@@ -53,6 +55,17 @@ public class AggregatingFontFamilyResolver implements FontFamilyResolver {
         return null;
     }
 
+    public GVTFontFamily loadFont(InputStream in, FontFace fontFace) throws Exception {
+        for (FontFamilyResolver resolver : resolvers) {
+            try {
+                return resolver.loadFont(in, fontFace);
+            } catch (Exception e) {
+                // Try the next one
+            }
+        }
+        return null;
+    }
+
     public GVTFontFamily getDefault() {
         return resolve("any");
     }
index a9a631691f5d2d665cd3dbd8c7362ca35b2b5c95..4305838daea1e1df9858b124185a1d8c9b92a5a3 100644 (file)
 
 package org.apache.fop.svg.font;
 
+import java.io.InputStream;
 import java.util.Map;
 
+import org.apache.batik.bridge.FontFace;
+import org.apache.batik.gvt.font.GVTFontFace;
+import org.apache.batik.gvt.font.GVTFontFamily;
+
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontTriplet;
@@ -34,20 +39,27 @@ public class FOPFontFamilyResolverImpl implements FOPFontFamilyResolver {
         this.fontInfo = fontInfo;
     }
 
-    public String lookup(String familyName) {
-        // TODO Auto-generated method stub
-        throw new UnsupportedOperationException();
+    public FOPGVTFontFamily resolve(String familyName) {
+        return resolve(familyName, new GVTFontFace(familyName));
     }
 
-    public FOPGVTFontFamily resolve(String familyName) {
+    public FOPGVTFontFamily resolve(String familyName, FontFace fontFace) {
+        return resolve(familyName, (GVTFontFace) FontFace.createFontFace(familyName, fontFace));
+    }
+
+    private FOPGVTFontFamily resolve(String familyName, GVTFontFace fontFace) {
         FOPGVTFontFamily gvtFontFamily = null;
         FontTriplet triplet = fontInfo.fontLookup(familyName, Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
         if (fontInfo.hasFont(familyName, Font.STYLE_NORMAL, Font.WEIGHT_NORMAL)) {
-            gvtFontFamily = new FOPGVTFontFamily(fontInfo, familyName, triplet);
+            gvtFontFamily = new FOPGVTFontFamily(fontInfo, familyName, triplet, fontFace);
         }
         return gvtFontFamily;
     }
 
+    public GVTFontFamily loadFont(InputStream in, FontFace fontFace) throws Exception {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
     public FOPGVTFontFamily getDefault() {
         return resolve("any");
     }
@@ -58,7 +70,8 @@ public class FOPFontFamilyResolverImpl implements FOPFontFamilyResolver {
             if (font.hasChar(c)) {
                 String fontFamily = font.getFamilyNames().iterator().next();
                 return new FOPGVTFontFamily(fontInfo, fontFamily,
-                        new FontTriplet(fontFamily, Font.STYLE_NORMAL, Font.WEIGHT_NORMAL));
+                        new FontTriplet(fontFamily, Font.STYLE_NORMAL, Font.WEIGHT_NORMAL),
+                        new GVTFontFace(fontFamily));
             }
         }
         return null;
index 036b560a06e546eccbeca31e116f5a4cfc4fd81e..5be9419d388c34d79774984e3913f862f61b1db2 100644 (file)
@@ -38,10 +38,13 @@ public class FOPGVTFontFamily implements GVTFontFamily {
 
     private final String familyName;
 
-    public FOPGVTFontFamily(FontInfo fontInfo, String familyName, FontTriplet triplet) {
+    private GVTFontFace fontFace;
+
+    public FOPGVTFontFamily(FontInfo fontInfo, String familyName, FontTriplet triplet, GVTFontFace fontFace) {
         this.fontInfo = fontInfo;
         this.fontTriplet = triplet;
         this.familyName = familyName;
+        this.fontFace = fontFace;
     }
 
     public String getFamilyName() {
@@ -49,8 +52,7 @@ public class FOPGVTFontFamily implements GVTFontFamily {
     }
 
     public GVTFontFace getFontFace() {
-        // TODO Auto-generated method stub
-        throw new UnsupportedOperationException();
+        return fontFace;
     }
 
     public FOPGVTFont deriveFont(float size, AttributedCharacterIterator aci) {
index 319d6b2b8484d7908004bd9012cad4dd11b56a03..93b92ea36c81afffe17c37c90b1c8ae31ce145d3 100644 (file)
 
 package org.apache.fop.svg.font;
 
+import java.io.InputStream;
+
+import org.apache.batik.bridge.FontFace;
+import org.apache.batik.gvt.font.GVTFontFamily;
+
 
 public class FilteringFontFamilyResolver implements FOPFontFamilyResolver {
 
@@ -28,14 +33,18 @@ public class FilteringFontFamilyResolver implements FOPFontFamilyResolver {
         this.delegate = delegate;
     }
 
-    public String lookup(String familyName) {
-        return delegate.lookup(familyName);
-    }
-
     public FOPGVTFontFamily resolve(String familyName) {
         return delegate.resolve(familyName);
     }
 
+    public GVTFontFamily resolve(String familyName, FontFace fontFace) {
+        return delegate.resolve(familyName, fontFace);
+    }
+
+    public GVTFontFamily loadFont(InputStream in, FontFace fontFace) throws Exception {
+        return delegate.loadFont(in, fontFace);
+    }
+
     public FOPGVTFontFamily getDefault() {
         return delegate.getDefault();
     }
index ca843ec366f8ea2d4194fa203513db5c1cf4fb0d..d14752b90a12f60ceba1ce5f712734fc48c62dab 100644 (file)
@@ -81,7 +81,7 @@ public class FOPFontFamilyResolverTestCase {
 
     @Test
     public void testDeriveFont() {
-        FOPGVTFontFamily family = (FOPGVTFontFamily) resolver.resolve(FontInfoBuilder.DEJAVU_LGC_SERIF);
+        FOPGVTFontFamily family = resolver.resolve(FontInfoBuilder.DEJAVU_LGC_SERIF);
         FOPGVTFont font = family.deriveFont(10, Collections.emptyMap());
         assertEquals(10, font.getSize(), 0);
         assertTrue(font.canDisplay('\u01F6'));
@@ -91,7 +91,7 @@ public class FOPFontFamilyResolverTestCase {
     @Test
     @Ignore("FOP metrics don't match AWT, but not sure who is right and who is wrong")
     public void testLineMetrics() throws FontFormatException, IOException {
-        FOPGVTFontFamily family = (FOPGVTFontFamily) resolver.resolve(FontInfoBuilder.DEJAVU_LGC_SERIF);
+        FOPGVTFontFamily family = resolver.resolve(FontInfoBuilder.DEJAVU_LGC_SERIF);
         FOPGVTFont font = family.deriveFont(10, Collections.emptyMap());
         GVTLineMetrics fopMetrics = font.getLineMetrics("", null);
         LineMetrics awtMetrics = getAWTLineMetrics();