rustybuzz/hb/
ot_shape_complex_vowel_constraints.rs

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