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