Blame src/otf.h

Packit daac2c
/* otf.h -- Header file for libotf (OpenType font library).
Packit daac2c
Packit daac2c
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Packit daac2c
  National Institute of Advanced Industrial Science and Technology (AIST)
Packit daac2c
  Registration Number H15PRO167
Packit daac2c
Packit daac2c
This file is part of libotf.
Packit daac2c
Packit daac2c
Libotf is free software; you can redistribute it and/or modify it
Packit daac2c
under the terms of the GNU Lesser General Public License as published
Packit daac2c
by the Free Software Foundation; either version 2.1 of the License, or
Packit daac2c
(at your option) any later version.
Packit daac2c
Packit daac2c
Libotf is distributed in the hope that it will be useful, but WITHOUT
Packit daac2c
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit daac2c
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit daac2c
License for more details.
Packit daac2c
Packit daac2c
You should have received a copy of the GNU Lesser General Public
Packit daac2c
License along with this library, in a file named COPYING; if not,
Packit daac2c
write to the Free Software Foundation, Inc., 59 Temple Place, Suite
Packit daac2c
330, Boston, MA 02111-1307, USA.  */
Packit daac2c
Packit daac2c
#ifndef _OTF_H_
Packit daac2c
#define _OTF_H_
Packit daac2c
Packit daac2c
#ifdef __cplusplus
Packit daac2c
extern "C" {
Packit daac2c
#endif
Packit daac2c
Packit daac2c
/* Version name of this library.  */
Packit daac2c
#define LIBOTF_VERSION "0.9.12"
Packit daac2c
Packit daac2c
/* Major version number.  */
Packit daac2c
#define LIBOTF_MAJOR_VERSION 0
Packit daac2c
/* Minor version number.  */
Packit daac2c
#define LIBOTF_MINOR_VERSION 9
Packit daac2c
/* Release (i.e. patch level) number.  */
Packit daac2c
#define LIBOTF_RELEASE_NUMBER 12
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Table of contents:
Packit daac2c
Packit daac2c
    (1) Structures for OTF Layout tables and OTF itself
Packit daac2c
    (1-1) Basic types
Packit daac2c
    (1-2) "head" table
Packit daac2c
    (1-3) "name" table
Packit daac2c
    (1-4) "cmap" table
Packit daac2c
    (1-5) Structures common to GDEF, GSUB, and GPOS
Packit daac2c
    (1-6) "GDEF" table
Packit daac2c
    (1-7) Structures for ScriptList, FeatureList, and LookupList
Packit daac2c
    (1-8) Structures common to GSUB and GPOS
Packit daac2c
    (1-9) "GSUB" table
Packit daac2c
    (1-10) "GPOS" table
Packit daac2c
    (1-11) Structure for OTF
Packit daac2c
Packit daac2c
    (2) API for reading OTF
Packit daac2c
    (2-1) OTF_open(), OTF_open_ft_face()
Packit daac2c
    (2-2) OTF_close()
Packit daac2c
    (2-3) OTF_get_table()
Packit daac2c
    (2-4) OTF_check_table()
Packit daac2c
Packit daac2c
    (3) API for driving OTF
Packit daac2c
    (3-1) Structure for glyph string
Packit daac2c
    (3-2) OTF_drive_cmap()
Packit daac2c
    (3-3) OTF_drive_gdef()
Packit daac2c
    (3-4) OTF_drive_gsub()
Packit daac2c
    (3-5) OTF_drive_gpos()
Packit daac2c
    (3-6) OTF_drive_tables()
Packit daac2c
    (3-7) OTF_get_unicode()
Packit daac2c
    (3-8) OTF_drive_gsub_alternate()
Packit daac2c
    (3-9) OTF_iterate_on_feature()
Packit daac2c
Packit daac2c
    (4) API for error handling
Packit daac2c
    (4-1) Error codes
Packit daac2c
    (4-2) OTF_perror()
Packit daac2c
Packit daac2c
    (5) API miscellaneous
Packit daac2c
Packit daac2c
*/
Packit daac2c
Packit daac2c

Packit daac2c
/*** (1) Structures for OTF Layout tables and OTF itself */
Packit daac2c
Packit daac2c
/*** (1-1) Basic types */
Packit daac2c
Packit daac2c
typedef unsigned OTF_Tag;
Packit daac2c
typedef unsigned OTF_GlyphID;
Packit daac2c
typedef unsigned OTF_Offset;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned high;
Packit daac2c
  unsigned low;
Packit daac2c
} OTF_Fixed;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (1-2) "head" table */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Fixed TableVersionNumber;
Packit daac2c
  OTF_Fixed fontRevision;
Packit daac2c
  unsigned checkSumAdjustment;
Packit daac2c
  unsigned magicNumber;
Packit daac2c
  unsigned flags;
Packit daac2c
  int unitsPerEm;
Packit daac2c
} OTF_head;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (1-3) "name" table */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  int platformID;
Packit daac2c
  int encodingID;
Packit daac2c
  int languageID;
Packit daac2c
  int nameID;
Packit daac2c
  int length;
Packit daac2c
  int offset;
Packit daac2c
Packit daac2c
  /* If nonzero, NAME is an ASCII string.  */
Packit daac2c
  int ascii;
Packit daac2c
  unsigned char *name;
Packit daac2c
} OTF_NameRecord;
Packit daac2c
Packit daac2c
#define OTF_max_nameID 23
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  int format;
Packit daac2c
  int count;
Packit daac2c
  int stringOffset;
Packit daac2c
  OTF_NameRecord *nameRecord;
Packit daac2c
  char *name[OTF_max_nameID + 1];
Packit daac2c
} OTF_name;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (1-4) "cmap" table */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned char glyphIdArray[256];
Packit daac2c
} OTF_EncodingSubtable0;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned firstCode;
Packit daac2c
  unsigned entryCount;
Packit daac2c
  int idDelta;
Packit daac2c
  unsigned idRangeOffset;
Packit daac2c
} OTF_cmapSubHeader;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned short subHeaderKeys[256];
Packit daac2c
  int subHeaderCount;
Packit daac2c
  OTF_cmapSubHeader *subHeaders;
Packit daac2c
  int glyphIndexCount;
Packit daac2c
  OTF_GlyphID *glyphIndexArray;
Packit daac2c
} OTF_EncodingSubtable2;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned startCount;
Packit daac2c
  unsigned endCount;
Packit daac2c
  int idDelta;
Packit daac2c
  unsigned idRangeOffset;
Packit daac2c
} OTF_cmapSegment;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned segCountX2;
Packit daac2c
  unsigned searchRange;
Packit daac2c
  unsigned entrySelector;
Packit daac2c
  unsigned rangeShift;
Packit daac2c
  OTF_cmapSegment *segments;
Packit daac2c
  int GlyphCount;
Packit daac2c
  unsigned *glyphIdArray;
Packit daac2c
} OTF_EncodingSubtable4;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned firstCode;
Packit daac2c
  unsigned entryCount;
Packit daac2c
  unsigned *glyphIdArray;
Packit daac2c
} OTF_EncodingSubtable6;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned startCharCode;
Packit daac2c
  unsigned endCharCode;
Packit daac2c
  unsigned startGlyphID;
Packit daac2c
} OTF_cmapGroup;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned char is32[8192];
Packit daac2c
  unsigned nGroups;
