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