/*
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package java.awt.font;

/**
 * The <code>OpenType</code> interface represents OpenType and
 * TrueType fonts.  This interface makes it possible to obtain
 * <i>sfnt</i> tables from the font.  A particular
 * <code>Font</code> object can implement this interface.
 * <p>
 * For more information on TrueType and OpenType fonts, see the
 * OpenType specification.
 * ( <a href="http://www.microsoft.com/typography/otspec/">http://www.microsoft.com/typography/otspec/</a> ).
 */
public interface OpenType {

  /* 51 tag types so far */

  /**
   * Character to glyph mapping.  Table tag "cmap" in the Open
   * Type Specification.
   */
  public final static int       TAG_CMAP        = 0x636d6170;

  /**
   * Font header.  Table tag "head" in the Open
   * Type Specification.
   */
  public final static int       TAG_HEAD        = 0x68656164;

  /**
   * Naming table.  Table tag "name" in the Open
   * Type Specification.
   */
  public final static int       TAG_NAME        = 0x6e616d65;

  /**
   * Glyph data.  Table tag "glyf" in the Open
   * Type Specification.
   */
  public final static int       TAG_GLYF        = 0x676c7966;

  /**
   * Maximum profile.  Table tag "maxp" in the Open
   * Type Specification.
   */
  public final static int       TAG_MAXP        = 0x6d617870;

  /**
   * CVT preprogram.  Table tag "prep" in the Open
   * Type Specification.
   */
  public final static int       TAG_PREP        = 0x70726570;

  /**
   * Horizontal metrics.  Table tag "hmtx" in the Open
   * Type Specification.
   */
  public final static int       TAG_HMTX        = 0x686d7478;

  /**
   * Kerning.  Table tag "kern" in the Open
   * Type Specification.
   */
  public final static int       TAG_KERN        = 0x6b65726e;

  /**
   * Horizontal device metrics.  Table tag "hdmx" in the Open
   * Type Specification.
   */
  public final static int       TAG_HDMX        = 0x68646d78;

  /**
   * Index to location.  Table tag "loca" in the Open
   * Type Specification.
   */
  public final static int       TAG_LOCA        = 0x6c6f6361;

  /**
   * PostScript Information.  Table tag "post" in the Open
   * Type Specification.
   */
  public final static int       TAG_POST        = 0x706f7374;

  /**
   * OS/2 and Windows specific metrics.  Table tag "OS/2"
   * in the Open Type Specification.
   */
  public final static int       TAG_OS2 = 0x4f532f32;

  /**
   * Control value table.  Table tag "cvt "
   * in the Open Type Specification.
   */
  public final static int       TAG_CVT = 0x63767420;

  /**
   * Grid-fitting and scan conversion procedure.  Table tag
   * "gasp" in the Open Type Specification.
   */
  public final static int       TAG_GASP        = 0x67617370;

  /**
   * Vertical device metrics.  Table tag "VDMX" in the Open
   * Type Specification.
   */
  public final static int       TAG_VDMX        = 0x56444d58;

  /**
   * Vertical metrics.  Table tag "vmtx" in the Open
   * Type Specification.
   */
  public final static int       TAG_VMTX        = 0x766d7478;

  /**
   * Vertical metrics header.  Table tag "vhea" in the Open
   * Type Specification.
   */
  public final static int       TAG_VHEA        = 0x76686561;

  /**
   * Horizontal metrics header.  Table tag "hhea" in the Open
   * Type Specification.
   */
  public final static int       TAG_HHEA        = 0x68686561;

  /**
   * Adobe Type 1 font data.  Table tag "typ1" in the Open
   * Type Specification.
   */
  public final static int       TAG_TYP1        = 0x74797031;

  /**
   * Baseline table.  Table tag "bsln" in the Open
   * Type Specification.
   */
  public final static int       TAG_BSLN        = 0x62736c6e;

  /**
   * Glyph substitution.  Table tag "GSUB" in the Open
   * Type Specification.
   */
  public final static int       TAG_GSUB        = 0x47535542;

