/*
 * Copyright (C) 1998-2004  David Turner and Werner Lemberg
 * Copyright (C) 2006  Behdad Esfahbod
 *
 *  This is part of HarfBuzz, an OpenType Layout engine library.
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 */

#ifndef HARFBUZZ_OPEN_H
#define HARFBUZZ_OPEN_H

#include "harfbuzz-global.h"

HB_BEGIN_HEADER

/* Use this if a feature applies to all glyphs */
#define HB_ALL_GLYPHS                    0xFFFF

#define HB_DEFAULT_LANGUAGE              0xFFFF

#define HB_MAX_NESTING_LEVEL             100


/* Script list related structures */

struct  HB_LangSys_
{
  HB_UShort   LookupOrderOffset;      /* always 0 for TT Open 1.0  */
  HB_UShort   ReqFeatureIndex;        /* required FeatureIndex     */
  HB_UShort   FeatureCount;           /* number of Feature indices */
  HB_UShort*  FeatureIndex;           /* array of Feature indices  */
};

typedef struct HB_LangSys_  HB_LangSys;


struct  HB_LangSysRecord_
{
  HB_UInt     LangSysTag;            /* LangSysTag identifier */
  HB_LangSys  LangSys;               /* LangSys table         */
};

typedef struct HB_LangSysRecord_  HB_LangSysRecord;


struct  HB_ScriptTable_
{
  HB_LangSys         DefaultLangSys; /* DefaultLangSys table     */
  HB_UShort           LangSysCount;   /* number of LangSysRecords */
  HB_LangSysRecord*  LangSysRecord;  /* array of LangSysRecords  */
};

typedef struct HB_ScriptTable_  HB_ScriptTable;


struct  HB_ScriptRecord_
{
  HB_UInt    ScriptTag;              /* ScriptTag identifier */
  HB_ScriptTable  Script;                 /* Script table         */
};

typedef struct HB_ScriptRecord_  HB_ScriptRecord;


struct  HB_ScriptList_
{
  HB_UShort          ScriptCount;     /* number of ScriptRecords */
  HB_ScriptRecord*  ScriptRecord;    /* array of ScriptRecords  */
};

typedef struct HB_ScriptList_  HB_ScriptList;


/* Feature list related structures */

struct HB_Feature_
{
  HB_UShort   FeatureParams;          /* always 0 for TT Open 1.0     */
  HB_UShort   LookupListCount;        /* number of LookupList indices */
  HB_UShort*  LookupListIndex;        /* array of LookupList indices  */
};

typedef struct HB_Feature_  HB_Feature;


struct  HB_FeatureRecord_
{
  HB_UInt     FeatureTag;            /* FeatureTag identifier */
  HB_Feature  Feature;               /* Feature table         */
};

typedef struct HB_FeatureRecord_  HB_FeatureRecord;


struct  HB_FeatureList_
{
  HB_UShort           FeatureCount;   /* number of FeatureRecords */
  HB_FeatureRecord*  FeatureRecord;  /* array of FeatureRecords  */
  HB_UShort*		ApplyOrder;	/* order to apply features */
  HB_UShort		ApplyCount;	/* number of elements in ApplyOrder */
};

typedef struct HB_FeatureList_  HB_FeatureList;


/* Lookup list related structures */

typedef struct HB_SubTable_  HB_SubTable;


struct  HB_Lookup_
{
  HB_UShort      LookupType;          /* Lookup type         */
  HB_UShort      LookupFlag;          /* Lookup qualifiers   */
  HB_UShort      SubTableCount;       /* number of SubTables */
  HB_SubTable*  SubTable;            /* array of SubTables  */
};

typedef struct HB_Lookup_  HB_Lookup;


/* The `Properties' field is not defined in the OpenType specification but
   is needed for processing lookups.  If properties[n] is > 0, the
   functions HB_GSUB_Apply_String() resp. HB_GPOS_Apply_String() will
   process Lookup[n] for glyphs which have the specific bit not set in
   the `properties' field of the input string object.                  */

