Home | History | Annotate | Download | only in autofit
      1 // afblue.dat
      2 //
      3 //   Auto-fitter data for blue strings.
      4 //
      5 // Copyright 2013-2018 by
      6 // David Turner, Robert Wilhelm, and Werner Lemberg.
      7 //
      8 // This file is part of the FreeType project, and may only be used,
      9 // modified, and distributed under the terms of the FreeType project
     10 // license, LICENSE.TXT.  By continuing to use, modify, or distribute
     11 // this file you indicate that you have read the license and
     12 // understand and accept it fully.
     13 
     14 
     15 // This file contains data specific to blue zones.  It gets processed by
     16 // a script to simulate `jagged arrays', with enumeration values holding
     17 // offsets into the arrays.
     18 //
     19 // The format of the file is rather simple:  A section starts with three
     20 // labels separated by whitespace and followed by a colon (everything in a
     21 // single line); the first label gives the name of the enumeration template,
     22 // the second the name of the array template, and the third the name of the
     23 // `maximum' template.  The script then fills the corresponding templates
     24 // (indicated by `@' characters around the name).
     25 //
     26 // A section contains one or more data records.  Each data record consists
     27 // of two or more lines.  The first line holds the enumeration name, and the
     28 // remaining lines the corresponding array data.
     29 //
     30 // There are two possible representations for array data.
     31 //
     32 // - A string of characters or character clusters (for example, representing
     33 //   Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double
     34 //   quotes, using C syntax, where the elements are separated by spaces.
     35 //   There can be only one string per line, thus the starting and ending
     36 //   double quote must be the first and last character in the line,
     37 //   respectively, ignoring whitespace before and after the string.  If
     38 //   there are multiple strings (in multiple lines), they are concatenated
     39 //   to a single string.  In the output, a string gets represented as a
     40 //   series of singles bytes, followed by a zero byte.  The enumeration
     41 //   values simply hold byte offsets to the start of the corresponding
     42 //   strings.
     43 //
     44 //   For strings, the `maximum' template holds the maximum number of
     45 //   non-space characters in all strings.
     46 //
     47 // - Data blocks enclosed in balanced braces, which get copied verbatim and
     48 //   which can span multiple lines.  The opening brace of a block must be
     49 //   the first character of a line (ignoring whitespace), and the closing
     50 //   brace the last (ignoring whitespace also).  The script appends a comma
     51 //   character after each block and counts the number of blocks to set the
     52 //   enumeration values.
     53 //
     54 //   For data blocks, the `maximum' template holds the maximum number of
     55 //   array elements.
     56 //
     57 // A section can contain either strings only or data blocks only.
     58 //
     59 // A comment line starts with `//'; it gets removed.  A preprocessor
     60 // directive line (using the standard syntax of `cpp') starts with `#' and
     61 // gets copied verbatim to both the enumeration and the array.  Whitespace
     62 // outside of a string is insignificant.
     63 //
     64 // Preprocessor directives are ignored while the script computes maximum
     65 // values; this essentially means that the maximum values can easily be too
     66 // large.  Given that the purpose of those values is to create local
     67 // fixed-size arrays at compile time for further processing of the blue zone
     68 // data, this isn't a problem.  Note the final zero byte of a string is not
     69 // counted.  Note also that the count holds the number of UTF-8 encoded
     70 // characters, not bytes.
     71 
     72 
     73 // The blue zone string data, to be used in the blue stringsets below.
     74 
     75 AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
     76 
     77   AF_BLUE_STRING_ADLAM_CAPITAL_TOP
     78     "     "
     79   AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM
     80     " "
     81   AF_BLUE_STRING_ADLAM_SMALL_TOP
     82     "    "
     83   AF_BLUE_STRING_ADLAM_SMALL_BOTTOM
     84     "       "
     85 
     86   AF_BLUE_STRING_ARABIC_TOP
     87     "     "
     88   AF_BLUE_STRING_ARABIC_BOTTOM
     89     "    "
     90   // We don't necessarily have access to medial forms via Unicode in case
     91   // Arabic presentational forms are missing.  The only character that is
     92   // guaranteed to have the same vertical position with joining (this is,
     93   // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both
     94   // round and flat curves.
     95   AF_BLUE_STRING_ARABIC_JOIN
     96     ""
     97 
     98   AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP
     99     "       "
    100   AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM
    101     "       "
    102   AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER
    103     "      "
    104   AF_BLUE_STRING_ARMENIAN_SMALL_TOP
    105     "       "
    106   AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM
    107     "       "
    108   AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER
    109     "       "
    110 
    111   AF_BLUE_STRING_AVESTAN_TOP
    112     "   "
    113   AF_BLUE_STRING_AVESTAN_BOTTOM
    114     " "
    115 
    116   AF_BLUE_STRING_BAMUM_TOP
    117     "       "
    118   AF_BLUE_STRING_BAMUM_BOTTOM
    119     "       "
    120 
    121   AF_BLUE_STRING_BENGALI_BASE
    122     "       "
    123   AF_BLUE_STRING_BENGALI_TOP
    124     "      "
    125   AF_BLUE_STRING_BENGALI_HEAD
    126     "       "
    127 
    128   AF_BLUE_STRING_BUHID_TOP
    129     " "
    130   AF_BLUE_STRING_BUHID_LARGE
    131     "  "
    132   AF_BLUE_STRING_BUHID_SMALL
    133     "   "
    134   AF_BLUE_STRING_BUHID_BOTTOM
    135     "      "
    136 
    137   AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP
    138     "       "
    139   AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM
    140     "       "
    141   AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP
    142     "       "
    143   AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM
    144     "       "
    145   AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP
    146     "      "
    147   AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM
    148     "       "
    149 
    150   AF_BLUE_STRING_CARIAN_TOP
    151     "       "
    152   AF_BLUE_STRING_CARIAN_BOTTOM
    153     "      "
    154 
    155   AF_BLUE_STRING_CHAKMA_TOP
    156     "    "
    157   AF_BLUE_STRING_CHAKMA_BOTTOM
    158     "    "
    159   AF_BLUE_STRING_CHAKMA_DESCENDER
    160     "    "
    161 
    162   AF_BLUE_STRING_CHEROKEE_CAPITAL
    163     "       "
    164   AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER
    165     "       "
    166   AF_BLUE_STRING_CHEROKEE_SMALL
    167     "       "
    168   AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER
    169     "   "
    170 
    171   AF_BLUE_STRING_COPTIC_CAPITAL_TOP
    172     "       "
    173   AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM
    174     "       "
    175   AF_BLUE_STRING_COPTIC_SMALL_TOP
    176     "       "
    177   AF_BLUE_STRING_COPTIC_SMALL_BOTTOM
    178     "       "
    179 
    180   AF_BLUE_STRING_CYPRIOT_TOP
    181     "       "
    182   AF_BLUE_STRING_CYPRIOT_BOTTOM
    183     "      "
    184   AF_BLUE_STRING_CYPRIOT_SMALL
    185     "  "
    186 
    187   AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP
    188     "       "
    189   AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM
    190     "       "
    191   AF_BLUE_STRING_CYRILLIC_SMALL
    192     "       "
    193   AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER
    194     "  "
    195 
    196   AF_BLUE_STRING_DESERET_CAPITAL_TOP
    197     "    "
    198   AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM
    199     "    "
    200   AF_BLUE_STRING_DESERET_SMALL_TOP
    201     "    "
    202   AF_BLUE_STRING_DESERET_SMALL_BOTTOM
    203     "    "
    204 
    205   AF_BLUE_STRING_DEVANAGARI_BASE
    206     "       "
    207   AF_BLUE_STRING_DEVANAGARI_TOP
    208     "       "
    209   // note that some fonts have extreme variation in the height of the
    210   // round head elements; for this reason we also define the `base'
    211   // blue zone, which must be always present
    212   AF_BLUE_STRING_DEVANAGARI_HEAD
    213     "       "
    214   AF_BLUE_STRING_DEVANAGARI_BOTTOM
    215     " "
    216 
    217   AF_BLUE_STRING_ETHIOPIC_TOP
    218     "       "
    219   AF_BLUE_STRING_ETHIOPIC_BOTTOM
    220     "       "
    221 
    222   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP
    223     "       "
    224   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM
    225     "       "
    226   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER
    227     "       "
    228   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER
    229     "       "
    230 
    231   AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP
    232     "       "
    233   AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM
    234     "       "
    235 
    236   AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP
    237     "       "
    238   AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM
    239     "       "
    240   AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER
    241     "       "
    242   AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER
    243     "       "
    244 
    245   AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP
    246     "       "
    247   AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM
    248     "       "
    249 
    250   AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP
    251     "       "
    252   AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM
    253     "       "
    254   AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP
    255     "       "
    256   AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM
    257     "       "
    258 
    259   AF_BLUE_STRING_GOTHIC_TOP
    260     "       "
    261   AF_BLUE_STRING_GOTHIC_BOTTOM
    262     "   "
    263 
    264   AF_BLUE_STRING_GREEK_CAPITAL_TOP
    265     "      "
    266   AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM
    267     "     "
    268   AF_BLUE_STRING_GREEK_SMALL_BETA_TOP
    269     "     "
    270   AF_BLUE_STRING_GREEK_SMALL
    271     "       "
    272   AF_BLUE_STRING_GREEK_SMALL_DESCENDER
    273     "       "
    274 
    275   AF_BLUE_STRING_GUJARATI_TOP
    276     "       "
    277   AF_BLUE_STRING_GUJARATI_BOTTOM
    278     "       "
    279   AF_BLUE_STRING_GUJARATI_ASCENDER
    280     "       "
    281   AF_BLUE_STRING_GUJARATI_DESCENDER
    282     "     "
    283   AF_BLUE_STRING_GUJARATI_DIGIT_TOP
    284     "    "
    285 
    286   AF_BLUE_STRING_GURMUKHI_BASE
    287     "       "
    288   AF_BLUE_STRING_GURMUKHI_HEAD
    289     "       "
    290   AF_BLUE_STRING_GURMUKHI_TOP
    291     "       "
    292   AF_BLUE_STRING_GURMUKHI_BOTTOM
    293     "       "
    294   AF_BLUE_STRING_GURMUKHI_DIGIT_TOP
    295     "    "
    296 
    297   AF_BLUE_STRING_HEBREW_TOP
    298     "       "
    299   AF_BLUE_STRING_HEBREW_BOTTOM
    300     "     "
    301   AF_BLUE_STRING_HEBREW_DESCENDER
    302     "    "
    303 
    304   AF_BLUE_STRING_KANNADA_TOP
    305     "       "
    306   AF_BLUE_STRING_KANNADA_BOTTOM
    307     "       "
    308 
    309   AF_BLUE_STRING_KAYAH_LI_TOP
    310     "     "
    311   AF_BLUE_STRING_KAYAH_LI_BOTTOM
    312     "    "
    313   AF_BLUE_STRING_KAYAH_LI_ASCENDER
    314     " "
    315   AF_BLUE_STRING_KAYAH_LI_DESCENDER
    316     "  "
    317   AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER
    318     "  "
    319 
    320   AF_BLUE_STRING_KHMER_TOP
    321     "     "
    322   AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP
    323     "   "
    324   AF_BLUE_STRING_KHMER_BOTTOM
    325     "       "
    326   AF_BLUE_STRING_KHMER_DESCENDER
    327     "   "
    328   AF_BLUE_STRING_KHMER_LARGE_DESCENDER
    329     "     "
    330 
    331   AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP
    332     " "
    333   AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM
    334     " "
    335 
    336   AF_BLUE_STRING_LAO_TOP
    337     "       "
    338   AF_BLUE_STRING_LAO_BOTTOM
    339     "       "
    340   AF_BLUE_STRING_LAO_ASCENDER
    341     "   "
    342   AF_BLUE_STRING_LAO_LARGE_ASCENDER
    343     "  "
    344   AF_BLUE_STRING_LAO_DESCENDER
    345     "     "
    346 
    347   AF_BLUE_STRING_LATIN_CAPITAL_TOP
    348     "T H E Z O C Q S"
    349   AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM
    350     "H E Z L O C U S"
    351   AF_BLUE_STRING_LATIN_SMALL_F_TOP
    352     "f i j k d b h"
    353   AF_BLUE_STRING_LATIN_SMALL_TOP
    354     "u v x z o e s c"
    355   AF_BLUE_STRING_LATIN_SMALL_BOTTOM
    356     "n r x z o e s c"
    357   AF_BLUE_STRING_LATIN_SMALL_DESCENDER
    358     "p q g j y"
    359 
    360   // we assume that both the subscript and superscript ranges
    361   // don't contain oldstyle digits (actually, most fonts probably
    362   // have digits only in those ranges)
    363   AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP
    364     "    "
    365   AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM
    366     "    "
    367   AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP
    368     "    "
    369   AF_BLUE_STRING_LATIN_SUBS_SMALL
    370     "        "
    371   AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER
    372     "    "
    373 
    374   AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP
    375     "       "
    376   AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM
    377     "       "
    378   AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP
    379     "      "
    380   AF_BLUE_STRING_LATIN_SUPS_SMALL
    381     "      "
    382   AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER
    383     "  "
    384 
    385   AF_BLUE_STRING_LISU_TOP
    386     "       "
    387   AF_BLUE_STRING_LISU_BOTTOM
    388     "       "
    389 
    390   AF_BLUE_STRING_MALAYALAM_TOP
    391     "       "
    392   AF_BLUE_STRING_MALAYALAM_BOTTOM
    393     "       "
    394 
    395   AF_BLUE_STRING_MYANMAR_TOP
    396     "       "
    397   AF_BLUE_STRING_MYANMAR_BOTTOM
    398     "       "
    399   AF_BLUE_STRING_MYANMAR_ASCENDER
    400     "      "
    401   AF_BLUE_STRING_MYANMAR_DESCENDER
    402     "       "
    403 
    404   AF_BLUE_STRING_NKO_TOP
    405     "       "
    406   AF_BLUE_STRING_NKO_BOTTOM
    407     "    "
    408   AF_BLUE_STRING_NKO_SMALL_TOP
    409     "  "
    410   AF_BLUE_STRING_NKO_SMALL_BOTTOM
    411     "   "
    412 
    413   AF_BLUE_STRING_OL_CHIKI
    414     "     "
    415 
    416   AF_BLUE_STRING_OLD_TURKIC_TOP
    417     "  "
    418   AF_BLUE_STRING_OLD_TURKIC_BOTTOM
    419     "   "
    420 
    421   AF_BLUE_STRING_OSAGE_CAPITAL_TOP
    422     "       "
    423   AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM
    424     "     "
    425   AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER
    426     "  "
    427   AF_BLUE_STRING_OSAGE_SMALL_TOP
    428     "       "
    429   AF_BLUE_STRING_OSAGE_SMALL_BOTTOM
    430     "       "
    431   AF_BLUE_STRING_OSAGE_SMALL_ASCENDER
    432     "    "
    433   AF_BLUE_STRING_OSAGE_SMALL_DESCENDER
    434     "  "
    435 
    436   AF_BLUE_STRING_OSMANYA_TOP
    437     "       "
    438   AF_BLUE_STRING_OSMANYA_BOTTOM
    439     "       "
    440 
    441   AF_BLUE_STRING_SAURASHTRA_TOP
    442     "       "
    443   AF_BLUE_STRING_SAURASHTRA_BOTTOM
    444     "    "
    445 
    446   AF_BLUE_STRING_SHAVIAN_TOP
    447     " "
    448   AF_BLUE_STRING_SHAVIAN_BOTTOM
    449     "    "
    450   AF_BLUE_STRING_SHAVIAN_DESCENDER
    451     " "
    452   AF_BLUE_STRING_SHAVIAN_SMALL_TOP
    453     "      "
    454   AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM
    455     "  "
    456 
    457   AF_BLUE_STRING_SINHALA_TOP
    458     "       "
    459   AF_BLUE_STRING_SINHALA_BOTTOM
    460     "       "
    461   AF_BLUE_STRING_SINHALA_DESCENDER
    462     "       "
    463 
    464   AF_BLUE_STRING_SUNDANESE_TOP
    465     "     "
    466   AF_BLUE_STRING_SUNDANESE_BOTTOM
    467     "       "
    468   AF_BLUE_STRING_SUNDANESE_DESCENDER
    469     " "
    470 
    471   AF_BLUE_STRING_TAI_VIET_TOP
    472     "    "
    473   AF_BLUE_STRING_TAI_VIET_BOTTOM
    474     "  "
    475 
    476   AF_BLUE_STRING_TAMIL_TOP
    477     "       "
    478   AF_BLUE_STRING_TAMIL_BOTTOM
    479     "       "
    480 
    481   AF_BLUE_STRING_TELUGU_TOP
    482     "      "
    483   AF_BLUE_STRING_TELUGU_BOTTOM
    484     "      "
    485 
    486   AF_BLUE_STRING_THAI_TOP
    487     "     "
    488   AF_BLUE_STRING_THAI_BOTTOM
    489     "      "
    490   AF_BLUE_STRING_THAI_ASCENDER
    491     "  "
    492   AF_BLUE_STRING_THAI_LARGE_ASCENDER
    493     "  "
    494   AF_BLUE_STRING_THAI_DESCENDER
    495     "   "
    496   AF_BLUE_STRING_THAI_LARGE_DESCENDER
    497     " "
    498   AF_BLUE_STRING_THAI_DIGIT_TOP
    499     "  "
    500 
    501   AF_BLUE_STRING_TIFINAGH
    502     "       "
    503 
    504   AF_BLUE_STRING_VAI_TOP
    505     "       "
    506   AF_BLUE_STRING_VAI_BOTTOM
    507     "       "
    508 
    509 
    510 #ifdef AF_CONFIG_OPTION_CJK
    511 
    512   AF_BLUE_STRING_CJK_TOP
    513     "       "
    514     "        "
    515     "        "
    516     "  |"
    517     "        "
    518     "        "
    519     "        "
    520     " "
    521   AF_BLUE_STRING_CJK_BOTTOM
    522     "       "
    523     "        "
    524     "        "
    525     "  |"
    526     "        "
    527     "        "
    528     "        "
    529     " "
    530 
    531 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
    532 
    533   AF_BLUE_STRING_CJK_LEFT
    534     "        "
    535     "        "
    536     "        "
    537     "  |"
    538     "        "
    539     "        "
    540     "        "
    541     " "
    542   AF_BLUE_STRING_CJK_RIGHT
    543     "       "
    544     "        "
    545     "        "
    546     "  |"
    547     "        "
    548     "        "
    549     "        "
    550     " "
    551 
    552 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
    553 
    554 #endif /* AF_CONFIG_OPTION_CJK                */
    555 
    556 
    557 // The blue zone stringsets, as used in the script styles, cf. `afstyles.h'.
    558 //
    559 // The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some
    560 // explanations.
    561 //
    562 // A blue zone in general is defined by a reference and an overshoot line.
    563 // During the hinting process, all coordinate values between those two lines
    564 // are set equal to the reference value, provided that the blue zone is not
    565 // wider than 0.75 pixels (otherwise the blue zone gets ignored).  All
    566 // entries must have `AF_BLUE_STRING_MAX' as the final line.
    567 //
    568 // During the glyph analysis, edges are sorted from bottom to top, and then
    569 // sequentially checked, edge by edge, against the blue zones in the order
    570 // given below.
    571 //
    572 //
    573 // latin auto-hinter
    574 // -----------------
    575 //
    576 // Characters in a blue string are automatically classified as having a flat
    577 // (reference) or a round (overshoot) extremum.  The blue zone is then set
    578 // up by the mean values of all flat extrema and all round extrema,
    579 // respectively.  Only horizontal blue zones (i.e., adjusting vertical
    580 // coordinate values) are supported.
    581 //
    582 // Some scripts like Khmer need character composition to get all necessary
    583 // blue zones, since Unicode only provides an abstract data model that
    584 // doesn't represent all possible glyph shapes.  For such character
    585 // clusters, the HarfBuzz library is used to convert them into the
    586 // corresponding glyphs.  The largest glyph element (where `largest' can be
    587 // either `largest ascender' or `largest descender') then defines the
    588 // corresponding flat or round extremum.
    589 //
    590 // For the latin auto-hinter, the overshoot should be larger than the
    591 // reference for top zones, and vice versa for bottom zones.
    592 //
    593 //   LATIN_TOP
    594 //     Take the maximum flat and round coordinate values of the blue string
    595 //     characters for computing the blue zone's reference and overshoot
    596 //     values.
    597 //
    598 //     If not set, take the minimum values.
    599 //
    600 //     Mutually exclusive with `LATIN_SUB_TOP'.
    601 //
    602 //   LATIN_SUB_TOP
    603 //     For all glyphs of a character cluster, compute the maximum flat
    604 //     and round coordinate values of each component, then take the
    605 //     smallest of the maximum values.  The idea is to get the top of
    606 //     subscript glyphs, as used in Khmer, for example.  Note that
    607 //     this mechanism doesn't work for ordinary ligatures.
    608 //
    609 //     This flags indicates a secondary blue zone: It gets removed if
    610 //     there is a non-LATIN_SUB_TOP blue zone at the same coordinate
    611 //     value (after scaling).
    612 //
    613 //     Mutually exclusive with `LATIN_TOP'.
    614 //
    615 //   LATIN_NEUTRAL
    616 //     Ignore round extrema and define the blue zone with flat values only.
    617 //     Both top and bottom of contours can match.  This is useful for
    618 //     scripts like Devanagari where vowel signs attach to the base
    619 //     character and are implemented as components of composite glyphs.
    620 //
    621 //     If not set, both round and flat extrema are taken into account.
    622 //     Additionally, only the top or the bottom of a contour can match,
    623 //     depending on the LATIN_TOP flag.
    624 //
    625 //     Neutral blue zones should always follow non-neutral blue zones.
    626 //
    627 //   LATIN_X_HEIGHT
    628 //     Scale all glyphs vertically from the corresponding script to make the
    629 //     reference line of this blue zone align on the grid.  The scaling
    630 //     takes place before all other blue zones get aligned to the grid.
    631 //     Only one blue character string of a script style can have this flag.
    632 //
    633 //   LATIN_LONG
    634 //     Apply an additional constraint for blue zone values: Don't
    635 //     necessarily use the extremum as-is but a segment of the topmost (or
    636 //     bottommost) contour that is longer than a heuristic threshold, and
    637 //     which is not too far away vertically from the real extremum.  This
    638 //     ensures that small bumps in the outline are ignored (for example, the
    639 //     `vertical serifs' found in many Hebrew glyph designs).
    640 //
    641 //     The segment must be at least EM/25 font units long, and the distance
    642 //     to the extremum must be smaller than EM/4.
    643 //
    644 //
    645 // cjk auto-hinter
    646 // ---------------
    647 //
    648 // Characters in a blue string are *not* automatically classified.  Instead,
    649 // first come the characters used for the overshoot value, then the
    650 // character `|', then the characters used for the reference value
    651 // (everything separated by space characters).  The blue zone is then set up
    652 // by the mean values of all reference values and all overshoot values,
    653 // respectively.  Both horizontal and vertical blue zones (i.e., adjusting
    654 // vertical and horizontal coordinate values, respectively) are supported.
    655 //
    656 // For the cjk auto-hinter, the overshoot should be smaller than the
    657 // reference for top zones, and vice versa for bottom zones.
    658 //
    659 //   CJK_TOP
    660 //     Take the maximum flat and round coordinate values of the blue string
    661 //     characters.  If not set, take the minimum values.
    662 //
    663 //   CJK_RIGHT
    664 //     A synonym for CJK_TOP.  If CJK_HORIZ is set, this flag indicates the
    665 //     right blue zone, taking horizontal maximum values.
    666 //
    667 //   CJK_HORIZ
    668 //     Define a blue zone for horizontal hinting (i.e., vertical blue
    669 //     zones).  If not set, this is a blue zone for vertical hinting.
    670 
    671 
    672 AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
    673 
    674   AF_BLUE_STRINGSET_ADLM
    675     { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    676     { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0                                 }
    677     { AF_BLUE_STRING_ADLAM_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
    678                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    679     { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   0                                 }
    680     { AF_BLUE_STRING_MAX,                  0                                 }
    681 
    682   AF_BLUE_STRINGSET_ARAB
    683     { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     }
    684     { AF_BLUE_STRING_ARABIC_BOTTOM, 0                              }
    685     { AF_BLUE_STRING_ARABIC_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL }
    686     { AF_BLUE_STRING_MAX,           0                              }
    687 
    688   AF_BLUE_STRINGSET_ARMN
    689     { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    690     { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 }
    691     { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    692     { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    693                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    694     { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 }
    695     { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 }
    696     { AF_BLUE_STRING_MAX,                      0                                 }
    697 
    698   AF_BLUE_STRINGSET_AVST
    699     { AF_BLUE_STRING_AVESTAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    700     { AF_BLUE_STRING_AVESTAN_BOTTOM, 0                          }
    701     { AF_BLUE_STRING_MAX,            0                          }
    702 
    703   AF_BLUE_STRINGSET_BAMU
    704     { AF_BLUE_STRING_BAMUM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    705     { AF_BLUE_STRING_BAMUM_BOTTOM, 0                          }
    706     { AF_BLUE_STRING_MAX,          0                          }
    707 
    708   AF_BLUE_STRINGSET_BENG
    709     { AF_BLUE_STRING_BENGALI_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
    710     { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP        }
    711     { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP      |
    712                                    AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
    713                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    714     { AF_BLUE_STRING_BENGALI_BASE, 0                                 }
    715     { AF_BLUE_STRING_MAX,          0                                 }
    716 
    717   AF_BLUE_STRINGSET_BUHD
    718     { AF_BLUE_STRING_BUHID_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    719     { AF_BLUE_STRING_BUHID_LARGE,  AF_BLUE_PROPERTY_LATIN_TOP        }
    720     { AF_BLUE_STRING_BUHID_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP      |
    721                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    722     { AF_BLUE_STRING_BUHID_BOTTOM, 0                                 }
    723     { AF_BLUE_STRING_MAX,          0                                 }
    724 
    725   AF_BLUE_STRINGSET_CAKM
    726     { AF_BLUE_STRING_CHAKMA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
    727     { AF_BLUE_STRING_CHAKMA_BOTTOM,    0                          }
    728     { AF_BLUE_STRING_CHAKMA_DESCENDER, 0                          }
    729     { AF_BLUE_STRING_MAX,              0                          }
    730 
    731   AF_BLUE_STRINGSET_CANS
    732     { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,             AF_BLUE_PROPERTY_LATIN_TOP        }
    733     { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,          0                                 }
    734     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    735                                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    736     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM,    0                                 }
    737     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        }
    738     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,     0                                 }
    739     { AF_BLUE_STRING_MAX,                                0                                 }
    740 
    741   AF_BLUE_STRINGSET_CARI
    742     { AF_BLUE_STRING_CARIAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    743     { AF_BLUE_STRING_CARIAN_BOTTOM, 0                          }
    744     { AF_BLUE_STRING_MAX,           0                          }
    745 
    746   AF_BLUE_STRINGSET_CHER
    747     { AF_BLUE_STRING_CHEROKEE_CAPITAL,         AF_BLUE_PROPERTY_LATIN_TOP        }
    748     { AF_BLUE_STRING_CHEROKEE_CAPITAL,         0                                 }
    749     { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    750     { AF_BLUE_STRING_CHEROKEE_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    751                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    752     { AF_BLUE_STRING_CHEROKEE_SMALL,           0                                 }
    753     { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0                                 }
    754     { AF_BLUE_STRING_MAX,                      0                                 }
    755 
    756   AF_BLUE_STRINGSET_COPT
    757     { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    758     { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0                                 }
    759     { AF_BLUE_STRING_COPTIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
    760                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    761     { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   0                                 }
    762     { AF_BLUE_STRING_MAX,                   0                                 }
    763 
    764   AF_BLUE_STRINGSET_CPRT
    765     { AF_BLUE_STRING_CYPRIOT_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    766     { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0                          }
    767     { AF_BLUE_STRING_CYPRIOT_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP }
    768     { AF_BLUE_STRING_CYPRIOT_SMALL,  0                          }
    769     { AF_BLUE_STRING_MAX,            0                          }
    770 
    771   AF_BLUE_STRINGSET_CYRL
    772     { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    773     { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 }
    774     { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    775                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    776     { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                 }
    777     { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                 }
    778     { AF_BLUE_STRING_MAX,                      0                                 }
    779 
    780   AF_BLUE_STRINGSET_DEVA
    781     { AF_BLUE_STRING_DEVANAGARI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    782     { AF_BLUE_STRING_DEVANAGARI_HEAD,   AF_BLUE_PROPERTY_LATIN_TOP        }
    783     { AF_BLUE_STRING_DEVANAGARI_BASE,   AF_BLUE_PROPERTY_LATIN_TOP      |
    784                                         AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
    785                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    786     { AF_BLUE_STRING_DEVANAGARI_BASE,   0                                 }
    787     { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 }
    788     { AF_BLUE_STRING_MAX,               0                                 }
    789 
    790   AF_BLUE_STRINGSET_DSRT
    791     { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    792     { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0                                 }
    793     { AF_BLUE_STRING_DESERET_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
    794                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    795     { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   0                                 }
    796     { AF_BLUE_STRING_MAX,                    0                                 }
    797 
    798   AF_BLUE_STRINGSET_ETHI
    799     { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    800     { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0                          }
    801     { AF_BLUE_STRING_MAX,             0                          }
    802 
    803   AF_BLUE_STRINGSET_GEOR
    804     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    805                                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    806     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM,    0                                 }
    807     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    808     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0                                 }
    809     { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        }
    810     { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM,     0                                 }
    811     { AF_BLUE_STRING_MAX,                          0                                 }
    812 
    813   AF_BLUE_STRINGSET_GEOK
    814     { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    815     { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0                                 }
    816     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    817                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    818     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM,    0                                 }
    819     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    820     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0                                 }
    821     { AF_BLUE_STRING_MAX,                         0                                 }
    822 
    823   AF_BLUE_STRINGSET_GLAG
    824     { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    825     { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0                                 }
    826     { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
    827                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    828     { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   0                                 }
    829     { AF_BLUE_STRING_MAX,                       0                                 }
    830 
    831   AF_BLUE_STRINGSET_GOTH
    832     { AF_BLUE_STRING_GOTHIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    833     { AF_BLUE_STRING_GOTHIC_BOTTOM, 0                          }
    834     { AF_BLUE_STRING_MAX,           0                          }
    835 
    836   AF_BLUE_STRINGSET_GREK
    837     { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    838     { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 }
    839     { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
    840     { AF_BLUE_STRING_GREEK_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    841                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    842     { AF_BLUE_STRING_GREEK_SMALL,           0                                 }
    843     { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 }
    844     { AF_BLUE_STRING_MAX,                   0                                 }
    845 
    846   AF_BLUE_STRINGSET_GUJR
    847     { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    848                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    849     { AF_BLUE_STRING_GUJARATI_BOTTOM,    0                                 }
    850     { AF_BLUE_STRING_GUJARATI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    851     { AF_BLUE_STRING_GUJARATI_DESCENDER, 0                                 }
    852     { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
    853     { AF_BLUE_STRING_MAX,                0                                 }
    854 
    855   AF_BLUE_STRINGSET_GURU
    856     { AF_BLUE_STRING_GURMUKHI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        }
    857     { AF_BLUE_STRING_GURMUKHI_HEAD,      AF_BLUE_PROPERTY_LATIN_TOP        }
    858     { AF_BLUE_STRING_GURMUKHI_BASE,      AF_BLUE_PROPERTY_LATIN_TOP      |
    859                                          AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
    860                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    861     { AF_BLUE_STRING_GURMUKHI_BOTTOM,    0                                 }
    862     { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
    863     { AF_BLUE_STRING_MAX,                0                                 }
    864 
    865   AF_BLUE_STRINGSET_HEBR
    866     { AF_BLUE_STRING_HEBREW_TOP,       AF_BLUE_PROPERTY_LATIN_TOP  |
    867                                        AF_BLUE_PROPERTY_LATIN_LONG   }
    868     { AF_BLUE_STRING_HEBREW_BOTTOM,    0                             }
    869     { AF_BLUE_STRING_HEBREW_DESCENDER, 0                             }
    870     { AF_BLUE_STRING_MAX,              0                             }
    871 
    872   AF_BLUE_STRINGSET_KALI
    873     { AF_BLUE_STRING_KAYAH_LI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
    874                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    875     { AF_BLUE_STRING_KAYAH_LI_BOTTOM,          0                                 }
    876     { AF_BLUE_STRING_KAYAH_LI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
    877     { AF_BLUE_STRING_KAYAH_LI_DESCENDER,       0                                 }
    878     { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0                                 }
    879     { AF_BLUE_STRING_MAX,                      0                                 }
    880 
    881   AF_BLUE_STRINGSET_KHMR
    882     { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
    883                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    884     { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP,   AF_BLUE_PROPERTY_LATIN_SUB_TOP    }
    885     { AF_BLUE_STRING_KHMER_BOTTOM,          0                                 }
    886     { AF_BLUE_STRING_KHMER_DESCENDER,       0                                 }
    887     { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0                                 }
    888     { AF_BLUE_STRING_MAX,                   0                                 }
    889 
    890   AF_BLUE_STRINGSET_KHMS
    891     { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
    892                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    893     { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 }
    894     { AF_BLUE_STRING_MAX,                         0                                 }
    895 
    896   AF_BLUE_STRINGSET_KNDA
    897     { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    898     { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          }
    899     { AF_BLUE_STRING_MAX,            0                          }
    900 
    901   AF_BLUE_STRINGSET_LAO
    902     { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
    903                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    904     { AF_BLUE_STRING_LAO_BOTTOM,         0                                 }
    905     { AF_BLUE_STRING_LAO_ASCENDER,       AF_BLUE_PROPERTY_LATIN_TOP        }
    906     { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP        }
    907     { AF_BLUE_STRING_LAO_DESCENDER,      0                                 }
    908     { AF_BLUE_STRING_MAX,                0                                 }
    909 
    910   AF_BLUE_STRINGSET_LATN
    911     { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    912     { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 }
    913     { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    914     { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    915                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    916     { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 }
    917     { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 }
    918     { AF_BLUE_STRING_MAX,                   0                                 }
    919 
    920   AF_BLUE_STRINGSET_LATB
    921     { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    922     { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 }
    923     { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    924     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    925                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    926     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 }
    927     { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 }
    928     { AF_BLUE_STRING_MAX,                        0                                 }
    929 
    930   AF_BLUE_STRINGSET_LATP
    931     { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    932     { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 }
    933     { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    934     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    935                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    936     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 }
    937     { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 }
    938     { AF_BLUE_STRING_MAX,                        0                                 }
    939 
    940   AF_BLUE_STRINGSET_LISU
    941     { AF_BLUE_STRING_LISU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    942     { AF_BLUE_STRING_LISU_BOTTOM, 0                          }
    943     { AF_BLUE_STRING_MAX,         0                          }
    944 
    945   AF_BLUE_STRINGSET_MLYM
    946     { AF_BLUE_STRING_MALAYALAM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    947     { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0                          }
    948     { AF_BLUE_STRING_MAX,              0                          }
    949 
    950   AF_BLUE_STRINGSET_MYMR
    951     { AF_BLUE_STRING_MYANMAR_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    952                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    953     { AF_BLUE_STRING_MYANMAR_BOTTOM,    0                                 }
    954     { AF_BLUE_STRING_MYANMAR_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    955     { AF_BLUE_STRING_MYANMAR_DESCENDER, 0                                 }
    956     { AF_BLUE_STRING_MAX,               0                                 }
    957 
    958   AF_BLUE_STRINGSET_NKOO
    959     { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
    960     { AF_BLUE_STRING_NKO_BOTTOM,       0                                 }
    961     { AF_BLUE_STRING_NKO_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
    962                                        AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    963     { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0                                 }
    964     { AF_BLUE_STRING_MAX,              0                                 }
    965 
    966   AF_BLUE_STRINGSET_NONE
    967     { AF_BLUE_STRING_MAX, 0 }
    968 
    969   AF_BLUE_STRINGSET_OLCK
    970     { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }
    971     { AF_BLUE_STRING_OL_CHIKI, 0                          }
    972     { AF_BLUE_STRING_MAX,      0                          }
    973 
    974   AF_BLUE_STRINGSET_ORKH
    975     { AF_BLUE_STRING_OLD_TURKIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    976     { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0                          }
    977     { AF_BLUE_STRING_MAX,               0                          }
    978 
    979   AF_BLUE_STRINGSET_OSGE
    980     { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP       }
    981     { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    0                                }
    982     { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                }
    983     { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP     |
    984                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT  }
    985     { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      0                                }
    986     { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP       }
    987     { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                }
    988     { AF_BLUE_STRING_MAX,                     0                                }
    989 
    990   AF_BLUE_STRINGSET_OSMA
    991     { AF_BLUE_STRING_OSMANYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    992     { AF_BLUE_STRING_OSMANYA_BOTTOM, 0                          }
    993     { AF_BLUE_STRING_MAX,            0                          }
    994 
    995   AF_BLUE_STRINGSET_SAUR
    996     { AF_BLUE_STRING_SAURASHTRA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    997     { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0                          }
    998     { AF_BLUE_STRING_MAX,               0                          }
    999 
   1000   AF_BLUE_STRINGSET_SHAW
   1001     { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
   1002     { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                 }
   1003     { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                 }
   1004     { AF_BLUE_STRING_SHAVIAN_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
   1005                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
   1006     { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0                                 }
   1007     { AF_BLUE_STRING_MAX,                  0                                 }
   1008 
   1009   AF_BLUE_STRINGSET_SINH
   1010     { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
   1011     { AF_BLUE_STRING_SINHALA_BOTTOM,    0                          }
   1012     { AF_BLUE_STRING_SINHALA_DESCENDER, 0                          }
   1013     { AF_BLUE_STRING_MAX,               0                          }
   1014 
   1015   AF_BLUE_STRINGSET_SUND
   1016     { AF_BLUE_STRING_SUNDANESE_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
   1017     { AF_BLUE_STRING_SUNDANESE_BOTTOM,    0                          }
   1018     { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0                          }
   1019     { AF_BLUE_STRING_MAX,                 0                          }
   1020 
   1021   AF_BLUE_STRINGSET_TAML
   1022     { AF_BLUE_STRING_TAMIL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
   1023     { AF_BLUE_STRING_TAMIL_BOTTOM, 0                          }
   1024     { AF_BLUE_STRING_MAX,          0                          }
   1025 
   1026   AF_BLUE_STRINGSET_TAVT
   1027     { AF_BLUE_STRING_TAI_VIET_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
   1028     { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0                          }
   1029     { AF_BLUE_STRING_MAX,             0                          }
   1030 
   1031   AF_BLUE_STRINGSET_TELU
   1032     { AF_BLUE_STRING_TELUGU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
   1033     { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          }
   1034     { AF_BLUE_STRING_MAX,           0                          }
   1035 
   1036   AF_BLUE_STRINGSET_TFNG
   1037     { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }
   1038     { AF_BLUE_STRING_TIFINAGH, 0                          }
   1039     { AF_BLUE_STRING_MAX,      0                          }
   1040 
   1041   AF_BLUE_STRINGSET_THAI
   1042     { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
   1043                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
   1044     { AF_BLUE_STRING_THAI_BOTTOM,          0                                 }
   1045     { AF_BLUE_STRING_THAI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
   1046     { AF_BLUE_STRING_THAI_LARGE_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
   1047     { AF_BLUE_STRING_THAI_DESCENDER,       0                                 }
   1048     { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0                                 }
   1049     { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 }
   1050     { AF_BLUE_STRING_MAX,                  0                                 }
   1051 
   1052   AF_BLUE_STRINGSET_VAII
   1053     { AF_BLUE_STRING_VAI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
   1054     { AF_BLUE_STRING_VAI_BOTTOM, 0                          }
   1055     { AF_BLUE_STRING_MAX,        0                          }
   1056 
   1057 #ifdef AF_CONFIG_OPTION_CJK
   1058 
   1059   AF_BLUE_STRINGSET_HANI
   1060     { AF_BLUE_STRING_CJK_TOP,    AF_BLUE_PROPERTY_CJK_TOP     }
   1061     { AF_BLUE_STRING_CJK_BOTTOM, 0                            }
   1062 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
   1063     { AF_BLUE_STRING_CJK_LEFT,   AF_BLUE_PROPERTY_CJK_HORIZ   }
   1064     { AF_BLUE_STRING_CJK_RIGHT,  AF_BLUE_PROPERTY_CJK_HORIZ |
   1065                                  AF_BLUE_PROPERTY_CJK_RIGHT   }
   1066 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
   1067     { AF_BLUE_STRING_MAX,        0                            }
   1068 
   1069 #endif /* AF_CONFIG_OPTION_CJK                */
   1070 
   1071 
   1072 // END
   1073