tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

hb-ot-shaper-vowel-constraints.cc (11271B)


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