1 /* == Start of generated functions == */
3 * The following functions are generated by running:
5 * ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt
7 * on files with these headers:
9 * # IndicShapingInvalidCluster.txt
10 * # Date: 2015-03-12, 21:17:00 GMT [AG]
11 * # Date: 2019-11-08, 23:22:00 GMT [AG]
13 * # Scripts-15.1.0.txt
14 * # Date: 2023-07-28, 16:01:07 GMT
19 #ifndef HB_NO_OT_SHAPE
21 #include "hb-ot-shaper-vowel-constraints.hh"
24 _output_dotted_circle (hb_buffer_t *buffer)
26 (void) buffer->output_glyph (0x25CCu);
27 _hb_glyph_info_reset_continuation (&buffer->prev());
31 _output_with_dotted_circle (hb_buffer_t *buffer)
33 _output_dotted_circle (buffer);
34 (void) buffer->next_glyph ();
38 _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
40 hb_font_t *font HB_UNUSED)
42 #ifdef HB_NO_OT_SHAPER_VOWEL_CONSTRAINTS
45 if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)
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.
52 * https://github.com/harfbuzz/harfbuzz/issues/1019
54 buffer->clear_output ();
55 unsigned int count = buffer->len;
56 switch ((unsigned) buffer->props.script)
58 case HB_SCRIPT_DEVANAGARI:
59 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
62 switch (buffer->cur ().codepoint)
65 switch (buffer->cur (1).codepoint)
67 case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
68 case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
69 case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
75 switch (buffer->cur (1).codepoint)
77 case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
84 matched = 0x0941u == buffer->cur (1).codepoint;
87 switch (buffer->cur (1).codepoint)
89 case 0x0945u: case 0x0946u: case 0x0947u:
95 if (0x094Du == buffer->cur (1).codepoint &&
96 buffer->idx + 2 < count &&
97 0x0907u == buffer->cur (2).codepoint)
99 (void) buffer->next_glyph ();
104 (void) buffer->next_glyph ();
105 if (matched) _output_with_dotted_circle (buffer);
109 case HB_SCRIPT_BENGALI:
110 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
112 bool matched = false;
113 switch (buffer->cur ().codepoint)
116 matched = 0x09BEu == buffer->cur (1).codepoint;
119 matched = 0x09C3u == buffer->cur (1).codepoint;
122 matched = 0x09E2u == buffer->cur (1).codepoint;
125 (void) buffer->next_glyph ();
126 if (matched) _output_with_dotted_circle (buffer);
130 case HB_SCRIPT_GURMUKHI:
131 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
133 bool matched = false;
134 switch (buffer->cur ().codepoint)
137 switch (buffer->cur (1).codepoint)
139 case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
145 switch (buffer->cur (1).codepoint)
147 case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
153 switch (buffer->cur (1).codepoint)
155 case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
161 (void) buffer->next_glyph ();
162 if (matched) _output_with_dotted_circle (buffer);
166 case HB_SCRIPT_GUJARATI:
167 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
169 bool matched = false;
170 switch (buffer->cur ().codepoint)
173 switch (buffer->cur (1).codepoint)
175 case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
176 case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
182 matched = 0x0ABEu == buffer->cur (1).codepoint;
185 (void) buffer->next_glyph ();
186 if (matched) _output_with_dotted_circle (buffer);
190 case HB_SCRIPT_ORIYA:
191 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
193 bool matched = false;
194 switch (buffer->cur ().codepoint)
197 matched = 0x0B3Eu == buffer->cur (1).codepoint;
199 case 0x0B0Fu: case 0x0B13u:
200 matched = 0x0B57u == buffer->cur (1).codepoint;
203 (void) buffer->next_glyph ();
204 if (matched) _output_with_dotted_circle (buffer);
208 case HB_SCRIPT_TAMIL:
209 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
211 bool matched = false;
212 if (0x0B85u == buffer->cur ().codepoint &&
213 0x0BC2u == buffer->cur (1).codepoint)
217 (void) buffer->next_glyph ();
218 if (matched) _output_with_dotted_circle (buffer);
222 case HB_SCRIPT_TELUGU:
223 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
225 bool matched = false;
226 switch (buffer->cur ().codepoint)
229 switch (buffer->cur (1).codepoint)
231 case 0x0C4Cu: case 0x0C55u:
236 case 0x0C3Fu: case 0x0C46u: case 0x0C4Au:
237 matched = 0x0C55u == buffer->cur (1).codepoint;
240 (void) buffer->next_glyph ();
241 if (matched) _output_with_dotted_circle (buffer);
245 case HB_SCRIPT_KANNADA:
246 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
248 bool matched = false;
249 switch (buffer->cur ().codepoint)
251 case 0x0C89u: case 0x0C8Bu:
252 matched = 0x0CBEu == buffer->cur (1).codepoint;
255 matched = 0x0CCCu == buffer->cur (1).codepoint;
258 (void) buffer->next_glyph ();
259 if (matched) _output_with_dotted_circle (buffer);
263 case HB_SCRIPT_MALAYALAM:
264 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
266 bool matched = false;
267 switch (buffer->cur ().codepoint)
269 case 0x0D07u: case 0x0D09u:
270 matched = 0x0D57u == buffer->cur (1).codepoint;
273 matched = 0x0D46u == buffer->cur (1).codepoint;
276 switch (buffer->cur (1).codepoint)
278 case 0x0D3Eu: case 0x0D57u:
284 (void) buffer->next_glyph ();
285 if (matched) _output_with_dotted_circle (buffer);
289 case HB_SCRIPT_SINHALA:
290 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
292 bool matched = false;
293 switch (buffer->cur ().codepoint)
296 switch (buffer->cur (1).codepoint)
298 case 0x0DCFu: case 0x0DD0u: case 0x0DD1u:
303 case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u:
304 matched = 0x0DDFu == buffer->cur (1).codepoint;
307 matched = 0x0DD8u == buffer->cur (1).codepoint;
310 switch (buffer->cur (1).codepoint)
312 case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
313 case 0x0DDDu: case 0x0DDEu:
319 (void) buffer->next_glyph ();
320 if (matched) _output_with_dotted_circle (buffer);
324 case HB_SCRIPT_BRAHMI:
325 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
327 bool matched = false;
328 switch (buffer->cur ().codepoint)
331 matched = 0x11038u == buffer->cur (1).codepoint;
334 matched = 0x1103Eu == buffer->cur (1).codepoint;
337 matched = 0x11042u == buffer->cur (1).codepoint;
340 (void) buffer->next_glyph ();
341 if (matched) _output_with_dotted_circle (buffer);
345 case HB_SCRIPT_KHOJKI:
346 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
348 bool matched = false;
349 switch (buffer->cur ().codepoint)
352 switch (buffer->cur (1).codepoint)
354 case 0x1122Cu: case 0x11231u: case 0x11233u:
360 matched = 0x1122Cu == buffer->cur (1).codepoint;
363 switch (buffer->cur (1).codepoint)
365 case 0x11230u: case 0x11231u:
371 matched = 0x1122Eu == buffer->cur (1).codepoint;
374 (void) buffer->next_glyph ();
375 if (matched) _output_with_dotted_circle (buffer);
379 case HB_SCRIPT_KHUDAWADI:
380 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
382 bool matched = false;
383 switch (buffer->cur ().codepoint)
386 switch (buffer->cur (1).codepoint)
388 case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u:
395 (void) buffer->next_glyph ();
396 if (matched) _output_with_dotted_circle (buffer);
400 case HB_SCRIPT_TIRHUTA:
401 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
403 bool matched = false;
404 switch (buffer->cur ().codepoint)
407 matched = 0x114B0u == buffer->cur (1).codepoint;
409 case 0x1148Bu: case 0x1148Du:
410 matched = 0x114BAu == buffer->cur (1).codepoint;
413 switch (buffer->cur (1).codepoint)
415 case 0x114B5u: case 0x114B6u:
421 (void) buffer->next_glyph ();
422 if (matched) _output_with_dotted_circle (buffer);
427 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
429 bool matched = false;
430 switch (buffer->cur ().codepoint)
432 case 0x11600u: case 0x11601u:
433 switch (buffer->cur (1).codepoint)
435 case 0x11639u: case 0x1163Au:
441 (void) buffer->next_glyph ();
442 if (matched) _output_with_dotted_circle (buffer);
446 case HB_SCRIPT_TAKRI:
447 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
449 bool matched = false;
450 switch (buffer->cur ().codepoint)
453 switch (buffer->cur (1).codepoint)
455 case 0x116ADu: case 0x116B4u: case 0x116B5u:
461 matched = 0x116B2u == buffer->cur (1).codepoint;
464 (void) buffer->next_glyph ();
465 if (matched) _output_with_dotted_circle (buffer);
477 /* == End of generated functions == */