Packit daac2c
  OTF_cmapGroup *Groups;
Packit daac2c
} OTF_EncodingSubtable8;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned startCharCode;
Packit daac2c
  unsigned numChars;
Packit daac2c
  unsigned *glyphs;
Packit daac2c
} OTF_EncodingSubtable10;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned nGroups;
Packit daac2c
  OTF_cmapGroup *Groups;
Packit daac2c
} OTF_EncodingSubtable12;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned unicodeValue;
Packit daac2c
  unsigned short glyphID;
Packit daac2c
} OTF_UVSMapping;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned startUnicodeValue;
Packit daac2c
  unsigned short additionalCount;
Packit daac2c
} OTF_UnicodeValueRange;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned varSelector;
Packit daac2c
  unsigned defaultUVSOffset;
Packit daac2c
  unsigned nonDefaultUVSOffset;
Packit daac2c
  /* DefaultUVS */
Packit daac2c
  unsigned numUnicodeValueRanges;
Packit daac2c
  OTF_UnicodeValueRange *unicodeValueRanges;
Packit daac2c
  /* NonDefaultUVS */
Packit daac2c
  unsigned numUVSMappings;
Packit daac2c
  OTF_UVSMapping *uvsMappings;
Packit daac2c
} OTF_VariationSelectorRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned nRecords;
Packit daac2c
  OTF_VariationSelectorRecord *Records;
Packit daac2c
} OTF_EncodingSubtable14;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned format;
Packit daac2c
  unsigned length;
Packit daac2c
  unsigned language;
Packit daac2c
  union {
Packit daac2c
    OTF_EncodingSubtable0 *f0;
Packit daac2c
    OTF_EncodingSubtable2 *f2;
Packit daac2c
    OTF_EncodingSubtable4 *f4;
Packit daac2c
    OTF_EncodingSubtable6 *f6;
Packit daac2c
    OTF_EncodingSubtable8 *f8;
Packit daac2c
    OTF_EncodingSubtable10 *f10;
Packit daac2c
    OTF_EncodingSubtable12 *f12;
Packit daac2c
    OTF_EncodingSubtable14 *f14;
Packit daac2c
  }f;
Packit daac2c
} OTF_EncodingSubtable;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned platformID;
Packit daac2c
  unsigned encodingID;
Packit daac2c
  unsigned offset;
Packit daac2c
  OTF_EncodingSubtable subtable;
Packit daac2c
} OTF_EncodingRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned version;
Packit daac2c
  unsigned numTables;
Packit daac2c
  OTF_EncodingRecord *EncodingRecord;
Packit daac2c
  /* Mapping table: Unicode->GlyphID (for BMP only) */
Packit daac2c
  unsigned short *unicode_table;
Packit daac2c
  /* Maximum Glyph ID that corresponds to a Unicode character.  */
Packit daac2c
  int max_glyph_id;
Packit daac2c
  /* Mapping table: GlyphID->Unicode */
Packit daac2c
  unsigned short *decode_table;
Packit daac2c
  /* Index of the EncodingRecord for Unicode->GlyphID mapping.
Packit daac2c
     -1 means that the font supports only Unicode BMP characters.  */
Packit daac2c
  int table_index;
Packit daac2c
} OTF_cmap;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (1-5) Structures common to GDEF, GSUB, GPOS */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_GlyphID Start;
Packit daac2c
  OTF_GlyphID End;
Packit daac2c
  unsigned StartCoverageIndex;
Packit daac2c
} OTF_RangeRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned CoverageFormat;
Packit daac2c
  unsigned Count;
Packit daac2c
  union {
Packit daac2c
    OTF_GlyphID *GlyphArray;
Packit daac2c
    OTF_RangeRecord *RangeRecord;
Packit daac2c
  } table;
Packit daac2c
} OTF_Coverage;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned StartSize;
Packit daac2c
  unsigned EndSize;
Packit daac2c
  unsigned DeltaFormat;
Packit daac2c
  char *DeltaValue;
Packit daac2c
} OTF_DeviceTable;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_GlyphID Start;
Packit daac2c
  OTF_GlyphID End;
Packit daac2c
  unsigned Class;
Packit daac2c
} OTF_ClassRangeRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned ClassFormat;
Packit daac2c
  union {
Packit daac2c
    struct {
Packit daac2c
      OTF_GlyphID StartGlyph;
Packit daac2c
      unsigned GlyphCount;
Packit daac2c
      unsigned *ClassValueArray;
Packit daac2c
    } f1;
Packit daac2c
    struct {
Packit daac2c
      unsigned ClassRangeCount;
Packit daac2c
      OTF_ClassRangeRecord *ClassRangeRecord;
Packit daac2c
    } f2;
Packit daac2c
  } f;
Packit daac2c
} OTF_ClassDef;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (1-6) "GDEF" table */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Fixed Version;
Packit daac2c
  OTF_Offset GlyphClassDef;
Packit daac2c
  OTF_Offset AttachList;
Packit daac2c
  OTF_Offset LigCaretList;
Packit daac2c
  OTF_Offset MarkAttachClassDef;
Packit daac2c
} OTF_GDEFHeader;
Packit daac2c
Packit daac2c
enum OTF_GlyphClassDef
Packit daac2c
  {
Packit daac2c
    OTF_GlyphClass0 = 0,
Packit daac2c
    OTF_GlyphClassBase = 1,
Packit daac2c
    OTF_GlyphClassLigature = 2,
Packit daac2c
    OTF_GlyphClassMark = 3,
Packit daac2c
    OTF_GlyphClassComponent = 4
Packit daac2c
  };
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned PointCount;
Packit daac2c
  unsigned *PointIndex;
Packit daac2c
} OTF_AttachPoint;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Coverage Coverage;
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  OTF_AttachPoint *AttachPoint;
Packit daac2c
} OTF_AttachList;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned CaretValueFormat;	/* 1, 2, or 3 */
Packit daac2c
  union {
Packit daac2c
    union {
Packit daac2c
      int Coordinate;
Packit daac2c
    } f1;
Packit daac2c
    union {
Packit daac2c
      unsigned CaretValuePoint;
Packit daac2c
    } f2;
Packit daac2c
    union {
Packit daac2c
      int Coordinate;
Packit daac2c
      OTF_DeviceTable DeviceTable;
Packit daac2c
    } f3;
Packit daac2c
  } f;
Packit daac2c
} OTF_CaretValue;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned CaretCount;
Packit daac2c
  OTF_CaretValue *CaretValue;
Packit daac2c
} OTF_LigGlyph;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Coverage Coverage;
Packit daac2c
  unsigned LigGlyphCount;
Packit daac2c
  OTF_LigGlyph *LigGlyph;
Packit daac2c
} OTF_LigCaretList;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_GDEFHeader header;
Packit daac2c
  OTF_ClassDef glyph_class_def;
Packit daac2c
  OTF_AttachList attach_list;
Packit daac2c
  OTF_LigCaretList lig_caret_list;
Packit daac2c
  OTF_ClassDef mark_attach_class_def;