struct  HB_LookupList_
{
  HB_UShort    LookupCount;           /* number of Lookups       */
  HB_Lookup*  Lookup;                /* array of Lookup records */
  HB_UInt*     Properties;            /* array of flags          */
};

typedef struct HB_LookupList_  HB_LookupList;


/* Possible LookupFlag bit masks.  `HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS' comes from the
   OpenType 1.2 specification; HB_LOOKUP_FLAG_RIGHT_TO_LEFT has been (re)introduced in
   OpenType 1.3 -- if set, the last glyph in a cursive attachment
   sequence has to be positioned on the baseline -- regardless of the
   writing direction.                                                    */

#define HB_LOOKUP_FLAG_RIGHT_TO_LEFT         0x0001
#define HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS    0x0002
#define HB_LOOKUP_FLAG_IGNORE_LIGATURES      0x0004
#define HB_LOOKUP_FLAG_IGNORE_MARKS          0x0008
#define HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS  0xFF00


struct  HB_CoverageFormat1_
{
  HB_UShort   GlyphCount;             /* number of glyphs in GlyphArray */
  HB_UShort*  GlyphArray;             /* array of glyph IDs             */
};

typedef struct HB_CoverageFormat1_  HB_CoverageFormat1;


struct HB_RangeRecord_
{
  HB_UShort  Start;                   /* first glyph ID in the range */
  HB_UShort  End;                     /* last glyph ID in the range  */
  HB_UShort  StartCoverageIndex;      /* coverage index of first
					 glyph ID in the range       */
};

typedef struct HB_RangeRecord_  HB_RangeRecord;


struct  HB_CoverageFormat2_
{
  HB_UShort         RangeCount;       /* number of RangeRecords */
  HB_RangeRecord*  RangeRecord;      /* array of RangeRecords  */
};

typedef struct HB_CoverageFormat2_  HB_CoverageFormat2;


struct  HB_Coverage_
{
  HB_UShort  CoverageFormat;          /* 1 or 2 */

  union
  {
    HB_CoverageFormat1  cf1;
    HB_CoverageFormat2  cf2;
  } cf;
};

typedef struct HB_Coverage_  HB_Coverage;


struct  HB_ClassDefFormat1_
{
  HB_UShort   StartGlyph;             /* first glyph ID of the
					 ClassValueArray             */
  HB_UShort   GlyphCount;             /* size of the ClassValueArray */
  HB_UShort*  ClassValueArray;        /* array of class values       */
};

typedef struct HB_ClassDefFormat1_  HB_ClassDefFormat1;


struct  HB_ClassRangeRecord_
{
  HB_UShort  Start;                   /* first glyph ID in the range    */
  HB_UShort  End;                     /* last glyph ID in the range     */
  HB_UShort  Class;                   /* applied to all glyphs in range */
};

typedef struct HB_ClassRangeRecord_  HB_ClassRangeRecord;


struct  HB_ClassDefFormat2_
{
  HB_UShort              ClassRangeCount;
				      /* number of ClassRangeRecords */
  HB_ClassRangeRecord*  ClassRangeRecord;
				      /* array of ClassRangeRecords  */
};

typedef struct HB_ClassDefFormat2_  HB_ClassDefFormat2;


struct  HB_ClassDefinition_
{
  HB_Bool    loaded;

  HB_UShort  ClassFormat;             /* 1 or 2                      */

  union
  {
    HB_ClassDefFormat1  cd1;
    HB_ClassDefFormat2  cd2;
  } cd;
};

typedef struct HB_ClassDefinition_  HB_ClassDefinition;


struct HB_Device_
{
  HB_UShort   StartSize;              /* smallest size to correct      */
  HB_UShort   EndSize;                /* largest size to correct       */
  HB_UShort   DeltaFormat;            /* DeltaValue array data format:
					 1, 2, or 3                    */
  HB_UShort*  DeltaValue;             /* array of compressed data      */
};

typedef struct HB_Device_  HB_Device;


enum  HB_Type_
{
  HB_Type_GSUB,
  HB_Type_GPOS
};

typedef enum HB_Type_  HB_Type;


HB_END_HEADER

#endif /* HARFBUZZ_OPEN_H */
