Copyright updated.
[m17n/libotf.git] / src / otf.h
index 31ff7b5..3fb566a 100644 (file)
--- a/src/otf.h
+++ b/src/otf.h
@@ -1,29 +1,39 @@
-/* otf.h -- Header file for the OTF (OpenType font) library.
+/* otf.h -- Header file for libotf (OpenType font library).
 
-Copyright (C) 2002
-  by AIST (National Institute of Advanced Industrial Science and Technology)
-  Registration Number H14PRO???
+Copyright (C) 2003, 2004, 2005, 2006
+  National Institute of Advanced Industrial Science and Technology (AIST)
+  Registration Number H15PRO167
 
-This file is part of the OTF library.
+This file is part of libotf.
 
-The OTF library is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2, or (at
-your option) any later version.
+Libotf is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published
+by the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
 
-The OTF library is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-General Public License for more details.
+Libotf is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+License for more details.
 
-You should have received a copy of the GNU General Public License
-along with the OTF library; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+You should have received a copy of the GNU Lesser General Public
+License along with this library, in a file named COPYING; if not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite
+330, Boston, MA 02111-1307, USA.  */
 
 #ifndef _OTF_H_
 #define _OTF_H_
 
+/* Version name of this library.  */
+#define LIBOTF_VERSION "0.9.5"
+
+/* Major version number.  */
+#define LIBOTF_MAJOR_VERSION 0
+/* Minor version number.  */
+#define LIBOTF_MINOR_VERSION 9
+/* Release (i.e. patch level) number.  */
+#define LIBOTF_RELEASE_NUMBER 5
+
 /***
     Table of contents:
 
@@ -40,24 +50,27 @@ Boston, MA 02111-1307, USA.  */
     (1-10) "GPOS" table
     (1-11) Structure for OTF
 
-    (2) APIs for reading OTF
-    (2-1) OTF_open()
+    (2) API for reading OTF
+    (2-1) OTF_open(), OTF_open_ft_face()
     (2-2) OTF_close()
     (2-3) OTF_get_table()
+    (2-4) OTF_check_table()
 
-    (3) APIs for driving OTF
+    (3) API for driving OTF
     (3-1) Structure for glyph string
     (3-2) OTF_drive_cmap()
     (3-3) OTF_drive_gdef()
     (3-4) OTF_drive_gsub()
     (3-5) OTF_drive_gpos()
     (3-6) OTF_drive_tables()
+    (3-7) OTF_get_unicode()
+    (3-8) OTF_drive_gsub_alternate()
 
-    (4) APIs for error handling 
+    (4) API for error handling
     (4-1) Error codes
     (4-2) OTF_perror()
 
-    (5) APIs miscellaneous
+    (5) API miscellaneous
 
 */
 
@@ -100,6 +113,10 @@ typedef struct
   int nameID;
   int length;
   int offset;
+
+  /* If nonzero, NAME is an ASCII string.  */
+  int ascii;
+  unsigned char *name;
 } OTF_NameRecord;
 
 #define OTF_max_nameID 23
@@ -131,9 +148,11 @@ typedef struct
 
 typedef struct
 {
-  unsigned subHeaderKeys[256];
+  unsigned short subHeaderKeys[256];
+  int subHeaderCount;
   OTF_cmapSubHeader *subHeaders;
-  unsigned *glyphIndexArray;
+  int glyphIndexCount;
+  OTF_GlyphID *glyphIndexArray;
 } OTF_EncodingSubtable2;
 
 typedef struct
@@ -218,7 +237,11 @@ typedef struct
   unsigned version;
   unsigned numTables;
   OTF_EncodingRecord *EncodingRecord;
-  OTF_EncodingRecord *Unicode;
+  /* Mapping table: Unicode->GlyphID */
+  unsigned short *unicode_table;
+  int max_glyph_id;
+  /* Mapping table: GlyphID->Unicode */
+  unsigned short *decode_table;
 } OTF_cmap;
 
 
