blob: 6582d592f9c0604fb59273d2e321ad671a37f8c2 [file] [log] [blame]
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -04001/*
Behdad Esfahbod359dcaa2011-07-07 21:55:05 -04002 * Copyright © 2010,2011 Google, Inc.
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -04003 *
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
Behdad Esfahbodc57d4542011-04-20 18:50:27 -040030#include "hb-private.hh"
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -040031
Behdad Esfahbod76f76812011-07-07 22:25:25 -040032#include "hb-ot-map-private.hh"
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -040033
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -040034
35
Behdad Esfahbodb65c0602011-07-28 16:48:43 -040036/* buffer var allocations, used during the entire shaping process */
Behdad Esfahbod76f76812011-07-07 22:25:25 -040037#define general_category() var1.u8[0] /* unicode general_category (hb_unicode_general_category_t) */
38#define combining_class() var1.u8[1] /* unicode combining_class (uint8_t) */
39
Behdad Esfahbodb65c0602011-07-28 16:48:43 -040040/* buffer var allocations, used by complex shapers */
41#define complex_var_persistent_u8_0() var2.u8[0]
42#define complex_var_persistent_u8_1() var2.u8[1]
43#define complex_var_persistent_u16() var2.u16[0]
44#define complex_var_temporary_u8_0() var2.u8[2]
45#define complex_var_temporary_u8_1() var2.u8[3]
46#define complex_var_temporary_u16() var2.u16[1]
47
Behdad Esfahbod76f76812011-07-07 22:25:25 -040048
Behdad Esfahbodd05dded2011-07-07 23:42:40 -040049#define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \
50 HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \
51 HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
52 HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
53 /* ^--- Add new shapers here */
54
Behdad Esfahbod76f76812011-07-07 22:25:25 -040055enum hb_ot_complex_shaper_t {
Behdad Esfahbodd05dded2011-07-07 23:42:40 -040056#define HB_COMPLEX_SHAPER_IMPLEMENT(name) hb_ot_complex_shaper_##name,
57 HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
58#undef HB_COMPLEX_SHAPER_IMPLEMENT
Behdad Esfahbod76f76812011-07-07 22:25:25 -040059};
60
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -040061static inline hb_ot_complex_shaper_t
62hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
63{
Behdad Esfahbod62879ee2011-04-18 23:40:21 -040064 switch ((int) props->script)
65 {
Behdad Esfahbodd05dded2011-07-07 23:42:40 -040066 default:
67 return hb_ot_complex_shaper_default;
68
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -040069 case HB_SCRIPT_ARABIC:
Behdad Esfahbodb0e73782010-12-21 14:19:32 -050070 case HB_SCRIPT_MANDAIC:
Behdad Esfahbodd86a5b32010-12-21 18:36:25 -050071 case HB_SCRIPT_MONGOLIAN:
Behdad Esfahbodb9ddbd52011-06-02 17:43:12 -040072 case HB_SCRIPT_NKO:
73 case HB_SCRIPT_SYRIAC:
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -040074 return hb_ot_complex_shaper_arabic;
75
Behdad Esfahbodb9ddbd52011-06-02 17:43:12 -040076 /* TODO: These are all the scripts that the ucd/IndicSyllabicCategory.txt covers.
77 * Quite possibly many of these need no shaping, and some other are encoded visually.
78 * Needs to be refined.
79 */
80 case HB_SCRIPT_BALINESE:
81 case HB_SCRIPT_BATAK:
82 case HB_SCRIPT_BENGALI:
83 case HB_SCRIPT_BRAHMI:
84 case HB_SCRIPT_BUGINESE:
85 case HB_SCRIPT_BUHID:
86 case HB_SCRIPT_CHAM:
87 case HB_SCRIPT_DEVANAGARI:
88 case HB_SCRIPT_GUJARATI:
89 case HB_SCRIPT_GURMUKHI:
90 case HB_SCRIPT_HANUNOO:
91 case HB_SCRIPT_JAVANESE:
92 case HB_SCRIPT_KAITHI:
93 case HB_SCRIPT_KANNADA:
94 case HB_SCRIPT_KAYAH_LI:
95 case HB_SCRIPT_KHAROSHTHI:
96 case HB_SCRIPT_KHMER:
97 case HB_SCRIPT_LAO:
98 case HB_SCRIPT_LEPCHA:
99 case HB_SCRIPT_LIMBU:
100 case HB_SCRIPT_MALAYALAM:
101 case HB_SCRIPT_MEETEI_MAYEK:
102 case HB_SCRIPT_MYANMAR:
103 case HB_SCRIPT_NEW_TAI_LUE:
104 case HB_SCRIPT_ORIYA:
105 case HB_SCRIPT_PHAGS_PA:
106 case HB_SCRIPT_REJANG:
107 case HB_SCRIPT_SAURASHTRA:
108 case HB_SCRIPT_SINHALA:
109 case HB_SCRIPT_SUNDANESE:
110 case HB_SCRIPT_SYLOTI_NAGRI:
111 case HB_SCRIPT_TAGALOG:
112 case HB_SCRIPT_TAGBANWA:
113 case HB_SCRIPT_TAI_LE:
114 case HB_SCRIPT_TAI_THAM:
115 case HB_SCRIPT_TAI_VIET:
116 case HB_SCRIPT_TAMIL:
117 case HB_SCRIPT_TELUGU:
118 case HB_SCRIPT_THAI:
119 case HB_SCRIPT_TIBETAN:
120 return hb_ot_complex_shaper_indic;
121
Behdad Esfahbodd05dded2011-07-07 23:42:40 -0400122 /* ^--- Add new shapers here */
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -0400123 }
124}
125
126
127
128/*
129 * collect_features()
130 *
Behdad Esfahbod13403bc2010-10-12 17:23:54 -0400131 * Called during shape_plan().
132 *
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400133 * Shapers should use map to add their features and callbacks.
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -0400134 */
135
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400136typedef void hb_ot_shape_complex_collect_features_func_t (hb_ot_map_builder_t *map, const hb_segment_properties_t *props);
Behdad Esfahbodd05dded2011-07-07 23:42:40 -0400137#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
138 HB_INTERNAL hb_ot_shape_complex_collect_features_func_t _hb_ot_shape_complex_collect_features_##name;
139 HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
140#undef HB_COMPLEX_SHAPER_IMPLEMENT
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -0400141
142static inline void
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400143hb_ot_shape_complex_collect_features (hb_ot_complex_shaper_t shaper,
144 hb_ot_map_builder_t *map,
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -0400145 const hb_segment_properties_t *props)
146{
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400147 switch (shaper) {
Behdad Esfahbod3361c9a2011-07-07 22:35:17 -0400148 default:
Behdad Esfahbodd05dded2011-07-07 23:42:40 -0400149#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
Behdad Esfahbod02cdf742011-07-21 12:23:12 -0400150 case hb_ot_complex_shaper_##name: _hb_ot_shape_complex_collect_features_##name (map, props); return;
151 HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
152#undef HB_COMPLEX_SHAPER_IMPLEMENT
153 }
154}
155
156
157/*
158 * prefer_decomposed()
159 *
160 * Called during shape_execute().
161 *
162 * Shapers should return TRUE if it prefers decomposed (NFD) input rather than precomposed (NFC).
163 */
164
165typedef bool hb_ot_shape_complex_prefer_decomposed_func_t (void);
166#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
167 HB_INTERNAL hb_ot_shape_complex_prefer_decomposed_func_t _hb_ot_shape_complex_prefer_decomposed_##name;
168 HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
169#undef HB_COMPLEX_SHAPER_IMPLEMENT
170
171static inline bool
172hb_ot_shape_complex_prefer_decomposed (hb_ot_complex_shaper_t shaper)
173{
174 switch (shaper) {
175 default:
176#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
177 case hb_ot_complex_shaper_##name: return _hb_ot_shape_complex_prefer_decomposed_##name ();
Behdad Esfahbodd05dded2011-07-07 23:42:40 -0400178 HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
179#undef HB_COMPLEX_SHAPER_IMPLEMENT
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -0400180 }
181}
182
183
Behdad Esfahbod13403bc2010-10-12 17:23:54 -0400184/* setup_masks()
185 *
186 * Called during shape_execute().
187 *
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400188 * Shapers should use map to get feature masks and set on buffer.
Behdad Esfahbod13403bc2010-10-12 17:23:54 -0400189 */
190
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400191typedef void hb_ot_shape_complex_setup_masks_func_t (hb_ot_map_t *map, hb_buffer_t *buffer);
Behdad Esfahbodd05dded2011-07-07 23:42:40 -0400192#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
193 HB_INTERNAL hb_ot_shape_complex_setup_masks_func_t _hb_ot_shape_complex_setup_masks_##name;
194 HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
195#undef HB_COMPLEX_SHAPER_IMPLEMENT
Behdad Esfahbod13403bc2010-10-12 17:23:54 -0400196
197static inline void
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400198hb_ot_shape_complex_setup_masks (hb_ot_complex_shaper_t shaper,
199 hb_ot_map_t *map,
200 hb_buffer_t *buffer)
Behdad Esfahbod13403bc2010-10-12 17:23:54 -0400201{
Behdad Esfahbod76f76812011-07-07 22:25:25 -0400202 switch (shaper) {
Behdad Esfahbod3361c9a2011-07-07 22:35:17 -0400203 default:
Behdad Esfahbodd05dded2011-07-07 23:42:40 -0400204#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
Behdad Esfahbod02cdf742011-07-21 12:23:12 -0400205 case hb_ot_complex_shaper_##name: _hb_ot_shape_complex_setup_masks_##name (map, buffer); return;
Behdad Esfahbodd05dded2011-07-07 23:42:40 -0400206 HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
207#undef HB_COMPLEX_SHAPER_IMPLEMENT
Behdad Esfahbod13403bc2010-10-12 17:23:54 -0400208 }
209}
210
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -0400211
Behdad Esfahbod49baa1f2010-10-12 16:50:36 -0400212
213#endif /* HB_OT_SHAPE_COMPLEX_PRIVATE_HH */