svn commit: r1903561 - in /xmlgraphics/fop-pdf-images/trunk: src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java
[email protected] Fri, 19 Aug 2022 09:23:04 -0000
| Newsgroups | gmane.text.xml.fop.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: ssteiner
Date: Fri Aug 19 09:23:03 2022
New Revision: 1903561
URL: http://svn.apache.org/viewvc?rev=1903561&view=rev
Log:
FOP-3089: Switch cmap format to support iPhone
Modified:
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java?rev=1903561&r1=1903560&r2=1903561&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java Fri Aug 19 09:23:03 2022
@@ -18,7 +18,6 @@ package org.apache.fop.render.pdf.pdfbox
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@@ -352,54 +351,44 @@ public class MergeTTFonts extends TTFSub
}
for (Cmap cmap : cmaps) {
- if (cmap.platformId == 1 && cmaps.size() == 1) {
- writeUShort(6); //subtableFormat
- int firstCode = -1;
- int lastCode = -1;
- List<Integer> codes = new ArrayList<Integer>();
- for (Map.Entry<Integer, Integer> g : cmap.glyphIdToCharacterCode.entrySet()) {
- if (firstCode < 0) {
- firstCode = g.getKey();
- }
- while (lastCode > 0 && lastCode + 1 < g.getKey()) {
- codes.add(0);
- lastCode++;
- }
- codes.add(g.getValue());
- lastCode = g.getKey();
- }
- writeUShort((codes.size() * 2) + 6); //length
- writeUShort(0); //version
- writeUShort(firstCode); //firstCode
- writeUShort(codes.size()); //entryCount
- for (int i : codes) {
- writeUShort(i);
- }
- } else {
- writeUShort(12); //subtableFormat
- writeUShort(0);
- writeULong(currentPos, (cmap.glyphIdToCharacterCode.size() * 12) + 16);
- currentPos += 4;
- writeULong(currentPos, 0);
- currentPos += 4;
- writeULong(currentPos, cmap.glyphIdToCharacterCode.size());
- currentPos += 4;
-
- for (Map.Entry<Integer, Integer> g : cmap.glyphIdToCharacterCode.entrySet()) {
- writeULong(currentPos, g.getKey());
- currentPos += 4;
- writeULong(currentPos, g.getKey());
- currentPos += 4;
- writeULong(currentPos, g.getValue());
- currentPos += 4;
- }
+ writeUShort(4); //subtableFormat
+ int segCount = cmap.glyphIdToCharacterCode.size() + 1;
+ writeUShort(16 + (segCount * 8)); //length
+ writeUShort(0); //lang
+ writeUShort(segCount * 2); //segCountX2
+ double searchRange = Math.pow(2, Math.floor(logBase2(segCount))) * 2;
+ writeUShort((int) searchRange); //searchRange
+ double entrySelector = Math.floor(logBase2(segCount));
+ writeUShort((int) entrySelector); //entrySelector
+ double rangeShift = (segCount * 2) - searchRange;
+ writeUShort((int) rangeShift); //rangeShift
+ for (int c : cmap.glyphIdToCharacterCode.keySet()) {
+ writeUShort(c); //endCode
+ }
+ writeUShort(0xFFFF);
+ writeUShort(0); //reservedPad
+ for (int c : cmap.glyphIdToCharacterCode.keySet()) {
+ writeUShort(c); //startCode
+ }
+ writeUShort(0);
+ for (Map.Entry<Integer, Integer> entry : cmap.glyphIdToCharacterCode.entrySet()) {
+ writeUShort(entry.getValue() - entry.getKey()); //idDelta
+ }
+ writeUShort(0);
+ for (int g : cmap.glyphIdToCharacterCode.keySet()) {
+ writeUShort(0); //idRangeOffsets
}
+ writeUShort(0);
}
updateCheckSum(checksum, currentPos - cmapPos, OFTableName.CMAP);
realSize += currentPos - cmapPos;
}
+ private int logBase2(int n) {
+ return (int)(Math.log(n) / Math.log(2));
+ }
+
private void mergeUniCmap(List<Cmap> cmaps) {
Cmap uniCmap = null;
for (Cmap cmap : cmaps) {
@@ -418,7 +407,8 @@ public class MergeTTFonts extends TTFSub
int result = 0;
for (int i = 0; i < index; i++) {
Cmap curCmap = cmaps.get(i);
- result += (curCmap.glyphIdToCharacterCode.size() * 12) + 16;
+ int segCount = curCmap.glyphIdToCharacterCode.size() + 1;
+ result += 16 + (segCount * 8); //length
}
return result;
}
Modified: xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java?rev=1903561&r1=1903560&r2=1903561&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java Fri Aug 19 09:23:03 2022
@@ -16,6 +16,7 @@
*/
package org.apache.fop.render.pdf;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
@@ -29,6 +30,9 @@ import org.apache.fontbox.cff.CFFFont;
import org.apache.fontbox.cff.CFFParser;
import org.apache.fontbox.ttf.GlyphData;
import org.apache.fontbox.ttf.GlyphTable;
+import org.apache.fontbox.ttf.TTFParser;
+import org.apache.fontbox.ttf.TTFTable;
+import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.fontbox.type1.Type1Font;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
@@ -137,7 +141,14 @@ public class FOPPDFSingleMultiByteFontTe
Assert.assertEquals(name, "TimesNewRomanPSMT_TrueType");
Assert.assertEquals(mbfont.getFontName(), "TimesNewRomanPSMT_TrueType");
byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
- Assert.assertEquals(is.length, 41112);
+ Assert.assertEquals(is.length, 41104);
+
+ TrueTypeFont trueTypeFont = new TTFParser().parse(new ByteArrayInputStream(is));
+ TTFTable ttfTable = trueTypeFont.getTableMap().get("cmap");
+ ByteArrayInputStream bis = new ByteArrayInputStream(is);
+ bis.skip(ttfTable.getOffset() + 21);
+ Assert.assertEquals(bis.read(), 4); //subtableFormat
+
doc.close();
doc2.close();
}