From: Vincent Hennebert Date: Thu, 20 Feb 2014 21:45:20 +0000 (+0000) Subject: FOP-2346: UnsupportedOperationException when handling an SVG containing a font-face X-Git-Tag: fop-2_0~130 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=c51d59011a3071707e69f6f06e7def09395f75bc;p=xmlgraphics-fop.git FOP-2346: UnsupportedOperationException when handling an SVG containing a font-face git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1570362 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/batik-all-trunk.jar b/lib/batik-all-trunk.jar index 4641118f6..08c1a383a 100644 Binary files a/lib/batik-all-trunk.jar and b/lib/batik-all-trunk.jar differ diff --git a/src/java/org/apache/fop/afp/svg/AFPFontFamilyResolver.java b/src/java/org/apache/fop/afp/svg/AFPFontFamilyResolver.java index 27026f4f3..a8217088b 100644 --- a/src/java/org/apache/fop/afp/svg/AFPFontFamilyResolver.java +++ b/src/java/org/apache/fop/afp/svg/AFPFontFamilyResolver.java @@ -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)); } } diff --git a/src/java/org/apache/fop/svg/font/AggregatingFontFamilyResolver.java b/src/java/org/apache/fop/svg/font/AggregatingFontFamilyResolver.java index 313a6a74b..a5a25c4ce 100644 --- a/src/java/org/apache/fop/svg/font/AggregatingFontFamilyResolver.java +++ b/src/java/org/apache/fop/svg/font/AggregatingFontFamilyResolver.java @@ -19,9 +19,11 @@ 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.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"); } diff --git a/src/java/org/apache/fop/svg/font/FOPFontFamilyResolverImpl.java b/src/java/org/apache/fop/svg/font/FOPFontFamilyResolverImpl.java index a9a631691..4305838da 100644 --- a/src/java/org/apache/fop/svg/font/FOPFontFamilyResolverImpl.java +++ b/src/java/org/apache/fop/svg/font/FOPFontFamilyResolverImpl.java @@ -19,8 +19,13 @@ 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; diff --git a/src/java/org/apache/fop/svg/font/FOPGVTFontFamily.java b/src/java/org/apache/fop/svg/font/FOPGVTFontFamily.java index 036b560a0..5be9419d3 100644 --- a/src/java/org/apache/fop/svg/font/FOPGVTFontFamily.java +++ b/src/java/org/apache/fop/svg/font/FOPGVTFontFamily.java @@ -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) { diff --git a/src/java/org/apache/fop/svg/font/FilteringFontFamilyResolver.java b/src/java/org/apache/fop/svg/font/FilteringFontFamilyResolver.java index 319d6b2b8..93b92ea36 100644 --- a/src/java/org/apache/fop/svg/font/FilteringFontFamilyResolver.java +++ b/src/java/org/apache/fop/svg/font/FilteringFontFamilyResolver.java @@ -19,6 +19,11 @@ 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(); } diff --git a/test/java/org/apache/fop/svg/font/FOPFontFamilyResolverTestCase.java b/test/java/org/apache/fop/svg/font/FOPFontFamilyResolverTestCase.java index ca843ec36..d14752b90 100644 --- a/test/java/org/apache/fop/svg/font/FOPFontFamilyResolverTestCase.java +++ b/test/java/org/apache/fop/svg/font/FOPFontFamilyResolverTestCase.java @@ -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();