/work/workdir/UnpackedTarball/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc
Line | Count | Source (jump to first uncovered line) |
1 | | /* == Start of generated functions == */ |
2 | | /* |
3 | | * The following functions are generated by running: |
4 | | * |
5 | | * ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt |
6 | | * |
7 | | * on files with these headers: |
8 | | * |
9 | | * # IndicShapingInvalidCluster.txt |
10 | | * # Date: 2015-03-12, 21:17:00 GMT [AG] |
11 | | * # Date: 2019-11-08, 23:22:00 GMT [AG] |
12 | | * |
13 | | * # Scripts-16.0.0.txt |
14 | | * # Date: 2024-04-30, 21:48:40 GMT |
15 | | */ |
16 | | |
17 | | #include "hb.hh" |
18 | | |
19 | | #ifndef HB_NO_OT_SHAPE |
20 | | |
21 | | #include "hb-ot-shaper-vowel-constraints.hh" |
22 | | |
23 | | static void |
24 | | _output_dotted_circle (hb_buffer_t *buffer) |
25 | 0 | { |
26 | 0 | (void) buffer->output_glyph (0x25CCu); |
27 | 0 | _hb_glyph_info_clear_continuation (&buffer->prev()); |
28 | 0 | } |
29 | | |
30 | | static void |
31 | | _output_with_dotted_circle (hb_buffer_t *buffer) |
32 | 0 | { |
33 | 0 | _output_dotted_circle (buffer); |
34 | 0 | (void) buffer->next_glyph (); |
35 | 0 | } |
36 | | |
37 | | void |
38 | | _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED, |
39 | | hb_buffer_t *buffer, |
40 | | hb_font_t *font HB_UNUSED) |
41 | 0 | { |
42 | | #ifdef HB_NO_OT_SHAPER_VOWEL_CONSTRAINTS |
43 | | return; |
44 | | #endif |
45 | 0 | if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) |
46 | 0 | return; |
47 | | |
48 | | /* UGLY UGLY UGLY business of adding dotted-circle in the middle of |
49 | | * vowel-sequences that look like another vowel. Data for each script |
50 | | * collected from the USE script development spec. |
51 | | * |
52 | | * https://github.com/harfbuzz/harfbuzz/issues/1019 |
53 | | */ |
54 | 0 | buffer->clear_output (); |
55 | 0 | unsigned int count = buffer->len; |
56 | 0 | switch ((unsigned) buffer->props.script) |
57 | 0 | { |
58 | 0 | case HB_SCRIPT_DEVANAGARI: |
59 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
60 | 0 | { |
61 | 0 | bool matched = false; |
62 | 0 | switch (buffer->cur ().codepoint) |
63 | 0 | { |
64 | 0 | case 0x0905u: |
65 | 0 | switch (buffer->cur (1).codepoint) |
66 | 0 | { |
67 | 0 | case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u: |
68 | 0 | case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu: |
69 | 0 | case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u: |
70 | 0 | matched = true; |
71 | 0 | break; |
72 | 0 | } |
73 | 0 | break; |
74 | 0 | case 0x0906u: |
75 | 0 | switch (buffer->cur (1).codepoint) |
76 | 0 | { |
77 | 0 | case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u: |
78 | 0 | case 0x0948u: |
79 | 0 | matched = true; |
80 | 0 | break; |
81 | 0 | } |
82 | 0 | break; |
83 | 0 | case 0x0909u: |
84 | 0 | matched = 0x0941u == buffer->cur (1).codepoint; |
85 | 0 | break; |
86 | 0 | case 0x090Fu: |
87 | 0 | switch (buffer->cur (1).codepoint) |
88 | 0 | { |
89 | 0 | case 0x0945u: case 0x0946u: case 0x0947u: |
90 | 0 | matched = true; |
91 | 0 | break; |
92 | 0 | } |
93 | 0 | break; |
94 | 0 | case 0x0930u: |
95 | 0 | if (0x094Du == buffer->cur (1).codepoint && |
96 | 0 | buffer->idx + 2 < count && |
97 | 0 | 0x0907u == buffer->cur (2).codepoint) |
98 | 0 | { |
99 | 0 | (void) buffer->next_glyph (); |
100 | 0 | matched = true; |
101 | 0 | } |
102 | 0 | break; |
103 | 0 | } |
104 | 0 | (void) buffer->next_glyph (); |
105 | 0 | if (matched) _output_with_dotted_circle (buffer); |
106 | 0 | } |
107 | 0 | break; |
108 | | |
109 | 0 | case HB_SCRIPT_BENGALI: |
110 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
111 | 0 | { |
112 | 0 | bool matched = false; |
113 | 0 | switch (buffer->cur ().codepoint) |
114 | 0 | { |
115 | 0 | case 0x0985u: |
116 | 0 | matched = 0x09BEu == buffer->cur (1).codepoint; |
117 | 0 | break; |
118 | 0 | case 0x098Bu: |
119 | 0 | matched = 0x09C3u == buffer->cur (1).codepoint; |
120 | 0 | break; |
121 | 0 | case 0x098Cu: |
122 | 0 | matched = 0x09E2u == buffer->cur (1).codepoint; |
123 | 0 | break; |
124 | 0 | } |
125 | 0 | (void) buffer->next_glyph (); |
126 | 0 | if (matched) _output_with_dotted_circle (buffer); |
127 | 0 | } |
128 | 0 | break; |
129 | | |
130 | 0 | case HB_SCRIPT_GURMUKHI: |
131 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
132 | 0 | { |
133 | 0 | bool matched = false; |
134 | 0 | switch (buffer->cur ().codepoint) |
135 | 0 | { |
136 | 0 | case 0x0A05u: |
137 | 0 | switch (buffer->cur (1).codepoint) |
138 | 0 | { |
139 | 0 | case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu: |
140 | 0 | matched = true; |
141 | 0 | break; |
142 | 0 | } |
143 | 0 | break; |
144 | 0 | case 0x0A72u: |
145 | 0 | switch (buffer->cur (1).codepoint) |
146 | 0 | { |
147 | 0 | case 0x0A3Fu: case 0x0A40u: case 0x0A47u: |
148 | 0 | matched = true; |
149 | 0 | break; |
150 | 0 | } |
151 | 0 | break; |
152 | 0 | case 0x0A73u: |
153 | 0 | switch (buffer->cur (1).codepoint) |
154 | 0 | { |
155 | 0 | case 0x0A41u: case 0x0A42u: case 0x0A4Bu: |
156 | 0 | matched = true; |
157 | 0 | break; |
158 | 0 | } |
159 | 0 | break; |
160 | 0 | } |
161 | 0 | (void) buffer->next_glyph (); |
162 | 0 | if (matched) _output_with_dotted_circle (buffer); |
163 | 0 | } |
164 | 0 | break; |
165 | | |
166 | 0 | case HB_SCRIPT_GUJARATI: |
167 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
168 | 0 | { |
169 | 0 | bool matched = false; |
170 | 0 | switch (buffer->cur ().codepoint) |
171 | 0 | { |
172 | 0 | case 0x0A85u: |
173 | 0 | switch (buffer->cur (1).codepoint) |
174 | 0 | { |
175 | 0 | case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u: |
176 | 0 | case 0x0AC9u: case 0x0ACBu: case 0x0ACCu: |
177 | 0 | matched = true; |
178 | 0 | break; |
179 | 0 | } |
180 | 0 | break; |
181 | 0 | case 0x0AC5u: |
182 | 0 | matched = 0x0ABEu == buffer->cur (1).codepoint; |
183 | 0 | break; |
184 | 0 | } |
185 | 0 | (void) buffer->next_glyph (); |
186 | 0 | if (matched) _output_with_dotted_circle (buffer); |
187 | 0 | } |
188 | 0 | break; |
189 | | |
190 | 0 | case HB_SCRIPT_ORIYA: |
191 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
192 | 0 | { |
193 | 0 | bool matched = false; |
194 | 0 | switch (buffer->cur ().codepoint) |
195 | 0 | { |
196 | 0 | case 0x0B05u: |
197 | 0 | matched = 0x0B3Eu == buffer->cur (1).codepoint; |
198 | 0 | break; |
199 | 0 | case 0x0B0Fu: case 0x0B13u: |
200 | 0 | matched = 0x0B57u == buffer->cur (1).codepoint; |
201 | 0 | break; |
202 | 0 | } |
203 | 0 | (void) buffer->next_glyph (); |
204 | 0 | if (matched) _output_with_dotted_circle (buffer); |
205 | 0 | } |
206 | 0 | break; |
207 | | |
208 | 0 | case HB_SCRIPT_TAMIL: |
209 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
210 | 0 | { |
211 | 0 | bool matched = false; |
212 | 0 | if (0x0B85u == buffer->cur ().codepoint && |
213 | 0 | 0x0BC2u == buffer->cur (1).codepoint) |
214 | 0 | { |
215 | 0 | matched = true; |
216 | 0 | } |
217 | 0 | (void) buffer->next_glyph (); |
218 | 0 | if (matched) _output_with_dotted_circle (buffer); |
219 | 0 | } |
220 | 0 | break; |
221 | | |
222 | 0 | case HB_SCRIPT_TELUGU: |
223 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
224 | 0 | { |
225 | 0 | bool matched = false; |
226 | 0 | switch (buffer->cur ().codepoint) |
227 | 0 | { |
228 | 0 | case 0x0C12u: |
229 | 0 | switch (buffer->cur (1).codepoint) |
230 | 0 | { |
231 | 0 | case 0x0C4Cu: case 0x0C55u: |
232 | 0 | matched = true; |
233 | 0 | break; |
234 | 0 | } |
235 | 0 | break; |
236 | 0 | case 0x0C3Fu: case 0x0C46u: case 0x0C4Au: |
237 | 0 | matched = 0x0C55u == buffer->cur (1).codepoint; |
238 | 0 | break; |
239 | 0 | } |
240 | 0 | (void) buffer->next_glyph (); |
241 | 0 | if (matched) _output_with_dotted_circle (buffer); |
242 | 0 | } |
243 | 0 | break; |
244 | | |
245 | 0 | case HB_SCRIPT_KANNADA: |
246 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
247 | 0 | { |
248 | 0 | bool matched = false; |
249 | 0 | switch (buffer->cur ().codepoint) |
250 | 0 | { |
251 | 0 | case 0x0C89u: case 0x0C8Bu: |
252 | 0 | matched = 0x0CBEu == buffer->cur (1).codepoint; |
253 | 0 | break; |
254 | 0 | case 0x0C92u: |
255 | 0 | matched = 0x0CCCu == buffer->cur (1).codepoint; |
256 | 0 | break; |
257 | 0 | } |
258 | 0 | (void) buffer->next_glyph (); |
259 | 0 | if (matched) _output_with_dotted_circle (buffer); |
260 | 0 | } |
261 | 0 | break; |
262 | | |
263 | 0 | case HB_SCRIPT_MALAYALAM: |
264 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
265 | 0 | { |
266 | 0 | bool matched = false; |
267 | 0 | switch (buffer->cur ().codepoint) |
268 | 0 | { |
269 | 0 | case 0x0D07u: case 0x0D09u: |
270 | 0 | matched = 0x0D57u == buffer->cur (1).codepoint; |
271 | 0 | break; |
272 | 0 | case 0x0D0Eu: |
273 | 0 | matched = 0x0D46u == buffer->cur (1).codepoint; |
274 | 0 | break; |
275 | 0 | case 0x0D12u: |
276 | 0 | switch (buffer->cur (1).codepoint) |
277 | 0 | { |
278 | 0 | case 0x0D3Eu: case 0x0D57u: |
279 | 0 | matched = true; |
280 | 0 | break; |
281 | 0 | } |
282 | 0 | break; |
283 | 0 | } |
284 | 0 | (void) buffer->next_glyph (); |
285 | 0 | if (matched) _output_with_dotted_circle (buffer); |
286 | 0 | } |
287 | 0 | break; |
288 | | |
289 | 0 | case HB_SCRIPT_SINHALA: |
290 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
291 | 0 | { |
292 | 0 | bool matched = false; |
293 | 0 | switch (buffer->cur ().codepoint) |
294 | 0 | { |
295 | 0 | case 0x0D85u: |
296 | 0 | switch (buffer->cur (1).codepoint) |
297 | 0 | { |
298 | 0 | case 0x0DCFu: case 0x0DD0u: case 0x0DD1u: |
299 | 0 | matched = true; |
300 | 0 | break; |
301 | 0 | } |
302 | 0 | break; |
303 | 0 | case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u: |
304 | 0 | matched = 0x0DDFu == buffer->cur (1).codepoint; |
305 | 0 | break; |
306 | 0 | case 0x0D8Du: |
307 | 0 | matched = 0x0DD8u == buffer->cur (1).codepoint; |
308 | 0 | break; |
309 | 0 | case 0x0D91u: |
310 | 0 | switch (buffer->cur (1).codepoint) |
311 | 0 | { |
312 | 0 | case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu: |
313 | 0 | case 0x0DDDu: case 0x0DDEu: |
314 | 0 | matched = true; |
315 | 0 | break; |
316 | 0 | } |
317 | 0 | break; |
318 | 0 | } |
319 | 0 | (void) buffer->next_glyph (); |
320 | 0 | if (matched) _output_with_dotted_circle (buffer); |
321 | 0 | } |
322 | 0 | break; |
323 | | |
324 | 0 | case HB_SCRIPT_BRAHMI: |
325 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
326 | 0 | { |
327 | 0 | bool matched = false; |
328 | 0 | switch (buffer->cur ().codepoint) |
329 | 0 | { |
330 | 0 | case 0x11005u: |
331 | 0 | matched = 0x11038u == buffer->cur (1).codepoint; |
332 | 0 | break; |
333 | 0 | case 0x1100Bu: |
334 | 0 | matched = 0x1103Eu == buffer->cur (1).codepoint; |
335 | 0 | break; |
336 | 0 | case 0x1100Fu: |
337 | 0 | matched = 0x11042u == buffer->cur (1).codepoint; |
338 | 0 | break; |
339 | 0 | } |
340 | 0 | (void) buffer->next_glyph (); |
341 | 0 | if (matched) _output_with_dotted_circle (buffer); |
342 | 0 | } |
343 | 0 | break; |
344 | | |
345 | 0 | case HB_SCRIPT_KHOJKI: |
346 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
347 | 0 | { |
348 | 0 | bool matched = false; |
349 | 0 | switch (buffer->cur ().codepoint) |
350 | 0 | { |
351 | 0 | case 0x11200u: |
352 | 0 | switch (buffer->cur (1).codepoint) |
353 | 0 | { |
354 | 0 | case 0x1122Cu: case 0x11231u: case 0x11233u: |
355 | 0 | matched = true; |
356 | 0 | break; |
357 | 0 | } |
358 | 0 | break; |
359 | 0 | case 0x11206u: |
360 | 0 | matched = 0x1122Cu == buffer->cur (1).codepoint; |
361 | 0 | break; |
362 | 0 | case 0x1122Cu: |
363 | 0 | switch (buffer->cur (1).codepoint) |
364 | 0 | { |
365 | 0 | case 0x11230u: case 0x11231u: |
366 | 0 | matched = true; |
367 | 0 | break; |
368 | 0 | } |
369 | 0 | break; |
370 | 0 | case 0x11240u: |
371 | 0 | matched = 0x1122Eu == buffer->cur (1).codepoint; |
372 | 0 | break; |
373 | 0 | } |
374 | 0 | (void) buffer->next_glyph (); |
375 | 0 | if (matched) _output_with_dotted_circle (buffer); |
376 | 0 | } |
377 | 0 | break; |
378 | | |
379 | 0 | case HB_SCRIPT_KHUDAWADI: |
380 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
381 | 0 | { |
382 | 0 | bool matched = false; |
383 | 0 | switch (buffer->cur ().codepoint) |
384 | 0 | { |
385 | 0 | case 0x112B0u: |
386 | 0 | switch (buffer->cur (1).codepoint) |
387 | 0 | { |
388 | 0 | case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u: |
389 | 0 | case 0x112E8u: |
390 | 0 | matched = true; |
391 | 0 | break; |
392 | 0 | } |
393 | 0 | break; |
394 | 0 | } |
395 | 0 | (void) buffer->next_glyph (); |
396 | 0 | if (matched) _output_with_dotted_circle (buffer); |
397 | 0 | } |
398 | 0 | break; |
399 | | |
400 | 0 | case HB_SCRIPT_TIRHUTA: |
401 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
402 | 0 | { |
403 | 0 | bool matched = false; |
404 | 0 | switch (buffer->cur ().codepoint) |
405 | 0 | { |
406 | 0 | case 0x11481u: |
407 | 0 | matched = 0x114B0u == buffer->cur (1).codepoint; |
408 | 0 | break; |
409 | 0 | case 0x1148Bu: case 0x1148Du: |
410 | 0 | matched = 0x114BAu == buffer->cur (1).codepoint; |
411 | 0 | break; |
412 | 0 | case 0x114AAu: |
413 | 0 | switch (buffer->cur (1).codepoint) |
414 | 0 | { |
415 | 0 | case 0x114B5u: case 0x114B6u: |
416 | 0 | matched = true; |
417 | 0 | break; |
418 | 0 | } |
419 | 0 | break; |
420 | 0 | } |
421 | 0 | (void) buffer->next_glyph (); |
422 | 0 | if (matched) _output_with_dotted_circle (buffer); |
423 | 0 | } |
424 | 0 | break; |
425 | | |
426 | 0 | case HB_SCRIPT_MODI: |
427 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
428 | 0 | { |
429 | 0 | bool matched = false; |
430 | 0 | switch (buffer->cur ().codepoint) |
431 | 0 | { |
432 | 0 | case 0x11600u: case 0x11601u: |
433 | 0 | switch (buffer->cur (1).codepoint) |
434 | 0 | { |
435 | 0 | case 0x11639u: case 0x1163Au: |
436 | 0 | matched = true; |
437 | 0 | break; |
438 | 0 | } |
439 | 0 | break; |
440 | 0 | } |
441 | 0 | (void) buffer->next_glyph (); |
442 | 0 | if (matched) _output_with_dotted_circle (buffer); |
443 | 0 | } |
444 | 0 | break; |
445 | | |
446 | 0 | case HB_SCRIPT_TAKRI: |
447 | 0 | for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;) |
448 | 0 | { |
449 | 0 | bool matched = false; |
450 | 0 | switch (buffer->cur ().codepoint) |
451 | 0 | { |
452 | 0 | case 0x11680u: |
453 | 0 | switch (buffer->cur (1).codepoint) |
454 | 0 | { |
455 | 0 | case 0x116ADu: case 0x116B4u: case 0x116B5u: |
456 | 0 | matched = true; |
457 | 0 | break; |
458 | 0 | } |
459 | 0 | break; |
460 | 0 | case 0x11686u: |
461 | 0 | matched = 0x116B2u == buffer->cur (1).codepoint; |
462 | 0 | break; |
463 | 0 | } |
464 | 0 | (void) buffer->next_glyph (); |
465 | 0 | if (matched) _output_with_dotted_circle (buffer); |
466 | 0 | } |
467 | 0 | break; |
468 | | |
469 | 0 | default: |
470 | 0 | break; |
471 | 0 | } |
472 | 0 | buffer->sync (); |
473 | 0 | } |
474 | | |
475 | | |
476 | | #endif |
477 | | /* == End of generated functions == */ |