ttfnametable.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 150 行
JAVA
150 行
// Copyright 2001, FreeHEP.
package org.jnode.awt.font.truetype;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
/**
* NAME Table.
*
* @author Mark Donszelmann
* @version $Id: TTFNameTable.java,v 1.1 2003/11/25 11:51:38 epr Exp $
*/
public class TTFNameTable extends TTFTable {
public static final int PLATFORM_APPLE_UNICODE = 0;
public static final int PLATFORM_MACINTOSH = 1;
public static final int PLATFORM_ISO = 2;
public static final int PLATFORM_MICROSOFT = 3;
private int format;
private int numberOfNameRecords;
private int stringStorage;
private String[][] name = new String[4][19]; // 18 NameIDs according to OpenType
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
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] = convert(b, "UTF-16BE");
} else if ((pid == 1) && (eid == 0)) {
if (lid == 0) {
// Mac-Roman-English
name[pid][nid] = convert(b, "ISO-8859-1");
}
// ignore other languages
} else if ((pid == 3) && (eid == 1)) {
// Win-UGL
if (lid == 0x0409) {
// ENU
name[pid][nid] = convert(b, "UTF-16BE");
}
// ignore other languages
} else {
System.out.println("Unimplemented PID, EID, LID scheme: " + pid + ", " + eid + ", " + lid);
System.out.println("NID = " + nid);
name[pid][nid] = new String(b, "Default");
}
ttf.popPos();
//ttf.seek(pos);
}
}
/**
* Convert the given byte-array to a String using the given charset name.
* @param byteArray
* @param charsetName
* @return
*/
private String convert(byte[] byteArray, String charsetName) {
final Charset charSet = Charset.forName(charsetName);
final CharBuffer buf = charSet.decode(ByteBuffer.wrap(byteArray));
return buf.toString();
}
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();
}
/**
* @return
*/
final int getFormat() {
return this.format;
}
/**
* @param pid Platform ID
* @param nid Name ID
* @return
*/
final String getName(int pid, int nid) {
return name[pid][nid];
}
public String getFontFamilyName() {
for (int pid = 0; pid < 4; pid++) {
final String s = name[pid][1];
if (s != null) {
return s;
}
}
return "?";
}
public String getFontSubFamilyName() {
for (int pid = 0; pid < 4; pid++) {
final String s = name[pid][2];
if (s != null) {
return s;
}
}
return "Regular";
}
/**
* @return
*/
final int getNumberOfNameRecords() {
return this.numberOfNameRecords;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?