1 /* == Start of generated functions == */
3 * The following functions are generated by running:
5 * ./gen-vowel-constraints.py use Scripts.txt
7 * on files with these headers:
9 * # Copied from https://docs.microsoft.com/en-us/typography/script-development/use
10 * # On October 23, 2018; with documentd dated 02/07/2018.
12 * # Scripts-12.0.0.txt
13 * # Date: 2019-01-28, 22:16:47 GMT
16 #include "hb-ot-shape-complex-vowel-constraints.hh"
19 _output_dotted_circle (hb_buffer_t *buffer)
21 hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
22 _hb_glyph_info_reset_continuation (&dottedcircle);
26 _output_with_dotted_circle (hb_buffer_t *buffer)
28 _output_dotted_circle (buffer);
29 buffer->next_glyph ();
33 _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
35 hb_font_t *font HB_UNUSED)
37 if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)
40 /* UGLY UGLY UGLY business of adding dotted-circle in the middle of
41 * vowel-sequences that look like another vowel. Data for each script
42 * collected from the USE script development spec.
44 * https://github.com/harfbuzz/harfbuzz/issues/1019
46 bool processed = false;
47 buffer->clear_output ();
48 unsigned int count = buffer->len;
49 switch ((unsigned) buffer->props.script)
51 case HB_SCRIPT_DEVANAGARI:
52 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
55 switch (buffer->cur ().codepoint)
58 switch (buffer->cur (1).codepoint)
60 case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
61 case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
62 case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
68 switch (buffer->cur (1).codepoint)
70 case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
77 matched = 0x0941u == buffer->cur (1).codepoint;
80 switch (buffer->cur (1).codepoint)
82 case 0x0945u: case 0x0946u: case 0x0947u:
88 if (0x094Du == buffer->cur (1).codepoint &&
89 buffer->idx + 2 < count &&
90 0x0907u == buffer->cur (2).codepoint)
92 buffer->next_glyph ();
93 buffer->next_glyph ();
94 _output_dotted_circle (buffer);
98 buffer->next_glyph ();
99 if (matched) _output_with_dotted_circle (buffer);
104 case HB_SCRIPT_BENGALI:
105 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
107 bool matched = false;
108 switch (buffer->cur ().codepoint)
111 matched = 0x09BEu == buffer->cur (1).codepoint;
114 matched = 0x09C3u == buffer->cur (1).codepoint;
117 matched = 0x09E2u == buffer->cur (1).codepoint;
120 buffer->next_glyph ();
121 if (matched) _output_with_dotted_circle (buffer);
126 case HB_SCRIPT_GURMUKHI:
127 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
129 bool matched = false;
130 switch (buffer->cur ().codepoint)
133 switch (buffer->cur (1).codepoint)
135 case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
141 switch (buffer->cur (1).codepoint)
143 case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
149 switch (buffer->cur (1).codepoint)
151 case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
157 buffer->next_glyph ();
158 if (matched) _output_with_dotted_circle (buffer);
163 case HB_SCRIPT_GUJARATI:
164 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
166 bool matched = false;
167 switch (buffer->cur ().codepoint)
170 switch (buffer->cur (1).codepoint)
172 case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
173 case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
179 matched = 0x0ABEu == buffer->cur (1).codepoint;
182 buffer->next_glyph ();
183 if (matched) _output_with_dotted_circle (buffer);
188 case HB_SCRIPT_ORIYA:
189 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
191 bool matched = false;
192 switch (buffer->cur ().codepoint)
195 matched = 0x0B3Eu == buffer->cur (1).codepoint;
197 case 0x0B0Fu: case 0x0B13u:
198 matched = 0x0B57u == buffer->cur (1).codepoint;
201 buffer->next_glyph ();
202 if (matched) _output_with_dotted_circle (buffer);
207 case HB_SCRIPT_TELUGU:
208 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
210 bool matched = false;
211 switch (buffer->cur ().codepoint)
214 switch (buffer->cur (1).codepoint)
216 case 0x0C4Cu: case 0x0C55u:
221 case 0x0C3Fu: case 0x0C46u: case 0x0C4Au:
222 matched = 0x0C55u == buffer->cur (1).codepoint;
225 buffer->next_glyph ();
226 if (matched) _output_with_dotted_circle (buffer);
231 case HB_SCRIPT_KANNADA:
232 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
234 bool matched = false;
235 switch (buffer->cur ().codepoint)
237 case 0x0C89u: case 0x0C8Bu:
238 matched = 0x0CBEu == buffer->cur (1).codepoint;
241 matched = 0x0CCCu == buffer->cur (1).codepoint;
244 buffer->next_glyph ();
245 if (matched) _output_with_dotted_circle (buffer);
250 case HB_SCRIPT_MALAYALAM:
251 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
253 bool matched = false;
254 switch (buffer->cur ().codepoint)
256 case 0x0D07u: case 0x0D09u:
257 matched = 0x0D57u == buffer->cur (1).codepoint;
260 matched = 0x0D46u == buffer->cur (1).codepoint;
263 switch (buffer->cur (1).codepoint)
265 case 0x0D3Eu: case 0x0D57u:
271 buffer->next_glyph ();
272 if (matched) _output_with_dotted_circle (buffer);
277 case HB_SCRIPT_SINHALA:
278 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
280 bool matched = false;
281 switch (buffer->cur ().codepoint)
284 switch (buffer->cur (1).codepoint)
286 case 0x0DCFu: case 0x0DD0u: case 0x0DD1u:
291 case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u:
292 matched = 0x0DDFu == buffer->cur (1).codepoint;
295 matched = 0x0DD8u == buffer->cur (1).codepoint;
298 switch (buffer->cur (1).codepoint)
300 case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
307 buffer->next_glyph ();
308 if (matched) _output_with_dotted_circle (buffer);
313 case HB_SCRIPT_BRAHMI:
314 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
316 bool matched = false;
317 switch (buffer->cur ().codepoint)
320 matched = 0x11038u == buffer->cur (1).codepoint;
323 matched = 0x1103Eu == buffer->cur (1).codepoint;
326 matched = 0x11042u == buffer->cur (1).codepoint;
329 buffer->next_glyph ();
330 if (matched) _output_with_dotted_circle (buffer);
335 case HB_SCRIPT_KHUDAWADI:
336 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
338 bool matched = false;
339 switch (buffer->cur ().codepoint)
342 switch (buffer->cur (1).codepoint)
344 case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u:
351 buffer->next_glyph ();
352 if (matched) _output_with_dotted_circle (buffer);
357 case HB_SCRIPT_TIRHUTA:
358 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
360 bool matched = false;
361 switch (buffer->cur ().codepoint)
364 matched = 0x114B0u == buffer->cur (1).codepoint;
366 case 0x1148Bu: case 0x1148Du:
367 matched = 0x114BAu == buffer->cur (1).codepoint;
370 switch (buffer->cur (1).codepoint)
372 case 0x114B5u: case 0x114B6u:
378 buffer->next_glyph ();
379 if (matched) _output_with_dotted_circle (buffer);
385 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
387 bool matched = false;
388 switch (buffer->cur ().codepoint)
390 case 0x11600u: case 0x11601u:
391 switch (buffer->cur (1).codepoint)
393 case 0x11639u: case 0x1163Au:
399 buffer->next_glyph ();
400 if (matched) _output_with_dotted_circle (buffer);
405 case HB_SCRIPT_TAKRI:
406 for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
408 bool matched = false;
409 switch (buffer->cur ().codepoint)
412 switch (buffer->cur (1).codepoint)
414 case 0x116ADu: case 0x116B4u: case 0x116B5u:
420 matched = 0x116B2u == buffer->cur (1).codepoint;
423 buffer->next_glyph ();
424 if (matched) _output_with_dotted_circle (buffer);
434 if (buffer->idx < count)
435 buffer->next_glyph ();
436 buffer->swap_buffers ();
440 /* == End of generated functions == */