@@ -441,11 +464,14 @@ enum OTF_LookupFlagBit
     OTF_RightToLeft = 0x0001,
     OTF_IgnoreBaseGlyphs = 0x0002,
     OTF_IgnoreLigatures = 0x0004,
-    OTF_IgnoreMarks = 0x8000,
+    OTF_IgnoreMarks = 0x0008,
     OTF_Reserved = 0x00F0,
     OTF_MarkAttachmentType = 0xFF00
   };
-    
+
+#define OTF_LookupFlagIgnoreMask \
+  (OTF_IgnoreBaseGlyphs | OTF_IgnoreLigatures | OTF_IgnoreMarks)
+
 typedef struct
 {
   OTF_Offset offset;
@@ -695,7 +721,8 @@ typedef OTF_ChainContext3 OTF_GSUB_ChainContext3;
 typedef struct
 {
   unsigned ExtensionLookupType;
-  unsigned ExtentionOffset;
+  unsigned ExtensionOffset;
+  OTF_LookupSubTableGSUB *ExtensionSubtable;
 } OTF_GSUB_Extension1;
 
 typedef struct
@@ -706,7 +733,7 @@ typedef struct
   OTF_Coverage *LookAhead;
   unsigned GlyphCount;
   OTF_GlyphID *Substitute;
-} OTF_GSUB_ReverseChainSingle1;
+} OTF_GSUB_ReverseChain1;
 
 struct OTF_LookupSubTableGSUB
 {
@@ -733,7 +760,7 @@ struct OTF_LookupSubTableGSUB
     /* LookupType 7 */
     OTF_GSUB_Extension1 extension1;
     /* LookupType 8 */
-    OTF_GSUB_ReverseChainSingle1 reverse_chain_single1;
+    OTF_GSUB_ReverseChain1 reverse_chain1;
   } u;
 };
 
