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



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

Reply via email to