Home | History | Annotate | Download | only in autofit
      1 //  afblue.dat
      2 //
      3 //    Auto-fitter data for blue strings.
      4 //
      5 //  Copyright 2013-2017 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_ARABIC_TOP
     78     "     "
     79   AF_BLUE_STRING_ARABIC_BOTTOM
     80     "    "
     81   // We don't necessarily have access to medial forms via Unicode in case
     82   // Arabic presentational forms are missing.  The only character that is
     83   // guaranteed to have the same vertical position with joining (this is,
     84   // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both
     85   // round and flat curves.
     86   AF_BLUE_STRING_ARABIC_JOIN
     87     ""
     88 
     89   AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP
     90     "       "
     91   AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM
     92     "       "
     93   AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER
     94     "      "
     95   AF_BLUE_STRING_ARMENIAN_SMALL_TOP
     96     "       "
     97   AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM
     98     "       "
     99   AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER
    100     "       "
    101 
    102   AF_BLUE_STRING_BENGALI_BASE
    103     "       "
    104   AF_BLUE_STRING_BENGALI_TOP
    105     "      "
    106   AF_BLUE_STRING_BENGALI_HEAD
    107     "       "
    108 
    109   AF_BLUE_STRING_CHEROKEE_CAPITAL
    110     "       "
    111   AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER
    112     "       "
    113   AF_BLUE_STRING_CHEROKEE_SMALL
    114     "       "
    115   AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER
    116     "   "
    117 
    118   AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP
    119     "       "
    120   AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM
    121     "       "
    122   AF_BLUE_STRING_CYRILLIC_SMALL
    123     "       "
    124   AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER
    125     "  "
    126 
    127   AF_BLUE_STRING_DEVANAGARI_BASE
    128     "       "
    129   AF_BLUE_STRING_DEVANAGARI_TOP
    130     "       "
    131   // note that some fonts have extreme variation in the height of the
    132   // round head elements; for this reason we also define the `base'
    133   // blue zone, which must be always present
    134   AF_BLUE_STRING_DEVANAGARI_HEAD
    135     "       "
    136   AF_BLUE_STRING_DEVANAGARI_BOTTOM
    137     " "
    138 
    139   AF_BLUE_STRING_ETHIOPIC_TOP
    140     "       "
    141   AF_BLUE_STRING_ETHIOPIC_BOTTOM
    142     "       "
    143 
    144   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP
    145     "       "
    146   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM
    147     "       "
    148   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER
    149     "       "
    150   AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER
    151     "       "
    152 
    153   AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP
    154     "       "
    155   AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM
    156     "       "
    157 
    158   AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP
    159     "       "
    160   AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM
    161     "       "
    162   AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER
    163     "       "
    164   AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER
    165     "       "
    166 
    167   AF_BLUE_STRING_GREEK_CAPITAL_TOP
    168     "      "
    169   AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM
    170     "     "
    171   AF_BLUE_STRING_GREEK_SMALL_BETA_TOP
    172     "     "
    173   AF_BLUE_STRING_GREEK_SMALL
    174     "       "
    175   AF_BLUE_STRING_GREEK_SMALL_DESCENDER
    176     "       "
    177 
    178   AF_BLUE_STRING_GUJARATI_TOP
    179     "       "
    180   AF_BLUE_STRING_GUJARATI_BOTTOM
    181     "       "
    182   AF_BLUE_STRING_GUJARATI_ASCENDER
    183     "       "
    184   AF_BLUE_STRING_GUJARATI_DESCENDER
    185     "     "
    186   AF_BLUE_STRING_GUJARATI_DIGIT_TOP
    187     "    "
    188 
    189   AF_BLUE_STRING_GURMUKHI_BASE
    190     "       "
    191   AF_BLUE_STRING_GURMUKHI_HEAD
    192     "       "
    193   AF_BLUE_STRING_GURMUKHI_TOP
    194     "       "
    195   AF_BLUE_STRING_GURMUKHI_BOTTOM
    196     "       "
    197   AF_BLUE_STRING_GURMUKHI_DIGIT_TOP
    198     "    "
    199 
    200   AF_BLUE_STRING_HEBREW_TOP
    201     "       "
    202   AF_BLUE_STRING_HEBREW_BOTTOM
    203     "     "
    204   AF_BLUE_STRING_HEBREW_DESCENDER
    205     "    "
    206 
    207   AF_BLUE_STRING_KANNADA_TOP
    208     "       "
    209   AF_BLUE_STRING_KANNADA_BOTTOM
    210     "       "
    211 
    212   AF_BLUE_STRING_KHMER_TOP
    213     "     "
    214   AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP
    215     "   "
    216   AF_BLUE_STRING_KHMER_BOTTOM
    217     "       "
    218   AF_BLUE_STRING_KHMER_DESCENDER
    219     "   "
    220   AF_BLUE_STRING_KHMER_LARGE_DESCENDER
    221     "     "
    222 
    223   AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP
    224     " "
    225   AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM
    226     " "
    227 
    228   AF_BLUE_STRING_LAO_TOP
    229     "       "
    230   AF_BLUE_STRING_LAO_BOTTOM
    231     "       "
    232   AF_BLUE_STRING_LAO_ASCENDER
    233     "   "
    234   AF_BLUE_STRING_LAO_LARGE_ASCENDER
    235     "  "
    236   AF_BLUE_STRING_LAO_DESCENDER
    237     "     "
    238 
    239   AF_BLUE_STRING_LATIN_CAPITAL_TOP
    240     "T H E Z O C Q S"
    241   AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM
    242     "H E Z L O C U S"
    243   AF_BLUE_STRING_LATIN_SMALL_F_TOP
    244     "f i j k d b h"
    245   AF_BLUE_STRING_LATIN_SMALL_TOP
    246     "u v x z o e s c"
    247   AF_BLUE_STRING_LATIN_SMALL_BOTTOM
    248     "n r x z o e s c"
    249   AF_BLUE_STRING_LATIN_SMALL_DESCENDER
    250     "p q g j y"
    251 
    252   // we assume that both the subscript and superscript ranges
    253   // don't contain oldstyle digits (actually, most fonts probably
    254   // have digits only in those ranges)
    255   AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP
    256     "    "
    257   AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM
    258     "    "
    259   AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP
    260     "    "
    261   AF_BLUE_STRING_LATIN_SUBS_SMALL
    262     "        "
    263   AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER
    264     "    "
    265 
    266   AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP
    267     "       "
    268   AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM
    269     "       "
    270   AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP
    271     "      "
    272   AF_BLUE_STRING_LATIN_SUPS_SMALL
    273     "      "
    274   AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER
    275     "  "
    276 
    277   AF_BLUE_STRING_MALAYALAM_TOP
    278     "       "
    279   AF_BLUE_STRING_MALAYALAM_BOTTOM
    280     "       "
    281 
    282   AF_BLUE_STRING_MYANMAR_TOP
    283     "       "
    284   AF_BLUE_STRING_MYANMAR_BOTTOM
    285     "       "
    286   AF_BLUE_STRING_MYANMAR_ASCENDER
    287     "      "
    288   AF_BLUE_STRING_MYANMAR_DESCENDER
    289     "       "
    290 
    291   AF_BLUE_STRING_SINHALA_TOP
    292     "       "
    293   AF_BLUE_STRING_SINHALA_BOTTOM
    294     "       "
    295   AF_BLUE_STRING_SINHALA_DESCENDER
    296     "       "
    297 
    298   AF_BLUE_STRING_TAMIL_TOP
    299     "       "
    300   AF_BLUE_STRING_TAMIL_BOTTOM
    301     "       "
    302 
    303   AF_BLUE_STRING_TELUGU_TOP
    304     "      "
    305   AF_BLUE_STRING_TELUGU_BOTTOM
    306     "      "
    307 
    308   AF_BLUE_STRING_THAI_TOP
    309     "     "
    310   AF_BLUE_STRING_THAI_BOTTOM
    311     "      "
    312   AF_BLUE_STRING_THAI_ASCENDER
    313     "  "
    314   AF_BLUE_STRING_THAI_LARGE_ASCENDER
    315     "  "
    316   AF_BLUE_STRING_THAI_DESCENDER
    317     "   "
    318   AF_BLUE_STRING_THAI_LARGE_DESCENDER
    319     " "
    320   AF_BLUE_STRING_THAI_DIGIT_TOP
    321     "  "
    322 
    323 
    324 #ifdef AF_CONFIG_OPTION_CJK
    325 
    326   AF_BLUE_STRING_CJK_TOP
    327     "       "
    328     "        "
    329     "        "
    330     "  |"
    331     "        "
    332     "        "
    333     "        "
    334     " "
    335   AF_BLUE_STRING_CJK_BOTTOM
    336     "       "
    337     "        "
    338     "        "
    339     "  |"
    340     "        "
    341     "        "
    342     "        "
    343     " "
    344 
    345 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
    346 
    347   AF_BLUE_STRING_CJK_LEFT
    348     "        "
    349     "        "
    350     "        "
    351     "  |"
    352     "        "
    353     "        "
    354     "        "
    355     " "
    356   AF_BLUE_STRING_CJK_RIGHT
    357     "       "
    358     "        "
    359     "        "
    360     "  |"
    361     "        "
    362     "        "
    363     "        "
    364     " "
    365 
    366 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
    367 
    368 #endif /* AF_CONFIG_OPTION_CJK                */
    369 
    370 
    371 // The blue zone stringsets, as used in the script styles, cf. `afstyles.h'.
    372 //
    373 // The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some
    374 // explanations.
    375 //
    376 // A blue zone in general is defined by a reference and an overshoot line.
    377 // During the hinting process, all coordinate values between those two lines
    378 // are set equal to the reference value, provided that the blue zone is not
    379 // wider than 0.75 pixels (otherwise the blue zone gets ignored).  All
    380 // entries must have `AF_BLUE_STRING_MAX' as the final line.
    381 //
    382 // During the glyph analysis, edges are sorted from bottom to top, and then
    383 // sequentially checked, edge by edge, against the blue zones in the order
    384 // given below.
    385 //
    386 //
    387 // latin auto-hinter
    388 // -----------------
    389 //
    390 // Characters in a blue string are automatically classified as having a flat
    391 // (reference) or a round (overshoot) extremum.  The blue zone is then set
    392 // up by the mean values of all flat extrema and all round extrema,
    393 // respectively.  Only horizontal blue zones (i.e., adjusting vertical
    394 // coordinate values) are supported.
    395 //
    396 // Some scripts like Khmer need character composition to get all necessary
    397 // blue zones, since Unicode only provides an abstract data model that
    398 // doesn't represent all possible glyph shapes.  For such character
    399 // clusters, the HarfBuzz library is used to convert them into the
    400 // corresponding glyphs.  The largest glyph element (where `largest' can be
    401 // either `largest ascender' or `largest descender') then defines the
    402 // corresponding flat or round extremum.
    403 //
    404 // For the latin auto-hinter, the overshoot should be larger than the
    405 // reference for top zones, and vice versa for bottom zones.
    406 //
    407 //   LATIN_TOP
    408 //     Take the maximum flat and round coordinate values of the blue string
    409 //     characters for computing the blue zone's reference and overshoot
    410 //     values.
    411 //
    412 //     If not set, take the minimum values.
    413 //
    414 //     Mutually exclusive with `LATIN_SUB_TOP'.
    415 //
    416 //   LATIN_SUB_TOP
    417 //     For all glyphs of a character cluster, compute the maximum flat
    418 //     and round coordinate values of each component, then take the
    419 //     smallest of the maximum values.  The idea is to get the top of
    420 //     subscript glyphs, as used in Khmer, for example.  Note that
    421 //     this mechanism doesn't work for ordinary ligatures.
    422 //
    423 //     This flags indicates a secondary blue zone: It gets removed if
    424 //     there is a non-LATIN_SUB_TOP blue zone at the same coordinate
    425 //     value (after scaling).
    426 //
    427 //     Mutually exclusive with `LATIN_TOP'.
    428 //
    429 //   LATIN_NEUTRAL
    430 //     Ignore round extrema and define the blue zone with flat values only.
    431 //     Both top and bottom of contours can match.  This is useful for
    432 //     scripts like Devanagari where vowel signs attach to the base
    433 //     character and are implemented as components of composite glyphs.
    434 //
    435 //     If not set, both round and flat extrema are taken into account.
    436 //     Additionally, only the top or the bottom of a contour can match,
    437 //     depending on the LATIN_TOP flag.
    438 //
    439 //     Neutral blue zones should always follow non-neutral blue zones.
    440 //
    441 //   LATIN_X_HEIGHT
    442 //     Scale all glyphs vertically from the corresponding script to make the
    443 //     reference line of this blue zone align on the grid.  The scaling
    444 //     takes place before all other blue zones get aligned to the grid.
    445 //     Only one blue character string of a script style can have this flag.
    446 //
    447 //   LATIN_LONG
    448 //     Apply an additional constraint for blue zone values: Don't
    449 //     necessarily use the extremum as-is but a segment of the topmost (or
    450 //     bottommost) contour that is longer than a heuristic threshold, and
    451 //     which is not too far away vertically from the real extremum.  This
    452 //     ensures that small bumps in the outline are ignored (for example, the
    453 //     `vertical serifs' found in many Hebrew glyph designs).
    454 //
    455 //     The segment must be at least EM/25 font units long, and the distance
    456 //     to the extremum must be smaller than EM/4.
    457 //
    458 //
    459 // cjk auto-hinter
    460 // ---------------
    461 //
    462 // Characters in a blue string are *not* automatically classified.  Instead,
    463 // first come the characters used for the overshoot value, then the
    464 // character `|', then the characters used for the reference value
    465 // (everything separated by space characters).  The blue zone is then set up
    466 // by the mean values of all reference values and all overshoot values,
    467 // respectively.  Both horizontal and vertical blue zones (i.e., adjusting
    468 // vertical and horizontal coordinate values, respectively) are supported.
    469 //
    470 // For the cjk auto-hinter, the overshoot should be smaller than the
    471 // reference for top zones, and vice versa for bottom zones.
    472 //
    473 //   CJK_TOP
    474 //     Take the maximum flat and round coordinate values of the blue string
    475 //     characters.  If not set, take the minimum values.
    476 //
    477 //   CJK_RIGHT
    478 //     A synonym for CJK_TOP.  If CJK_HORIZ is set, this flag indicates the
    479 //     right blue zone, taking horizontal maximum values.
    480 //
    481 //   CJK_HORIZ
    482 //     Define a blue zone for horizontal hinting (i.e., vertical blue
    483 //     zones).  If not set, this is a blue zone for vertical hinting.
    484 
    485 
    486 AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
    487 
    488   AF_BLUE_STRINGSET_ARAB
    489     { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     }
    490     { AF_BLUE_STRING_ARABIC_BOTTOM, 0                              }
    491     { AF_BLUE_STRING_ARABIC_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL }
    492     { AF_BLUE_STRING_MAX,           0                              }
    493 
    494   AF_BLUE_STRINGSET_ARMN
    495     { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    496     { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 }
    497     { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    498     { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    499                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    500     { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 }
    501     { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 }
    502     { AF_BLUE_STRING_MAX,                      0                                 }
    503 
    504   AF_BLUE_STRINGSET_BENG
    505     { AF_BLUE_STRING_BENGALI_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
    506     { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP        }
    507     { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP      |
    508                                    AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
    509                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    510     { AF_BLUE_STRING_BENGALI_BASE, 0                                 }
    511     { AF_BLUE_STRING_MAX,          0                                 }
    512 
    513   AF_BLUE_STRINGSET_CHER
    514     { AF_BLUE_STRING_CHEROKEE_CAPITAL,         AF_BLUE_PROPERTY_LATIN_TOP        }
    515     { AF_BLUE_STRING_CHEROKEE_CAPITAL,         0                                 }
    516     { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    517     { AF_BLUE_STRING_CHEROKEE_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    518                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    519     { AF_BLUE_STRING_CHEROKEE_SMALL,           0                                 }
    520     { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0                                 }
    521     { AF_BLUE_STRING_MAX,                      0                                 }
    522 
    523   AF_BLUE_STRINGSET_CYRL
    524     { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    525     { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 }
    526     { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    527                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    528     { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                 }
    529     { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                 }
    530     { AF_BLUE_STRING_MAX,                      0                                 }
    531 
    532   AF_BLUE_STRINGSET_DEVA
    533     { AF_BLUE_STRING_DEVANAGARI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    534     { AF_BLUE_STRING_DEVANAGARI_HEAD,   AF_BLUE_PROPERTY_LATIN_TOP        }
    535     { AF_BLUE_STRING_DEVANAGARI_BASE,   AF_BLUE_PROPERTY_LATIN_TOP      |
    536                                         AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
    537                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    538     { AF_BLUE_STRING_DEVANAGARI_BASE,   0                                 }
    539     { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 }
    540     { AF_BLUE_STRING_MAX,               0                                 }
    541 
    542   AF_BLUE_STRINGSET_ETHI
    543     { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    544     { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0                          }
    545     { AF_BLUE_STRING_MAX,             0                          }
    546 
    547   // blue zones for Mtavruli are missing (not yet defined in Unicode)
    548   AF_BLUE_STRINGSET_GEOR
    549     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    550                                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    551     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM,    0                                 }
    552     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    553     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0                                 }
    554     { AF_BLUE_STRING_MAX,                          0                                 }
    555 
    556   AF_BLUE_STRINGSET_GEOK
    557     { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    558     { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0                                 }
    559     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    560                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    561     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM,    0                                 }
    562     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    563     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0                                 }
    564     { AF_BLUE_STRING_MAX,                         0                                 }
    565 
    566   AF_BLUE_STRINGSET_GREK
    567     { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    568     { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 }
    569     { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
    570     { AF_BLUE_STRING_GREEK_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    571                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    572     { AF_BLUE_STRING_GREEK_SMALL,           0                                 }
    573     { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 }
    574     { AF_BLUE_STRING_MAX,                   0                                 }
    575 
    576   AF_BLUE_STRINGSET_GUJR
    577     { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    578                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    579     { AF_BLUE_STRING_GUJARATI_BOTTOM,    0                                 }
    580     { AF_BLUE_STRING_GUJARATI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    581     { AF_BLUE_STRING_GUJARATI_DESCENDER, 0                                 }
    582     { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
    583     { AF_BLUE_STRING_MAX,                0                                 }
    584 
    585   AF_BLUE_STRINGSET_GURU
    586     { AF_BLUE_STRING_GURMUKHI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        }
    587     { AF_BLUE_STRING_GURMUKHI_HEAD,      AF_BLUE_PROPERTY_LATIN_TOP        }
    588     { AF_BLUE_STRING_GURMUKHI_BASE,      AF_BLUE_PROPERTY_LATIN_TOP      |
    589                                          AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
    590                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    591     { AF_BLUE_STRING_GURMUKHI_BOTTOM,    0                                 }
    592     { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
    593     { AF_BLUE_STRING_MAX,                0                                 }
    594 
    595   AF_BLUE_STRINGSET_HEBR
    596     { AF_BLUE_STRING_HEBREW_TOP,       AF_BLUE_PROPERTY_LATIN_TOP  |
    597                                        AF_BLUE_PROPERTY_LATIN_LONG   }
    598     { AF_BLUE_STRING_HEBREW_BOTTOM,    0                             }
    599     { AF_BLUE_STRING_HEBREW_DESCENDER, 0                             }
    600     { AF_BLUE_STRING_MAX,              0                             }
    601 
    602   AF_BLUE_STRINGSET_KNDA
    603     { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    604     { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          }
    605     { AF_BLUE_STRING_MAX,            0                          }
    606 
    607   AF_BLUE_STRINGSET_KHMR
    608     { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
    609                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    610     { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP,   AF_BLUE_PROPERTY_LATIN_SUB_TOP    }
    611     { AF_BLUE_STRING_KHMER_BOTTOM,          0                                 }
    612     { AF_BLUE_STRING_KHMER_DESCENDER,       0                                 }
    613     { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0                                 }
    614     { AF_BLUE_STRING_MAX,                   0                                 }
    615 
    616   AF_BLUE_STRINGSET_KHMS
    617     { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
    618                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    619     { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 }
    620     { AF_BLUE_STRING_MAX,                         0                                 }
    621 
    622   AF_BLUE_STRINGSET_LAO
    623     { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
    624                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    625     { AF_BLUE_STRING_LAO_BOTTOM,         0                                 }
    626     { AF_BLUE_STRING_LAO_ASCENDER,       AF_BLUE_PROPERTY_LATIN_TOP        }
    627     { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP        }
    628     { AF_BLUE_STRING_LAO_DESCENDER,      0                                 }
    629     { AF_BLUE_STRING_MAX,                0                                 }
    630 
    631   AF_BLUE_STRINGSET_LATN
    632     { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    633     { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 }
    634     { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    635     { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    636                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    637     { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 }
    638     { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 }
    639     { AF_BLUE_STRING_MAX,                   0                                 }
    640 
    641   AF_BLUE_STRINGSET_LATB
    642     { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    643     { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 }
    644     { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    645     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    646                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    647     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 }
    648     { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 }
    649     { AF_BLUE_STRING_MAX,                        0                                 }
    650 
    651   AF_BLUE_STRINGSET_LATP
    652     { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    653     { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 }
    654     { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    655     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
    656                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    657     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 }
    658     { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 }
    659     { AF_BLUE_STRING_MAX,                        0                                 }
    660 
    661   AF_BLUE_STRINGSET_MLYM
    662     { AF_BLUE_STRING_MALAYALAM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    663     { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0                          }
    664     { AF_BLUE_STRING_MAX,              0                          }
    665 
    666   AF_BLUE_STRINGSET_MYMR
    667     { AF_BLUE_STRING_MYANMAR_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
    668                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    669     { AF_BLUE_STRING_MYANMAR_BOTTOM,    0                                 }
    670     { AF_BLUE_STRING_MYANMAR_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    671     { AF_BLUE_STRING_MYANMAR_DESCENDER, 0                                 }
    672     { AF_BLUE_STRING_MAX,               0                                 }
    673 
    674   AF_BLUE_STRINGSET_NONE
    675     { AF_BLUE_STRING_MAX, 0 }
    676 
    677   AF_BLUE_STRINGSET_SINH
    678     { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
    679     { AF_BLUE_STRING_SINHALA_BOTTOM,    0                          }
    680     { AF_BLUE_STRING_SINHALA_DESCENDER, 0                          }
    681     { AF_BLUE_STRING_MAX,               0                          }
    682 
    683   AF_BLUE_STRINGSET_TAML
    684     { AF_BLUE_STRING_TAMIL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    685     { AF_BLUE_STRING_TAMIL_BOTTOM, 0                          }
    686     { AF_BLUE_STRING_MAX,          0                          }
    687 
    688   AF_BLUE_STRINGSET_TELU
    689     { AF_BLUE_STRING_TELUGU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    690     { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          }
    691     { AF_BLUE_STRING_MAX,           0                          }
    692 
    693   AF_BLUE_STRINGSET_THAI
    694     { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
    695                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    696     { AF_BLUE_STRING_THAI_BOTTOM,          0                                 }
    697     { AF_BLUE_STRING_THAI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
    698     { AF_BLUE_STRING_THAI_LARGE_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    699     { AF_BLUE_STRING_THAI_DESCENDER,       0                                 }
    700     { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0                                 }
    701     { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 }
    702     { AF_BLUE_STRING_MAX,                  0                                 }
    703 
    704 
    705 #ifdef AF_CONFIG_OPTION_CJK
    706 
    707   AF_BLUE_STRINGSET_HANI
    708     { AF_BLUE_STRING_CJK_TOP,    AF_BLUE_PROPERTY_CJK_TOP     }
    709     { AF_BLUE_STRING_CJK_BOTTOM, 0                            }
    710 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
    711     { AF_BLUE_STRING_CJK_LEFT,   AF_BLUE_PROPERTY_CJK_HORIZ   }
    712     { AF_BLUE_STRING_CJK_RIGHT,  AF_BLUE_PROPERTY_CJK_HORIZ |
    713                                  AF_BLUE_PROPERTY_CJK_RIGHT   }
    714 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
    715     { AF_BLUE_STRING_MAX,        0                            }
    716 
    717 #endif /* AF_CONFIG_OPTION_CJK                */
    718 
    719 
    720 // END
    721