/****************************************************************************
 *
 * tttypes.h
 *
 *   Basic SFNT/TrueType type definitions and interface (specification
 *   only).
 *
 * Copyright (C) 1996-2020 by
 * David Turner, Robert Wilhelm, and Werner Lemberg.
 *
 * This file is part of the FreeType project, and may only be used,
 * modified, and distributed under the terms of the FreeType project
 * license, LICENSE.TXT.  By continuing to use, modify, or distribute
 * this file you indicate that you have read the license and
 * understand and accept it fully.
 *
 */


#ifndef TTTYPES_H_
#define TTTYPES_H_


#include <ft2build.h>
#include <freetype/tttables.h>
#include <freetype/internal/ftobjs.h>
#include <freetype/ftcolor.h>

#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
#include <freetype/ftmm.h>
#endif


FT_BEGIN_HEADER


  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/
  /***                                                                   ***/
  /***                                                                   ***/
  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
  /***                                                                   ***/
  /***                                                                   ***/
  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/


  /**************************************************************************
   *
   * @struct:
   *   TTC_HeaderRec
   *
   * @description:
   *   TrueType collection header.  This table contains the offsets of the
   *   font headers of each distinct TrueType face in the file.
   *
   * @fields:
   *   tag ::
   *     Must be 'ttc~' to indicate a TrueType collection.
   *
   *   version ::
   *     The version number.
   *
   *   count ::
   *     The number of faces in the collection.  The specification says this
   *     should be an unsigned long, but we use a signed long since we need
   *     the value -1 for specific purposes.
   *
   *   offsets ::
   *     The offsets of the font headers, one per face.
   */
  typedef struct  TTC_HeaderRec_
  {
    FT_ULong   tag;
    FT_Fixed   version;
    FT_Long    count;
    FT_ULong*  offsets;

  } TTC_HeaderRec;


  /**************************************************************************
   *
   * @struct:
   *   SFNT_HeaderRec
   *
   * @description:
   *   SFNT file format header.
   *
   * @fields:
   *   format_tag ::
   *     The font format tag.
   *
   *   num_tables ::
   *     The number of tables in file.
   *
   *   search_range ::
   *     Must be '16 * (max power of 2 <= num_tables)'.
   *
   *   entry_selector ::
   *     Must be log2 of 'search_range / 16'.
   *
   *   range_shift ::
   *     Must be 'num_tables * 16 - search_range'.
   */
  typedef struct  SFNT_HeaderRec_
  {
    FT_ULong   format_tag;
    FT_UShort  num_tables;
    FT_UShort  search_range;
    FT_UShort  entry_selector;
    FT_UShort  range_shift;

    FT_ULong   offset;  /* not in file */

  } SFNT_HeaderRec, *SFNT_Header;


  /**************************************************************************
   *
   * @struct:
   *   TT_TableRec
   *
   * @description:
   *   This structure describes a given table of a TrueType font.
   *
   * @fields:
   *   Tag ::
   *     A four-bytes tag describing the table.
   *
   *   CheckSum ::
   *     The table checksum.  This value can be ignored.
   *
   *   Offset ::
   *     The offset of the table from the start of the TrueType font in its
   *     resource.
   *
   *   Length ::
   *     The table length (in bytes).
   */
  typedef struct  TT_TableRec_
  {
    FT_ULong  Tag;        /*        table type */
    FT_ULong  CheckSum;   /*    table checksum */
    FT_ULong  Offset;     /* table file offset */
    FT_ULong  Length;     /*      table length */

  } TT_TableRec, *TT_Table;


  /**************************************************************************
   *
   * @struct:
   *   TT_LongMetricsRec
   *
   * @description:
   *   A structure modeling the long metrics of the 'hmtx' and 'vmtx'
   *   TrueType tables.  The values are expressed in font units.
   *
   * @fields:
   *   advance ::
   *     The advance width or height for the glyph.
   *
   *   bearing ::
   *     The left-side or top-side bearing for the glyph.
   */
  typedef struct  TT_LongMetricsRec_
  {
    FT_UShort  advance;
    FT_Short   bearing;

  } TT_LongMetricsRec, *TT_LongMetrics;


  /**************************************************************************
   *
   * @type:
   *   TT_ShortMetrics
   *
   * @description:
   *   A simple type to model the short metrics of the 'hmtx' and 'vmtx'
   *   tables.
   */
  typedef FT_Short  TT_ShortMetrics;


  /**************************************************************************
   *
   * @struct:
   *   TT_NameRec
   *
   * @description:
   *   A structure modeling TrueType name records.  Name records are used to
   *   store important strings like family name, style name, copyright,
   *   etc. in _localized_ versions (i.e., language, encoding, etc).
   *
   * @fields:
   *   platformID ::
   *     The ID of the name's encoding platform.
   *
   *   encodingID ::
   *     The platform-specific ID for the name's encoding.
   *
   *   languageID ::
   *     The platform-specific ID for the name's language.
   *
   *   nameID ::
   *     The ID specifying what kind of name this is.
   *
   *   stringLength ::
   *     The length of the string in bytes.
   *
   *   stringOffset ::
   *     The offset to the string in the 'name' table.
   *
   *   string ::
   *     A pointer to the string's bytes.  Note that these are usually UTF-16
   *     encoded characters.
   */
  typedef struct  TT_NameRec_
  {
    FT_UShort  platformID;
    FT_UShort  encodingID;
    FT_UShort  languageID;
    FT_UShort  nameID;
    FT_UShort  stringLength;
    FT_ULong   stringOffset;

    /* this last field is not defined in the spec */
    /* but used by the FreeType engine            */

    FT_Byte*  string;

  } TT_NameRec, *TT_Name;


  /**************************************************************************
   *
   * @struct:
   *   TT_LangTagRec
   *
   * @description:
   *   A structure modeling language tag records in SFNT 'name' tables,
   *   introduced in OpenType version 1.6.
   *
   * @fields:
   *   stringLength ::
   *     The length of the string in bytes.
   *
   *   stringOffset ::
   *     The offset to the string in the 'name' table.
   *
   *   string ::
   *     A pointer to the string's bytes.  Note that these are UTF-16BE
   *     encoded characters.
   */
  typedef struct TT_LangTagRec_
  {
    FT_UShort  stringLength;
    FT_ULong   stringOffset;

    /* this last field is not defined in the spec */
    /* but used by the FreeType engine            */

    FT_Byte*  string;

  } TT_LangTagRec, *TT_LangTag;


  /**************************************************************************
   *
   * @struct:
   *   TT_NameTableRec
   *
   * @description:
   *   A structure modeling the TrueType name table.
   *
   * @fields:
   *   format ::
   *     The format of the name table.
   *
   *   numNameRecords ::
   *     The number of names in table.
   *
   *   storageOffset ::
   *     The offset of the name table in the 'name' TrueType table.
   *
   *   names ::
   *     An array of name records.
   *
   *   numLangTagRecords ::
   *     The number of language tags in table.
   *
   *   langTags ::
   *     An array of language tag records.
   *
   *   stream ::
   *     The file's input stream.
   */
  typedef struct  TT_NameTableRec_
  {
    FT_UShort       format;
    FT_UInt         numNameRecords;
    FT_UInt         storageOffset;
    TT_NameRec*     names;
    FT_UInt         numLangTagRecords;
    TT_LangTagRec*  langTags;
    FT_Stream       stream;

  } TT_NameTableRec, *TT_NameTable;


  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/
  /***                                                                   ***/
  /***                                                                   ***/
  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
  /***                                                                   ***/
  /***                                                                   ***/
  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/


  /**************************************************************************
   *
   * @struct:
   *   TT_GaspRangeRec
   *
   * @description:
   *   A tiny structure used to model a gasp range according to the TrueType
   *   specification.
   *
   * @fields:
   *   maxPPEM ::
   *     The maximum ppem value to which `gaspFlag` applies.
   *
   *   gaspFlag ::
   *     A flag describing the grid-fitting and anti-aliasing modes to be
   *     used.
   */
  typedef struct  TT_GaspRangeRec_
  {
    FT_UShort  maxPPEM;
    FT_UShort  gaspFlag;

  } TT_GaspRangeRec, *TT_GaspRange;


