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 + -
显示快捷键?