FOP-3124: Subrs data missing from font merging
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
index f44c9f1..d410425 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
@@ -276,16 +276,17 @@
offsets.privateDict = currentPos;
writePrivateDict();
- //Char Strings Index
- offsets.charString = currentPos;
- writeIndex(subsetCharStringsIndex);
-
//Local subroutine index
offsets.localIndex = currentPos;
+ readSubrs();
if (!subsetLocalIndexSubr.isEmpty()) {
writeIndex(subsetLocalIndexSubr);
}
+ //Char Strings Index
+ offsets.charString = currentPos;
+ writeIndex(subsetCharStringsIndex);
+
if (hasFDSelect) {
offsets.fdArray = currentPos;
List<byte[]> index = new ArrayList<byte[]>();
@@ -314,6 +315,15 @@
}
}
+ private void readSubrs() {
+ if (fileFont instanceof CFFType1Font) {
+ byte[][] subrsArray = (byte[][]) ((CFFType1Font) fileFont).getPrivateDict().get("Subrs");
+ if (subrsArray != null) {
+ subsetLocalIndexSubr.addAll(Arrays.asList(subrsArray));
+ }
+ }
+ }
+
protected void writeEncoding() throws IOException {
if (!chars.isEmpty()) {
writeCard16(chars.size());
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index 1c6f5a4..bfb72ae 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -45,6 +45,7 @@
import org.apache.commons.io.IOUtils;
import org.apache.fontbox.cff.CFFParser;
+import org.apache.fontbox.cff.CFFType1Font;
import org.apache.fontbox.ttf.GlyphData;
import org.apache.fontbox.ttf.TTFParser;
import org.apache.fontbox.ttf.TrueTypeFont;
@@ -100,6 +101,8 @@
protected static final String CFF1 = "2fonts.pdf";
protected static final String CFF2 = "2fonts2.pdf";
protected static final String CFF3 = "simpleh.pdf";
+ protected static final String CFFSUBRS = "cffsubrs.pdf";
+ protected static final String CFFSUBRS2 = "cffsubrs2.pdf";
protected static final String TTCID1 = "ttcid1.pdf";
protected static final String TTCID2 = "ttcid2.pdf";
protected static final String TTSubset1 = "ttsubset.pdf";
@@ -772,4 +775,21 @@
pdfdoc.output(bos);
Assert.assertFalse(bos.toString("UTF-8").contains("/R 90"));
}
+
+ @Test
+ public void testCFFSubrs() throws Exception {
+ FontInfo fontInfo = new FontInfo();
+ writeText(fontInfo, CFFSUBRS);
+ writeText(fontInfo, CFFSUBRS2);
+ byte[] data = null;
+ for (Typeface font : fontInfo.getUsedFonts().values()) {
+ if ("AllianzNeo-Bold".equals(font.getEmbedFontName())) {
+ InputStream is = ((CustomFont) font).getInputStream();
+ data = IOUtils.toByteArray(is);
+ }
+ }
+ CFFType1Font font = (CFFType1Font) new CFFParser().parse(data).get(0);
+ byte[][] indexData = (byte[][]) font.getPrivateDict().get("Subrs");
+ Assert.assertEquals(indexData.length, 183);
+ }
}