rustybuzz/hb/
ot_shape_complex_vowel_constraints.rs
1use 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 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}