Packit daac2c
} OTF_GDEF;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (1-7) Structures for ScriptList, FeatureList, and LookupList  */
Packit daac2c
Packit daac2c
/*** The structure hierarchy
Packit daac2c
Packit daac2c
   ScriptList
Packit daac2c
     ScriptRecord[]
Packit daac2c
       ScriptTag
Packit daac2c
     Script[]
Packit daac2c
       DefaultLangSys
Packit daac2c
       LangSysRecord[]
Packit daac2c
         LangSysTag
Packit daac2c
       LangSys[]
Packit daac2c
         LookupOrder
Packit daac2c
	 ReqFeatureIndex
Packit daac2c
	 FeatureIndex[]
Packit daac2c
Packit daac2c
  FeatureList
Packit daac2c
    FeatureRecored[]
Packit daac2c
      FeatureTag
Packit daac2c
    Feature[]
Packit daac2c
      FeatureParams
Packit daac2c
      LookupListIndex[]
Packit daac2c
Packit daac2c
  LookupList
Packit daac2c
    LookupOffset[]
Packit daac2c
    Lookup[]
Packit daac2c
      LookupType
Packit daac2c
      LookupFlag
Packit daac2c
      SubTableOffset[]
Packit daac2c
      SubTable.gsub[] or SubTable.gpos[]
Packit daac2c
*/
Packit daac2c
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset LookupOrder;
Packit daac2c
  unsigned ReqFeatureIndex;
Packit daac2c
  unsigned FeatureCount;
Packit daac2c
  unsigned *FeatureIndex;
Packit daac2c
} OTF_LangSys;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Tag LangSysTag;
Packit daac2c
  OTF_Offset LangSys;
Packit daac2c
} OTF_LangSysRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Tag ScriptTag;
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  OTF_Offset DefaultLangSysOffset;
Packit daac2c
  OTF_LangSys DefaultLangSys;
Packit daac2c
  unsigned LangSysCount;
Packit daac2c
  OTF_LangSysRecord *LangSysRecord;
Packit daac2c
  OTF_LangSys *LangSys;
Packit daac2c
} OTF_Script;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned ScriptCount;
Packit daac2c
  OTF_Script *Script;
Packit daac2c
} OTF_ScriptList;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Tag FeatureTag;
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  OTF_Offset FeatureParams;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  unsigned *LookupListIndex;
Packit daac2c
} OTF_Feature;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned FeatureCount;
Packit daac2c
  OTF_Feature *Feature;
Packit daac2c
} OTF_FeatureList;
Packit daac2c
Packit daac2c
typedef struct OTF_LookupSubTableGSUB OTF_LookupSubTableGSUB;
Packit daac2c
typedef struct OTF_LookupSubTableGPOS OTF_LookupSubTableGPOS;
Packit daac2c
Packit daac2c
enum OTF_LookupFlagBit
Packit daac2c
  {
Packit daac2c
    OTF_RightToLeft = 0x0001,
Packit daac2c
    OTF_IgnoreBaseGlyphs = 0x0002,
Packit daac2c
    OTF_IgnoreLigatures = 0x0004,
Packit daac2c
    OTF_IgnoreMarks = 0x0008,
Packit daac2c
    OTF_Reserved = 0x00F0,
Packit daac2c
    OTF_MarkAttachmentType = 0xFF00
Packit daac2c
  };
Packit daac2c
Packit daac2c
#define OTF_LookupFlagIgnoreMask \
Packit daac2c
  (OTF_IgnoreBaseGlyphs | OTF_IgnoreLigatures | OTF_IgnoreMarks)
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned LookupType;
Packit daac2c
  unsigned LookupFlag;
Packit daac2c
  unsigned SubTableCount;
Packit daac2c
  OTF_Offset *SubTableOffset;
Packit daac2c
  union {
Packit daac2c
    OTF_LookupSubTableGSUB *gsub;
Packit daac2c
    OTF_LookupSubTableGPOS *gpos;
Packit daac2c
  } SubTable;
Packit daac2c
} OTF_Lookup;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  OTF_Lookup *Lookup;
Packit daac2c
} OTF_LookupList;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (1-8) Structures common to GSUB and GPOS */
Packit daac2c
Packit daac2c
/* For SubstLookupRecord (GSUB) and PosLookupRecord (GPOS).  */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned SequenceIndex;
Packit daac2c
  unsigned LookupListIndex;
Packit daac2c
} OTF_LookupRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  OTF_GlyphID *Input;		/* [<GlyphCount> - 1] */
Packit daac2c
  OTF_LookupRecord *LookupRecord; /* [<LookupCount>] */
Packit daac2c
} OTF_Rule;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned RuleCount;
Packit daac2c
  OTF_Rule *Rule;		/* [<RuleCount>] */
Packit daac2c
} OTF_RuleSet;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  unsigned *Class;		/* [<GlyphCount> - 1] */
Packit daac2c
  OTF_LookupRecord *LookupRecord; /* [<LookupCount>] */
Packit daac2c
} OTF_ClassRule;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned ClassRuleCnt;
Packit daac2c
  OTF_ClassRule *ClassRule;	/* [<ClassRuleCnt>] */
Packit daac2c
} OTF_ClassSet;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned BacktrackGlyphCount;
Packit daac2c
  OTF_GlyphID *Backtrack;
Packit daac2c
  unsigned InputGlyphCount;
Packit daac2c
  OTF_GlyphID *Input;
Packit daac2c
  unsigned LookaheadGlyphCount;
Packit daac2c
  OTF_GlyphID *LookAhead;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  OTF_LookupRecord *LookupRecord;
Packit daac2c
} OTF_ChainRule;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned ChainRuleCount;
Packit daac2c
  OTF_ChainRule *ChainRule;
Packit daac2c
} OTF_ChainRuleSet;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned BacktrackGlyphCount;
Packit daac2c
  unsigned *Backtrack;
Packit daac2c
  unsigned InputGlyphCount;
Packit daac2c
  unsigned *Input;
Packit daac2c
  unsigned LookaheadGlyphCount;
Packit daac2c
  unsigned *LookAhead;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  OTF_LookupRecord *LookupRecord;
Packit daac2c
} OTF_ChainClassRule;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned ChainClassRuleCnt;
Packit daac2c
  OTF_ChainClassRule *ChainClassRule;
Packit daac2c
} OTF_ChainClassSet;
Packit daac2c
Packit daac2c
Packit daac2c
/* Common to OTF_GSUB/GPOS_Context1/2/3.  */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned RuleSetCount;
Packit daac2c
  OTF_RuleSet *RuleSet;		/* [<RuleSetCount>] */
Packit daac2c
} OTF_Context1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_ClassDef ClassDef;
Packit daac2c
  unsigned ClassSetCnt;
Packit daac2c
  OTF_ClassSet *ClassSet;	/* [<ClassSetCnt>] */
Packit daac2c
} OTF_Context2;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  OTF_Coverage *Coverage;	/* [<GlyphCount>] */
Packit daac2c
  OTF_LookupRecord *LookupRecord; /* [<LookupCount>] */
Packit daac2c
} OTF_Context3;
Packit daac2c
Packit daac2c
Packit daac2c
/* Common to OTF_GSUB/GPOS_ChainContext1/2/3.  */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned ChainRuleSetCount;
Packit daac2c
  OTF_ChainRuleSet *ChainRuleSet;
Packit daac2c
} OTF_ChainContext1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_ClassDef BacktrackClassDef;
Packit daac2c
  OTF_ClassDef InputClassDef;
Packit daac2c
  OTF_ClassDef LookaheadClassDef;
Packit daac2c
  unsigned ChainClassSetCnt;
