// Copyright 2001, FreeHEP. package org.freehep.graphicsio.font.truetype; import java.io.IOException; import org.geogebra.common.util.debug.Log; /** * NAME Table. * * @author Mark Donszelmann * @version $Id: TTFNameTable.java,v 1.5 2009-08-17 21:44:45 murkle Exp $ */ public class TTFNameTable extends TTFTable { private int format; private int numberOfNameRecords; private int stringStorage; private String[][] name = new String[4][19]; // 18 NameIDs according to // OpenType @Override public String getTag() { return "name"; } // FIXME: fixed decoding for lucida files // PID = 0, -> UnicodeBig (Apple-Unicode-English) // PID = 1, EID = 0, LID = 0; -> Default Encoding (Mac-Roman-English) // PID = 3, EID = 1, LID = 1033; -> UnicodeBig (Win-UGL-ENU) // LID english, other languages ignored @Override public void readTable() throws IOException { format = ttf.readUShort(); numberOfNameRecords = ttf.readUShort(); stringStorage = ttf.readUShort(); for (int i = 0; i < numberOfNameRecords; i++) { int pid = ttf.readUShort(); int eid = ttf.readUShort(); int lid = ttf.readUShort(); int nid = ttf.readUShort(); int stringLen = ttf.readUShort(); int stringOffset = ttf.readUShort(); // long pos = ttf.getFilePointer(); ttf.pushPos(); ttf.seek(stringStorage + stringOffset); byte[] b = new byte[stringLen]; ttf.readFully(b); if (pid == 0) { // Apple Unicode name[pid][nid] = new String(b, "UnicodeBig"); } else if ((pid == 1) && (eid == 0)) { if (lid == 0) { // Mac-Roman-English name[pid][nid] = new String(b, "ISO8859-1"); } // ignore other languages } else if ((pid == 3) && (eid == 1)) { // Win-UGL if (lid == 0x0409) { // ENU name[pid][nid] = new String(b, "UnicodeBig"); } // ignore other languages } else { Log.debug("Unimplemented PID, EID, LID scheme: " + pid + ", " + eid + ", " + lid); Log.debug("NID = " + nid); name[pid][nid] = new String(b, "Default"); } ttf.popPos(); // ttf.seek(pos); } } @Override public String toString() { StringBuffer s = new StringBuffer(); s.append(super.toString() + "\n"); s.append(" format: " + format); for (int i = 0; i < name.length; i++) { for (int j = 0; j < name[i].length; j++) { if (name[i][j] != null) { s.append("\n name[" + i + "][" + j + "]: " + name[i][j]); } } } return s.toString(); } }