#define TT_GASP_GRIDFIT  0x01
#define TT_GASP_DOGRAY   0x02


  /**************************************************************************
   *
   * @struct:
   *   TT_GaspRec
   *
   * @description:
   *   A structure modeling the TrueType 'gasp' table used to specify
   *   grid-fitting and anti-aliasing behaviour.
   *
   * @fields:
   *   version ::
   *     The version number.
   *
   *   numRanges ::
   *     The number of gasp ranges in table.
   *
   *   gaspRanges ::
   *     An array of gasp ranges.
   */
  typedef struct  TT_Gasp_
  {
    FT_UShort     version;
    FT_UShort     numRanges;
    TT_GaspRange  gaspRanges;

  } TT_GaspRec;


  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/
  /***                                                                   ***/
  /***                                                                   ***/
  /***                    EMBEDDED BITMAPS SUPPORT                       ***/
  /***                                                                   ***/
  /***                                                                   ***/
  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/


  /**************************************************************************
   *
   * @struct:
   *   TT_SBit_MetricsRec
   *
   * @description:
   *   A structure used to hold the big metrics of a given glyph bitmap in a
   *   TrueType or OpenType font.  These are usually found in the 'EBDT'
   *   (Microsoft) or 'bloc' (Apple) table.
   *
   * @fields:
   *   height ::
   *     The glyph height in pixels.
   *
   *   width ::
   *     The glyph width in pixels.
   *
   *   horiBearingX ::
   *     The horizontal left bearing.
   *
   *   horiBearingY ::
   *     The horizontal top bearing.
   *
   *   horiAdvance ::
   *     The horizontal advance.
   *
   *   vertBearingX ::
   *     The vertical left bearing.
   *
   *   vertBearingY ::
   *     The vertical top bearing.
   *
   *   vertAdvance ::
   *     The vertical advance.
   */
  typedef struct  TT_SBit_MetricsRec_
  {
    FT_UShort  height;
    FT_UShort  width;

    FT_Short   horiBearingX;
    FT_Short   horiBearingY;
    FT_UShort  horiAdvance;

    FT_Short   vertBearingX;
    FT_Short   vertBearingY;
    FT_UShort  vertAdvance;

  } TT_SBit_MetricsRec, *TT_SBit_Metrics;


  /**************************************************************************
   *
   * @struct:
   *   TT_SBit_SmallMetricsRec
   *
   * @description:
   *   A structure used to hold the small metrics of a given glyph bitmap in
   *   a TrueType or OpenType font.  These are usually found in the 'EBDT'
   *   (Microsoft) or the 'bdat' (Apple) table.
   *
   * @fields:
   *   height ::
   *     The glyph height in pixels.
   *
   *   width ::
   *     The glyph width in pixels.
   *
   *   bearingX ::
   *     The left-side bearing.
   *
   *   bearingY ::
   *     The top-side bearing.
   *
   *   advance ::
   *     The advance width or height.
   */
  typedef struct  TT_SBit_Small_Metrics_
  {
    FT_Byte  height;
    FT_Byte  width;

    FT_Char  bearingX;
    FT_Char  bearingY;
    FT_Byte  advance;

  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;


  /**************************************************************************
   *
   * @struct:
   *   TT_SBit_LineMetricsRec
   *
   * @description:
   *   A structure used to describe the text line metrics of a given bitmap
   *   strike, for either a horizontal or vertical layout.
   *
   * @fields:
   *   ascender ::
   *     The ascender in pixels.
   *
   *   descender ::
   *     The descender in pixels.
   *
   *   max_width ::
   *     The maximum glyph width in pixels.
   *
   *   caret_slope_enumerator ::
   *     Rise of the caret slope, typically set to 1 for non-italic fonts.
   *
   *   caret_slope_denominator ::
   *     Rise of the caret slope, typically set to 0 for non-italic fonts.
   *
   *   caret_offset ::
   *     Offset in pixels to move the caret for proper positioning.
   *
   *   min_origin_SB ::
   *     Minimum of horiBearingX (resp.  vertBearingY).
   *   min_advance_SB ::
   *     Minimum of
   *
   *     horizontal advance - ( horiBearingX + width )
   *
   *     resp.
   *
   *     vertical advance - ( vertBearingY + height )
   *
   *   max_before_BL ::
   *     Maximum of horiBearingY (resp.  vertBearingY).
   *
   *   min_after_BL ::
   *     Minimum of
   *
   *     horiBearingY - height
   *
   *     resp.
   *
   *     vertBearingX - width
   *
   *   pads ::
   *     Unused (to make the size of the record a multiple of 32 bits.
   */
  typedef struct  TT_SBit_LineMetricsRec_
  {
    FT_Char  ascender;
    FT_Char  descender;
    FT_Byte  max_width;
    FT_Char  caret_slope_numerator;
    FT_Char  caret_slope_denominator;
    FT_Char  caret_offset;
    FT_Char  min_origin_SB;
    FT_Char  min_advance_SB;
    FT_Char  max_before_BL;
    FT_Char  min_after_BL;
    FT_Char  pads[2];

  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;


  /**************************************************************************
   *
   * @struct:
   *   TT_SBit_RangeRec
   *
   * @description:
   *   A TrueType/OpenType subIndexTable as defined in the 'EBLC' (Microsoft)
   *   or 'bloc' (Apple) tables.
   *
   * @fields:
   *   first_glyph ::
   *     The first glyph index in the range.
   *
   *   last_glyph ::
   *     The last glyph index in the range.
   *
   *   index_format ::
   *     The format of index table.  Valid values are 1 to 5.
   *
   *   image_format ::
   *     The format of 'EBDT' image data.
   *
   *   image_offset ::
   *     The offset to image data in 'EBDT'.
   *
   *   image_size ::
   *     For index formats 2 and 5.  This is the size in bytes of each glyph
   *     bitmap.
   *
   *   big_metrics ::
   *     For index formats 2 and 5.  This is the big metrics for each glyph
   *     bitmap.
   *
   *   num_glyphs ::
   *     For index formats 4 and 5.  This is the number of glyphs in the code
   *     array.
   *
   *   glyph_offsets ::
   *     For index formats 1 and 3.
   *
   *   glyph_codes ::
   *     For index formats 4 and 5.
   *
   *   table_offset ::
   *     The offset of the index table in the 'EBLC' table.  Only used during
   *     strike loading.
   */
  typedef struct  TT_SBit_RangeRec_
  {
    FT_UShort           first_glyph;
    FT_UShort           last_glyph;

    FT_UShort           index_format;
    FT_UShort           image_format;
    FT_ULong            image_offset;

    FT_ULong            image_size;
    TT_SBit_MetricsRec  metrics;
    FT_ULong            num_glyphs;

    FT_ULong*           glyph_offsets;
    FT_UShort*          glyph_codes;

    FT_ULong            table_offset;

  } TT_SBit_RangeRec, *TT_SBit_Range;


  /**************************************************************************
   *
   * @struct:
   *   TT_SBit_StrikeRec
   *
   * @description:
   *   A structure used describe a given bitmap strike in the 'EBLC'
   *   (Microsoft) or 'bloc' (Apple) tables.
   *
   * @fields:
   *  num_index_ranges ::
   *    The number of index ranges.
   *
   *  index_ranges ::
   *    An array of glyph index ranges.
   *
   *  color_ref ::
   *    Unused.  `color_ref` is put in for future enhancements, but these
   *    fields are already in use by other platforms (e.g. Newton).  For
   *    details, please see
   *
   *    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html
   *
   *  hori ::
   *    The line metrics for horizontal layouts.
   *
   *  vert ::
   *    The line metrics for vertical layouts.
   *
   *  start_glyph ::
   *    The lowest glyph index for this strike.
   *
   *  end_glyph ::
   *    The highest glyph index for this strike.
   *
   *  x_ppem ::
   *    The number of horizontal pixels per EM.
   *
   *  y_ppem ::
   *    The number of vertical pixels per EM.
   *
   *  bit_depth ::
   *    The bit depth.  Valid values are 1, 2, 4, and 8.
   *
   *  flags ::
   *    Is this a vertical or horizontal strike?  For details, please see
   *
   *    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html
   */
  typedef struct  TT_SBit_StrikeRec_
  {
    FT_Int                  num_ranges;
    TT_SBit_Range           sbit_ranges;
    FT_ULong                ranges_offset;

    FT_ULong                color_ref;

    TT_SBit_LineMetricsRec  hori;
    TT_SBit_LineMetricsRec  vert;

    FT_UShort               start_glyph;
    FT_UShort               end_glyph;

    FT_Byte                 x_ppem;
    FT_Byte                 y_ppem;

    FT_Byte                 bit_depth;
    FT_Char                 flags;

  } TT_SBit_StrikeRec, *TT_SBit_Strike;


  /**************************************************************************
   *
   * @struct:
   *   TT_SBit_ComponentRec
   *
   * @description:
   *   A simple structure to describe a compound sbit element.
   *
   * @fields:
   *   glyph_code ::
   *     The element's glyph index.
   *
   *   x_offset ::
   *     The element's left bearing.
   *
   *   y_offset ::
   *     The element's top bearing.
   */
  typedef struct  TT_SBit_ComponentRec_
  {
    FT_UShort  glyph_code;
    FT_Char    x_offset;
    FT_Char    y_offset;

  } TT_SBit_ComponentRec, *TT_SBit_Component;


  /**************************************************************************
   *
   * @struct:
   *   TT_SBit_ScaleRec
   *
   * @description:
   *   A structure used describe a given bitmap scaling table, as defined in
   *   the 'EBSC' table.
   *
   * @fields:
   *   hori ::
   *     The horizontal line metrics.
   *
   *   vert ::
   *     The vertical line metrics.
   *
   *   x_ppem ::
   *     The number of horizontal pixels per EM.
   *
   *   y_ppem ::
   *     The number of vertical pixels per EM.
   *
   *   x_ppem_substitute ::
   *     Substitution x_ppem value.
   *
   *   y_ppem_substitute ::
   *     Substitution y_ppem value.
   */
  typedef struct  TT_SBit_ScaleRec_
  {
    TT_SBit_LineMetricsRec  hori;
    TT_SBit_LineMetricsRec  vert;

    FT_Byte                 x_ppem;
    FT_Byte                 y_ppem;

    FT_Byte                 x_ppem_substitute;
    FT_Byte                 y_ppem_substitute;

  } TT_SBit_ScaleRec, *TT_SBit_Scale;


  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/
  /***                                                                   ***/
  /***                                                                   ***/
  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/
  /***                                                                   ***/
  /***                                                                   ***/
  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/


  /**************************************************************************
   *
   * @struct:
   *   TT_Post_20Rec
   *
   * @description:
   *   Postscript names sub-table, format 2.0.  Stores the PS name of each
   *   glyph in the font face.
   *
   * @fields:
   *   num_glyphs ::
   *     The number of named glyphs in the table.
   *
   *   num_names ::
   *     The number of PS names stored in the table.
   *
   *   glyph_indices ::
   *     The indices of the glyphs in the names arrays.
   *
   *   glyph_names ::
   *     The PS names not in Mac Encoding.
   */
  typedef struct  TT_Post_20Rec_
  {
    FT_UShort   num_glyphs;
    FT_UShort   num_names;
    FT_UShort*  glyph_indices;
    FT_Char**   glyph_names;

  } TT_Post_20Rec, *TT_Post_20;


  /**************************************************************************
   *
   * @struct:
   *   TT_Post_25Rec
   *
   * @description:
   *   Postscript names sub-table, format 2.5.  Stores the PS name of each
   *   glyph in the font face.
   *
   * @fields:
   *   num_glyphs ::
   *     The number of glyphs in the table.
   *
   *   offsets ::
   *     An array of signed offsets in a normal Mac Postscript name encoding.
   */
  typedef struct  TT_Post_25_
  {
    FT_UShort  num_glyphs;
    FT_Char*   offsets;

  } TT_Post_25Rec, *TT_Post_25;


  /**************************************************************************
   *
   * @struct:
   *   TT_Post_NamesRec
   *
   * @description:
   *   Postscript names table, either format 2.0 or 2.5.
   *
   * @fields:
   *   loaded ::
   *     A flag to indicate whether the PS names are loaded.
   *
   *   format_20 ::
   *     The sub-table used for format 2.0.
   *
   *   format_25 ::
   *     The sub-table used for format 2.5.
   */
  typedef struct  TT_Post_NamesRec_
  {
    FT_Bool  loaded;

    union
    {
      TT_Post_20Rec  format_20;
      TT_Post_25Rec  format_25;

    } names;

  } TT_Post_NamesRec, *TT_Post_Names;


  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/
  /***                                                                   ***/
  /***                                                                   ***/
  /***                    GX VARIATION TABLE SUPPORT                     ***/
  /***                                                                   ***/
  /***                                                                   ***/
  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/


#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
  typedef struct GX_BlendRec_  *GX_Blend;
#endif

  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/
  /***                                                                   ***/
  /***                                                                   ***/
  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/
  /***                                                                   ***/
  /***                                                                   ***/
  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/

  /*
   * These types are used to support a `BDF ' table that isn't part of the
   * official TrueType specification.  It is mainly used in SFNT-based bitmap
   * fonts that were generated from a set of BDF fonts.
   *
   * The format of the table is as follows.
   *
   *   USHORT version `BDF ' table version number, should be 0x0001.  USHORT
   *   strikeCount Number of strikes (bitmap sizes) in this table.  ULONG
   *   stringTable Offset (from start of BDF table) to string
   *                         table.
   *
   * This is followed by an array of `strikeCount' descriptors, having the
   * following format.
   *
   *   USHORT ppem Vertical pixels per EM for this strike.  USHORT numItems
   *   Number of items for this strike (properties and
   *                         atoms).  Maximum is 255.
   *
   * This array in turn is followed by `strikeCount' value sets.  Each `value
   * set' is an array of `numItems' items with the following format.
   *
   *   ULONG    item_name    Offset in string table to item name.
   *   USHORT   item_type    The item type.  Possible values are
   *                            0 => string (e.g., COMMENT)
   *                            1 => atom   (e.g., FONT or even SIZE)
   *                            2 => int32
   *                            3 => uint32
   *                         0x10 => A flag to indicate a properties.  This
   *                                 is ORed with the above values.
   *   ULONG    item_value   For strings  => Offset into string table without
   *                                         the corresponding double quotes.
   *                         For atoms    => Offset into string table.
   *                         For integers => Direct value.
   *
   * All strings in the string table consist of bytes and are
   * zero-terminated.
   *
   */

#ifdef TT_CONFIG_OPTION_BDF

  typedef struct  TT_BDFRec_
  {
    FT_Byte*   table;
    FT_Byte*   table_end;
    FT_Byte*   strings;
    FT_ULong   strings_size;
    FT_UInt    num_strikes;
    FT_Bool    loaded;

  } TT_BDFRec, *TT_BDF;

#endif /* TT_CONFIG_OPTION_BDF */

  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/
  /***                                                                   ***/
  /***                                                                   ***/
  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/
  /***                                                                   ***/
  /***                                                                   ***/
  /*************************************************************************/
  /*************************************************************************/
  /*************************************************************************/


  /**************************************************************************
   *
   * This structure/class is defined here because it is common to the
   * following formats: TTF, OpenType-TT, and OpenType-CFF.
   *
   * Note, however, that the classes TT_Size and TT_GlyphSlot are not shared
   * between font drivers, and are thus defined in `ttobjs.h`.
   *
   */


  /**************************************************************************
   *
   * @type:
   *   TT_Face
   *
   * @description:
   *   A handle to a TrueType face/font object.  A TT_Face encapsulates the
   *   resolution and scaling independent parts of a TrueType font resource.
   *
   * @note:
   *   The TT_Face structure is also used as a 'parent class' for the
   *   OpenType-CFF class (T2_Face).
   */
  typedef struct TT_FaceRec_*  TT_Face;


  /* a function type used for the truetype bytecode interpreter hooks */
  typedef FT_Error
  (*TT_Interpreter)( void*  exec_context );

  /* forward declaration */
  typedef struct TT_LoaderRec_*  TT_Loader;


  /**************************************************************************
   *
   * @functype:
   *   TT_Loader_GotoTableFunc
   *
   * @description:
   *   Seeks a stream to the start of a given TrueType table.
   *
   * @input:
   *   face ::
   *     A handle to the target face object.
   *
   *   tag ::
   *     A 4-byte tag used to name the table.
   *
   *   stream ::
   *     The input stream.
   *
   * @output:
   *   length ::
   *     The length of the table in bytes.  Set to 0 if not needed.
   *
   * @return:
   *   FreeType error code.  0 means success.
   *
   * @note:
   *   The stream cursor must be at the font file's origin.
   */
  typedef FT_Error
  (*TT_Loader_GotoTableFunc)( TT_Face    face,
                              FT_ULong   tag,
                              FT_Stream  stream,
                              FT_ULong*  length );


  /**************************************************************************
   *
   * @functype:
   *   TT_Loader_StartGlyphFunc
   *
   * @description:
   *   Seeks a stream to the start of a given glyph element, and opens a
   *   frame for it.
   *
   * @input:
   *   loader ::
   *     The current TrueType glyph loader object.
   *
   *     glyph index :: The index of the glyph to access.
   *
   *   offset ::
   *     The offset of the glyph according to the 'locations' table.
   *
   *   byte_count ::
   *     The size of the frame in bytes.
   *
   * @return:
   *   FreeType error code.  0 means success.
   *
   * @note:
   *   This function is normally equivalent to FT_STREAM_SEEK(offset)
   *   followed by FT_FRAME_ENTER(byte_count) with the loader's stream, but
   *   alternative formats (e.g. compressed ones) might use something
   *   different.
   */
  typedef FT_Error
  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,
                               FT_UInt    glyph_index,
                               FT_ULong   offset,
                               FT_UInt    byte_count );


  /**************************************************************************
   *
   * @functype:
   *   TT_Loader_ReadGlyphFunc
   *
   * @description:
   *   Reads one glyph element (its header, a simple glyph, or a composite)
   *   from the loader's current stream frame.
   *
   * @input:
   *   loader ::
   *     The current TrueType glyph loader object.
   *
   * @return:
   *   FreeType error code.  0 means success.
   */
  typedef FT_Error
  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );


  /**************************************************************************
   *
   * @functype:
   *   TT_Loader_EndGlyphFunc
   *
   * @description:
   *   Closes the current loader stream frame for the glyph.
   *
   * @input:
   *   loader ::
   *     The current TrueType glyph loader object.
   */
  typedef void
  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );


  typedef enum TT_SbitTableType_
  {
    TT_SBIT_TABLE_TYPE_NONE = 0,
    TT_SBIT_TABLE_TYPE_EBLC, /* `EBLC' (Microsoft), */
                             /* `bloc' (Apple)      */
    TT_SBIT_TABLE_TYPE_CBLC, /* `CBLC' (Google)     */
    TT_SBIT_TABLE_TYPE_SBIX, /* `sbix' (Apple)      */

    /* do not remove */
    TT_SBIT_TABLE_TYPE_MAX

  } TT_SbitTableType;


  /* OpenType 1.8 brings new tables for variation font support;  */
  /* to make the old MM and GX fonts still work we need to check */
  /* the presence (and validity) of the functionality provided   */
  /* by those tables.  The following flag macros are for the     */
  /* field `variation_support'.                                  */
  /*                                                             */
  /* Note that `fvar' gets checked immediately at font loading,  */
  /* while the other features are only loaded if MM support is   */
  /* actually requested.                                         */

  /* FVAR */
