Docstring updated.
[m17n/libotf.git] / src / otf.h
index 488998c..95f044f 100644 (file)
--- a/src/otf.h
+++ b/src/otf.h
@@ -1,6 +1,6 @@
 /* otf.h -- Header file for libotf (OpenType font library).
 
-Copyright (C) 2003, 2004
+Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009
   National Institute of Advanced Industrial Science and Technology (AIST)
   Registration Number H15PRO167
 
@@ -24,6 +24,20 @@ write to the Free Software Foundation, Inc., 59 Temple Place, Suite
 #ifndef _OTF_H_
 #define _OTF_H_
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Version name of this library.  */
+#define LIBOTF_VERSION "0.9.10"
+
+/* 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 10
+
 /***
     Table of contents:
 
@@ -41,7 +55,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place, Suite
     (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,6 +67,9 @@ write to the Free Software Foundation, Inc., 59 Temple Place, Suite
     (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()
+    (3-9) OTF_iterate_on_feature()
 
     (4) API for error handling
     (4-1) Error codes
@@ -101,6 +118,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 +153,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
@@ -143,7 +166,7 @@ typedef struct
   unsigned endCount;
   int idDelta;
   unsigned idRangeOffset;
-} OTF_cmapSegument;
+} OTF_cmapSegment;
 
 typedef struct
 {
@@ -151,7 +174,7 @@ typedef struct
   unsigned searchRange;
   unsigned entrySelector;
   unsigned rangeShift;
-  OTF_cmapSegument *segments;
+  OTF_cmapSegment *segments;
   int GlyphCount;
   unsigned *glyphIdArray;
 } OTF_EncodingSubtable4;
@@ -192,6 +215,37 @@ typedef struct
 
 typedef struct
 {
+  unsigned unicodeValue;
+  unsigned short glyphID;
+} OTF_UVSMapping;
+
+typedef struct
+{
+  unsigned startUnicodeValue;
+  unsigned short additionalCount;
+} OTF_UnicodeValueRange;
+
+typedef struct
+{
+  unsigned varSelector;
+  unsigned defaultUVSOffset;
+  unsigned nonDefaultUVSOffset;
+  /* DefaultUVS */
+  unsigned numUnicodeValueRanges;
+  OTF_UnicodeValueRange *unicodeValueRanges;
+  /* NonDefaultUVS */
+  unsigned numUVSMappings;
+  OTF_UVSMapping *uvsMappings;
+} OTF_VariationSelectorRecord;
+
+typedef struct
+{
+  unsigned nRecords;
+  OTF_VariationSelectorRecord *Records;
+} OTF_EncodingSubtable14;
+
+typedef struct
+{
   unsigned format;
   unsigned length;
   unsigned language;
@@ -203,6 +257,7 @@ typedef struct
     OTF_EncodingSubtable8 *f8;
     OTF_EncodingSubtable10 *f10;
     OTF_EncodingSubtable12 *f12;
+    OTF_EncodingSubtable14 *f14;
   }f;
 } OTF_EncodingSubtable;
 
@@ -219,11 +274,15 @@ typedef struct
   unsigned version;
   unsigned numTables;
   OTF_EncodingRecord *EncodingRecord;
-  /* Mapping table: Unicode->GlyphID */
+  /* Mapping table: Unicode->GlyphID (for BMP only) */
   unsigned short *unicode_table;
+  /* Maximum Glyph ID that corresponds to a Unicode character.  */
   int max_glyph_id;
   /* Mapping table: GlyphID->Unicode */
   unsigned short *decode_table;
+  /* Index of the EncodingRecord for Unicode->GlyphID mapping.
+     -1 means that the font supports only Unicode BMP characters.  */
+  int table_index;
 } OTF_cmap;
 
 
