* @param cmap the CMap table
* @return true if the font was changed, or false if it was left as-is
*/
private boolean fixCMapTable (TrueTypeFont ttf, CmapTable cmap) {
CMapFormat4 fourMap = null;
CMapFormat0 zeroMap = null;
for (int i = 0; i < mapIDs.length; i += 2) {
CMap map = this.cmapTable.getCMap (mapIDs[i], mapIDs[i + 1]);
if (map != null) {
if (fourMap == null && map instanceof CMapFormat4) {
fourMap = (CMapFormat4) map;
} else if (zeroMap == null && map instanceof CMapFormat0) {
zeroMap = (CMapFormat0) map;
}
}
}
// if there were no maps, we could have problems. Just try creating
// an identity map
if (zeroMap == null && fourMap == null) {
fourMap = (CMapFormat4) CMap.createMap ((short) 4, (short) 0);
fourMap.addSegment ((short) getFirstChar (),
(short) getLastChar (),
(short) 0);
}
// create our map based on the type 0 map, since PDF seems
// to prefer a type 0 map (Java prefers a unicode map)
if (zeroMap != null) {
fourMap = (CMapFormat4) CMap.createMap ((short) 4, (short) 0);
// add the mappings from 0 to null and 1 to notdef
fourMap.addSegment ((short) 0, (short) 1, (short) 0);
for (int i = getFirstChar (); i <= getLastChar (); i++) {
short value = (short) (zeroMap.map ((byte) i) & 0xff);
if (value != 0) {
fourMap.addSegment ((short) i, (short) i,
(short) (value - i));
}
}