/*******************************************************************
 *
 *  tttables.h                                                  1.1
 *
 *    TrueType Tables structures and handling (specification).
 *
 *  Copyright 1996-1998 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 TTTABLES_H
#define TTTABLES_H

#include "ttconfig.h"
#include "tttypes.h"

#ifdef __cplusplus
  extern "C" {
#endif

  /***********************************************************************/
  /*                                                                     */
  /*                      TrueType Table Types                           */
  /*                                                                     */
  /***********************************************************************/

  /* TrueType Collection Header */

  struct  TTTCHeader_
  {
    ULong     Tag;
    TT_Fixed  version;
    ULong     DirCount;
    PULong    TableDirectory;
  };

  typedef struct TTTCHeader_  TTTCHeader;
  typedef TTTCHeader*         PTTCHeader;


  /* TrueType Table Directory type */

  struct  TTableDir_
  {
    TT_Fixed  version;      /* should be 0x10000 */
    UShort    numTables;    /* number of tables  */

    UShort  searchRange;    /* These parameters are only used  */
    UShort  entrySelector;  /* for a dichotomy search in the   */
    UShort  rangeShift;     /* directory. We ignore them.      */
  };

  typedef struct TTableDir_  TTableDir;
  typedef TTableDir*         PTableDir;


  /* The 'TableDir' is followed by 'numTables' TableDirEntries */

  struct  TTableDirEntry_
  {
    ULong  Tag;        /*        table type */
    ULong  CheckSum;   /*    table checksum */
    ULong  Offset;     /* table file offset */
    ULong  Length;     /*      table length */
  };

  typedef struct TTableDirEntry_  TTableDirEntry;
  typedef TTableDirEntry*         PTableDirEntry;


  /* 'cmap' tables */

  struct  TCMapDir_
  {
    UShort  tableVersionNumber;
    UShort  numCMaps;
  };

  typedef struct TCMapDir_  TCMapDir;
  typedef TCMapDir*         PCMapDir;

  struct  TCMapDirEntry_
  {
    UShort  platformID;
    UShort  platformEncodingID;
    Long    offset;
  };

  typedef struct TCMapDirEntry_  TCMapDirEntry;
  typedef TCMapDirEntry*         PCMapDirEntries;


  /* 'maxp' Maximum Profiles table */

  struct  TMaxProfile_
  {
    TT_Fixed  version;
    UShort    numGlyphs,
              maxPoints,
              maxContours,
              maxCompositePoints,
              maxCompositeContours,
              maxZones,
              maxTwilightPoints,
              maxStorage,
              maxFunctionDefs,
              maxInstructionDefs,
              maxStackElements,
              maxSizeOfInstructions,
              maxComponentElements,
              maxComponentDepth;
  };

  typedef struct TMaxProfile_  TMaxProfile;
  typedef TMaxProfile*         PMaxProfile;


  /* table "gasp" */

  #define GASP_GRIDFIT  0x01
  #define GASP_DOGRAY   0x02

  struct  GaspRange_
  {
    UShort  maxPPEM;
    UShort  gaspFlag;
  };

  typedef struct GaspRange_  GaspRange;


  struct  TGasp_
  {
    UShort      version;
    UShort      numRanges;
    GaspRange*  gaspRanges;
  };

  typedef struct TGasp_  TGasp;


  /* table "head" - now defined in freetype.h */
  /* table "hhea" - now defined in freetype.h */


  /* tables "HMTX" and "VMTX" */

  struct  TLongMetrics_
  {
    UShort  advance;
    Short   bearing;
  };

  typedef struct TLongMetrics_  TLongMetrics, *PLongMetrics;

  typedef Short  TShortMetrics, *PShortMetrics;

  /* 'loca' location table type */

  struct  TLoca_
  {
    UShort    Size;
    PStorage  Table;
  };

  typedef struct TLoca_  TLoca;


  /* table "name" */

  struct  TNameRec_
  {
    UShort  platformID;
    UShort  encodingID;
    UShort  languageID;
    UShort  nameID;
    UShort  stringLength;
    UShort  stringOffset;

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

    PByte   string;
  };

  typedef struct TNameRec_  TNameRec;


  struct  TName_Table_
  {
    UShort     format;
    UShort     numNameRecords;
    UShort     storageOffset;
    TNameRec*  names;
    PByte      storage;
  };

  typedef struct TName_Table_  TName_Table;


#ifdef __cplusplus
  }
#endif

#endif /* TTTABLES_H */


/* END */