Packit daac2c
  OTF_ChainClassSet *ChainClassSet;
Packit daac2c
} OTF_ChainContext2;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned BacktrackGlyphCount;
Packit daac2c
  OTF_Coverage *Backtrack;
Packit daac2c
  unsigned InputGlyphCount;
Packit daac2c
  OTF_Coverage *Input;
Packit daac2c
  unsigned LookaheadGlyphCount;
Packit daac2c
  OTF_Coverage *LookAhead;
Packit daac2c
  unsigned LookupCount;
Packit daac2c
  OTF_LookupRecord *LookupRecord;
Packit daac2c
} OTF_ChainContext3;
Packit daac2c
Packit daac2c
/* Common to OTF_GSUB/GPOS.  */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Fixed Version;
Packit daac2c
  OTF_ScriptList ScriptList;
Packit daac2c
  OTF_FeatureList FeatureList;
Packit daac2c
  OTF_LookupList LookupList;
Packit daac2c
} OTF_GSUB_GPOS;
Packit daac2c
Packit daac2c
/*** (1-9) "GSUB" table */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  int DeltaGlyphID;
Packit daac2c
} OTF_GSUB_Single1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  OTF_GlyphID *Substitute;
Packit daac2c
} OTF_GSUB_Single2;
Packit daac2c
Packit daac2c
typedef struct OTF_Sequence OTF_Sequence;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned SequenceCount;
Packit daac2c
  OTF_Sequence *Sequence;
Packit daac2c
} OTF_GSUB_Multiple1;
Packit daac2c
Packit daac2c
struct OTF_Sequence
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  OTF_GlyphID *Substitute;
Packit daac2c
};
Packit daac2c
Packit daac2c
typedef struct OTF_AlternateSet OTF_AlternateSet;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned AlternateSetCount;
Packit daac2c
  OTF_AlternateSet *AlternateSet;
Packit daac2c
} OTF_GSUB_Alternate1;
Packit daac2c
Packit daac2c
struct OTF_AlternateSet
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  OTF_GlyphID *Alternate;
Packit daac2c
};
Packit daac2c
Packit daac2c
typedef struct OTF_LigatureSet OTF_LigatureSet;
Packit daac2c
typedef struct OTF_Ligature OTF_Ligature;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned LigSetCount;
Packit daac2c
  OTF_LigatureSet *LigatureSet;
Packit daac2c
} OTF_GSUB_Ligature1;
Packit daac2c
Packit daac2c
struct OTF_LigatureSet
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned LigatureCount;
Packit daac2c
  OTF_Ligature *Ligature;
Packit daac2c
};
Packit daac2c
Packit daac2c
struct OTF_Ligature
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  OTF_GlyphID LigGlyph;
Packit daac2c
  unsigned CompCount;
Packit daac2c
  OTF_GlyphID *Component;
Packit daac2c
};
Packit daac2c
Packit daac2c
typedef OTF_Context1 OTF_GSUB_Context1;
Packit daac2c
Packit daac2c
typedef OTF_Context2 OTF_GSUB_Context2;
Packit daac2c
Packit daac2c
typedef OTF_Context3 OTF_GSUB_Context3;
Packit daac2c
Packit daac2c
typedef OTF_ChainContext1 OTF_GSUB_ChainContext1;
Packit daac2c
Packit daac2c
typedef OTF_ChainContext2 OTF_GSUB_ChainContext2;
Packit daac2c
Packit daac2c
typedef OTF_ChainContext3 OTF_GSUB_ChainContext3;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned ExtensionLookupType;
Packit daac2c
  unsigned ExtensionOffset;
Packit daac2c
  OTF_LookupSubTableGSUB *ExtensionSubtable;
Packit daac2c
} OTF_GSUB_Extension1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned BacktrackGlyphCount;
Packit daac2c
  OTF_Coverage *Backtrack;
Packit daac2c
  unsigned LookaheadGlyphCount;
Packit daac2c
  OTF_Coverage *LookAhead;
Packit daac2c
  unsigned GlyphCount;
Packit daac2c
  OTF_GlyphID *Substitute;
Packit daac2c
} OTF_GSUB_ReverseChain1;
Packit daac2c
Packit daac2c
struct OTF_LookupSubTableGSUB
Packit daac2c
{
Packit daac2c
  unsigned Format;
Packit daac2c
  OTF_Coverage Coverage;
Packit daac2c
  union {
Packit daac2c
    /* LookupType 1 */
Packit daac2c
    OTF_GSUB_Single1 single1;
Packit daac2c
    OTF_GSUB_Single2 single2;
Packit daac2c
    /* LookupType 2 */
Packit daac2c
    OTF_GSUB_Multiple1 multiple1;
Packit daac2c
    /* LookupType 3 */
Packit daac2c
    OTF_GSUB_Alternate1 alternate1;
Packit daac2c
    /* LookupType 4 */
Packit daac2c
    OTF_GSUB_Ligature1 ligature1;
Packit daac2c
    /* LookupType 5 */
Packit daac2c
    OTF_GSUB_Context1 context1;
Packit daac2c
    OTF_GSUB_Context2 context2;
Packit daac2c
    OTF_GSUB_Context3 context3;
Packit daac2c
    /* LookupType 6 */
Packit daac2c
    OTF_GSUB_ChainContext1 chain_context1;
Packit daac2c
    OTF_GSUB_ChainContext2 chain_context2;
Packit daac2c
    OTF_GSUB_ChainContext3 chain_context3;
Packit daac2c
    /* LookupType 7 */
Packit daac2c
    OTF_GSUB_Extension1 extension1;
Packit daac2c
    /* LookupType 8 */
Packit daac2c
    OTF_GSUB_ReverseChain1 reverse_chain1;
Packit daac2c
  } u;
Packit daac2c
};
Packit daac2c
Packit daac2c
typedef OTF_GSUB_GPOS OTF_GSUB;
Packit daac2c
Packit daac2c
/*** (1-10) "GPOS" table */
Packit daac2c
Packit daac2c
enum OTF_ValueFormat
Packit daac2c
  {
Packit daac2c
    OTF_XPlacement = 0x0001,
Packit daac2c
    OTF_YPlacement = 0x0002,
Packit daac2c
    OTF_XAdvance = 0x0004,
Packit daac2c
    OTF_YAdvance = 0x0008,
Packit daac2c
    OTF_XPlaDevice = 0x0010,
Packit daac2c
    OTF_YPlaDevice = 0x0020,
Packit daac2c
    OTF_XAdvDevice = 0x0040,
Packit daac2c
    OTF_YAdvDevice = 0x0080
Packit daac2c
  };
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  int XPlacement;
Packit daac2c
  int YPlacement;
Packit daac2c
  int XAdvance;
Packit daac2c
  int YAdvance;
Packit daac2c
  OTF_DeviceTable XPlaDevice;
Packit daac2c
  OTF_DeviceTable YPlaDevice;
Packit daac2c
  OTF_DeviceTable XAdvDevice;
Packit daac2c
  OTF_DeviceTable YAdvDevice;
Packit daac2c
} OTF_ValueRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned AnchorFormat;
Packit daac2c
  int XCoordinate;
Packit daac2c
  int YCoordinate;
Packit daac2c
  union {
Packit daac2c
    struct {
Packit daac2c
      unsigned AnchorPoint;
Packit daac2c
    } f1;
Packit daac2c
    struct {
Packit daac2c
      OTF_DeviceTable XDeviceTable;
Packit daac2c
      OTF_DeviceTable YDeviceTable;
Packit daac2c
    } f2;
Packit daac2c
  } f;
