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-13.0.0.txt
14 * # Date: 2020-01-22, 00:07:43 GMT
19 #ifndef HB_NO_OT_SHAPE
21 #include "hb-ot-shape-complex-vowel-constraints.hh"
24 _output_dotted_circle (hb_buffer_t *buffer)
26 hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
27 _hb_glyph_info_reset_continuation (&dottedcircle);
31 _output_with_dotted_circle (hb_buffer_t *buffer)
33 _output_dotted_circle (buffer);
34 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_SHAPE_COMPLEX_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 bool processed = false;
55 buffer->clear_output ();
56 unsigned int count = buffer->len;
57 switch ((unsigned) buffer->props.script)
59 case HB_SCRIPT_DEVANAGARI:
60 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
63 switch (buffer->cur ().codepoint)
66 switch (buffer->cur (1).codepoint)
68 case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
69 case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
70 case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
76 switch (buffer->cur (1).codepoint)
78 case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
85 matched = 0x0941u == buffer->cur (1).codepoint;
88 switch (buffer->cur (1).codepoint)
90 case 0x0945u: case 0x0946u: case 0x0947u:
96 if (0x094Du == buffer->cur (1).codepoint &&
97 buffer->idx + 2 < count &&
98 0x0907u == buffer->cur (2).codepoint)
100 buffer->next_glyph ();
105 buffer->next_glyph ();
106 if (matched) _output_with_dotted_circle (buffer);
111 case HB_SCRIPT_BENGALI:
112 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
114 bool matched = false;
115 switch (buffer->cur ().codepoint)
118 matched = 0x09BEu == buffer->cur (1).codepoint;
121 matched = 0x09C3u == buffer->cur (1).codepoint;
124 matched = 0x09E2u == buffer->cur (1).codepoint;
127 buffer->next_glyph ();
128 if (matched) _output_with_dotted_circle (buffer);
133 case HB_SCRIPT_GURMUKHI:
134 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
136 bool matched = false;
137 switch (buffer->cur ().codepoint)
140 switch (buffer->cur (1).codepoint)
142 case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
148 switch (buffer->cur (1).codepoint)
150 case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
156 switch (buffer->cur (1).codepoint)
158 case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
164 buffer->next_glyph ();
165 if (matched) _output_with_dotted_circle (buffer);
170 case HB_SCRIPT_GUJARATI:
171 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
173 bool matched = false;
174 switch (buffer->cur ().codepoint)
177 switch (buffer->cur (1).codepoint)
179 case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
180 case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
186 matched = 0x0ABEu == buffer->cur (1).codepoint;
189 buffer->next_glyph ();
190 if (matched) _output_with_dotted_circle (buffer);
195 case HB_SCRIPT_ORIYA:
196 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
198 bool matched = false;
199 switch (buffer->cur ().codepoint)
202 matched = 0x0B3Eu == buffer->cur (1).codepoint;
204 case 0x0B0Fu: case 0x0B13u:
205 matched = 0x0B57u == buffer->cur (1).codepoint;
208 buffer->next_glyph ();
209 if (matched) _output_with_dotted_circle (buffer);
214 case HB_SCRIPT_TAMIL:
215 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
217 bool matched = false;
218 if (0x0B85u == buffer->cur ().codepoint &&
219 0x0BC2u == buffer->cur (1).codepoint)
223 buffer->next_glyph ();
224 if (matched) _output_with_dotted_circle (buffer);
229 case HB_SCRIPT_TELUGU:
230 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
232 bool matched = false;
233 switch (buffer->cur ().codepoint)
236 switch (buffer->cur (1).codepoint)
238 case 0x0C4Cu: case 0x0C55u:
243 case 0x0C3Fu: case 0x0C46u: case 0x0C4Au:
244 matched = 0x0C55u == buffer->cur (1).codepoint;
247 buffer->next_glyph ();
248 if (matched) _output_with_dotted_circle (buffer);
253 case HB_SCRIPT_KANNADA:
254 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
256 bool matched = false;
257 switch (buffer->cur ().codepoint)
259 case 0x0C89u: case 0x0C8Bu:
260 matched = 0x0CBEu == buffer->cur (1).codepoint;
263 matched = 0x0CCCu == buffer->cur (1).codepoint;
266 buffer->next_glyph ();
267 if (matched) _output_with_dotted_circle (buffer);
272 case HB_SCRIPT_MALAYALAM:
273 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
275 bool matched = false;
276 switch (buffer->cur ().codepoint)
278 case 0x0D07u: case 0x0D09u:
279 matched = 0x0D57u == buffer->cur (1).codepoint;
282 matched = 0x0D46u == buffer->cur (1).codepoint;
285 switch (buffer->cur (1).codepoint)
287 case 0x0D3Eu: case 0x0D57u:
293 buffer->next_glyph ();
294 if (matched) _output_with_dotted_circle (buffer);
299 case HB_SCRIPT_SINHALA:
300 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
302 bool matched = false;
303 switch (buffer->cur ().codepoint)
306 switch (buffer->cur (1).codepoint)
308 case 0x0DCFu: case 0x0DD0u: case 0x0DD1u:
313 case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u:
314 matched = 0x0DDFu == buffer->cur (1).codepoint;
317 matched = 0x0DD8u == buffer->cur (1).codepoint;
320 switch (buffer->cur (1).codepoint)
322 case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
329 buffer->next_glyph ();
330 if (matched) _output_with_dotted_circle (buffer);
335 case HB_SCRIPT_BRAHMI:
336 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
338 bool matched = false;
339 switch (buffer->cur ().codepoint)
342 matched = 0x11038u == buffer->cur (1).codepoint;
345 matched = 0x1103Eu == buffer->cur (1).codepoint;
348 matched = 0x11042u == buffer->cur (1).codepoint;
351 buffer->next_glyph ();
352 if (matched) _output_with_dotted_circle (buffer);
357 case HB_SCRIPT_KHUDAWADI:
358 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
360 bool matched = false;
361 switch (buffer->cur ().codepoint)
364 switch (buffer->cur (1).codepoint)
366 case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u:
373 buffer->next_glyph ();
374 if (matched) _output_with_dotted_circle (buffer);
379 case HB_SCRIPT_TIRHUTA:
380 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
382 bool matched = false;
383 switch (buffer->cur ().codepoint)
386 matched = 0x114B0u == buffer->cur (1).codepoint;
388 case 0x1148Bu: case 0x1148Du:
389 matched = 0x114BAu == buffer->cur (1).codepoint;
392 switch (buffer->cur (1).codepoint)
394 case 0x114B5u: case 0x114B6u:
400 buffer->next_glyph ();
401 if (matched) _output_with_dotted_circle (buffer);
407 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
409 bool matched = false;
410 switch (buffer->cur ().codepoint)
412 case 0x11600u: case 0x11601u:
413 switch (buffer->cur (1).codepoint)
415 case 0x11639u: case 0x1163Au:
421 buffer->next_glyph ();
422 if (matched) _output_with_dotted_circle (buffer);
427 case HB_SCRIPT_TAKRI:
428 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
430 bool matched = false;
431 switch (buffer->cur ().codepoint)
434 switch (buffer->cur (1).codepoint)
436 case 0x116ADu: case 0x116B4u: case 0x116B5u:
442 matched = 0x116B2u == buffer->cur (1).codepoint;
445 buffer->next_glyph ();
446 if (matched) _output_with_dotted_circle (buffer);
456 if (buffer->idx < count)
457 buffer->next_glyph ();
458 buffer->swap_buffers ();
464 /* == End of generated functions == */