Fix merging word truetype
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/branches/Temp_FontMerging@1607866 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
index 6e7eb00..ed0289d 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
@@ -216,6 +216,7 @@
readHorizontalHeader();
readHorizontalMetrics();
readIndexToLocation();
+ int sgsize = subsetGlyphs.size();
if (!cid && subsetGlyphs.size() <= 1) {
for (int i = 0; i < mtxTab.length; i++) {
subsetGlyphs.put(i, i);
@@ -224,7 +225,10 @@
scanGlyphs(fontFile, subsetGlyphs);
readGlyf(subsetGlyphs, fontFile);
if (nhmtxDiff == null) {
- nhmtxDiff = subsetGlyphs.size() - nhmtx;
+ nhmtxDiff = sgsize - nhmtx;
+ if (nhmtxDiff < 0) {
+ nhmtxDiff = 0;
+ }
}
}
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java
index a9e1aed..8e0568a 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java
@@ -101,16 +101,18 @@
subByteMap.put(i, subArray.get(i));
}
Map<String, byte[]> cs = font.getType1Font().getCharStringsDict();
- int skipBytes = 4;
- PostscriptParser.PSElement element = getElement("lenIV", mainSection);
+ int lenIV = 4;
+ PostscriptParser.PSElement element = getElement("/lenIV", mainSection);
if (element != null && element instanceof PostscriptParser.PSVariable) {
- PostscriptParser.PSVariable lenIV = (PostscriptParser.PSVariable)element;
- skipBytes = Integer.parseInt(lenIV.getValue());
+ PostscriptParser.PSVariable lenIVVar = (PostscriptParser.PSVariable)element;
+ lenIV = Integer.parseInt(lenIVVar.getValue());
}
for (String e : cs.keySet()) {
byte[] charStringEntry = getBinaryEntry(charStrings.getBinaryEntries().get("/" + e), decoded);
- charStringEntry = BinaryCoder.decodeBytes(charStringEntry, 4330, skipBytes);
- charStringEntry = BinaryCoder.encodeBytes(charStringEntry, 4330, 4);
+ if (lenIV != 4) {
+ charStringEntry = BinaryCoder.decodeBytes(charStringEntry, 4330, lenIV);
+ charStringEntry = BinaryCoder.encodeBytes(charStringEntry, 4330, 4);
+ }
subsetCharStrings.put("/" + e, charStringEntry);
}
}
@@ -216,6 +218,7 @@
String nd = findVariable(decoded, mainSection, new String[] {"def", "noaccess def"}, "noaccess def");
String np = findVariable(decoded, mainSection, new String[] {"put", "noaccess put"}, "noaccess put");
main.write(subrsBeforeStream.toByteArray());
+ writeString("/lenIV 4 def", main);
writeString("/Subrs " + subByteMap.size() + " array" + eol, main);
for (Map.Entry<Integer, byte[]> e : subByteMap.entrySet()) {
byte[] encoded = BinaryCoder.encodeBytes(e.getValue(), 4330, 4);
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
index 80e3a0e..cf4596b 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
@@ -495,8 +495,12 @@
readCharMap(font, gidToGlyph, glyphData, mainFont, oldToNewGIMap);
FontFileReader ffr = readFontFile(mainFont);
if (ttf != null) {
- mergeMaxp(ttf);
+ mergeMaxp(ttf, mergeTTFonts.maxp);
+ int sizeNoCompGlyphs = oldToNewGIMap.size();
mergeTTFonts.readFont(ffr, oldToNewGIMap, true);
+ if (oldToNewGIMap.size() > sizeNoCompGlyphs) {
+ cidSet.mapChar(256 * 256, (char) 0);
+ }
} else {
mergeCFFFonts.readType1CFont(new ByteArrayInputStream(ffr.getAllBytes()), getEmbedFontName());
}
@@ -583,26 +587,6 @@
return mapping;
}
- private void mergeMaxp(TrueTypeFont ttf) {
- MaximumProfileTable mp = ttf.getMaximumProfile();
- MaximumProfileTable outMaxp = mergeTTFonts.maxp;
- outMaxp.setVersion(mp.getVersion());
- outMaxp.setNumGlyphs(outMaxp.getNumGlyphs() + mp.getNumGlyphs());
- outMaxp.setMaxPoints(outMaxp.getMaxPoints() + mp.getMaxPoints());
- outMaxp.setMaxContours(outMaxp.getMaxContours() + mp.getMaxContours());
- outMaxp.setMaxCompositePoints(outMaxp.getMaxCompositePoints() + mp.getMaxCompositePoints());
- outMaxp.setMaxCompositeContours(outMaxp.getMaxCompositeContours() + mp.getMaxCompositeContours());
- outMaxp.setMaxZones(outMaxp.getMaxZones() + mp.getMaxZones());
- outMaxp.setMaxTwilightPoints(outMaxp.getMaxTwilightPoints() + mp.getMaxTwilightPoints());
- outMaxp.setMaxStorage(outMaxp.getMaxStorage() + mp.getMaxStorage());
- outMaxp.setMaxFunctionDefs(outMaxp.getMaxFunctionDefs() + mp.getMaxFunctionDefs());
- outMaxp.setMaxInstructionDefs(outMaxp.getMaxInstructionDefs() + mp.getMaxInstructionDefs());
- outMaxp.setMaxStackElements(outMaxp.getMaxStackElements() + mp.getMaxStackElements());
- outMaxp.setMaxSizeOfInstructions(outMaxp.getMaxSizeOfInstructions() + mp.getMaxSizeOfInstructions());
- outMaxp.setMaxComponentElements(outMaxp.getMaxComponentElements() + mp.getMaxComponentElements());
- outMaxp.setMaxComponentDepth(outMaxp.getMaxComponentDepth() + mp.getMaxComponentDepth());
- }
-
private boolean differentGlyphData(GlyphData[] data, Map<Integer, String> mapping) throws IOException {
Map<String, Integer> tmpMap = new HashMap<String, Integer>();
for (Map.Entry<Integer, String> entry : mapping.entrySet()) {
@@ -830,17 +814,16 @@
if (font instanceof PDTrueTypeFont) {
TrueTypeFont ttfont = ((PDTrueTypeFont) font).getTTFFont();
CMAPEncodingEntry[] cmapList = ttfont.getCMAP().getCmaps();
- CMAPEncodingEntry c = cmapList[0];
- if (cmapList.length > 1) {
- c = cmapList[1];
- }
- newCmap.platformId = c.getPlatformId();
- newCmap.platformEncodingId = c.getPlatformEncodingId();
- for (int i = 0; i < 256 * 256; i++) {
- if (c.getGlyphId(i) != 0) {
- newCmap.glyphIdToCharacterCode.put(i, c.getGlyphId(i));
+ for (CMAPEncodingEntry c : cmapList) {
+ newCmap.platformId = c.getPlatformId();
+ newCmap.platformEncodingId = c.getPlatformEncodingId();
+ for (int i = 0; i < 256 * 256; i++) {
+ if (c.getGlyphId(i) != 0) {
+ newCmap.glyphIdToCharacterCode.put(i, c.getGlyphId(i));
+ }
}
}
+ mergeMaxp(ttfont, mergeTTFonts.maxp);
}
}
@@ -1142,6 +1125,25 @@
}
}
+ private void mergeMaxp(TrueTypeFont ttf, MaximumProfileTable outMaxp) {
+ MaximumProfileTable mp = ttf.getMaximumProfile();
+ outMaxp.setVersion(mp.getVersion());
+ outMaxp.setNumGlyphs(outMaxp.getNumGlyphs() + mp.getNumGlyphs());
+ outMaxp.setMaxPoints(outMaxp.getMaxPoints() + mp.getMaxPoints());
+ outMaxp.setMaxContours(outMaxp.getMaxContours() + mp.getMaxContours());
+ outMaxp.setMaxCompositePoints(outMaxp.getMaxCompositePoints() + mp.getMaxCompositePoints());
+ outMaxp.setMaxCompositeContours(outMaxp.getMaxCompositeContours() + mp.getMaxCompositeContours());
+ outMaxp.setMaxZones(outMaxp.getMaxZones() + mp.getMaxZones());
+ outMaxp.setMaxTwilightPoints(outMaxp.getMaxTwilightPoints() + mp.getMaxTwilightPoints());
+ outMaxp.setMaxStorage(outMaxp.getMaxStorage() + mp.getMaxStorage());
+ outMaxp.setMaxFunctionDefs(outMaxp.getMaxFunctionDefs() + mp.getMaxFunctionDefs());
+ outMaxp.setMaxInstructionDefs(outMaxp.getMaxInstructionDefs() + mp.getMaxInstructionDefs());
+ outMaxp.setMaxStackElements(outMaxp.getMaxStackElements() + mp.getMaxStackElements());
+ outMaxp.setMaxSizeOfInstructions(outMaxp.getMaxSizeOfInstructions() + mp.getMaxSizeOfInstructions());
+ outMaxp.setMaxComponentElements(outMaxp.getMaxComponentElements() + mp.getMaxComponentElements());
+ outMaxp.setMaxComponentDepth(outMaxp.getMaxComponentDepth() + mp.getMaxComponentDepth());
+ }
+
public class PDFWriter {
protected StringBuilder s = new StringBuilder();
private String key;
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index 3e5512e..1438676 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -246,7 +246,7 @@
Assert.assertEquals(name, "TimesNewRomanPSMT_TrueType");
Assert.assertEquals(mbfont.getFontName(), "TimesNewRomanPSMT_TrueType");
byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
- Assert.assertEquals(is.length, 34228);
+ Assert.assertEquals(is.length, 34264);
doc.close();
doc2.close();
}