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.