1use super::buffer::*;
2use super::common::TagExt;
3use super::font_funcs::FontFuncsDispatch;
4use super::ot_shape::*;
5use super::ot_shape_normalize::*;
6use super::ot_shape_plan::hb_ot_shape_plan_t;
7use super::unicode::Codepoint;
8use super::{hb_tag_t, script, Direction, Script};
9use alloc::boxed::Box;
10use core::any::Any;
11
12impl GlyphInfo {
13 declare_buffer_var!(
14 u8,
15 2,
16 2,
17 OT_SHAPER_VAR_U8_CATEGORY_VAR,
18 ot_shaper_var_u8_category,
19 set_ot_shaper_var_u8_category
20 );
21 declare_buffer_var!(
22 u8,
23 2,
24 3,
25 OT_SHAPER_VAR_U8_AUXILIARY_VAR,
26 ot_shaper_var_u8_auxiliary,
27 set_ot_shaper_var_u8_auxiliary
28 );
29}
30
31pub const MAX_COMBINING_MARKS: usize = 32;
32
33pub type hb_ot_shape_zero_width_marks_type_t = u32;
34pub const HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE: u32 = 0;
35pub const HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY: u32 = 1;
36pub const HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE: u32 = 2;
37
38pub type DecomposeFn =
39 fn(&hb_ot_shape_normalize_context_t, Codepoint) -> Option<(Codepoint, Codepoint)>;
40pub type ComposeFn =
41 fn(&hb_ot_shape_normalize_context_t, Codepoint, Codepoint) -> Option<Codepoint>;
42
43pub const DEFAULT_SHAPER: hb_ot_shaper_t = hb_ot_shaper_t {
44 collect_features: None,
45 override_features: None,
46 create_data: None,
47 preprocess_text: None,
48 postprocess_glyphs: None,
49 normalization_preference: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO,
50 decompose: None,
51 compose: None,
52 setup_masks: None,
53 gpos_tag: None,
54 reorder_marks: None,
55 zero_width_marks: HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
56 fallback_position: true,
57};
58
59pub struct hb_ot_shaper_t {
60 pub collect_features: Option<fn(&mut hb_ot_shape_planner_t)>,
63
64 pub override_features: Option<fn(&mut hb_ot_shape_planner_t)>,
68
69 pub create_data: Option<fn(&hb_ot_shape_plan_t) -> Box<dyn Any + Send + Sync>>,
72
73 pub preprocess_text: Option<fn(&hb_ot_shape_plan_t, &mut FontFuncsDispatch, &mut hb_buffer_t)>,
76
77 pub postprocess_glyphs:
80 Option<fn(&hb_ot_shape_plan_t, &mut FontFuncsDispatch, &mut hb_buffer_t)>,
81
82 pub normalization_preference: hb_ot_shape_normalization_mode_t,
84
85 pub decompose: Option<DecomposeFn>,
87
88 pub compose: Option<ComposeFn>,
90
91 pub setup_masks: Option<fn(&hb_ot_shape_plan_t, &mut FontFuncsDispatch, &mut hb_buffer_t)>,
95
96 pub gpos_tag: Option<hb_tag_t>,
99
100 pub reorder_marks: Option<fn(&hb_ot_shape_plan_t, &mut hb_buffer_t, usize, usize)>,
103
104 pub zero_width_marks: hb_ot_shape_zero_width_marks_type_t,
106
107 pub fallback_position: bool,
109}
110
111pub const DUMBER_SHAPER: hb_ot_shaper_t = hb_ot_shaper_t {
114 collect_features: None,
115 override_features: None,
116 create_data: None,
117 preprocess_text: None,
118 postprocess_glyphs: None,
119 normalization_preference: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO,
120 decompose: None,
121 compose: None,
122 setup_masks: None,
123 gpos_tag: None,
124 reorder_marks: None,
125 zero_width_marks: HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
126 fallback_position: false,
127};
128
129pub fn hb_ot_shape_complex_categorize(
130 script: Script,
131 direction: Direction,
132 gsub_script: Option<hb_tag_t>,
133) -> &'static hb_ot_shaper_t {
134 match script {
135 script::ARABIC
137
138 | script::SYRIAC => {
140 if (gsub_script != Some(hb_tag_t::default_script()) || script == script::ARABIC)
147 && direction.is_horizontal()
148 {
149 &crate::hb::ot_shaper_arabic::ARABIC_SHAPER
150 } else {
151 &DEFAULT_SHAPER
152 }
153 }
154
155 script::THAI
157 | script::LAO => &crate::hb::ot_shaper_thai::THAI_SHAPER,
158
159 script::HANGUL => &crate::hb::ot_shaper_hangul::HANGUL_SHAPER,
161
162 script::HEBREW => &crate::hb::ot_shaper_hebrew::HEBREW_SHAPER,
164
165 script::BENGALI
167 | script::DEVANAGARI
168 | script::GUJARATI
169 | script::GURMUKHI
170 | script::KANNADA
171 | script::MALAYALAM
172 | script::ORIYA
173 | script::TAMIL
174 | script::TELUGU => {
175 if gsub_script == Some(hb_tag_t::default_script()) ||
181 gsub_script == Some(hb_tag_t::new(b"latn")) {
182 &DEFAULT_SHAPER
183 } else if gsub_script.is_some_and(|tag| tag.to_be_bytes()[3] == b'3') {
184 &crate::hb::ot_shaper_use::UNIVERSAL_SHAPER
185 } else {
186 &crate::hb::ot_shaper_indic::INDIC_SHAPER
187 }
188 }
189
190 script::KHMER => &crate::hb::ot_shaper_khmer::KHMER_SHAPER,
191
192 script::MYANMAR => {
193 if gsub_script == Some(hb_tag_t::default_script()) ||
201 gsub_script == Some(hb_tag_t::new(b"latn")) ||
202 gsub_script == Some(hb_tag_t::new(b"mymr"))
203 {
204 &DEFAULT_SHAPER
205 } else {
206 &crate::hb::ot_shaper_myanmar::MYANMAR_SHAPER
207 }
208 }
209
210 script::MYANMAR_ZAWGYI => &crate::hb::ot_shaper_myanmar::MYANMAR_ZAWGYI_SHAPER,
212
213 script::TIBETAN
215
216 | script::MONGOLIAN
218 | script::SINHALA
219
220 | script::BUHID
222 | script::HANUNOO
223 | script::TAGALOG
224 | script::TAGBANWA
225
226 | script::LIMBU
228 | script::TAI_LE
229
230 | script::BUGINESE
232 | script::KHAROSHTHI
233 | script::SYLOTI_NAGRI
234 | script::TIFINAGH
235
236 | script::BALINESE
238 | script::NKO
239 | script::PHAGS_PA
240
241 | script::CHAM
243 | script::KAYAH_LI
244 | script::LEPCHA
245 | script::REJANG
246 | script::SAURASHTRA
247 | script::SUNDANESE
248
249 | script::EGYPTIAN_HIEROGLYPHS
251 | script::JAVANESE
252 | script::KAITHI
253 | script::MEETEI_MAYEK
254 | script::TAI_THAM
255 | script::TAI_VIET
256
257 | script::BATAK
259 | script::BRAHMI
260 | script::MANDAIC
261
262 | script::CHAKMA
264 | script::MIAO
265 | script::SHARADA
266 | script::TAKRI
267
268 | script::DUPLOYAN
270 | script::GRANTHA
271 | script::KHOJKI
272 | script::KHUDAWADI
273 | script::MAHAJANI
274 | script::MANICHAEAN
275 | script::MODI
276 | script::PAHAWH_HMONG
277 | script::PSALTER_PAHLAVI
278 | script::SIDDHAM
279 | script::TIRHUTA
280
281 | script::AHOM
283 | script::MULTANI
284
285 | script::ADLAM
287 | script::BHAIKSUKI
288 | script::MARCHEN
289 | script::NEWA
290
291 | script::MASARAM_GONDI
293 | script::SOYOMBO
294 | script::ZANABAZAR_SQUARE
295
296 | script::DOGRA
298 | script::GUNJALA_GONDI
299 | script::HANIFI_ROHINGYA
300 | script::MAKASAR
301 | script::MEDEFAIDRIN
302 | script::OLD_SOGDIAN
303 | script::SOGDIAN
304
305 | script::ELYMAIC
307 | script::NANDINAGARI
308 | script::NYIAKENG_PUACHUE_HMONG
309 | script::WANCHO
310
311 | script::CHORASMIAN
313 | script::DIVES_AKURU
314 | script::KHITAN_SMALL_SCRIPT
315 | script::YEZIDI
316
317 | script::CYPRO_MINOAN
319 | script::OLD_UYGHUR
320 | script::TANGSA
321 | script::TOTO
322 | script::VITHKUQI
323
324 | script::KAWI
326 | script::NAG_MUNDARI
327
328 | script::GARAY
330 | script::GURUNG_KHEMA
331 | script::KIRAT_RAI
332 | script::OL_ONAL
333 | script::SUNUWAR
334 | script::TODHRI
335 | script::TULU_TIGALARI
336
337 | script::BERIA_ERFE
339 | script::SIDETIC
340 | script::TAI_YO
341 | script::TOLONG_SIKI
342
343 => {
344 if gsub_script == Some(hb_tag_t::default_script()) ||
350 gsub_script == Some(hb_tag_t::new(b"latn")) {
351 &DEFAULT_SHAPER
352 } else {
353 &crate::hb::ot_shaper_use::UNIVERSAL_SHAPER
354 }
355 }
356
357 _ => &DEFAULT_SHAPER
358 }
359}