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(glyph_index:0x25CC);
12 {
13 let out_idx: usize = 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}
462