rustybuzz/hb/
ot_shaper_vowel_constraints.rs

1// WARNING: this file was generated by scripts/gen-vowel-constraints.py
2
3#![allow(clippy::single_match)]
4
5use super::buffer::hb_buffer_t;
6use super::ot_layout::*;
7use super::script;
8use crate::BufferFlags;
9
10fn output_dotted_circle(buffer: &mut hb_buffer_t) {
11    buffer.output_glyph(0x25CC);
12    {
13        let out_idx = buffer.out_len - 1;
14        _hb_glyph_info_reset_continuation(&mut buffer.out_info_mut()[out_idx]);
15    }
16}
17
18fn output_with_dotted_circle(buffer: &mut hb_buffer_t) {
19    output_dotted_circle(buffer);
20    buffer.next_glyph();
21}
22
23pub fn preprocess_text_vowel_constraints(buffer: &mut hb_buffer_t) {
24    if buffer
25        .flags
26        .contains(BufferFlags::DO_NOT_INSERT_DOTTED_CIRCLE)
27    {
28        return;
29    }
30
31    // UGLY UGLY UGLY business of adding dotted-circle in the middle of
32    // vowel-sequences that look like another vowel.  Data for each script
33    // collected from the USE script development spec.
34    //
35    // https://github.com/harfbuzz/harfbuzz/issues/1019
36    buffer.clear_output();
37    match buffer.script {
38        Some(script::DEVANAGARI) => {
39            buffer.idx = 0;
40            while buffer.idx + 1 < buffer.len {
41                #[allow(unused_mut)]
42                let mut matched = false;
43                match buffer.cur(0).glyph_id {
44                    0x0905 => match buffer.cur(1).glyph_id {
45                        0x093A | 0x093B | 0x093E | 0x0945 | 0x0946 | 0x0949 | 0x094A | 0x094B
46                        | 0x094C | 0x094F | 0x0956 | 0x0957 => {
47                            matched = true;
48                        }
49                        _ => {}
50                    },
51                    0x0906 => match buffer.cur(1).glyph_id {
52                        0x093A | 0x0945 | 0x0946 | 0x0947 | 0x0948 => {
53                            matched = true;
54                        }
55                        _ => {}
56                    },
57                    0x0909 => {
58                        matched = 0x0941 == buffer.cur(1).glyph_id;
59                    }
60                    0x090F => match buffer.cur(1).glyph_id {
61                        0x0945 | 0x0946 | 0x0947 => {
62                            matched = true;
63                        }
64                        _ => {}
65                    },
66                    0x0930 => {
67                        if 0x094D == buffer.cur(1).glyph_id
68                            && buffer.idx + 2 < buffer.len
69                            && 0x0907 == buffer.cur(2).glyph_id
70                        {
71                            buffer.next_glyph();
72                            buffer.next_glyph();
73                            output_dotted_circle(buffer);
74                        }
75                    }
76                    _ => {}
77                }
78                buffer.next_glyph();
79                if matched {
80                    output_with_dotted_circle(buffer);
81                }
82            }
83        }
84
85        Some(script::BENGALI) => {
86            buffer.idx = 0;
87            while buffer.idx + 1 < buffer.len {
88                #[allow(unused_mut)]
89                let mut matched = false;
90                match buffer.cur(0).glyph_id {
91                    0x0985 => {
92                        matched = 0x09BE == buffer.cur(1).glyph_id;
93                    }
94                    0x098B => {
95                        matched = 0x09C3 == buffer.cur(1).glyph_id;
96                    }
97                    0x098C => {
98                        matched = 0x09E2 == buffer.cur(1).glyph_id;
99                    }
100                    _ => {}
101                }
102                buffer.next_glyph();
103                if matched {
104                    output_with_dotted_circle(buffer);
105                }
106            }
107        }
108
109        Some(script::GURMUKHI) => {
110            buffer.idx = 0;
111            while buffer.idx + 1 < buffer.len {
112                #[allow(unused_mut)]
113                let mut matched = false;
114                match buffer.cur(0).glyph_id {
115                    0x0A05 => match buffer.cur(1).glyph_id {
116                        0x0A3E | 0x0A48 | 0x0A4C => {
117                            matched = true;
118                        }
119                        _ => {}
120                    },
121                    0x0A72 => match buffer.cur(1).glyph_id {
122                        0x0A3F | 0x0A40 | 0x0A47 => {
123                            matched = true;
124                        }
125                        _ => {}
126                    },
127                    0x0A73 => match buffer.cur(1).glyph_id {
128                        0x0A41 | 0x0A42 | 0x0A4B => {
129                            matched = true;
130                        }
131                        _ => {}
132                    },
133                    _ => {}
134                }
135                buffer.next_glyph();
136                if matched {
137                    output_with_dotted_circle(buffer);
138                }
139            }
140        }
141
142        Some(script::GUJARATI) => {
143            buffer.idx = 0;
144            while buffer.idx + 1 < buffer.len {
145                #[allow(unused_mut)]
146                let mut matched = false;
147                match buffer.cur(0).glyph_id {
148                    0x0A85 => match buffer.cur(1).glyph_id {
149                        0x0ABE | 0x0AC5 | 0x0AC7 | 0x0AC8 | 0x0AC9 | 0x0ACB | 0x0ACC => {
150                            matched = true;
151                        }
152                        _ => {}
153                    },
154                    0x0AC5 => {
155                        matched = 0x0ABE == buffer.cur(1).glyph_id;
156                    }
157                    _ => {}
158                }
159                buffer.next_glyph();
160                if matched {
161                    output_with_dotted_circle(buffer);
162                }
163            }
164        }
165
166        Some(script::ORIYA) => {
167            buffer.idx = 0;
168            while buffer.idx + 1 < buffer.len {
169                #[allow(unused_mut)]
170                let mut matched = false;
171                match buffer.cur(0).glyph_id {
172                    0x0B05 => {
173                        matched = 0x0B3E == buffer.cur(1).glyph_id;
174                    }
175                    0x0B0F | 0x0B13 => {
176                        matched = 0x0B57 == buffer.cur(1).glyph_id;
177                    }
178                    _ => {}
179                }
180                buffer.next_glyph();
181                if matched {
182                    output_with_dotted_circle(buffer);
183                }
184            }
185        }
186
187        Some(script::TAMIL) => {
188            buffer.idx = 0;
189            while buffer.idx + 1 < buffer.len {
190                #[allow(unused_mut)]
191                let mut matched = false;
192                if 0x0B85 == buffer.cur(0).glyph_id && 0x0BC2 == buffer.cur(1).glyph_id {
193                    buffer.next_glyph();
194                    output_dotted_circle(buffer);
195                }
196                buffer.next_glyph();
197                if matched {
198                    output_with_dotted_circle(buffer);
199                }
200            }
201        }
202
203        Some(script::TELUGU) => {
204            buffer.idx = 0;
205            while buffer.idx + 1 < buffer.len {
206                #[allow(unused_mut)]
207                let mut matched = false;
208                match buffer.cur(0).glyph_id {
209                    0x0C12 => match buffer.cur(1).glyph_id {
210                        0x0C4C | 0x0C55 => {
211                            matched = true;
212                        }
213                        _ => {}
214                    },
215                    0x0C3F | 0x0C46 | 0x0C4A => {
216                        matched = 0x0C55 == buffer.cur(1).glyph_id;
217                    }
218                    _ => {}
219                }
220                buffer.next_glyph();
221                if matched {
222                    output_with_dotted_circle(buffer);
223                }
224            }
225        }
226
227        Some(script::KANNADA) => {
228            buffer.idx = 0;
229            while buffer.idx + 1 < buffer.len {
230                #[allow(unused_mut)]
231                let mut matched = false;
232                match buffer.cur(0).glyph_id {
233                    0x0C89 | 0x0C8B => {
234                        matched = 0x0CBE == buffer.cur(1).glyph_id;
235                    }
236                    0x0C92 => {
237                        matched = 0x0CCC == buffer.cur(1).glyph_id;
238                    }
239                    _ => {}
240                }
241                buffer.next_glyph();
242                if matched {
243                    output_with_dotted_circle(buffer);
244                }
245            }
246        }
247
248        Some(script::MALAYALAM) => {
249            buffer.idx = 0;
250            while buffer.idx + 1 < buffer.len {
251                #[allow(unused_mut)]
252                let mut matched = false;
253                match buffer.cur(0).glyph_id {
254                    0x0D07 | 0x0D09 => {
255                        matched = 0x0D57 == buffer.cur(1).glyph_id;
256                    }
257                    0x0D0E => {
258                        matched = 0x0D46 == buffer.cur(1).glyph_id;
259                    }
260                    0x0D12 => match buffer.cur(1).glyph_id {
261                        0x0D3E | 0x0D57 => {
262                            matched = true;
263                        }
264                        _ => {}
265                    },
266                    _ => {}
267                }
268                buffer.next_glyph();
269                if matched {
270                    output_with_dotted_circle(buffer);
271                }
272            }
273        }
274
275        Some(script::SINHALA) => {
276            buffer.idx = 0;
277            while buffer.idx + 1 < buffer.len {
278                #[allow(unused_mut)]
279                let mut matched = false;
280                match buffer.cur(0).glyph_id {
281                    0x0D85 => match buffer.cur(1).glyph_id {
282                        0x0DCF | 0x0DD0 | 0x0DD1 => {
283                            matched = true;
284                        }
285                        _ => {}
286                    },
287                    0x0D8B | 0x0D8F | 0x0D94 => {
288                        matched = 0x0DDF == buffer.cur(1).glyph_id;
289                    }
290                    0x0D8D => {
291                        matched = 0x0DD8 == buffer.cur(1).glyph_id;
292                    }
293                    0x0D91 => match buffer.cur(1).glyph_id {
294                        0x0DCA | 0x0DD9 | 0x0DDA | 0x0DDC | 0x0DDD | 0x0DDE => {
295                            matched = true;
296                        }
297                        _ => {}
298                    },
299                    _ => {}
300                }
301                buffer.next_glyph();
302                if matched {
303                    output_with_dotted_circle(buffer);
304                }
305            }
306        }
307
308        Some(script::BRAHMI) => {
309            buffer.idx = 0;
310            while buffer.idx + 1 < buffer.len {
311                #[allow(unused_mut)]
312                let mut matched = false;
313                match buffer.cur(0).glyph_id {
314                    0x11005 => {
315                        matched = 0x11038 == buffer.cur(1).glyph_id;
316                    }
317                    0x1100B => {
318                        matched = 0x1103E == buffer.cur(1).glyph_id;
319                    }
320                    0x1100F => {
321                        matched = 0x11042 == buffer.cur(1).glyph_id;
322                    }
323                    _ => {}
324                }
325                buffer.next_glyph();
326                if matched {
327                    output_with_dotted_circle(buffer);
328                }
329            }
330        }
331
332        Some(script::KHOJKI) => {
333            buffer.idx = 0;
334            while buffer.idx + 1 < buffer.len {
335                #[allow(unused_mut)]
336                let mut matched = false;
337                match buffer.cur(0).glyph_id {
338                    0x11200 => match buffer.cur(1).glyph_id {
339                        0x1122C | 0x11231 | 0x11233 => {
340                            matched = true;
341                        }
342                        _ => {}
343                    },
344                    0x11206 => {
345                        matched = 0x1122C == buffer.cur(1).glyph_id;
346                    }
347                    0x1122C => match buffer.cur(1).glyph_id {
348                        0x11230 | 0x11231 => {
349                            matched = true;
350                        }
351                        _ => {}
352                    },
353                    0x11240 => {
354                        matched = 0x1122E == buffer.cur(1).glyph_id;
355                    }
356                    _ => {}
357                }
358                buffer.next_glyph();
359                if matched {
360                    output_with_dotted_circle(buffer);
361                }
362            }
363        }
364
365        Some(script::KHUDAWADI) => {
366            buffer.idx = 0;
367            while buffer.idx + 1 < buffer.len {
368                #[allow(unused_mut)]
369                let mut matched = false;
370                match buffer.cur(0).glyph_id {
371                    0x112B0 => match buffer.cur(1).glyph_id {
372                        0x112E0 | 0x112E5 | 0x112E6 | 0x112E7 | 0x112E8 => {
373                            matched = true;
374                        }
375                        _ => {}
376                    },
377                    _ => {}
378                }
379                buffer.next_glyph();
380                if matched {
381                    output_with_dotted_circle(buffer);
382                }
383            }
384        }
385
386        Some(script::TIRHUTA) => {
387            buffer.idx = 0;
388            while buffer.idx + 1 < buffer.len {
389                #[allow(unused_mut)]
390                let mut matched = false;
391                match buffer.cur(0).glyph_id {
392                    0x11481 => {
393                        matched = 0x114B0 == buffer.cur(1).glyph_id;
394                    }
395                    0x1148B | 0x1148D => {
396                        matched = 0x114BA == buffer.cur(1).glyph_id;
397                    }
398                    0x114AA => match buffer.cur(1).glyph_id {
399                        0x114B5 | 0x114B6 => {
400                            matched = true;
401                        }
402                        _ => {}
403                    },
404                    _ => {}
405                }
406                buffer.next_glyph();
407                if matched {
408                    output_with_dotted_circle(buffer);
409                }
410            }
411        }
412
413        Some(script::MODI) => {
414            buffer.idx = 0;
415            while buffer.idx + 1 < buffer.len {
416                #[allow(unused_mut)]
417                let mut matched = false;
418                match buffer.cur(0).glyph_id {
419                    0x11600 | 0x11601 => match buffer.cur(1).glyph_id {
420                        0x11639 | 0x1163A => {
421                            matched = true;
422                        }
423                        _ => {}
424                    },
425                    _ => {}
426                }
427                buffer.next_glyph();
428                if matched {
429                    output_with_dotted_circle(buffer);
430                }
431            }
432        }
433
434        Some(script::TAKRI) => {
435            buffer.idx = 0;
436            while buffer.idx + 1 < buffer.len {
437                #[allow(unused_mut)]
438                let mut matched = false;
439                match buffer.cur(0).glyph_id {
440                    0x11680 => match buffer.cur(1).glyph_id {
441                        0x116AD | 0x116B4 | 0x116B5 => {
442                            matched = true;
443                        }
444                        _ => {}
445                    },
446                    0x11686 => {
447                        matched = 0x116B2 == buffer.cur(1).glyph_id;
448                    }
449                    _ => {}
450                }
451                buffer.next_glyph();
452                if matched {
453                    output_with_dotted_circle(buffer);
454                }
455            }
456        }
457
458        _ => {}
459    }
460    buffer.sync();
461}