Packit daac2c
} OTF_Anchor;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned Class;
Packit daac2c
  OTF_Anchor MarkAnchor;
Packit daac2c
} OTF_MarkRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned MarkCount;
Packit daac2c
  OTF_MarkRecord *MarkRecord;
Packit daac2c
} OTF_MarkArray;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned ValueFormat;
Packit daac2c
  OTF_ValueRecord Value;
Packit daac2c
} OTF_GPOS_Single1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned ValueFormat;
Packit daac2c
  unsigned ValueCount;
Packit daac2c
  OTF_ValueRecord *Value;  	/* [<ValueCount>] */
Packit daac2c
} OTF_GPOS_Single2;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_GlyphID SecondGlyph;
Packit daac2c
  OTF_ValueRecord Value1;
Packit daac2c
  OTF_ValueRecord Value2;
Packit daac2c
} OTF_PairValueRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned PairValueCount;
Packit daac2c
  OTF_PairValueRecord *PairValueRecord;
Packit daac2c
} OTF_PairSet;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned ValueFormat1;
Packit daac2c
  unsigned ValueFormat2;
Packit daac2c
  unsigned PairSetCount;
Packit daac2c
  OTF_PairSet *PairSet;
Packit daac2c
} OTF_GPOS_Pair1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_ValueRecord Value1;
Packit daac2c
  OTF_ValueRecord Value2;
Packit daac2c
} OTF_Class2Record;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Class2Record *Class2Record;
Packit daac2c
} OTF_Class1Record;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned ValueFormat1;
Packit daac2c
  unsigned ValueFormat2;
Packit daac2c
  OTF_ClassDef ClassDef1;
Packit daac2c
  OTF_ClassDef ClassDef2;
Packit daac2c
  unsigned Class1Count;
Packit daac2c
  unsigned Class2Count;
Packit daac2c
  OTF_Class1Record *Class1Record; /* size: <Class1Count> */
Packit daac2c
} OTF_GPOS_Pair2;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Anchor EntryAnchor;
Packit daac2c
  OTF_Anchor ExitAnchor;
Packit daac2c
} OTF_EntryExitRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned EntryExitCount;
Packit daac2c
  OTF_EntryExitRecord *EntryExitRecord;
Packit daac2c
} OTF_GPOS_Cursive1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Anchor *Anchor;
Packit daac2c
} OTF_AnchorRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned Count;
Packit daac2c
  OTF_AnchorRecord *AnchorRecord;
Packit daac2c
} OTF_AnchorArray;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Coverage BaseCoverage;
Packit daac2c
  unsigned ClassCount;
Packit daac2c
  OTF_MarkArray MarkArray;
Packit daac2c
  OTF_AnchorArray BaseArray;
Packit daac2c
} OTF_GPOS_MarkBase1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Anchor *LigatureAnchor; /* [<ClassCount>] */
Packit daac2c
} OTF_ComponentRecord;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned ComponentCount;
Packit daac2c
  OTF_ComponentRecord *ComponentRecord; /* [<ComponentCount>] */
Packit daac2c
} OTF_LigatureAttach;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Offset offset;
Packit daac2c
  unsigned LigatureCount;
Packit daac2c
  OTF_LigatureAttach *LigatureAttach; /* [<LiagureCount>] */
Packit daac2c
} OTF_LigatureArray;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Coverage LigatureCoverage;
Packit daac2c
  unsigned ClassCount;
Packit daac2c
  OTF_MarkArray MarkArray;
Packit daac2c
  OTF_LigatureArray LigatureArray;
Packit daac2c
} OTF_GPOS_MarkLig1;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Coverage Mark2Coverage;
Packit daac2c
  unsigned ClassCount;
Packit daac2c
  OTF_MarkArray Mark1Array;
Packit daac2c
  OTF_AnchorArray Mark2Array;
Packit daac2c
} OTF_GPOS_MarkMark1;
Packit daac2c
Packit daac2c
typedef OTF_Context1 OTF_GPOS_Context1;
Packit daac2c
Packit daac2c
typedef OTF_Context2 OTF_GPOS_Context2;
Packit daac2c
Packit daac2c
typedef OTF_Context3 OTF_GPOS_Context3;
Packit daac2c
Packit daac2c
typedef OTF_ChainContext1 OTF_GPOS_ChainContext1;
Packit daac2c
Packit daac2c
typedef OTF_ChainContext2 OTF_GPOS_ChainContext2;
Packit daac2c
Packit daac2c
typedef OTF_ChainContext3 OTF_GPOS_ChainContext3;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  unsigned ExtensionLookupType;
Packit daac2c
  unsigned ExtensionOffset;
Packit daac2c
  OTF_LookupSubTableGPOS *ExtensionSubtable;
Packit daac2c
} OTF_GPOS_Extension1;
Packit daac2c
Packit daac2c
Packit daac2c
struct OTF_LookupSubTableGPOS
Packit daac2c
{
Packit daac2c
  unsigned Format;
Packit daac2c
  OTF_Coverage Coverage;
Packit daac2c
  union {
Packit daac2c
    /* LookupType 1 */
Packit daac2c
    OTF_GPOS_Single1 single1;
Packit daac2c
    OTF_GPOS_Single2 single2;
Packit daac2c
    /* LookupType 2 */
Packit daac2c
    OTF_GPOS_Pair1 pair1;
Packit daac2c
    OTF_GPOS_Pair2 pair2;
Packit daac2c
    /* LookupType 3 */
Packit daac2c
    OTF_GPOS_Cursive1 cursive1;
Packit daac2c
    /* LookupType 4 */
Packit daac2c
    OTF_GPOS_MarkBase1 mark_base1;
Packit daac2c
    /* LookupType 5 */
Packit daac2c
    OTF_GPOS_MarkLig1 mark_lig1;
Packit daac2c
    /* LookupType 6 */
Packit daac2c
    OTF_GPOS_MarkMark1 mark_mark1;
Packit daac2c
    /* LookupType 7 */
Packit daac2c
    OTF_GPOS_Context1 context1;
Packit daac2c
    OTF_GPOS_Context2 context2;
Packit daac2c
    OTF_GPOS_Context3 context3;
Packit daac2c
    /* LookupType 8 */
Packit daac2c
    OTF_GPOS_ChainContext1 chain_context1;
Packit daac2c
    OTF_GPOS_ChainContext2 chain_context2;
Packit daac2c
    OTF_GPOS_ChainContext3 chain_context3;
Packit daac2c
    /* LookupType 9 */
Packit daac2c
    OTF_GPOS_Extension1 extension1;
Packit daac2c
  } u;
Packit daac2c
};
Packit daac2c
Packit daac2c
typedef OTF_GSUB_GPOS OTF_GPOS;
Packit daac2c
Packit daac2c
/*** (1-11) Structure for OTF */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Fixed sfnt_version;
Packit daac2c
  unsigned numTables;
Packit daac2c
  unsigned searchRange;
Packit daac2c
  unsigned enterSelector;
Packit daac2c
  unsigned rangeShift;
Packit daac2c
} OTF_OffsetTable;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  OTF_Tag tag;
Packit daac2c
  char name[5];