@@ -772,10 +799,10 @@ typedef struct
   int XCoordinate;
   int YCoordinate;
   union {
-    union {
+    struct {
       unsigned AnchorPoint;
     } f1;
-    union {
+    struct {
       OTF_DeviceTable XDeviceTable;
       OTF_DeviceTable YDeviceTable;
     } f2;
@@ -798,7 +825,7 @@ typedef struct
 typedef struct
 {
   unsigned ValueFormat;
-  OTF_ValueRecord Value;  
+  OTF_ValueRecord Value;
 } OTF_GPOS_Single1;
 
 typedef struct
@@ -810,7 +837,24 @@ typedef struct
 
 typedef struct
 {
-  int dummy;
+  OTF_GlyphID SecondGlyph;
+  OTF_ValueRecord Value1;
+  OTF_ValueRecord Value2;
+} OTF_PairValueRecord;
+
+typedef struct
+{
+  OTF_Offset offset;
+  unsigned PairValueCount;
+  OTF_PairValueRecord *PairValueRecord;
+} OTF_PairSet;
+
+typedef struct
+{
+  unsigned ValueFormat1;
+  unsigned ValueFormat2;
+  unsigned PairSetCount;
+  OTF_PairSet *PairSet;
 } OTF_GPOS_Pair1;
 
 typedef struct
@@ -837,7 +881,14 @@ typedef struct
 
 typedef struct
 {
-  int dummy;
+  OTF_Anchor EntryAnchor;
+  OTF_Anchor ExitAnchor;
+} OTF_EntryExitRecord;
+
+typedef struct
+{
+  unsigned EntryExitCount;
+  OTF_EntryExitRecord *EntryExitRecord;
 } OTF_GPOS_Cursive1;
 
 typedef struct
@@ -862,7 +913,29 @@ typedef struct
 
 typedef struct
 {
-  int dummy;
+  OTF_Anchor *LigatureAnchor; /* [<ClassCount>] */
+} OTF_ComponentRecord;
+
+typedef struct
+{
+  OTF_Offset offset;
+  unsigned ComponentCount;
+  OTF_ComponentRecord *ComponentRecord; /* [<ComponentCount>] */
+} OTF_LigatureAttach;
+
+typedef struct
+{
+  OTF_Offset offset;
+  unsigned LigatureCount;
+  OTF_LigatureAttach *LigatureAttach; /* [<LiagureCount>] */
+} OTF_LigatureArray;
+
+typedef struct
+{
+  OTF_Coverage LigatureCoverage;
+  unsigned ClassCount;
+  OTF_MarkArray MarkArray;
+  OTF_LigatureArray LigatureArray;
 } OTF_GPOS_MarkLig1;
 
 typedef struct
@@ -887,7 +960,9 @@ typedef OTF_ChainContext3 OTF_GPOS_ChainContext3;
 
 typedef struct
 {
-  int dummy;
+  unsigned ExtensionLookupType;
+  unsigned ExtensionOffset;
+  OTF_LookupSubTableGPOS *ExtensionSubtable;
 } OTF_GPOS_Extension1;
 
 
@@ -959,13 +1034,13 @@ typedef struct
   OTF_GSUB *gsub;
   OTF_GPOS *gpos;
   /* The following tables are not yet supported.  */
-  // OTF_BASE *base;
-  // OTF_JSTF *jstf;
+  /* OTF_BASE *base; */
+  /* OTF_JSTF *jstf; */
   OTF_InternalData *internal_data;
 } OTF;
 
 \f
-/*** (2) APIs for reading OTF */
+/*** (2) API for reading OTF */
 
 /*** (2-1) otf_open () */
 
@@ -990,14 +1065,19 @@ typedef struct
 
 extern OTF *OTF_open (char *name);
 
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+extern OTF *OTF_open_ft_face (FT_Face face);
+
 
 /*** (2-2) OTF_close () */
 
 /***
     Close OpenType font
 
-    The OTF_close() function closes the OpenType font pointed by $OTF
-    which must be what the OTF_open() returned.
+    The OTF_close() function closes the OpenType font $OTF which must
+    be what the OTF_open() function returned.
 
     See also OTF_open().  */
 
@@ -1009,8 +1089,8 @@ extern void OTF_close (OTF *otf);
 /***
     Get OpenType font table
 
-    The OTF_get_table() function setups one of the OTF tables
-    specified by $NAME in the structure pointed by $OTF.
+    The OTF_get_table() function setups one of the OTF table specified
+    by $NAME in the OpenType font $OTF.
 
     $NAME must be one of "head", "name", "cmap", "GDEF", "GSUB", and
     "GPOS", and a member of the same name is setup.
@@ -1022,8 +1102,68 @@ extern void OTF_close (OTF *otf);
 
 extern int OTF_get_table (OTF *otf, char *name);
 
+/*** (2-4) OTF_check_table () */
+
+/***
+    Check the existence of OpenType font table
 
-/*** (3) APIs for driving OTF */
+    The OTF_check_table() function checks if the the OTF table
+    specified by $NAME exists in OpenType font $OTF.
+
+    If the table exists, return 0, else return -1.
+
+    See also OTF_open().  */
+
+extern int OTF_check_table (OTF *otf, char *name);
+
+/*** (2-5) OTF_get_scripts () */
+
+/***
+    Get supported scripts.
+
+    The OTF_get_scripts() function setups OTF_ScriptList of GSUB (if
+    $GSUBP is nonzero) or GPOS (if $GSUBP is zero) table of the
+    OpenType font $OTF.
+
+    If the table is successfully setup, return 0.  Otherwise, retrun
+    -1, and set the variable OTF_error to OTF_ERROR_TABLE.  */
+
+extern int OTF_get_scripts (OTF *otf, int gsubp);
+
+/*** (2-6) OTF_get_features () */
+
+/***
+    Get supported features.
+
+    The OTF_get_features() function setups OTF_FeatureList of GSUB (if
+    $GSUBP is nonzero) or GPOS (if $GSUBP is zero) table of the
+    OpenType font $OTF.
+
+    If the table is successfully setup, return 0.  Otherwise, retrun
+    -1, and set the variable OTF_error to OTF_ERROR_TABLE.  */
+
+extern int OTF_get_features (OTF *otf, int gsubp);
+
+/*** (2-7) OTF_check_features  */
+
+/***
+    Check supported features.
+
+    The OTF_check_features() function checks if or not the OpenType
+    font $OTF has, for $SCRIPT and $LANGUAGE, all features in the
+    array $FEATURES.  The array size is $N_FEATURES.  If $LANGUAGE is
+    zero or $OTF doesn't have LangSys for $SCRIPT, the default LangSys
+    is checked.
+
+    If $OTF has all the features, return 1.  Otherwise, return 0.  If
+    an error occurs, return -1, and set the variable OTF_error to
+    OTF_ERROR_TABLE.   */
+
+extern int OTF_check_features (OTF *otf, int gsubp,
+                              OTF_Tag script, OTF_Tag language,
+                              OTF_Tag *features, int n_features);
+
+/*** (3) API for driving OTF */
 
 /*** (3-1) Structure for glyph string */
 
@@ -1033,12 +1173,16 @@ extern int OTF_get_table (OTF *otf, char *name);
 
 typedef struct
 {
-  /* Character code of the glyph.  This is the only member that a
-     client has to set before calling the function
-     OTF_drive_XXX().  */
+  /** The first two members must be set by a clinet before calling the
+      function OTF_drive_XXX().  **/
+
+  /* Character code of the glyph.  The value less than 32 is treated
+     as a place-holder in a glyph string, and OTF_drive_XXX ()
+     function just ignore the glyph as if it doesn't exist.  */
   int c;
 
-  /* Glyph ID of the glyph.  */
+  /* Glyph ID of the glyph.  If the value is 0, the library gets a
+     correct value from the above character code via cmap.  */
   OTF_GlyphID glyph_id;
 
   /* GlyphClass of the glyph.  The value is extracted from the GDEF
@@ -1047,7 +1191,7 @@ typedef struct
 
   /* MarkAttachClassDef of the glyph.  The value is extracted from the
      GDEF table.  */
-  unsigned MarkAttachClass;  
+  unsigned MarkAttachClass;
 
   /* Positioning format type of the glyph.  The value specifies how
      the glyph positioning information is encoded in the member <f>.
@@ -1057,6 +1201,9 @@ typedef struct
   int positioning_type;
   union {
     struct {
+      int from, to;
+    } index;
+    struct {
       enum OTF_ValueFormat format;
       OTF_ValueRecord *value;
     } f1;
@@ -1092,7 +1239,7 @@ typedef struct
   /* How many glyphs are allocated at the memory pointed by the member
       <glyphs>.  */
   int size;
-  /* How many glyphs contains valid information.  */
+  /* How many glyphs contain valid information.  */
   int used;
   /* Array of glyphs.  It must be allocated by malloc().  The
      functions otf_drive_XXX() may reallocate it and increase the
@@ -1104,14 +1251,27 @@ typedef struct
 /*** (3-2) OTF_drive_cmap() */
 
 /***
-    Process glyph string by cmap table.
+    Process glyph string by Unicode-based cmap table.
 
-    The OTF_drive_cmap() function looks up the cmap table of OpenType
-    font $OTF, and setup the member <glyhph_id> of all glhphs in the
-    glyph string $GSTRING.  */
+    The OTF_drive_cmap() function looks up a Unicode-based cmap table
+    of OpenType font $OTF, and setup the member <glyhph_id> of all
+    glhphs in the glyph string $GSTRING if the value of the member is
+    not zero.  */
 
 extern int OTF_drive_cmap (OTF *otf, OTF_GlyphString *gstring);
 
+/***
+    Process glyph string by a specific cmap table.
+
+    The OTF_drive_cmap2() function looks up a cmap table (whose
+    Platform-ID is $PLATFORM_ID an Encoding-ID is $ENCODING_ID) of
+    OpenType font $OTF, and setup the member <glyhph_id> of all glhphs
+    in the glyph string $GSTRING if the value of the member is not
+    zero.  */
+
+extern int OTF_drive_cmap2 (OTF *otf, OTF_GlyphString *gstring,
+                           int platform_id, int encoding_id);
+
 /*** (3-3) OTF_drive_gdef() */
 
 /***
@@ -1133,7 +1293,9 @@ extern int OTF_drive_gdef (OTF *otf, OTF_GlyphString *gstring);
     font $OTF, and by using features the font has for script $SCRIPT
     and language system $LANGSYS, update member <glyphs> of the glyph
     string $GSTRING.  It may substitute, delete, insert glyphs in that
-    array.  */
+    array.  $FEATURES is a list of features to apply.  This doesn't
+    perform a lookup of type 3 (Alternate Substitution).  For that,
+    use OTF_drive_gsub_alternate().  */
 
 extern int OTF_drive_gsub (OTF *otf, OTF_GlyphString *gstring,
                           char *script, char *language, char *features);
@@ -1147,7 +1309,7 @@ extern int OTF_drive_gsub (OTF *otf, OTF_GlyphString *gstring,
     OpenType font $OTF, and by using features the font has for script
     $SCRIPT and language system $LANGSYS, setup members
     <positioning_type> and <f> of all glhphs in the glyph string
-    $GSTRING.  */
+    $GSTRING.  $FEATURES is a list of features to apply.  */
 
 extern int OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring,
                           char *script, char *language, char *features);
@@ -1166,7 +1328,27 @@ extern int OTF_drive_tables (OTF *otf, OTF_GlyphString *gstring,
                             char *gsub_features, char *gpos_features);
 
 
-/*** (4) APIs for error handling ***/
+/*** (3-7) OTF_get_unicode()  */
+
+/***
+    Return Unicode code point corresponding to the glyph-id CODE.
+  */
+
+extern int OTF_get_unicode (OTF *otf, OTF_GlyphID code);
+
+/*** (3-8) OTF_drive_gsub_alternate() */
+
+/***
+    Find alternate glyphs.
+
+    This is like OTF_drive_gsub(), but perform only a lookup of type 3
+    (Alternate Substituion).  */
+
+extern int OTF_drive_gsub_alternate (OTF *otf, OTF_GlyphString *gstring,
+                                    char *script, char *language,
+                                    char *features);
+
+/*** (4) API for error handling ***/
 
 /*** (4-1) Error codes ***/
 
@@ -1221,6 +1403,13 @@ extern int OTF_error;
     See the function OTF_drive_gpos() for more detail.  */
 #define OTF_ERROR_GPOS_DRIVE   7
 
+/***
+    FT_Face access error.
+
+    This error indicates that the library fails in accessing Sfnt
+    tables via FT_Face.  */
+#define OTF_ERROR_FT_FACE      8
+
 
 /*** (4-2) OTF_perror() */
 
@@ -1229,14 +1418,14 @@ extern int OTF_error;
 
     The OTF_perror() function produces a message on the standard error
     output, describing the last error encountered during a call to the
-    OTF library function.  If $PREFIX is not NULL, is is printed
+    OTF library function.  If $PREFIX is not NULL, it is printed
     first, followed by a colon and a blank.  Then the message and a
     newline.  */
 
 extern void OTF_perror (char *prefix);
 
 
-/*** (5) APIs miscellaneous ***/
+/*** (5) API miscellaneous ***/
 
 /***
     Return OTF tag of a specified name string.