*** empty log message ***
[m17n/libotf.git] / src / otf.h
index bd0704d..47e2a78 100644 (file)
--- a/src/otf.h
+++ b/src/otf.h
@@ -1,29 +1,43 @@
-/* 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, 2007
+  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_
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Version name of this library.  */
+#define LIBOTF_VERSION "0.9.6"
+
+/* 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 6
+
 /***
     Table of contents:
 
@@ -41,7 +55,7 @@ Boston, MA 02111-1307, USA.  */
     (1-11) Structure for OTF
 
     (2) API for reading OTF
-    (2-1) OTF_open()
+    (2-1) OTF_open(), OTF_open_ft_face()
     (2-2) OTF_close()
     (2-3) OTF_get_table()
     (2-4) OTF_check_table()
@@ -53,8 +67,10 @@ Boston, MA 02111-1307, USA.  */
     (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) API for error handling 
+    (4) API for error handling
     (4-1) Error codes
     (4-2) OTF_perror()
 
@@ -101,6 +117,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
@@ -132,9 +152,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
@@ -219,7 +241,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;
 
 
@@ -442,11 +468,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;
@@ -696,7 +725,8 @@ typedef OTF_ChainContext3 OTF_GSUB_ChainContext3;
 typedef struct
 {
   unsigned ExtensionLookupType;
-  unsigned ExtentionOffset;
+  unsigned ExtensionOffset;
+  OTF_LookupSubTableGSUB *ExtensionSubtable;
 } OTF_GSUB_Extension1;
 
 typedef struct
@@ -707,7 +737,7 @@ typedef struct
   OTF_Coverage *LookAhead;
   unsigned GlyphCount;
   OTF_GlyphID *Substitute;
-} OTF_GSUB_ReverseChainSingle1;
+} OTF_GSUB_ReverseChain1;
 
 struct OTF_LookupSubTableGSUB
 {
@@ -734,7 +764,7 @@ struct OTF_LookupSubTableGSUB
     /* LookupType 7 */
     OTF_GSUB_Extension1 extension1;
     /* LookupType 8 */
-    OTF_GSUB_ReverseChainSingle1 reverse_chain_single1;
+    OTF_GSUB_ReverseChain1 reverse_chain1;
   } u;
 };
 
@@ -773,10 +803,10 @@ typedef struct
   int XCoordinate;
   int YCoordinate;
   union {
-    union {
+    struct {
       unsigned AnchorPoint;
     } f1;
-    union {
+    struct {
       OTF_DeviceTable XDeviceTable;
       OTF_DeviceTable YDeviceTable;
     } f2;
@@ -799,7 +829,7 @@ typedef struct
 typedef struct
 {
   unsigned ValueFormat;
-  OTF_ValueRecord Value;  
+  OTF_ValueRecord Value;
 } OTF_GPOS_Single1;
 
 typedef struct
@@ -811,7 +841,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
@@ -838,7 +885,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
@@ -863,7 +917,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
@@ -888,7 +964,9 @@ typedef OTF_ChainContext3 OTF_GPOS_ChainContext3;
 
 typedef struct
 {
-  int dummy;
+  unsigned ExtensionLookupType;
+  unsigned ExtensionOffset;
+  OTF_LookupSubTableGPOS *ExtensionSubtable;
 } OTF_GPOS_Extension1;
 
 
@@ -960,8 +1038,8 @@ 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;
 
@@ -989,7 +1067,12 @@ typedef struct
 
     See also OTF_get_table() and OTF_close().  */
 
-extern OTF *OTF_open (char *name);
+extern OTF *OTF_open (const char *name);
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+extern OTF *OTF_open_ft_face (FT_Face face);
 
 
 /*** (2-2) OTF_close () */
@@ -1021,7 +1104,7 @@ extern void OTF_close (OTF *otf);
 
     See also OTF_open().  */
 
-extern int OTF_get_table (OTF *otf, char *name);
+extern int OTF_get_table (OTF *otf, const char *name);
 
 /*** (2-4) OTF_check_table () */
 
@@ -1035,8 +1118,54 @@ extern int OTF_get_table (OTF *otf, char *name);
 
     See also OTF_open().  */
 
-extern int OTF_check_table (OTF *otf, char *name);
+extern int OTF_check_table (OTF *otf, const 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,
+                              const OTF_Tag *features, int n_features);
 
 /*** (3) API for driving OTF */
 
@@ -1048,12 +1177,16 @@ extern int OTF_check_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
@@ -1062,7 +1195,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>.
@@ -1072,6 +1205,9 @@ typedef struct
   int positioning_type;
   union {
     struct {
+      int from, to;
+    } index;
+    struct {
       enum OTF_ValueFormat format;
       OTF_ValueRecord *value;
     } f1;
@@ -1107,7 +1243,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
@@ -1119,14 +1255,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() */
 
 /***
@@ -1148,10 +1297,13 @@ 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);
+                          const char *script, const char *language,
+                          const char *features);
 
 /*** (3-5) OTF_drive_gpos() */
 
@@ -1162,10 +1314,11 @@ 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);
+                          const char *script, const char *language,
+                          const char *features);
 
 /*** (3-6) OTF_drive_tables() */
 
@@ -1177,9 +1330,30 @@ extern int OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring,
     order, and update the glyphs string GSTRING.  */
 
 extern int OTF_drive_tables (OTF *otf, OTF_GlyphString *gstring,
-                            char *script, char *language,
-                            char *gsub_features, char *gpos_features);
+                            const char *script, const char *language,
+                            const char *gsub_features,
+                            const char *gpos_features);
+
 
+/*** (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,
+                                    const char *script, const char *language,
+                                    const char *features);
 
 /*** (4) API for error handling ***/
 
@@ -1236,6 +1410,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() */
 
@@ -1244,11 +1425,11 @@ 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);
+extern void OTF_perror (const char *prefix);
 
 
 /*** (5) API miscellaneous ***/
@@ -1260,7 +1441,7 @@ extern void OTF_perror (char *prefix);
     NULL, return 0.  Otherwise, $NAME must be at least 4-byte length.
     Only the first 4 characters are took into an account.  */
 
-extern OTF_Tag OTF_tag (char *name);
+extern OTF_Tag OTF_tag (const char *name);
 
 /***
     Convert OTF tag to name string.
@@ -1271,5 +1452,8 @@ extern OTF_Tag OTF_tag (char *name);
 
 extern void OTF_tag_name (OTF_Tag tag, char *name);
 
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* not _OTF_H_ */