You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by ss...@apache.org on 2023/03/23 13:41:56 UTC

[xmlgraphics-fop-pdf-images] branch main updated: FOP-3124: Subrs data missing from font merging

This is an automated email from the ASF dual-hosted git repository.

ssteiner pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/xmlgraphics-fop-pdf-images.git


The following commit(s) were added to refs/heads/main by this push:
     new f11ef09  FOP-3124: Subrs data missing from font merging
f11ef09 is described below

commit f11ef0941991887dec015407ab58e36bc2b64232
Author: Simon Steiner <ss...@apache.org>
AuthorDate: Thu Mar 23 13:38:57 2023 +0000

    FOP-3124: Subrs data missing from font merging
---
 .../apache/fop/render/pdf/pdfbox/MergeCFFFonts.java  | 18 ++++++++++++++----
 .../apache/fop/render/pdf/PDFBoxAdapterTestCase.java | 20 ++++++++++++++++++++
 2 files changed, 34 insertions(+), 4 deletions(-)

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 @@ public class MergeCFFFonts extends OTFSubSetFile implements MergeFonts {
         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 @@ public class MergeCFFFonts extends OTFSubSetFile implements MergeFonts {
         }
     }
 
+    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 static org.mockito.Mockito.when;
 
 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 @@ public class PDFBoxAdapterTestCase {
     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 @@ public class PDFBoxAdapterTestCase {
         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);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org