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);
+    }
 }