Package org.jnode.awt.font.truetype.tables

Source Code of org.jnode.awt.font.truetype.tables.NameTable

/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.awt.font.truetype.tables;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import org.jnode.awt.font.truetype.TTFFontData;
import org.jnode.awt.font.truetype.TTFInput;

/**
* NAME Table.
*
* @author Mark Donszelmann
* @version $Id$
*/
public final class NameTable 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

    /**
     * @param font
     * @param input
     */
    NameTable(TTFFontData font, TTFInput input) {
        super(font, input);
    }

    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
    protected void readTable(TTFInput in) throws IOException {

        format = in.readUShort();
        numberOfNameRecords = in.readUShort();
        stringStorage = in.readUShort();

        for (int i = 0; i < numberOfNameRecords; i++) {
            int pid = in.readUShort();
            int eid = in.readUShort();
            int lid = in.readUShort();
            int nid = in.readUShort();
            int stringLen = in.readUShort();
            int stringOffset = in.readUShort();
            //long pos = ttf.getFilePointer();
            in.pushPos();
            in.seek(stringStorage + stringOffset);
            byte[] b = new byte[stringLen];
            in.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");
            }
            in.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;
    }

}
TOP

Related Classes of org.jnode.awt.font.truetype.tables.NameTable

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.