/*******************************************************************
 *
 *  ftxkern.h                                                   1.0
 *
 *    High-Level API Kerning extension
 *
 *  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.
 *
 *
 *  The kerning support is currently part of the engine extensions.
 *
 *  This file should _not_ depend on engine internal types.
 *
 ******************************************************************/

#ifndef FTXKERN_H
#define FTXKERN_H

#include "freetype.h"

#ifdef __cplusplus
extern "C" {
#endif

  /* The kerning support in FreeType is minimal.  This means that  */
  /* we do not try to interpret the kerning data in any way to     */
  /* 'cook' it for a user application.  This API lets you access   */
  /* directly the kerning tables found in the TrueType file; it's  */
  /* up to the client application to apply its own processing on   */
  /* these.                                                        */

  /* The reason for this is that we generally do not encourage     */
  /* feature-bloat of the core engine.  Moreover, not all          */
  /* libraries or font servers really need kerning data, or all    */
  /* formats of this data.                                         */

  /************** kerning error codes *****************************/

  /* we choose the class 0x0A for our errors, this should not      */
  /* match with any error code class used in any other extension   */

#define TT_Err_Invalid_Kerning_Table_Format  0x0A00
#define TT_Err_Invalid_Kerning_Table         0x0A01


  /********** structures definitions ******************************/

  /* Remember that all types and function are accessible by client */
  /* applications in this section, and thus should have the 'TT_'  */
  /* prefix.                                                       */

  /* format 0 kerning pair */

  struct  TT_Kern_0_Pair_
  {
    TT_UShort  left;   /* index of left  glyph in pair */
    TT_UShort  right;  /* index of right glyph in pair */
    TT_FWord   value;  /* kerning value                */
  };

  typedef struct TT_Kern_0_Pair_  TT_Kern_0_Pair;


  /* format 0 kerning subtable */

  struct TT_Kern_0_
  {
    TT_UShort  nPairs;          /* number of kerning pairs */

    TT_UShort  searchRange;     /* these values are defined by the TT spec */
    TT_UShort  entrySelector;   /* for table searchs.                      */
    TT_UShort  rangeShift;

    TT_Kern_0_Pair*  pairs;     /* a table of nPairs 'pairs' */
  };

  typedef struct TT_Kern_0_  TT_Kern_0;


  /* format 2 kerning glyph class */

  struct  TT_Kern_2_Class_
  {
    TT_UShort   firstGlyph;   /* first glyph in range                    */
    TT_UShort   nGlyphs;      /* number of glyphs in range               */
    TT_UShort*  classes;      /* a table giving for each ranged glyph    */
                              /* it's class offset in the subtable pairs */
                              /* two-dimensional array                   */
  };

  typedef struct TT_Kern_2_Class_  TT_Kern_2_Class;


  /* format 2 kerning subtable */

  struct TT_Kern_2_
  {
    TT_UShort        rowWidth;   /* length of one row in bytes         */
    TT_Kern_2_Class  leftClass;  /* left class table                   */
    TT_Kern_2_Class  rightClass; /* right class table                  */
    TT_FWord*        array;      /* 2-dimensional kerning values array */
  };

  typedef struct TT_Kern_2_  TT_Kern_2;


  /* kerning subtable */

  struct  TT_Kern_Subtable_
  {
    TT_Bool    loaded;   /* boolean; indicates whether the table is   */
                         /* loaded                                    */
    TT_UShort  version;  /* table version number                      */
    TT_Long    offset;   /* file offset of table                      */
    TT_UShort  length;   /* length of table, _excluding_ header       */
    TT_Byte    coverage; /* lower 8 bit of the coverage table entry   */
    TT_Byte    format;   /* the subtable format, as found in the      */
                         /* higher 8 bits of the coverage table entry */
    union
    {
      TT_Kern_0  kern0;
      TT_Kern_2  kern2;
    } t;
  };

  typedef struct TT_Kern_Subtable_  TT_Kern_Subtable;


  struct  TT_Kerning_
  {
    TT_UShort          version;  /* kern table version number. starts at 0 */
    TT_UShort          nTables;  /* number of tables                       */

    TT_Kern_Subtable*  tables;   /* the kerning sub-tables                 */
  };

  typedef struct TT_Kerning_  TT_Kerning;



  /***************** high-level API extension **************************/

  /* Initialize Kerning extension, must be called after                 */
  /* TT_Init_FreeType(). There is no need for a finaliser               */

  TT_Error  TT_Init_Kerning_Extension( TT_Engine  engine );

  /* Note on the implemented mechanism:                                 */

  /* The kerning table directory is loaded with the face through the    */
  /* extension constructor.  However, the tables will only be loaded    */
  /* on demand, as they may represent a lot of data, unnecessary to     */
  /* most applications.                                                 */

  /* Queries a pointer to the kerning directory for the face object     */
  TT_Error  TT_Get_Kerning_Directory( TT_Face      face,
                                      TT_Kerning*  directory );

  /* Load the kerning table number 'kern_index' in the kerning          */
  /* directory.  The table will stay in memory until the 'face'         */
  /* face is destroyed.                                                 */
  TT_Error  TT_Load_Kerning_Table( TT_Face    face,
                                   TT_UShort  kern_index );

#ifdef __cplusplus
}
#endif

#endif /* FTXKERN_H */


/* END */
