aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Hennebert <vhennebert@apache.org>2014-02-20 21:45:20 +0000
committerVincent Hennebert <vhennebert@apache.org>2014-02-20 21:45:20 +0000
commitc51d59011a3071707e69f6f06e7def09395f75bc (patch)
tree72fcde43003548fdede782a50e476a0a5e65b8f4
parent342e75cf8a9bff942763520a07be9b955f16c852 (diff)
downloadxmlgraphics-fop-c51d59011a3071707e69f6f06e7def09395f75bc.tar.gz
xmlgraphics-fop-c51d59011a3071707e69f6f06e7def09395f75bc.zip
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
-rw-r--r--lib/batik-all-trunk.jarbin3313193 -> 3313410 bytes
-rw-r--r--src/java/org/apache/fop/afp/svg/AFPFontFamilyResolver.java5
-rw-r--r--src/java/org/apache/fop/svg/font/AggregatingFontFamilyResolver.java25
-rw-r--r--src/java/org/apache/fop/svg/font/FOPFontFamilyResolverImpl.java25
-rw-r--r--src/java/org/apache/fop/svg/font/FOPGVTFontFamily.java8
-rw-r--r--src/java/org/apache/fop/svg/font/FilteringFontFamilyResolver.java17
-rw-r--r--test/java/org/apache/fop/svg/font/FOPFontFamilyResolverTestCase.java4
7 files changed, 62 insertions, 22 deletions
diff --git a/lib/batik-all-trunk.jar b/lib/batik-all-trunk.jar
index 4641118f6..08c1a383a 100644
--- a/lib/batik-all-trunk.jar
+++ b/lib/batik-all-trunk.jar
Binary files 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.<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");
}
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();