  /**
   * Digital signature.  Table tag "DSIG" in the Open
   * Type Specification.
   */
  public final static int       TAG_DSIG        = 0x44534947;

  /**
   * Font program.   Table tag "fpgm" in the Open
   * Type Specification.
   */
  public final static int       TAG_FPGM        = 0x6670676d;

  /**
   * Font variation.   Table tag "fvar" in the Open
   * Type Specification.
   */
  public final static int       TAG_FVAR        = 0x66766172;

  /**
   * Glyph variation.  Table tag "gvar" in the Open
   * Type Specification.
   */
  public final static int       TAG_GVAR        = 0x67766172;

  /**
   * Compact font format (Type1 font).  Table tag
   * "CFF " in the Open Type Specification.
   */
  public final static int       TAG_CFF = 0x43464620;

  /**
   * Multiple master supplementary data.  Table tag
   * "MMSD" in the Open Type Specification.
   */
  public final static int       TAG_MMSD        = 0x4d4d5344;

  /**
   * Multiple master font metrics.  Table tag
   * "MMFX" in the Open Type Specification.
   */
  public final static int       TAG_MMFX        = 0x4d4d4658;

  /**
   * Baseline data.  Table tag "BASE" in the Open
   * Type Specification.
   */
  public final static int       TAG_BASE        = 0x42415345;

  /**
   * Glyph definition.  Table tag "GDEF" in the Open
   * Type Specification.
   */
  public final static int       TAG_GDEF        = 0x47444546;

  /**
   * Glyph positioning.  Table tag "GPOS" in the Open
   * Type Specification.
   */
  public final static int       TAG_GPOS        = 0x47504f53;

  /**
   * Justification.  Table tag "JSTF" in the Open
   * Type Specification.
   */
  public final static int       TAG_JSTF        = 0x4a535446;

  /**
   * Embedded bitmap data.  Table tag "EBDT" in the Open
   * Type Specification.
   */
  public final static int       TAG_EBDT        = 0x45424454;

  /**
   * Embedded bitmap location.  Table tag "EBLC" in the Open
   * Type Specification.
   */
  public final static int       TAG_EBLC        = 0x45424c43;

  /**
   * Embedded bitmap scaling.  Table tag "EBSC" in the Open
   * Type Specification.
   */
  public final static int       TAG_EBSC        = 0x45425343;

  /**
   * Linear threshold.  Table tag "LTSH" in the Open
   * Type Specification.
   */
  public final static int       TAG_LTSH        = 0x4c545348;

  /**
   * PCL 5 data.  Table tag "PCLT" in the Open
   * Type Specification.
   */
  public final static int       TAG_PCLT        = 0x50434c54;

  /**
   * Accent attachment.  Table tag "acnt" in the Open
   * Type Specification.
   */
  public final static int       TAG_ACNT        = 0x61636e74;

  /**
   * Axis variation.  Table tag "avar" in the Open
   * Type Specification.
   */
  public final static int       TAG_AVAR        = 0x61766172;

  /**
   * Bitmap data.  Table tag "bdat" in the Open
   * Type Specification.
   */
  public final static int       TAG_BDAT        = 0x62646174;

  /**
   * Bitmap location.  Table tag "bloc" in the Open
   * Type Specification.
   */
  public final static int       TAG_BLOC        = 0x626c6f63;

   /**
    * CVT variation.  Table tag "cvar" in the Open
    * Type Specification.
    */
  public final static int       TAG_CVAR        = 0x63766172;

  /**
   * Feature name.  Table tag "feat" in the Open
    * Type Specification.
   */
  public final static int       TAG_FEAT        = 0x66656174;

  /**
   * Font descriptors.  Table tag "fdsc" in the Open
   * Type Specification.
   */
  public final static int       TAG_FDSC        = 0x66647363;

  /**
   * Font metrics.  Table tag "fmtx" in the Open
   * Type Specification.
   */
  public final static int       TAG_FMTX        = 0x666d7478;

  /**
   * Justification.  Table tag "just" in the Open
   * Type Specification.
   */
  public final static int       TAG_JUST        = 0x6a757374;