#define TT_FACE_FLAG_VAR_FVAR  ( 1 << 0 )

  /* HVAR */
#define TT_FACE_FLAG_VAR_HADVANCE  ( 1 << 1 )
#define TT_FACE_FLAG_VAR_LSB       ( 1 << 2 )
#define TT_FACE_FLAG_VAR_RSB       ( 1 << 3 )

  /* VVAR */
#define TT_FACE_FLAG_VAR_VADVANCE  ( 1 << 4 )
#define TT_FACE_FLAG_VAR_TSB       ( 1 << 5 )
#define TT_FACE_FLAG_VAR_BSB       ( 1 << 6 )
#define TT_FACE_FLAG_VAR_VORG      ( 1 << 7 )

  /* MVAR */
#define TT_FACE_FLAG_VAR_MVAR  ( 1 << 8 )


  /**************************************************************************
   *
   *                        TrueType Face Type
   *
   * @struct:
   *   TT_Face
   *
   * @description:
   *   The TrueType face class.  These objects model the resolution and
   *   point-size independent data found in a TrueType font file.
   *
   * @fields:
   *   root ::
   *     The base FT_Face structure, managed by the base layer.
   *
   *   ttc_header ::
   *     The TrueType collection header, used when the file is a 'ttc' rather
   *     than a 'ttf'.  For ordinary font files, the field `ttc_header.count`
   *     is set to 0.
   *
   *   format_tag ::
   *     The font format tag.
   *
   *   num_tables ::
   *     The number of TrueType tables in this font file.
   *
   *   dir_tables ::
   *     The directory of TrueType tables for this font file.
   *
   *   header ::
   *     The font's font header ('head' table).  Read on font opening.
   *
   *   horizontal ::
   *     The font's horizontal header ('hhea' table).  This field also
   *     contains the associated horizontal metrics table ('hmtx').
   *
   *   max_profile ::
   *     The font's maximum profile table.  Read on font opening.  Note that
   *     some maximum values cannot be taken directly from this table.  We
   *     thus define additional fields below to hold the computed maxima.
   *
   *   vertical_info ::
   *     A boolean which is set when the font file contains vertical metrics.
   *     If not, the value of the 'vertical' field is undefined.
   *
   *   vertical ::
   *     The font's vertical header ('vhea' table).  This field also contains
   *     the associated vertical metrics table ('vmtx'), if found.
   *     IMPORTANT: The contents of this field is undefined if the
   *     `vertical_info` field is unset.
   *
   *   num_names ::
   *     The number of name records within this TrueType font.
   *
   *   name_table ::
   *     The table of name records ('name').
   *
   *   os2 ::
   *     The font's OS/2 table ('OS/2').
   *
   *   postscript ::
   *     The font's PostScript table ('post' table).  The PostScript glyph
   *     names are not loaded by the driver on face opening.  See the
   *     'ttpost' module for more details.
   *
   *   cmap_table ::
   *     Address of the face's 'cmap' SFNT table in memory (it's an extracted
   *     frame).
   *
   *   cmap_size ::
   *     The size in bytes of the `cmap_table` described above.
   *
   *   goto_table ::
   *     A function called by each TrueType table loader to position a
   *     stream's cursor to the start of a given table according to its tag.
   *     It defaults to TT_Goto_Face but can be different for strange formats
   *     (e.g.  Type 42).
   *
   *   access_glyph_frame ::
   *     A function used to access the frame of a given glyph within the
   *     face's font file.
   *
   *   forget_glyph_frame ::
   *     A function used to forget the frame of a given glyph when all data
   *     has been loaded.
   *
   *   read_glyph_header ::
   *     A function used to read a glyph header.  It must be called between
   *     an 'access' and 'forget'.
   *
   *   read_simple_glyph ::
   *     A function used to read a simple glyph.  It must be called after the
   *     header was read, and before the 'forget'.
   *
   *   read_composite_glyph ::
   *     A function used to read a composite glyph.  It must be called after
   *     the header was read, and before the 'forget'.
   *
   *   sfnt ::
   *     A pointer to the SFNT service.
   *
   *   psnames ::
   *     A pointer to the PostScript names service.
   *
   *   mm ::
   *     A pointer to the Multiple Masters service.
   *
   *   var ::
   *     A pointer to the Metrics Variations service.
   *
   *   hdmx ::
   *     The face's horizontal device metrics ('hdmx' table).  This table is
   *     optional in TrueType/OpenType fonts.
   *
   *   gasp ::
   *     The grid-fitting and scaling properties table ('gasp').  This table
   *     is optional in TrueType/OpenType fonts.
   *
   *   pclt ::
   *     The 'pclt' SFNT table.
   *
   *   num_sbit_scales ::
   *     The number of sbit scales for this font.
   *
   *   sbit_scales ::
   *     Array of sbit scales embedded in this font.  This table is optional
   *     in a TrueType/OpenType font.
   *
   *   postscript_names ::
   *     A table used to store the Postscript names of the glyphs for this
   *     font.  See the file `ttconfig.h` for comments on the
   *     TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.
   *
   *   palette_data ::
   *     Some fields from the 'CPAL' table that are directly indexed.
   *
   *   palette_index ::
   *     The current palette index, as set by @FT_Palette_Select.
   *
   *   palette ::
   *     An array containing the current palette's colors.
   *
   *   have_foreground_color ::
   *     There was a call to @FT_Palette_Set_Foreground_Color.
   *
   *   foreground_color ::
   *     The current foreground color corresponding to 'CPAL' color index
   *     0xFFFF.  Only valid if `have_foreground_color` is set.
   *
   *   font_program_size ::
   *     Size in bytecodes of the face's font program.  0 if none defined.
   *     Ignored for Type 2 fonts.
   *
   *   font_program ::
   *     The face's font program (bytecode stream) executed at load time,
   *     also used during glyph rendering.  Comes from the 'fpgm' table.
   *     Ignored for Type 2 font fonts.
   *
   *   cvt_program_size ::
   *     The size in bytecodes of the face's cvt program.  Ignored for Type 2
   *     fonts.
   *
   *   cvt_program ::
   *     The face's cvt program (bytecode stream) executed each time an
   *     instance/size is changed/reset.  Comes from the 'prep' table.
   *     Ignored for Type 2 fonts.
   *
   *   cvt_size ::
   *     Size of the control value table (in entries).  Ignored for Type 2
   *     fonts.
   *
   *   cvt ::
   *     The face's original control value table.  Coordinates are expressed
   *     in unscaled font units (in 26.6 format).  Comes from the 'cvt~'
   *     table.  Ignored for Type 2 fonts.
   *
   *     If varied by the `CVAR' table, non-integer values are possible.
   *
   *   interpreter ::
   *     A pointer to the TrueType bytecode interpreters field is also used
   *     to hook the debugger in 'ttdebug'.
   *
   *   extra ::
   *     Reserved for third-party font drivers.
   *
   *   postscript_name ::
   *     The PS name of the font.  Used by the postscript name service.
   *
   *   glyf_len ::
   *     The length of the 'glyf' table.  Needed for malformed 'loca' tables.
   *
   *   glyf_offset ::
   *     The file offset of the 'glyf' table.
   *
   *   is_cff2 ::
   *     Set if the font format is CFF2.
   *
   *   doblend ::
   *     A boolean which is set if the font should be blended (this is for GX
   *     var).
   *
   *   blend ::
   *     Contains the data needed to control GX variation tables (rather like
   *     Multiple Master data).
   *
   *   variation_support ::
   *     Flags that indicate which OpenType functionality related to font
   *     variation support is present, valid, and usable.  For example,
   *     TT_FACE_FLAG_VAR_FVAR is only set if we have at least one design
   *     axis.
   *
   *   var_postscript_prefix ::
   *     The PostScript name prefix needed for constructing a variation font
   *     instance's PS name .
   *
   *   var_postscript_prefix_len ::
   *     The length of the `var_postscript_prefix` string.
   *
   *   horz_metrics_size ::
   *     The size of the 'hmtx' table.
   *
   *   vert_metrics_size ::
   *     The size of the 'vmtx' table.
   *
   *   num_locations ::
   *     The number of glyph locations in this TrueType file.  This should be
   *     identical to the number of glyphs.  Ignored for Type 2 fonts.
   *
   *   glyph_locations ::
   *     An array of longs.  These are offsets to glyph data within the
   *     'glyf' table.  Ignored for Type 2 font faces.
   *
   *   hdmx_table ::
   *     A pointer to the 'hdmx' table.
   *
   *   hdmx_table_size ::
   *     The size of the 'hdmx' table.
   *
   *   hdmx_record_count ::
   *     The number of hdmx records.
   *
   *   hdmx_record_size ::
   *     The size of a single hdmx record.
   *
   *   hdmx_record_sizes ::
   *     An array holding the ppem sizes available in the 'hdmx' table.
   *
   *   sbit_table ::
   *     A pointer to the font's embedded bitmap location table.
   *
   *   sbit_table_size ::
   *     The size of `sbit_table`.
   *
   *   sbit_table_type ::
   *     The sbit table type (CBLC, sbix, etc.).
   *
   *   sbit_num_strikes ::
   *     The number of sbit strikes exposed by FreeType's API, omitting
   *     invalid strikes.
   *
   *   sbit_strike_map ::
   *     A mapping between the strike indices exposed by the API and the
   *     indices used in the font's sbit table.
   *
   *   cpal ::
   *     A pointer to data related to the 'CPAL' table.  `NULL` if the table
   *     is not available.
   *
   *   colr ::
   *     A pointer to data related to the 'COLR' table.  `NULL` if the table
   *     is not available.
   *
   *   kern_table ::
   *     A pointer to the 'kern' table.
   *
   *   kern_table_size ::
   *     The size of the 'kern' table.
   *
   *   num_kern_tables ::
   *     The number of supported kern subtables (up to 32; FreeType
   *     recognizes only horizontal ones with format 0).
   *
   *   kern_avail_bits ::
   *     The availability status of kern subtables; if bit n is set, table n
   *     is available.
   *
   *   kern_order_bits ::
   *     The sortedness status of kern subtables; if bit n is set, table n is
   *     sorted.
   *
   *   bdf ::
   *     Data related to an SFNT font's 'bdf' table; see `tttypes.h`.
   *
   *   horz_metrics_offset ::
   *     The file offset of the 'hmtx' table.
   *
   *   vert_metrics_offset ::
   *     The file offset of the 'vmtx' table.
   *
   *   sph_found_func_flags ::
   *     Flags identifying special bytecode functions (used by the v38
   *     implementation of the bytecode interpreter).
   *
   *   sph_compatibility_mode ::
   *     This flag is set if we are in ClearType backward compatibility mode
   *     (used by the v38 implementation of the bytecode interpreter).
   *
   *   ebdt_start ::
   *     The file offset of the sbit data table (CBDT, bdat, etc.).
   *
   *   ebdt_size ::
   *     The size of the sbit data table.
   */
  typedef struct  TT_FaceRec_
  {
    FT_FaceRec            root;

    TTC_HeaderRec         ttc_header;

    FT_ULong              format_tag;
    FT_UShort             num_tables;
    TT_Table              dir_tables;

    TT_Header             header;       /* TrueType header table          */
    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */

    TT_MaxProfile         max_profile;

    FT_Bool               vertical_info;
    TT_VertHeader         vertical;     /* TT Vertical header, if present */

    FT_UShort             num_names;    /* number of name records  */
    TT_NameTableRec       name_table;   /* name table              */

    TT_OS2                os2;          /* TrueType OS/2 table            */
    TT_Postscript         postscript;   /* TrueType Postscript table      */

    FT_Byte*              cmap_table;   /* extracted `cmap' table */
    FT_ULong              cmap_size;

    TT_Loader_GotoTableFunc   goto_table;

    TT_Loader_StartGlyphFunc  access_glyph_frame;
    TT_Loader_EndGlyphFunc    forget_glyph_frame;
    TT_Loader_ReadGlyphFunc   read_glyph_header;
    TT_Loader_ReadGlyphFunc   read_simple_glyph;
    TT_Loader_ReadGlyphFunc   read_composite_glyph;

    /* a typeless pointer to the SFNT_Interface table used to load */
    /* the basic TrueType tables in the face object                */
    void*                 sfnt;

    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
    /* handle glyph names <-> unicode & Mac values                   */
    void*                 psnames;

#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
    /* a typeless pointer to the FT_Service_MultiMasters table used to */
    /* handle variation fonts                                          */
    void*                 mm;

    /* a typeless pointer to the FT_Service_MetricsVariationsRec table */
    /* used to handle the HVAR, VVAR, and MVAR OpenType tables         */
    void*                 var;
#endif

    /* a typeless pointer to the PostScript Aux service */
    void*                 psaux;


    /************************************************************************
     *
     * Optional TrueType/OpenType tables
     *
     */

    /* grid-fitting and scaling table */
    TT_GaspRec            gasp;                 /* the `gasp' table */

    /* PCL 5 table */
    TT_PCLT               pclt;

    /* embedded bitmaps support */
    FT_ULong              num_sbit_scales;
    TT_SBit_Scale         sbit_scales;

    /* postscript names table */
    TT_Post_NamesRec      postscript_names;

    /* glyph colors */
    FT_Palette_Data       palette_data;         /* since 2.10 */
    FT_UShort             palette_index;
    FT_Color*             palette;
    FT_Bool               have_foreground_color;
    FT_Color              foreground_color;


    /************************************************************************
     *
     * TrueType-specific fields (ignored by the CFF driver)
     *
     */

    /* the font program, if any */
    FT_ULong              font_program_size;
    FT_Byte*              font_program;

    /* the cvt program, if any */
    FT_ULong              cvt_program_size;
    FT_Byte*              cvt_program;

    /* the original, unscaled, control value table */
    FT_ULong              cvt_size;
    FT_Int32*             cvt;

    /* A pointer to the bytecode interpreter to use.  This is also */
    /* used to hook the debugger for the `ttdebug' utility.        */
    TT_Interpreter        interpreter;


    /************************************************************************
     *
     * Other tables or fields. This is used by derivative formats like
     * OpenType.
     *
     */

    FT_Generic            extra;

    const char*           postscript_name;

    FT_ULong              glyf_len;
    FT_ULong              glyf_offset;    /* since 2.7.1 */

    FT_Bool               is_cff2;        /* since 2.7.1 */

#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
    FT_Bool               doblend;
    GX_Blend              blend;

    FT_UInt32             variation_support;     /* since 2.7.1 */

    const char*           var_postscript_prefix;     /* since 2.7.2 */
    FT_UInt               var_postscript_prefix_len; /* since 2.7.2 */

#endif

    /* since version 2.2 */

    FT_ULong              horz_metrics_size;
    FT_ULong              vert_metrics_size;

    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */
    FT_Byte*              glyph_locations;

    FT_Byte*              hdmx_table;
    FT_ULong              hdmx_table_size;
    FT_UInt               hdmx_record_count;
    FT_ULong              hdmx_record_size;
    FT_Byte*              hdmx_record_sizes;

    FT_Byte*              sbit_table;
    FT_ULong              sbit_table_size;
    TT_SbitTableType      sbit_table_type;
    FT_UInt               sbit_num_strikes;
    FT_UInt*              sbit_strike_map;

    FT_Byte*              kern_table;
    FT_ULong              kern_table_size;
    FT_UInt               num_kern_tables;
    FT_UInt32             kern_avail_bits;
    FT_UInt32             kern_order_bits;

#ifdef TT_CONFIG_OPTION_BDF
    TT_BDFRec             bdf;
#endif /* TT_CONFIG_OPTION_BDF */

    /* since 2.3.0 */
    FT_ULong              horz_metrics_offset;
    FT_ULong              vert_metrics_offset;

#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
    /* since 2.4.12 */
    FT_ULong              sph_found_func_flags; /* special functions found */
                                                /* for this face           */
    FT_Bool               sph_compatibility_mode;
#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */

#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
    /* since 2.7 */
    FT_ULong              ebdt_start;  /* either `CBDT', `EBDT', or `bdat' */
    FT_ULong              ebdt_size;
#endif

    /* since 2.10 */
    void*                 cpal;
    void*                 colr;

  } TT_FaceRec;


  /**************************************************************************
   *
   * @struct:
   *    TT_GlyphZoneRec
   *
   * @description:
   *   A glyph zone is used to load, scale and hint glyph outline
   *   coordinates.
   *
   * @fields:
   *   memory ::
   *     A handle to the memory manager.
   *
   *   max_points ::
   *     The maximum size in points of the zone.
   *
   *   max_contours ::
   *     Max size in links contours of the zone.
   *
   *   n_points ::
   *     The current number of points in the zone.
   *
   *   n_contours ::
   *     The current number of contours in the zone.
   *
   *   org ::
   *     The original glyph coordinates (font units/scaled).
   *
   *   cur ::
   *     The current glyph coordinates (scaled/hinted).
   *
   *   tags ::
   *     The point control tags.
   *
   *   contours ::
   *     The contours end points.
   *
   *   first_point ::
   *     Offset of the current subglyph's first point.
   */
  typedef struct  TT_GlyphZoneRec_
  {
    FT_Memory   memory;
    FT_UShort   max_points;
    FT_Short    max_contours;
    FT_UShort   n_points;    /* number of points in zone    */
    FT_Short    n_contours;  /* number of contours          */

    FT_Vector*  org;         /* original point coordinates  */
    FT_Vector*  cur;         /* current point coordinates   */
    FT_Vector*  orus;        /* original (unscaled) point coordinates */

    FT_Byte*    tags;        /* current touch flags         */
    FT_UShort*  contours;    /* contour end points          */

    FT_UShort   first_point; /* offset of first (#0) point  */

  } TT_GlyphZoneRec, *TT_GlyphZone;


  /* handle to execution context */
  typedef struct TT_ExecContextRec_*  TT_ExecContext;


  /**************************************************************************
   *
   * @type:
   *   TT_Size
   *
   * @description:
   *   A handle to a TrueType size object.
   */
  typedef struct TT_SizeRec_*  TT_Size;


  /* glyph loader structure */
  typedef struct  TT_LoaderRec_
  {
    TT_Face          face;
    TT_Size          size;
    FT_GlyphSlot     glyph;
    FT_GlyphLoader   gloader;

    FT_ULong         load_flags;
    FT_UInt          glyph_index;

    FT_Stream        stream;
    FT_Int           byte_len;

    FT_Short         n_contours;
    FT_BBox          bbox;
    FT_Int           left_bearing;
    FT_Int           advance;
    FT_Int           linear;
    FT_Bool          linear_def;
    FT_Vector        pp1;
    FT_Vector        pp2;

    /* the zone where we load our glyphs */
    TT_GlyphZoneRec  base;
    TT_GlyphZoneRec  zone;

    TT_ExecContext   exec;
    FT_Byte*         instructions;
    FT_ULong         ins_pos;

    /* for possible extensibility in other formats */
    void*            other;

    /* since version 2.1.8 */
    FT_Int           top_bearing;
    FT_Int           vadvance;
    FT_Vector        pp3;
    FT_Vector        pp4;

    /* since version 2.2.1 */
    FT_Byte*         cursor;
    FT_Byte*         limit;

    /* since version 2.6.2 */
    FT_ListRec       composites;

  } TT_LoaderRec;


FT_END_HEADER

#endif /* TTTYPES_H_ */


/* END */
