in src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java [437:488]
private void writeCMAP(List<Cmap> cmaps) {
mergeUniCmap(cmaps);
int checksum = currentPos;
pad4();
int cmapPos = currentPos;
writeUShort(0); //version
writeUShort(cmaps.size()); //number of tables
int tablesSize = 8 * cmaps.size();
for (int i = 0; i < cmaps.size(); i++) {
Cmap cmap = cmaps.get(i);
writeUShort(cmap.platformId); //platformid
writeUShort(cmap.platformEncodingId); //platformEncodingId
writeULong(currentPos, 4 + tablesSize + getCmapOffset(cmaps, i)); //subTableOffset
currentPos += 4;
}
for (Cmap cmap : cmaps) {
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;
}