svn commit: r1786148 - in /xmlgraphics/fop/trunk/fop-core/src: main/java/org/apache/fop/fonts/truetype/OTFSubSetFile.java test/java/org/apache/fop/fonts/truetype/OTFSubSetFileTestCase.java

[email protected]
Newsgroups gmane.text.xml.fop.cvs
Message-ID <[email protected]>
Author: ssteiner
Date: Thu Mar  9 11:58:08 2017
New Revision: 1786148

URL: http://svn.apache.org/viewvc?rev=1786148&view=rev
Log:
FOP-2697: Adobe Reader error with Adobe Kozuka Mincho font

Modified:
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/truetype/OTFSubSetFile.java
    xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFSubSetFileTestCase.java

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/truetype/OTFSubSetFile.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/truetype/OTFSubSetFile.java?rev=1786148&r1=1786147&r2=1786148&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/truetype/OTFSubSetFile.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/truetype/OTFSubSetFile.java Thu Mar  9 11:58:08 2017
@@ -1055,12 +1055,21 @@ public class OTFSubSetFile extends OTFFi
     }
 
     private void writeCharsetTable(boolean cidFont) throws IOException {
-        writeByte(0);
-        for (Entry<Integer, Integer> entry : gidToSID.entrySet()) {
-            if (cidFont && entry.getKey() == 0) {
-                continue;
+        if (cidFont) {
+            writeByte(2);
+            for (int entry : gidToSID.keySet()) {
+                if (entry == 0) {
+                    continue;
+                }
+                writeCard16(entry);
+                writeCard16(gidToSID.size() - 1);
+                break;
+            }
+        } else {
+            writeByte(0);
+            for (int entry : gidToSID.values()) {
+                writeCard16(entry);
             }
-            writeCard16((cidFont) ? entry.getKey() : entry.getValue());
         }
     }
 

Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFSubSetFileTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFSubSetFileTestCase.java?rev=1786148&r1=1786147&r2=1786148&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFSubSetFileTestCase.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFSubSetFileTestCase.java Thu Mar  9 11:58:08 2017
@@ -19,6 +19,7 @@
 
 package org.apache.fop.fonts.truetype;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -48,6 +49,7 @@ public class OTFSubSetFileTestCase exten
 
     private CFFDataReader cffReaderSourceSans;
     private OTFSubSetFile sourceSansSubset;
+    private Map<Integer, Integer> glyphs = new HashMap<Integer, Integer>();
 
     /**
      * Initialises the test by creating the font subset. A CFFDataReader is
@@ -57,8 +59,6 @@ public class OTFSubSetFileTestCase exten
     @Before
     public void setUp() throws Exception {
         super.setUp();
-
-        Map<Integer, Integer> glyphs = new HashMap<Integer, Integer>();
         for (int i = 0; i < 256; i++) {
             glyphs.put(i, i);
         }
@@ -444,27 +444,7 @@ public class OTFSubSetFileTestCase exten
         FontFileReader reader = sourceSansReader;
         String header = OFFontLoader.readHeader(reader);
 
-        OTFSubSetFile otfSubSetFile = new OTFSubSetFile() {
-            protected void createCFF() throws IOException {
-                cffReader = mock(CFFDataReader.class);
-                when(cffReader.getHeader()).thenReturn(new byte[0]);
-                when(cffReader.getTopDictIndex()).thenReturn(new CFFDataReader().new CFFIndexData() {
-                    public byte[] getByteData() throws IOException {
-                        return new byte[3];
-                    }
-                });
-
-                LinkedHashMap<String, DICTEntry> map = new LinkedHashMap<String, DICTEntry>();
-                DICTEntry dict = new DICTEntry();
-                dict.setOperands(Collections.<Number>singletonList(1));
-                map.put("charset", dict);
-                map.put("CharStrings", dict);
-                when((cffReader.getTopDictEntries())).thenReturn(map);
-                when(cffReader.getFDSelect()).thenReturn(new CFFDataReader().new Format3FDSelect());
-                cffReader.getTopDictEntries().get("CharStrings").setOperandLength(opLen);
-                super.createCFF();
-            }
-        };
+        OTFSubSetFile otfSubSetFile = new MyOTFSubSetFile(opLen);
 
         otfSubSetFile.readFont(reader, "StandardOpenType", header, new HashMap<Integer, Integer>());
         return otfSubSetFile.getFontSubset();
@@ -472,10 +452,6 @@ public class OTFSubSetFileTestCase exten
 
     @Test
     public void testOffsets() throws IOException {
-        Map<Integer, Integer> glyphs = new HashMap<Integer, Integer>();
-        for (int i = 0; i < 256; i++) {
-            glyphs.put(i, i);
-        }
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < 2048; i++) {
             sb.append("SourceSansProBold");
@@ -484,4 +460,49 @@ public class OTFSubSetFileTestCase exten
         otfSubSetFile.readFont(sourceSansReader, sb.toString(), null, glyphs);
         new CFFParser().parse(otfSubSetFile.getFontSubset());
     }
+
+    @Test
+    public void testCharset() throws IOException {
+        FontFileReader reader = sourceSansReader;
+        MyOTFSubSetFile otfSubSetFile = new MyOTFSubSetFile(1);
+        otfSubSetFile.readFont(reader, "StandardOpenType", null, new HashMap<Integer, Integer>());
+        ByteArrayInputStream is = new ByteArrayInputStream(otfSubSetFile.getFontSubset());
+        is.skip(otfSubSetFile.charsetOffset);
+        Assert.assertEquals(is.read(), 2);
+    }
+
+    class MyOTFSubSetFile extends OTFSubSetFile {
+        int charsetOffset;
+        int opLen;
+        MyOTFSubSetFile(int opLen) throws IOException {
+            super();
+            this.opLen = opLen;
+        }
+
+        protected void createCFF() throws IOException {
+            cffReader = mock(CFFDataReader.class);
+            when(cffReader.getHeader()).thenReturn(new byte[0]);
+            when(cffReader.getTopDictIndex()).thenReturn(new CFFDataReader().new CFFIndexData() {
+                public byte[] getByteData() throws IOException {
+                    return new byte[3];
+                }
+            });
+
+            LinkedHashMap<String, DICTEntry> map = new LinkedHashMap<String, DICTEntry>();
+            DICTEntry dict = new DICTEntry();
+            dict.setOperands(Collections.<Number>singletonList(1));
+            map.put("charset", dict);
+            map.put("CharStrings", dict);
+            when((cffReader.getTopDictEntries())).thenReturn(map);
+            when(cffReader.getFDSelect()).thenReturn(new CFFDataReader().new Format3FDSelect());
+            cffReader.getTopDictEntries().get("CharStrings").setOperandLength(opLen);
+            super.createCFF();
+        }
+
+        protected void updateFixedOffsets(Map<String, DICTEntry> topDICT, int dataTopDictOffset,
+                                          int charsetOffset, int charStringOffset, int encodingOffset) {
+            this.charsetOffset = charsetOffset;
+            super.updateFixedOffsets(topDICT, dataTopDictOffset, charsetOffset, charStringOffset, encodingOffset);
+        }
+    }
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.