Packit daac2c
  unsigned checkSum;
Packit daac2c
  unsigned offset;
Packit daac2c
  unsigned length;
Packit daac2c
} OTF_TableDirectory;
Packit daac2c
Packit daac2c
typedef struct OTF_InternalData  OTF_InternalData;
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  char *filename;
Packit daac2c
  OTF_OffsetTable offset_table;
Packit daac2c
  OTF_TableDirectory *table_dirs;
Packit daac2c
  OTF_head *head;
Packit daac2c
  OTF_name *name;
Packit daac2c
  OTF_cmap *cmap;
Packit daac2c
  OTF_GDEF *gdef;
Packit daac2c
  OTF_GSUB *gsub;
Packit daac2c
  OTF_GPOS *gpos;
Packit daac2c
  /* The following tables are not yet supported.  */
Packit daac2c
  /* OTF_BASE *base; */
Packit daac2c
  /* OTF_JSTF *jstf; */
Packit daac2c
  OTF_InternalData *internal_data;
Packit daac2c
} OTF;
Packit daac2c
Packit daac2c

Packit daac2c
/*** (2) API for reading OTF */
Packit daac2c
Packit daac2c
/*** (2-1) otf_open () */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Open OpenType font
Packit daac2c
Packit daac2c
    The OTF_open() function reads the OpenType font file whose name is
Packit daac2c
    $NAME, and return a pointer to the structure of type OTF.
Packit daac2c
Packit daac2c
    It setups these member of the structure OTF:
Packit daac2c
	filename, offset_table, table_dirs
Packit daac2c
Packit daac2c
    If the file can't be read or the file contains invalid data, NULL
Packit daac2c
    is returned, and the variable OTF_error is set to one of the
Packit daac2c
    following values.
Packit daac2c
Packit daac2c
	OTF_ERROR_MEMORY
Packit daac2c
	OTF_ERROR_FILE
Packit daac2c
	OTF_ERROR_TABLE
Packit daac2c
Packit daac2c
    See also OTF_get_table() and OTF_close().  */
Packit daac2c
Packit daac2c
extern OTF *OTF_open (const char *name);
Packit daac2c
Packit daac2c
#include <ft2build.h>
Packit daac2c
#include FT_FREETYPE_H
Packit daac2c
Packit daac2c
extern OTF *OTF_open_ft_face (FT_Face face);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (2-2) OTF_close () */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Close OpenType font
Packit daac2c
Packit daac2c
    The OTF_close() function closes the OpenType font $OTF which must
Packit daac2c
    be what the OTF_open() function returned.
Packit daac2c
Packit daac2c
    See also OTF_open().  */
Packit daac2c
Packit daac2c
extern void OTF_close (OTF *otf);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (2-3) OTF_get_table () */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Get OpenType font table
Packit daac2c
Packit daac2c
    The OTF_get_table() function setups one of the OTF table specified
Packit daac2c
    by $NAME in the OpenType font $OTF.
Packit daac2c
Packit daac2c
    $NAME must be one of "head", "name", "cmap", "GDEF", "GSUB", and
Packit daac2c
    "GPOS", and a member of the same name is setup.
Packit daac2c
Packit daac2c
    If the table is successfully setup, return 0.  Otherwise, return
Packit daac2c
    -1, and set the variable OTF_error to OTF_ERROR_TABLE.
Packit daac2c
Packit daac2c
    See also OTF_open().  */
Packit daac2c
Packit daac2c
extern int OTF_get_table (OTF *otf, const char *name);
Packit daac2c
Packit daac2c
/*** (2-4) OTF_check_table () */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Check the existence of OpenType font table
Packit daac2c
Packit daac2c
    The OTF_check_table() function checks if the the OTF table
Packit daac2c
    specified by $NAME exists in OpenType font $OTF.
Packit daac2c
Packit daac2c
    If the table exists, return 0, else return -1.
Packit daac2c
Packit daac2c
    See also OTF_open().  */
Packit daac2c
Packit daac2c
extern int OTF_check_table (OTF *otf, const char *name);
Packit daac2c
Packit daac2c
/*** (2-5) OTF_get_scripts () */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Get supported scripts.
Packit daac2c
Packit daac2c
    The OTF_get_scripts() function setups OTF_ScriptList of GSUB (if
Packit daac2c
    $GSUBP is nonzero) or GPOS (if $GSUBP is zero) table of the
Packit daac2c
    OpenType font $OTF.
Packit daac2c
Packit daac2c
    If the table is successfully setup, return 0.  Otherwise, retrun
Packit daac2c
    -1, and set the variable OTF_error to OTF_ERROR_TABLE.  */
Packit daac2c
Packit daac2c
extern int OTF_get_scripts (OTF *otf, int gsubp);
Packit daac2c
Packit daac2c
/*** (2-6) OTF_get_features () */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Get supported features.
Packit daac2c
Packit daac2c
    The OTF_get_features() function setups OTF_FeatureList of GSUB (if
Packit daac2c
    $GSUBP is nonzero) or GPOS (if $GSUBP is zero) table of the
Packit daac2c
    OpenType font $OTF.
Packit daac2c
Packit daac2c
    If the table is successfully setup, return 0.  Otherwise, retrun
Packit daac2c
    -1, and set the variable OTF_error to OTF_ERROR_TABLE.  */
Packit daac2c
Packit daac2c
extern int OTF_get_features (OTF *otf, int gsubp);
Packit daac2c
Packit daac2c
/*** (2-7) OTF_check_features  */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Check supported features.
Packit daac2c
Packit daac2c
    The OTF_check_features() function checks whether or not the
Packit daac2c
    OpenType font $OTF has, for $SCRIPT and $LANGUAGE, all features in
Packit daac2c
    the array $FEATURES.  The array size is $N_FEATURES.  If $LANGUAGE
Packit daac2c
    is zero or $OTF doesn't have LangSys for $SCRIPT, the default
Packit daac2c
    LangSys is checked.
Packit daac2c
Packit daac2c
    If $OTF has all the features, return 1.  Otherwise, return 0.  If
Packit daac2c
    an error occurs, return -1, and set the variable OTF_error to
Packit daac2c
    OTF_ERROR_TABLE.   */
Packit daac2c
Packit daac2c
extern int OTF_check_features (OTF *otf, int gsubp,
Packit daac2c
			       OTF_Tag script, OTF_Tag language,
Packit daac2c
			       const OTF_Tag *features, int n_features);
Packit daac2c
Packit daac2c
/*** (3) API for driving OTF */
Packit daac2c
Packit daac2c
/*** (3-1) Structure for glyph string */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    The structure OTF_Glyph contains information about each glyph in
Packit daac2c
    the structure OTF_GlyphString.  */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  /** The first two members must be set by a clinet before calling the
Packit daac2c
      function OTF_drive_XXX().  **/
Packit daac2c
Packit daac2c
  /* Character code of the glyph.  The value less than 32 is treated
Packit daac2c
     as a place-holder in a glyph string, and OTF_drive_XXX ()
Packit daac2c
     function just ignore the glyph as if it doesn't exist.  */
Packit daac2c
  int c;
