1 | // WARNING: this file was generated by scripts/gen-vowel-constraints.py |
2 | |
3 | #![allow (clippy::single_match)] |
4 | |
5 | use super::buffer::hb_buffer_t; |
6 | use super::ot_layout::*; |
7 | use super::script; |
8 | use crate::BufferFlags; |
9 | |
10 | fn 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 | |
18 | fn output_with_dotted_circle(buffer: &mut hb_buffer_t) { |
19 | output_dotted_circle(buffer); |
20 | buffer.next_glyph(); |
21 | } |
22 | |
23 | pub 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 | |