Upgrade to latest harfbuzz
[framework/uifw/harfbuzz.git] / src / hb-ot-shape-complex-private.hh
1 /*
2  * Copyright © 2010,2011,2012  Google, Inc.
3  *
4  *  This is part of HarfBuzz, a text shaping library.
5  *
6  * Permission is hereby granted, without written agreement and without
7  * license or royalty fees, to use, copy, modify, and distribute this
8  * software and its documentation for any purpose, provided that the
9  * above copyright notice and the following two paragraphs appear in
10  * all copies of this software.
11  *
12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16  * DAMAGE.
17  *
18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23  *
24  * Google Author(s): Behdad Esfahbod
25  */
26
27 #ifndef HB_OT_SHAPE_COMPLEX_PRIVATE_HH
28 #define HB_OT_SHAPE_COMPLEX_PRIVATE_HH
29
30 #include "hb-private.hh"
31
32 #include "hb-ot-map-private.hh"
33 #include "hb-ot-shape-normalize-private.hh"
34
35
36
37 /* buffer var allocations, used during the entire shaping process */
38 #define unicode_props0()        var1.u8[0]
39 #define unicode_props1()        var1.u8[1]
40
41 /* buffer var allocations, used during the GSUB/GPOS processing */
42 #define props_cache()           var1.u16[1] /* GSUB/GPOS glyph_props cache */
43 #define syllable()              var2.u8[0] /* GSUB/GPOS shaping boundaries */
44 #define lig_props()             var2.u8[1] /* GSUB/GPOS ligature tracking */
45
46 /* buffer var allocations, used by complex shapers */
47 #define complex_var_persistent_u8_0()   var2.u8[2]
48 #define complex_var_persistent_u8_1()   var2.u8[3]
49 #define complex_var_temporary_u8()      var2.u8[0]
50
51
52 #define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \
53   HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \
54   HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
55   HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
56   HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
57   HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
58   /* ^--- Add new shapers here */
59
60 enum hb_ot_complex_shaper_t {
61 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) hb_ot_complex_shaper_##name,
62   HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
63   /* Just here to avoid enum trailing comma: */
64   hb_ot_complex_shaper_generic = hb_ot_complex_shaper_default
65 #undef HB_COMPLEX_SHAPER_IMPLEMENT
66 };
67
68 static inline hb_ot_complex_shaper_t
69 hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
70 {
71   switch ((hb_tag_t) props->script)
72   {
73     default:
74       return hb_ot_complex_shaper_default;
75
76
77     /* Unicode-1.1 additions */
78     case HB_SCRIPT_ARABIC:
79     case HB_SCRIPT_MONGOLIAN:
80     case HB_SCRIPT_SYRIAC:
81
82     /* Unicode-5.0 additions */
83     case HB_SCRIPT_NKO:
84
85     /* Unicode-6.0 additions */
86     case HB_SCRIPT_MANDAIC:
87
88       return hb_ot_complex_shaper_arabic;
89
90
91     /* Unicode-1.1 additions */
92     case HB_SCRIPT_HANGUL:
93
94       return hb_ot_complex_shaper_hangul;
95
96
97     /* Unicode-1.1 additions */
98     case HB_SCRIPT_THAI:
99     case HB_SCRIPT_LAO:
100
101       return hb_ot_complex_shaper_thai;
102
103
104
105     /* ^--- Add new shapers here */
106
107
108 #if 0
109     /* Note:
110      *
111      * These disabled scripts are listed in ucd/IndicSyllabicCategory.txt, but according
112      * to Martin Hosken and Jonathan Kew do not require complex shaping.
113      *
114      * TODO We should automate figuring out which scripts do not need complex shaping
115      *
116      * TODO We currently keep data for these scripts in our indic table.  Need to fix the
117      * generator to not do that.
118      */
119
120
121     /* Simple? */
122
123     /* Unicode-3.2 additions */
124     case HB_SCRIPT_BUHID:
125     case HB_SCRIPT_HANUNOO:
126
127     /* Unicode-5.1 additions */
128     case HB_SCRIPT_SAURASHTRA:
129
130     /* Unicode-5.2 additions */
131     case HB_SCRIPT_MEETEI_MAYEK:
132
133     /* Unicode-6.0 additions */
134     case HB_SCRIPT_BATAK:
135     case HB_SCRIPT_BRAHMI:
136
137
138     /* Simple */
139
140     /* Unicode-1.1 additions */
141     /* These have their own shaper now. */
142     case HB_SCRIPT_LAO:
143     case HB_SCRIPT_THAI:
144
145     /* Unicode-2.0 additions */
146     case HB_SCRIPT_TIBETAN:
147
148     /* Unicode-3.2 additions */
149     case HB_SCRIPT_TAGALOG:
150     case HB_SCRIPT_TAGBANWA:
151
152     /* Unicode-4.0 additions */
153     case HB_SCRIPT_LIMBU:
154     case HB_SCRIPT_TAI_LE:
155
156     /* Unicode-4.1 additions */
157     case HB_SCRIPT_SYLOTI_NAGRI:
158
159     /* Unicode-5.0 additions */
160     case HB_SCRIPT_PHAGS_PA:
161
162     /* Unicode-5.1 additions */
163     case HB_SCRIPT_KAYAH_LI:
164
165     /* Unicode-5.2 additions */
166     case HB_SCRIPT_TAI_VIET:
167
168
169     /* May need Indic treatment in the future? */
170
171     /* Unicode-3.0 additions */
172     case HB_SCRIPT_MYANMAR:
173
174
175 #endif
176
177     /* Unicode-1.1 additions */
178     case HB_SCRIPT_BENGALI:
179     case HB_SCRIPT_DEVANAGARI:
180     case HB_SCRIPT_GUJARATI:
181     case HB_SCRIPT_GURMUKHI:
182     case HB_SCRIPT_KANNADA:
183     case HB_SCRIPT_MALAYALAM:
184     case HB_SCRIPT_ORIYA:
185     case HB_SCRIPT_TAMIL:
186     case HB_SCRIPT_TELUGU:
187
188     /* Unicode-3.0 additions */
189     case HB_SCRIPT_KHMER:
190     case HB_SCRIPT_SINHALA:
191
192     /* Unicode-4.1 additions */
193     case HB_SCRIPT_BUGINESE:
194     case HB_SCRIPT_KHAROSHTHI:
195     case HB_SCRIPT_NEW_TAI_LUE:
196
197     /* Unicode-5.0 additions */
198     case HB_SCRIPT_BALINESE:
199
200     /* Unicode-5.1 additions */
201     case HB_SCRIPT_CHAM:
202     case HB_SCRIPT_LEPCHA:
203     case HB_SCRIPT_REJANG:
204     case HB_SCRIPT_SUNDANESE:
205
206     /* Unicode-5.2 additions */
207     case HB_SCRIPT_JAVANESE:
208     case HB_SCRIPT_KAITHI:
209     case HB_SCRIPT_TAI_THAM:
210
211     /* Unicode-6.1 additions */
212     case HB_SCRIPT_CHAKMA:
213     case HB_SCRIPT_SHARADA:
214     case HB_SCRIPT_TAKRI:
215
216       return hb_ot_complex_shaper_indic;
217
218     /* ^--- Add new shapers here */
219   }
220 }
221
222
223
224 /*
225  * collect_features()
226  *
227  * Called during shape_plan().
228  *
229  * Shapers should use map to add their features and callbacks.
230  */
231
232 typedef void hb_ot_shape_complex_collect_features_func_t (hb_ot_map_builder_t *map, const hb_segment_properties_t  *props);
233 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
234   HB_INTERNAL hb_ot_shape_complex_collect_features_func_t _hb_ot_shape_complex_collect_features_##name;
235   HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
236 #undef HB_COMPLEX_SHAPER_IMPLEMENT
237
238 static inline void
239 hb_ot_shape_complex_collect_features (hb_ot_complex_shaper_t shaper,
240                                       hb_ot_map_builder_t *map,
241                                       const hb_segment_properties_t  *props)
242 {
243   switch (shaper) {
244     default:
245 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
246     case hb_ot_complex_shaper_##name:   _hb_ot_shape_complex_collect_features_##name (map, props); return;
247     HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
248 #undef HB_COMPLEX_SHAPER_IMPLEMENT
249   }
250 }
251
252
253 /*
254  * normalization_preference()
255  *
256  * Called during shape_execute().
257  *
258  * Shapers should return true if it prefers decomposed (NFD) input rather than precomposed (NFC).
259  */
260
261 typedef hb_ot_shape_normalization_mode_t hb_ot_shape_complex_normalization_preference_func_t (void);
262 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
263   HB_INTERNAL hb_ot_shape_complex_normalization_preference_func_t _hb_ot_shape_complex_normalization_preference_##name;
264   HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
265 #undef HB_COMPLEX_SHAPER_IMPLEMENT
266
267 static inline hb_ot_shape_normalization_mode_t
268 hb_ot_shape_complex_normalization_preference (hb_ot_complex_shaper_t shaper)
269 {
270   switch (shaper) {
271     default:
272 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
273     case hb_ot_complex_shaper_##name:   return _hb_ot_shape_complex_normalization_preference_##name ();
274     HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
275 #undef HB_COMPLEX_SHAPER_IMPLEMENT
276   }
277 }
278
279
280 /* setup_masks()
281  *
282  * Called during shape_execute().
283  *
284  * Shapers should use map to get feature masks and set on buffer.
285  */
286
287 typedef void hb_ot_shape_complex_setup_masks_func_t (hb_ot_map_t *map, hb_buffer_t *buffer, hb_font_t *font);
288 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
289   HB_INTERNAL hb_ot_shape_complex_setup_masks_func_t _hb_ot_shape_complex_setup_masks_##name;
290   HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
291 #undef HB_COMPLEX_SHAPER_IMPLEMENT
292
293 static inline void
294 hb_ot_shape_complex_setup_masks (hb_ot_complex_shaper_t shaper,
295                                  hb_ot_map_t *map,
296                                  hb_buffer_t *buffer,
297                                  hb_font_t *font)
298 {
299   switch (shaper) {
300     default:
301 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
302     case hb_ot_complex_shaper_##name:   _hb_ot_shape_complex_setup_masks_##name (map, buffer, font); return;
303     HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
304 #undef HB_COMPLEX_SHAPER_IMPLEMENT
305   }
306 }
307
308
309
310 #endif /* HB_OT_SHAPE_COMPLEX_PRIVATE_HH */