Packit daac2c
Packit daac2c
  /* Glyph ID of the glyph.  If the value is 0, the library gets a
Packit daac2c
     correct value from the above character code via cmap if such a
Packit daac2c
     glyph is available in the font.
Packit daac2c
Packit daac2c
     The functions OTF_drive_gpos2 and OTF_driver_gpos_with_log may
Packit daac2c
     insert a glyph whose glyph_id is 0 but positioning_type is
Packit daac2c
     positive.  It is not an actual glyph but just contains
Packit daac2c
     positioning information that should be accumulated to the
Packit daac2c
     positioning information of the previous glyphs.  */
Packit daac2c
  OTF_GlyphID glyph_id;
Packit daac2c
Packit daac2c
  /* GlyphClass of the glyph.  The value is extracted from the GDEF
Packit daac2c
     table.  */
Packit daac2c
  enum OTF_GlyphClassDef GlyphClass;
Packit daac2c
Packit daac2c
  /* MarkAttachClassDef of the glyph.  The value is extracted from the
Packit daac2c
     GDEF table.  */
Packit daac2c
  unsigned MarkAttachClass;
Packit daac2c
Packit daac2c
  /* The lowest 4-bit is a positioning format type of the glyph.  The
Packit daac2c
     value specifies how the glyph positioning information is encoded
Packit daac2c
     in the member <f>.  If the value is N, the union member fN, is
Packit daac2c
     used.  If the value is zero, the glyph has no positioning
Packit daac2c
     information, i.e. it should be drawn at the normal position.
Packit daac2c
Packit daac2c
     OTF_drive_gsub, OTF_drive_gsub_alternate, OTF_drive_gpos, and
Packit daac2c
     OTF_drive_gpos2 always sets the higher bits to zero.
Packit daac2c
Packit daac2c
     OTF_drive_gsub_with_log and OTF_drive_gpos_with_log sets the
Packit daac2c
     higher 16-bit (i.e. 5th to 20th bits) to the index number of the
Packit daac2c
     lastly applied feature on the glyph plus one.  If no feature was
Packit daac2c
     applied, those bits are zero.  */
Packit daac2c
  unsigned int positioning_type;
Packit daac2c
  union {
Packit daac2c
    struct {
Packit daac2c
      int from, to;
Packit daac2c
    } index;
Packit daac2c
    struct {
Packit daac2c
      enum OTF_ValueFormat format;
Packit daac2c
      OTF_ValueRecord *value;
Packit daac2c
    } f1;
Packit daac2c
    struct {
Packit daac2c
      enum OTF_ValueFormat format;
Packit daac2c
      OTF_ValueRecord *value;
Packit daac2c
    } f2;
Packit daac2c
    struct {
Packit daac2c
      OTF_Anchor *entry_anchor;
Packit daac2c
      OTF_Anchor *exit_anchor;
Packit daac2c
    } f3;
Packit daac2c
    struct {
Packit daac2c
      OTF_Anchor *mark_anchor;
Packit daac2c
      OTF_Anchor *base_anchor;
Packit daac2c
    } f4;
Packit daac2c
    struct {
Packit daac2c
      OTF_Anchor *mark_anchor;
Packit daac2c
      OTF_Anchor *ligature_anchor;
Packit daac2c
    } f5;
Packit daac2c
    struct {
Packit daac2c
      OTF_Anchor *mark1_anchor;
Packit daac2c
      OTF_Anchor *mark2_anchor;
Packit daac2c
    } f6;
Packit daac2c
  } f;
Packit daac2c
} OTF_Glyph;
Packit daac2c
Packit daac2c
/***
Packit daac2c
    The structure OTF_GlyphString contains an array of glyphs (type
Packit daac2c
    OTF_Glyph).  It is used as arguments of otf_drive_XXX().  */
Packit daac2c
Packit daac2c
typedef struct
Packit daac2c
{
Packit daac2c
  /* How many glyphs are allocated at the memory pointed by the member
Packit daac2c
      <glyphs>.  */
Packit daac2c
  int size;
Packit daac2c
  /* How many glyphs contain valid information.  */
Packit daac2c
  int used;
Packit daac2c
  /* Array of glyphs.  It must be allocated by malloc().  The
Packit daac2c
     functions otf_drive_XXX() may reallocate it and increase the
Packit daac2c
     members <size> and <used>.  */
Packit daac2c
  OTF_Glyph *glyphs;
Packit daac2c
} OTF_GlyphString;
Packit daac2c
Packit daac2c
Packit daac2c
/*** (3-2) OTF_drive_cmap() */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by Unicode-based cmap table.
Packit daac2c
Packit daac2c
    The OTF_drive_cmap() function looks up a Unicode-based cmap table
Packit daac2c
    of OpenType font $OTF, and setup the member <glyph_id> of all
Packit daac2c
    glhphs in the glyph string $GSTRING if the value of the member is
Packit daac2c
    not zero.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_cmap (OTF *otf, OTF_GlyphString *gstring);
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by a specific cmap table.
Packit daac2c
Packit daac2c
    The OTF_drive_cmap2() function looks up a cmap table (whose
Packit daac2c
    Platform-ID is $PLATFORM_ID an Encoding-ID is $ENCODING_ID) of
Packit daac2c
    OpenType font $OTF, and setup the member <glyph_id> of all glhphs
Packit daac2c
    in the glyph string $GSTRING if the value of the member is not
Packit daac2c
    zero.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_cmap2 (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
			    int platform_id, int encoding_id);
Packit daac2c
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Store variable glyphs of character C in the array CODE.  The array
Packit daac2c
    size must be 256.  The Nth element of CODE is the glyph corresponding
Packit daac2c
    to the variation selector (N + 1).  The return value is the number
Packit daac2c
    of variation glyphs.  */
Packit daac2c
Packit daac2c
extern int OTF_get_variation_glyphs (OTF *otf, int c, OTF_GlyphID code[256]);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (3-3) OTF_drive_gdef() */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by GDEF table.
Packit daac2c
Packit daac2c
    The OTF_drive_gdef() function looks up the GDEF table of OpenType
Packit daac2c
    font $OTF, and setup members <GlyphClass> and <MarkAttachClass> of
Packit daac2c
    all glhphs in the glyph string $GSTRING.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_gdef (OTF *otf, OTF_GlyphString *gstring);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (3-4) OTF_drive_gsub() */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by GSUB table.
Packit daac2c
Packit daac2c
    The OTF_drive_gsub() function looks up the GSUB table of OpenType
Packit daac2c
    font $OTF, and by using features the font has for script $SCRIPT
Packit daac2c
    and language system $LANGSYS, update member <glyphs> of the glyph
Packit daac2c
    string $GSTRING.  It may substitute, delete, insert glyphs in that
Packit daac2c
    array.  $FEATURES is a list of features to apply.  This doesn't
Packit daac2c
    perform a lookup of type 3 (Alternate Substitution).  For that,
Packit daac2c
    use OTF_drive_gsub_alternate().  */
Packit daac2c
Packit daac2c
extern int OTF_drive_gsub (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
			   const char *script, const char *language,
Packit daac2c
			   const char *features);
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by GSUB table with log.
Packit daac2c
Packit daac2c
    This is like OTF_drive_gsub(), but records which feature is