  /**
   * Ligature caret.   Table tag "lcar" in the Open
   * Type Specification.
   */
  public final static int       TAG_LCAR        = 0x6c636172;

  /**
   * Glyph metamorphosis.  Table tag "mort" in the Open
   * Type Specification.
   */
  public final static int       TAG_MORT        = 0x6d6f7274;

  /**
   * Optical bounds.  Table tag "opbd" in the Open
   * Type Specification.
   */
  public final static int       TAG_OPBD        = 0x6d6f7274;

  /**
   * Glyph properties.  Table tag "prop" in the Open
   * Type Specification.
   */
  public final static int       TAG_PROP        = 0x70726f70;

  /**
   * Tracking.  Table tag "trak" in the Open
   * Type Specification.
   */
  public final static int       TAG_TRAK        = 0x7472616b;

  /**
   * Returns the version of the <code>OpenType</code> font.
   * 1.0 is represented as 0x00010000.
   * @return the version of the <code>OpenType</code> font.
   */
  public int getVersion();

  /**
   * Returns the table as an array of bytes for a specified tag.
   * Tags for sfnt tables include items like <i>cmap</i>,
   * <i>name</i> and <i>head</i>.  The <code>byte</code> array
   * returned is a copy of the font data in memory.
   * @param     sfntTag a four-character code as a 32-bit integer
   * @return a <code>byte</code> array that is the table that
   * contains the font data corresponding to the specified
   * tag.
   */
  public byte[] getFontTable(int sfntTag);

  /**
   * Returns the table as an array of bytes for a specified tag.
   * Tags for sfnt tables include items like <i>cmap</i>,
   * <i>name</i> and <i>head</i>.  The byte array returned is a
   * copy of the font data in memory.
   * @param     strSfntTag a four-character code as a
   *            <code>String</code>
   * @return a <code>byte</code> array that is the table that
   * contains the font data corresponding to the specified
   * tag.
   */
  public byte[] getFontTable(String strSfntTag);

  /**
   * Returns a subset of the table as an array of bytes
   * for a specified tag.  Tags for sfnt tables include
   * items like <i>cmap</i>, <i>name</i> and <i>head</i>.
   * The byte array returned is a copy of the font data in
   * memory.
   * @param     sfntTag a four-character code as a 32-bit integer
   * @param     offset index of first byte to return from table
   * @param     count number of bytes to return from table
   * @return a subset of the table corresponding to
   *            <code>sfntTag</code> and containing the bytes
   *            starting at <code>offset</code> byte and including
   *            <code>count</code> bytes.
   */
  public byte[] getFontTable(int sfntTag, int offset, int count);

  /**
   * Returns a subset of the table as an array of bytes
   * for a specified tag.  Tags for sfnt tables include items
   * like <i>cmap</i>, <i>name</i> and <i>head</i>. The
   * <code>byte</code> array returned is a copy of the font
   * data in memory.
   * @param     strSfntTag a four-character code as a
   * <code>String</code>
   * @param     offset index of first byte to return from table
   * @param     count  number of bytes to return from table
   * @return a subset of the table corresponding to
   *            <code>strSfntTag</code> and containing the bytes
   *            starting at <code>offset</code> byte and including
   *            <code>count</code> bytes.
   */
  public byte[] getFontTable(String strSfntTag, int offset, int count);

  /**
   * Returns the size of the table for a specified tag. Tags for sfnt
   * tables include items like <i>cmap</i>, <i>name</i> and <i>head</i>.
   * @param     sfntTag a four-character code as a 32-bit integer
   * @return the size of the table corresponding to the specified
   * tag.
   */
  public int getFontTableSize(int sfntTag);

  /**
   * Returns the size of the table for a specified tag. Tags for sfnt
   * tables include items like <i>cmap</i>, <i>name</i> and <i>head</i>.
   * @param     strSfntTag a four-character code as a
   * <code>String</code>
   * @return the size of the table corresponding to the specified tag.
   */
  public int getFontTableSize(String strSfntTag);


}
