/*****************************************************************************
 * Copyright (C) The Apache Software Foundation. All rights reserved.        *
 * ------------------------------------------------------------------------- *
 * This software is published under the terms of the Apache Software License *
 * version 1.1, a copy of which has been included with this distribution in  *
 * the LICENSE file.                                                         *
 *****************************************************************************/

package jogamp.graph.font.typecast.ot.table;

import java.io.DataInput;
import java.io.IOException;

import jogamp.graph.font.typecast.ot.Fixed;

/**
 * @version $Id: HheaTable.java,v 1.2 2010-08-10 11:44:02 davidsch Exp $
 * @author <a href="mailto:davidsch@dev.java.net">David Schweinsberg</a>
 */
public class HheaTable implements Table {

    private final DirectoryEntry de;
    private final int version;
    private final short ascender;
    private final short descender;
    private final short lineGap;
    private final short advanceWidthMax;
    private final short minLeftSideBearing;
    private final short minRightSideBearing;
    private final short xMaxExtent;
    private final short caretSlopeRise;
    private final short caretSlopeRun;
    private final short metricDataFormat;
    private final int numberOfHMetrics;

    protected HheaTable(final DirectoryEntry de, final DataInput di) throws IOException {
        this.de = (DirectoryEntry) de.clone();
        version = di.readInt();
        ascender = di.readShort();
        descender = di.readShort();
        lineGap = di.readShort();
        advanceWidthMax = di.readShort();
        minLeftSideBearing = di.readShort();
        minRightSideBearing = di.readShort();
        xMaxExtent = di.readShort();
        caretSlopeRise = di.readShort();
        caretSlopeRun = di.readShort();
        for (int i = 0; i < 5; i++) {
            di.readShort();
        }
        metricDataFormat = di.readShort();
        numberOfHMetrics = di.readUnsignedShort();
    }

    public short getAdvanceWidthMax() {
        return advanceWidthMax;
    }

    public short getAscender() {
        return ascender;
    }

    public short getCaretSlopeRise() {
        return caretSlopeRise;
    }

    public short getCaretSlopeRun() {
        return caretSlopeRun;
    }

    public short getDescender() {
        return descender;
    }

    public short getLineGap() {
        return lineGap;
    }

    public short getMetricDataFormat() {
        return metricDataFormat;
    }

    public short getMinLeftSideBearing() {
        return minLeftSideBearing;
    }

    public short getMinRightSideBearing() {
        return minRightSideBearing;
    }

    public int getNumberOfHMetrics() {
        return numberOfHMetrics;
    }

    @Override
    public int getType() {
        return hhea;
    }

    public short getXMaxExtent() {
        return xMaxExtent;
    }

    @Override
    public String toString() {
        return new StringBuilder()
            .append("'hhea' Table - Horizontal Header\n--------------------------------")
            .append("\n        'hhea' version:       ").append(Fixed.floatValue(version))
            .append("\n        yAscender:            ").append(ascender)
            .append("\n        yDescender:           ").append(descender)
            .append("\n        yLineGap:             ").append(lineGap)
            .append("\n        advanceWidthMax:      ").append(advanceWidthMax)
            .append("\n        minLeftSideBearing:   ").append(minLeftSideBearing)
            .append("\n        minRightSideBearing:  ").append(minRightSideBearing)
            .append("\n        xMaxExtent:           ").append(xMaxExtent)
            .append("\n        horizCaretSlopeNum:   ").append(caretSlopeRise)
            .append("\n        horizCaretSlopeDenom: ").append(caretSlopeRun)
            .append("\n        reserved0:            0")
            .append("\n        reserved1:            0")
            .append("\n        reserved2:            0")
            .append("\n        reserved3:            0")
            .append("\n        reserved4:            0")
            .append("\n        metricDataFormat:     ").append(metricDataFormat)
            .append("\n        numOf_LongHorMetrics: ").append(numberOfHMetrics)
            .toString();
    }

    /**
     * Get a directory entry for this table.  This uniquely identifies the
     * table in collections where there may be more than one instance of a
     * particular table.
     * @return A directory entry
     */
    @Override
    public DirectoryEntry getDirectoryEntry() {
        return de;
    }

}