Packit daac2c
    applied to each glyph in the higher bits of `positioning_type'
Packit daac2c
    member of OTF_Glyph.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_gsub_with_log (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
				    const char *script, const char *language,
Packit daac2c
				    const char *features);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (3-5) OTF_drive_gpos() */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by GPOS table.
Packit daac2c
Packit daac2c
    The OTF_drive_gpos() function is deprecated.  Use
Packit daac2c
    OTF_drive_gpos2() instread.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
			   const char *script, const char *language,
Packit daac2c
			   const char *features);
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by GPOS table.
Packit daac2c
Packit daac2c
    The OTF_drive_gpos2() function looks up the GPOS table of $OTF of
Packit daac2c
    OpenType font $OTF, and by using features the font has for script
Packit daac2c
    $SCRIPT and language system $LANGSYS, setup members
Packit daac2c
    <positioning_type> and <f> of all glhphs in the glyph string
Packit daac2c
    $GSTRING.  $FEATURES is a list of features to apply.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_gpos2 (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
			    const char *script, const char *language,
Packit daac2c
			    const char *features);
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by GPOS table with log.
Packit daac2c
Packit daac2c
    This is like OTF_drive_pos_2(), but records which feature is
Packit daac2c
    applied to each glyph in the higher bits of `positioning_type'
Packit daac2c
    member of OTF_Glyph.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_gpos_with_log (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
				    const char *script, const char *language,
Packit daac2c
				    const char *features);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (3-6) OTF_drive_tables() */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Process glyph string by cmap, GDEF, GSUB, and GPOS tables.
Packit daac2c
Packit daac2c
    The OTF_drive_tables() function calls OTF_drive_cmap(),
Packit daac2c
    OTF_drive_gdef(), OTF_drive_gsub(), and OTF_drive_gpos() in this
Packit daac2c
    order, and update the glyphs string GSTRING.  */
Packit daac2c
Packit daac2c
extern int OTF_drive_tables (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
			     const char *script, const char *language,
Packit daac2c
			     const char *gsub_features,
Packit daac2c
			     const char *gpos_features);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (3-7) OTF_get_unicode()  */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Return Unicode code point corresponding to the glyph-id CODE.
Packit daac2c
  */
Packit daac2c
Packit daac2c
extern int OTF_get_unicode (OTF *otf, OTF_GlyphID code);
Packit daac2c
Packit daac2c
/*** (3-8) OTF_drive_gsub_alternate() */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Find alternate glyphs.
Packit daac2c
Packit daac2c
    This is like OTF_drive_gsub(), but perform only a lookup of type 3
Packit daac2c
    (Alternate Substituion).  */
Packit daac2c
Packit daac2c
extern int OTF_drive_gsub_alternate (OTF *otf, OTF_GlyphString *gstring,
Packit daac2c
				     const char *script, const char *language,
Packit daac2c
				     const char *features);
Packit daac2c
Packit daac2c
/*** (3-9) OTF_iterate_on_feature() */
Packit daac2c
typedef int (*OTF_Feature_Callback) (OTF *otf, const char *feature,
Packit daac2c
				     unsigned glyph_id);
Packit daac2c
Packit daac2c
extern int OTF_iterate_gsub_feature (OTF *otf, OTF_Feature_Callback callback,
Packit daac2c
				     const char *script, const char *language,
Packit daac2c
				     const char *feature);
Packit daac2c
Packit daac2c
/*** (4) API for error handling ***/
Packit daac2c
Packit daac2c
/*** (4-1) Error codes ***/
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Global variable holding an error code.
Packit daac2c
Packit daac2c
    The variable OTF_error is set to one of OTF_ERROR_XXX macros when
Packit daac2c
    an error is detected in the OTF library.  */
Packit daac2c
extern int OTF_error;
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Memory allocation error
Packit daac2c
Packit daac2c
    This error indicates that the library couldn't allocate
Packit daac2c
    memory.  */
Packit daac2c
#define OTF_ERROR_MEMORY	1
Packit daac2c
Packit daac2c
/***
Packit daac2c
    File error
Packit daac2c
Packit daac2c
    This error indicates that the library fails in opening, reading,
Packit daac2c
    or seeking an OTF file.  */
Packit daac2c
#define OTF_ERROR_FILE		2
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Invalid table contents
Packit daac2c
Packit daac2c
    This error indicates that an OTF file contains invalid data.  */
Packit daac2c
#define OTF_ERROR_TABLE		3
Packit daac2c
Packit daac2c
/***
Packit daac2c
    CMAP driving error
Packit daac2c
Packit daac2c
    See the function otf_drive_cmap() for more detail.  */
Packit daac2c
#define OTF_ERROR_CMAP_DRIVE	4
Packit daac2c
Packit daac2c
/***
Packit daac2c
    GDEF driving error
Packit daac2c
Packit daac2c
    See the function OTF_drive_gdef() for more detail.  */
Packit daac2c
#define OTF_ERROR_GDEF_DRIVE	5
Packit daac2c
Packit daac2c
/***
Packit daac2c
    GSUB driving error
Packit daac2c
Packit daac2c
    See the function OTF_drive_gsub() for more detail.  */
Packit daac2c
#define OTF_ERROR_GSUB_DRIVE	6
Packit daac2c
Packit daac2c
/***
Packit daac2c
    GPOS driving error
Packit daac2c
Packit daac2c
    See the function OTF_drive_gpos() for more detail.  */
Packit daac2c
#define OTF_ERROR_GPOS_DRIVE	7
Packit daac2c
Packit daac2c
/***
Packit daac2c
    FT_Face access error.
Packit daac2c
Packit daac2c
    This error indicates that the library fails in accessing Sfnt
Packit daac2c
    tables via FT_Face.  */
Packit daac2c
#define OTF_ERROR_FT_FACE	8
Packit daac2c
Packit daac2c
Packit daac2c
/*** (4-2) OTF_perror() */
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Print an OTF error message
Packit daac2c
Packit daac2c
    The OTF_perror() function produces a message on the standard error
Packit daac2c
    output, describing the last error encountered during a call to the
Packit daac2c
    OTF library function.  If $PREFIX is not NULL, it is printed
Packit daac2c
    first, followed by a colon and a blank.  Then the message and a
Packit daac2c
    newline.  */
Packit daac2c
Packit daac2c
extern void OTF_perror (const char *prefix);
Packit daac2c
Packit daac2c
Packit daac2c
/*** (5) API miscellaneous ***/
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Return OTF tag of a specified name string.
Packit daac2c
Packit daac2c
    The OTF_tag() function returns OTF tag of name $NAME.  If $NAME is
Packit daac2c
    NULL, return 0.  Otherwise, $NAME must be at least 4-byte length.
Packit daac2c
    Only the first 4 characters are took into an account.  */
Packit daac2c
Packit daac2c
extern OTF_Tag OTF_tag (const char *name);
Packit daac2c
Packit daac2c
/***
Packit daac2c
    Convert OTF tag to name string.
Packit daac2c
Packit daac2c
    The OTF_tag_name() function converts OTF tag $TAG to a 5-byte name
Packit daac2c
    string (including the terminating NULL), and store it in $NAME.
Packit daac2c
    At least 5-byte space must be at $NAME.  */
Packit daac2c
Packit daac2c
extern void OTF_tag_name (OTF_Tag tag, char *name);
Packit daac2c
Packit daac2c
extern int OTF_put_data (OTF *otf, char *id, void *data,
Packit daac2c
			 void (*freer) (void *data));
Packit daac2c
Packit daac2c
extern void *OTF_get_data (OTF *otf, char *id);
Packit daac2c
Packit daac2c
#ifdef __cplusplus
Packit daac2c
}
Packit daac2c
#endif
Packit daac2c
Packit daac2c
#endif /* not _OTF_H_ */