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