@@ -446,11 +505,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;
@@ -778,10 +840,10 @@ typedef struct
   int XCoordinate;
   int YCoordinate;
   union {
-    union {
+    struct {
       unsigned AnchorPoint;
     } f1;
-    union {
+    struct {
       OTF_DeviceTable XDeviceTable;
       OTF_DeviceTable YDeviceTable;
     } f2;
@@ -1013,8 +1075,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;
 
@@ -1042,7 +1104,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 () */
@@ -1074,7 +1141,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 () */
 
@@ -1088,8 +1155,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 */
 
@@ -1110,7 +1223,14 @@ typedef struct
   int c;
 
   /* Glyph ID of the glyph.  If the value is 0, the library gets a
-     correct value from the above character code via cmap.  */
+     correct value from the above character code via cmap if such a
+     glyph is available in the font.
+
+     The function OTF_drive_gpos2 may insert a glyph whose glyph_id is
+     0 but positioning_type is positive.  It is not an actual glyph
+     but just contains positioning information that should be
+     accumulated to the positioning information of the previous
+     glyphs.  */
   OTF_GlyphID glyph_id;
 
   /* GlyphClass of the glyph.  The value is extracted from the GDEF
@@ -1129,6 +1249,9 @@ typedef struct
   int positioning_type;
   union {
     struct {
+      int from, to;
+    } index;
+    struct {
       enum OTF_ValueFormat format;
       OTF_ValueRecord *value;
     } f1;
@@ -1164,7 +1287,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
@@ -1176,14 +1299,37 @@ 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 if the value of the member is not zero.  */
+    The OTF_drive_cmap() function looks up a Unicode-based cmap table
+    of OpenType font $OTF, and setup the member <glyph_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 <glyph_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);
+
+
+/***
+    Store variable glyphs of character C in the array CODE.  The array
+    size must be 256.  The Nth element of CODE is the glyph corresponding
+    to the variation selector (N + 1).  The return value is the number
+    of variation glyphs.  */
+
+extern int OTF_get_variation_glyphs (OTF *otf, int c, OTF_GlyphID code[256]);
+
+
 /*** (3-3) OTF_drive_gdef() */
 
 /***
@@ -1205,24 +1351,38 @@ 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.  $FEATURES is a list of features to apply.  */
+    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() */
 
 /***
     Process glyph string by GPOS table.
 
-    The OTF_drive_gdef() function looks up the GPOS table of $OTF of
+    The OTF_drive_gpos() function is deprecated.  Use
+    OTF_drive_gpos2() instread.  */
+
+extern int OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring,
+                          const char *script, const char *language,
+                          const char *features);
+
+/***
+    Process glyph string by GPOS table.
+
+    The OTF_drive_gpos2() function looks up the GPOS table of $OTF of
     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.  $FEATURES is a list of features to apply.  */
 
-extern int OTF_drive_gpos (OTF *otf, OTF_GlyphString *gstring,
-                          char *script, char *language, char *features);
+extern int OTF_drive_gpos2 (OTF *otf, OTF_GlyphString *gstring,
+                           const char *script, const char *language,
+                           const char *features);
 
 /*** (3-6) OTF_drive_tables() */
 
@@ -1234,8 +1394,9 @@ 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()  */
@@ -1246,6 +1407,26 @@ extern int OTF_drive_tables (OTF *otf, OTF_GlyphString *gstring,
 
 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);
+
+/*** (3-9) OTF_iterate_on_feature() */
+typedef int (*OTF_Feature_Callback) (OTF *otf, const char *feature,
+                                    unsigned glyph_id);
+
+extern int OTF_iterate_gsub_feature (OTF *otf, OTF_Feature_Callback callback,
+                                    const char *script, const char *language,
+                                    const char *feature);
+
 /*** (4) API for error handling ***/
 
 /*** (4-1) Error codes ***/
@@ -1301,6 +1482,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() */
 
@@ -1309,11 +1497,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 ***/
@@ -1325,7 +1513,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.
@@ -1336,5 +1524,13 @@ extern OTF_Tag OTF_tag (char *name);
 
 extern void OTF_tag_name (OTF_Tag tag, char *name);
 
+extern int OTF_put_data (OTF *otf, char *id, void *data,
+                        void (*freer) (void *data));
+
+extern void *OTF_get_data (OTF *otf, char *id);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* not _OTF_H_ */