1/*
2 * Copyright (C) 1998-2004  David Turner and Werner Lemberg
3 * Copyright (C) 2006  Behdad Esfahbod
4 *
5 * This is part of HarfBuzz, an OpenType Layout engine library.
6 *
7 * Permission is hereby granted, without written agreement and without
8 * license or royalty fees, to use, copy, modify, and distribute this
9 * software and its documentation for any purpose, provided that the
10 * above copyright notice and the following two paragraphs appear in
11 * all copies of this software.
12 *
13 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17 * DAMAGE.
18 *
19 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24 */
25
26#ifndef HARFBUZZ_GSUB_H
27#define HARFBUZZ_GSUB_H
28
29#include "harfbuzz-gdef.h"
30#include "harfbuzz-buffer.h"
31
32HB_BEGIN_HEADER
33
34
35#ifdef HB_USE_PACKED_STRUCTS
36#pragma pack(push, 1)
37#endif
38
39/* Lookup types for glyph substitution */
40
41#define HB_GSUB_LOOKUP_SINGLE        1
42#define HB_GSUB_LOOKUP_MULTIPLE      2
43#define HB_GSUB_LOOKUP_ALTERNATE     3
44#define HB_GSUB_LOOKUP_LIGATURE      4
45#define HB_GSUB_LOOKUP_CONTEXT       5
46#define HB_GSUB_LOOKUP_CHAIN         6
47#define HB_GSUB_LOOKUP_EXTENSION     7
48#define HB_GSUB_LOOKUP_REVERSE_CHAIN 8
49
50
51/* A pointer to a function which selects the alternate glyph.  `pos' is
52   the position of the glyph with index `glyphID', `num_alternates'
53   gives the number of alternates in the `alternates' array.  `data'
54   points to the user-defined structure specified during a call to
55   HB_GSUB_Register_Alternate_Function().  The function must return an
56   index into the `alternates' array.                                   */
57
58typedef HB_UShort  (*HB_AltFunction)(HB_UInt    pos,
59				      HB_UShort   glyphID,
60				      HB_UShort   num_alternates,
61				      HB_UShort*  alternates,
62				      void*       data );
63
64
65struct  HB_GSUBHeader_
66{
67  HB_GDEFHeader*  gdef;
68
69  /* the next two fields are used for an alternate substitution callback
70     function to select the proper alternate glyph.                      */
71
72  void*            data;
73  HB_AltFunction  altfunc;
74
75  HB_UInt         offset;
76
77  HB_16Dot16         Version;
78
79  HB_ScriptList   ScriptList;
80  HB_FeatureList  FeatureList;
81  HB_LookupList   LookupList;
82};
83
84typedef struct HB_GSUBHeader_   HB_GSUBHeader;
85typedef HB_GSUBHeader*  HB_GSUB;
86
87
88HB_Error  HB_Load_GSUB_Table( HB_Stream       stream,
89			      HB_GSUBHeader** gsub,
90			      HB_GDEFHeader*  gdef,
91                              HB_Stream       gdefStream );
92
93
94HB_Error  HB_Done_GSUB_Table( HB_GSUBHeader*  gsub );
95
96
97HB_Error  HB_GSUB_Select_Script( HB_GSUBHeader*  gsub,
98				 HB_UInt         script_tag,
99				 HB_UShort*       script_index );
100
101HB_Error  HB_GSUB_Select_Language( HB_GSUBHeader*  gsub,
102				   HB_UInt         language_tag,
103				   HB_UShort        script_index,
104				   HB_UShort*       language_index,
105				   HB_UShort*       req_feature_index );
106
107HB_Error  HB_GSUB_Select_Feature( HB_GSUBHeader*  gsub,
108				  HB_UInt         feature_tag,
109				  HB_UShort        script_index,
110				  HB_UShort        language_index,
111				  HB_UShort*       feature_index );
112
113
114HB_Error  HB_GSUB_Query_Scripts( HB_GSUBHeader*  gsub,
115				 HB_UInt**       script_tag_list );
116
117HB_Error  HB_GSUB_Query_Languages( HB_GSUBHeader*  gsub,
118				   HB_UShort        script_index,
119				   HB_UInt**       language_tag_list );
120
121HB_Error  HB_GSUB_Query_Features( HB_GSUBHeader*  gsub,
122				  HB_UShort        script_index,
123				  HB_UShort        language_index,
124				  HB_UInt**       feature_tag_list );
125
126
127HB_Error  HB_GSUB_Add_Feature( HB_GSUBHeader*  gsub,
128			       HB_UShort        feature_index,
129			       HB_UInt          property );
130
131HB_Error  HB_GSUB_Clear_Features( HB_GSUBHeader*  gsub );
132
133
134HB_Error  HB_GSUB_Register_Alternate_Function( HB_GSUBHeader*  gsub,
135					       HB_AltFunction  altfunc,
136					       void*            data );
137
138
139HB_Error  HB_GSUB_Apply_String( HB_GSUBHeader*   gsub,
140				HB_Buffer        buffer );
141
142#ifdef HB_USE_PACKED_STRUCTS
143#pragma pack(pop)
144#endif
145
146HB_END_HEADER
147
148#endif /* HARFBUZZ_GSUB_H */
149