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_GLAGOLITIC_CAPITAL_TOP
 246     "Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ"
 247   AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM
 248     "Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ"
 249   AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP
 250     "ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ"
 251   AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM
 252     "ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ"
 253 
 254   AF_BLUE_STRING_GOTHIC_TOP
 255     "𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾"
 256   AF_BLUE_STRING_GOTHIC_BOTTOM
 257     "𐌶 𐌴 𐍃 𐍈"
 258 
 259   AF_BLUE_STRING_GREEK_CAPITAL_TOP
 260     "Γ Β Ε Ζ Θ Ο Ω"
 261   AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM
 262     "Β Δ Ζ Ξ Θ Ο"
 263   AF_BLUE_STRING_GREEK_SMALL_BETA_TOP
 264     "β θ δ ζ λ ξ"
 265   AF_BLUE_STRING_GREEK_SMALL
 266     "α ε ι ο π σ τ ω"
 267   AF_BLUE_STRING_GREEK_SMALL_DESCENDER
 268     "β γ η μ ρ φ χ ψ"
 269 
 270   AF_BLUE_STRING_GUJARATI_TOP
 271     "ત ન ઋ ઌ છ ટ ર ૦"
 272   AF_BLUE_STRING_GUJARATI_BOTTOM
 273     "ખ ગ ઘ ઞ ઇ ઈ ઠ જ"
 274   AF_BLUE_STRING_GUJARATI_ASCENDER
 275     "ઈ ઊ િ ી લી શ્ચિ જિ સી"
 276   AF_BLUE_STRING_GUJARATI_DESCENDER
 277     "ુ ૃ ૄ ખુ છૃ છૄ"
 278   AF_BLUE_STRING_GUJARATI_DIGIT_TOP
 279     "૦ ૧ ૨ ૩ ૭"
 280 
 281   AF_BLUE_STRING_GURMUKHI_BASE
 282     "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ"
 283   AF_BLUE_STRING_GURMUKHI_HEAD
 284     "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ"
 285   AF_BLUE_STRING_GURMUKHI_TOP
 286     "ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ"
 287   AF_BLUE_STRING_GURMUKHI_BOTTOM
 288     "ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ"
 289   AF_BLUE_STRING_GURMUKHI_DIGIT_TOP
 290     "੦ ੧ ੨ ੩ ੭"
 291 
 292   AF_BLUE_STRING_HEBREW_TOP
 293     "ב ד ה ח ך כ ם ס"
 294   AF_BLUE_STRING_HEBREW_BOTTOM
 295     "ב ט כ ם ס צ"
 296   AF_BLUE_STRING_HEBREW_DESCENDER
 297     "ק ך ן ף ץ"
 298 
 299   AF_BLUE_STRING_KANNADA_TOP
 300     "ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ"
 301   AF_BLUE_STRING_KANNADA_BOTTOM
 302     "ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭"
 303 
 304   AF_BLUE_STRING_KAYAH_LI_TOP
 305     "꤅ ꤏ ꤁ ꤋ ꤀ ꤍ"
 306   AF_BLUE_STRING_KAYAH_LI_BOTTOM
 307     "꤈ ꤘ ꤀ ꤍ ꤢ"
 308   AF_BLUE_STRING_KAYAH_LI_ASCENDER
 309     "ꤖ ꤡ"
 310   AF_BLUE_STRING_KAYAH_LI_DESCENDER
 311     "ꤑ ꤜ ꤞ"
 312   AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER
 313     "ꤑ꤬ ꤜ꤭ ꤔ꤬"
 314 
 315   AF_BLUE_STRING_KHMER_TOP
 316     "ខ ទ ន ឧ ឩ ា"
 317   AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP
 318     "ក្ក ក្ខ ក្គ ក្ថ"
 319   AF_BLUE_STRING_KHMER_BOTTOM
 320     "ខ ឃ ច ឋ ប ម យ ឲ"
 321   AF_BLUE_STRING_KHMER_DESCENDER
 322     "ត្រ រៀ ឲ្យ អឿ"
 323   AF_BLUE_STRING_KHMER_LARGE_DESCENDER
 324     "ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ"
 325 
 326   AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP
 327     "᧠ ᧡"
 328   AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM
 329     "᧶ ᧹"
 330 
 331   AF_BLUE_STRING_LAO_TOP
 332     "າ ດ ອ ມ ລ ວ ຣ ງ"
 333   AF_BLUE_STRING_LAO_BOTTOM
 334     "າ ອ ບ ຍ ຣ ຮ ວ ຢ"
 335   AF_BLUE_STRING_LAO_ASCENDER
 336     "ປ ຢ ຟ ຝ"
 337   AF_BLUE_STRING_LAO_LARGE_ASCENDER
 338     "ໂ ໄ ໃ"
 339   AF_BLUE_STRING_LAO_DESCENDER
 340     "ງ ຊ ຖ ຽ ໆ ຯ"
 341 
 342   AF_BLUE_STRING_LATIN_CAPITAL_TOP
 343     "T H E Z O C Q S"
 344   AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM
 345     "H E Z L O C U S"
 346   AF_BLUE_STRING_LATIN_SMALL_F_TOP
 347     "f i j k d b h"
 348   AF_BLUE_STRING_LATIN_SMALL_TOP
 349     "u v x z o e s c"
 350   AF_BLUE_STRING_LATIN_SMALL_BOTTOM
 351     "n r x z o e s c"
 352   AF_BLUE_STRING_LATIN_SMALL_DESCENDER
 353     "p q g j y"
 354 
 355   // we assume that both the subscript and superscript ranges
 356   // don't contain oldstyle digits (actually, most fonts probably
 357   // have digits only in those ranges)
 358   AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP
 359     "₀ ₃ ₅ ₇ ₈"
 360   AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM
 361     "₀ ₁ ₂ ₃ ₈"
 362   AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP
 363     "ᵢ ⱼ ₕ ₖ ₗ"
 364   AF_BLUE_STRING_LATIN_SUBS_SMALL
 365     "ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ"
 366   AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER
 367     "ᵦ ᵧ ᵨ ᵩ ₚ"
 368 
 369   AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP
 370     "⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ"
 371   AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM
 372     "⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ"
 373   AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP
 374     "ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ"
 375   AF_BLUE_STRING_LATIN_SUPS_SMALL
 376     "ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ"
 377   AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER
 378     "ᵖ ʸ ᵍ"
 379 
 380   AF_BLUE_STRING_LISU_TOP
 381     "ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ"
 382   AF_BLUE_STRING_LISU_BOTTOM
 383     "ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ"
 384 
 385   AF_BLUE_STRING_MALAYALAM_TOP
 386     "ഒ ട ഠ റ ച പ ച്ച പ്പ"
 387   AF_BLUE_STRING_MALAYALAM_BOTTOM
 388     "ട ഠ ധ ശ ഘ ച ഥ ല"
 389 
 390   AF_BLUE_STRING_MYANMAR_TOP
 391     "ခ ဂ င ဒ ဝ ၥ ၊ ။"
 392   AF_BLUE_STRING_MYANMAR_BOTTOM
 393     "င ဎ ဒ ပ ဗ ဝ ၊ ။"
 394   AF_BLUE_STRING_MYANMAR_ASCENDER
 395     "ဩ ြ ၍ ၏ ၆ ါ ိ"
 396   AF_BLUE_STRING_MYANMAR_DESCENDER
 397     "ဉ ည ဥ ဩ ဨ ၂ ၅ ၉"
 398 
 399   AF_BLUE_STRING_NKO_TOP
 400     "ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ"
 401   AF_BLUE_STRING_NKO_BOTTOM
 402     "߀ ߘ ߡ ߠ ߥ"
 403   AF_BLUE_STRING_NKO_SMALL_TOP
 404     "ߏ ߛ ߋ"
 405   AF_BLUE_STRING_NKO_SMALL_BOTTOM
 406     "ߎ ߏ ߛ ߋ"
 407 
 408   AF_BLUE_STRING_OL_CHIKI
 409     "ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ"
 410 
 411   AF_BLUE_STRING_OLD_TURKIC_TOP
 412     "𐰗 𐰘 𐰧"
 413   AF_BLUE_STRING_OLD_TURKIC_BOTTOM
 414     "𐰉 𐰗 𐰦 𐰧"
 415 
 416   AF_BLUE_STRING_OSAGE_CAPITAL_TOP
 417     "𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆"
 418   AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM
 419     "𐒰 𐓍 𐓂 𐒿 𐓎 𐒹"
 420   AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER
 421     "𐒼 𐒽 𐒾"
 422   AF_BLUE_STRING_OSAGE_SMALL_TOP
 423     "𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮"
 424   AF_BLUE_STRING_OSAGE_SMALL_BOTTOM
 425     "𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶"
 426   AF_BLUE_STRING_OSAGE_SMALL_ASCENDER
 427     "𐓤 𐓦 𐓸 𐓹 𐓛"
 428   AF_BLUE_STRING_OSAGE_SMALL_DESCENDER
 429     "𐓤 𐓥 𐓦"
 430 
 431   AF_BLUE_STRING_OSMANYA_TOP
 432     "𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣"
 433   AF_BLUE_STRING_OSMANYA_BOTTOM
 434     "𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩"
 435 
 436   AF_BLUE_STRING_SAURASHTRA_TOP
 437     "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ"
 438   AF_BLUE_STRING_SAURASHTRA_BOTTOM
 439     "ꢂ ꢨ ꢺ ꢤ ꢎ"
 440 
 441   AF_BLUE_STRING_SHAVIAN_TOP
 442     "𐑕 𐑙"
 443   AF_BLUE_STRING_SHAVIAN_BOTTOM
 444     "𐑔 𐑖 𐑗 𐑹 𐑻"
 445   AF_BLUE_STRING_SHAVIAN_DESCENDER
 446     "𐑟 𐑣"
 447   AF_BLUE_STRING_SHAVIAN_SMALL_TOP
 448     "𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼"
 449   AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM
 450     "𐑴 𐑻 𐑹"
 451 
 452   AF_BLUE_STRING_SINHALA_TOP
 453     "ඉ ක ඝ ඳ ප ය ල ෆ"
 454   AF_BLUE_STRING_SINHALA_BOTTOM
 455     "එ ඔ ඝ ජ ට ථ ධ ර"
 456   AF_BLUE_STRING_SINHALA_DESCENDER
 457     "ද ඳ උ ල තූ තු බු දු"
 458 
 459   AF_BLUE_STRING_SUNDANESE_TOP
 460     "ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ"
 461   AF_BLUE_STRING_SUNDANESE_BOTTOM
 462     "ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ"
 463   AF_BLUE_STRING_SUNDANESE_DESCENDER
 464     "ᮼ ᳄"
 465 
 466   AF_BLUE_STRING_TAI_VIET_TOP
 467     "ꪆ ꪔ ꪒ ꪖ ꪫ"
 468   AF_BLUE_STRING_TAI_VIET_BOTTOM
 469     "ꪉ ꪫ ꪮ"
 470 
 471   AF_BLUE_STRING_TAMIL_TOP
 472     "உ ஒ ஓ ற ஈ க ங ச"
 473   AF_BLUE_STRING_TAMIL_BOTTOM
 474     "க ச ல ஶ உ ங ட ப"
 475 
 476   AF_BLUE_STRING_TELUGU_TOP
 477     "ఇ ఌ ఙ ఞ ణ ఱ ౯"
 478   AF_BLUE_STRING_TELUGU_BOTTOM
 479     "అ క చ ర ఽ ౨ ౬"
 480 
 481   AF_BLUE_STRING_THAI_TOP
 482     "บ เ แ อ ก า"
 483   AF_BLUE_STRING_THAI_BOTTOM
 484     "บ ป ษ ฯ อ ย ฮ"
 485   AF_BLUE_STRING_THAI_ASCENDER
 486     "ป ฝ ฟ"
 487   AF_BLUE_STRING_THAI_LARGE_ASCENDER
 488     "โ ใ ไ"
 489   AF_BLUE_STRING_THAI_DESCENDER
 490     "ฎ ฏ ฤ ฦ"
 491   AF_BLUE_STRING_THAI_LARGE_DESCENDER
 492     "ญ ฐ"
 493   AF_BLUE_STRING_THAI_DIGIT_TOP
 494     "๐ ๑ ๓"
 495 
 496   AF_BLUE_STRING_TIFINAGH
 497     "ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ"
 498 
 499   AF_BLUE_STRING_VAI_TOP
 500     "ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ"
 501   AF_BLUE_STRING_VAI_BOTTOM
 502     "ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ"
 503 
 504 
 505 #ifdef AF_CONFIG_OPTION_CJK
 506 
 507   AF_BLUE_STRING_CJK_TOP
 508     "他 们 你 來 們 到 和 地"
 509     " 对 對 就 席 我 时 時 會"
 510     " 来 為 能 舰 說 说 这 這"
 511     " 齊 |"
 512     " 军 同 已 愿 既 星 是 景"
 513     " 民 照 现 現 理 用 置 要"
 514     " 軍 那 配 里 開 雷 露 面"
 515     " 顾"
 516   AF_BLUE_STRING_CJK_BOTTOM
 517     "个 为 人 他 以 们 你 來"
 518     " 個 們 到 和 大 对 對 就"
 519     " 我 时 時 有 来 為 要 說"
 520     " 说 |"
 521     " 主 些 因 它 想 意 理 生"
 522     " 當 看 着 置 者 自 著 裡"
 523     " 过 还 进 進 過 道 還 里"
 524     " 面"
 525 
 526 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
 527 
 528   AF_BLUE_STRING_CJK_LEFT
 529     " 些 们 你 來 們 到 和 地"
 530     " 她 将 將 就 年 得 情 最"
 531     " 样 樣 理 能 說 说 这 這"
 532     " 通 |"
 533     " 即 吗 吧 听 呢 品 响 嗎"
 534     " 师 師 收 断 斷 明 眼 間"
 535     " 间 际 陈 限 除 陳 随 際"
 536     " 隨"
 537   AF_BLUE_STRING_CJK_RIGHT
 538     "事 前 學 将 將 情 想 或"
 539     " 政 斯 新 样 樣 民 沒 没"
 540     " 然 特 现 現 球 第 經 谁"
 541     " 起 |"
 542     " 例 別 别 制 动 動 吗 嗎"
 543     " 增 指 明 朝 期 构 物 确"
 544     " 种 調 调 費 费 那 都 間"
 545     " 间"
 546 
 547 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
 548 
 549 #endif /* AF_CONFIG_OPTION_CJK                */
 550 
 551 
 552 // The blue zone stringsets, as used in the script styles, cf. `afstyles.h'.
 553 //
 554 // The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some
 555 // explanations.
 556 //
 557 // A blue zone in general is defined by a reference and an overshoot line.
 558 // During the hinting process, all coordinate values between those two lines
 559 // are set equal to the reference value, provided that the blue zone is not
 560 // wider than 0.75 pixels (otherwise the blue zone gets ignored).  All
 561 // entries must have `AF_BLUE_STRING_MAX' as the final line.
 562 //
 563 // During the glyph analysis, edges are sorted from bottom to top, and then
 564 // sequentially checked, edge by edge, against the blue zones in the order
 565 // given below.
 566 //
 567 //
 568 // latin auto-hinter
 569 // -----------------
 570 //
 571 // Characters in a blue string are automatically classified as having a flat
 572 // (reference) or a round (overshoot) extremum.  The blue zone is then set
 573 // up by the mean values of all flat extrema and all round extrema,
 574 // respectively.  Only horizontal blue zones (i.e., adjusting vertical
 575 // coordinate values) are supported.
 576 //
 577 // Some scripts like Khmer need character composition to get all necessary
 578 // blue zones, since Unicode only provides an abstract data model that
 579 // doesn't represent all possible glyph shapes.  For such character
 580 // clusters, the HarfBuzz library is used to convert them into the
 581 // corresponding glyphs.  The largest glyph element (where `largest' can be
 582 // either `largest ascender' or `largest descender') then defines the
 583 // corresponding flat or round extremum.
 584 //
 585 // For the latin auto-hinter, the overshoot should be larger than the
 586 // reference for top zones, and vice versa for bottom zones.
 587 //
 588 //   LATIN_TOP
 589 //     Take the maximum flat and round coordinate values of the blue string
 590 //     characters for computing the blue zone's reference and overshoot
 591 //     values.
 592 //
 593 //     If not set, take the minimum values.
 594 //
 595 //     Mutually exclusive with `LATIN_SUB_TOP'.
 596 //
 597 //   LATIN_SUB_TOP
 598 //     For all glyphs of a character cluster, compute the maximum flat
 599 //     and round coordinate values of each component, then take the
 600 //     smallest of the maximum values.  The idea is to get the top of
 601 //     subscript glyphs, as used in Khmer, for example.  Note that
 602 //     this mechanism doesn't work for ordinary ligatures.
 603 //
 604 //     This flags indicates a secondary blue zone: It gets removed if
 605 //     there is a non-LATIN_SUB_TOP blue zone at the same coordinate
 606 //     value (after scaling).
 607 //
 608 //     Mutually exclusive with `LATIN_TOP'.
 609 //
 610 //   LATIN_NEUTRAL
 611 //     Ignore round extrema and define the blue zone with flat values only.
 612 //     Both top and bottom of contours can match.  This is useful for
 613 //     scripts like Devanagari where vowel signs attach to the base
 614 //     character and are implemented as components of composite glyphs.
 615 //
 616 //     If not set, both round and flat extrema are taken into account.
 617 //     Additionally, only the top or the bottom of a contour can match,
 618 //     depending on the LATIN_TOP flag.
 619 //
 620 //     Neutral blue zones should always follow non-neutral blue zones.
 621 //
 622 //   LATIN_X_HEIGHT
 623 //     Scale all glyphs vertically from the corresponding script to make the
 624 //     reference line of this blue zone align on the grid.  The scaling
 625 //     takes place before all other blue zones get aligned to the grid.
 626 //     Only one blue character string of a script style can have this flag.
 627 //
 628 //   LATIN_LONG
 629 //     Apply an additional constraint for blue zone values: Don't
 630 //     necessarily use the extremum as-is but a segment of the topmost (or
 631 //     bottommost) contour that is longer than a heuristic threshold, and
 632 //     which is not too far away vertically from the real extremum.  This
 633 //     ensures that small bumps in the outline are ignored (for example, the
 634 //     `vertical serifs' found in many Hebrew glyph designs).
 635 //
 636 //     The segment must be at least EM/25 font units long, and the distance
 637 //     to the extremum must be smaller than EM/4.
 638 //
 639 //
 640 // cjk auto-hinter
 641 // ---------------
 642 //
 643 // Characters in a blue string are *not* automatically classified.  Instead,
 644 // first come the characters used for the overshoot value, then the
 645 // character `|', then the characters used for the reference value
 646 // (everything separated by space characters).  The blue zone is then set up
 647 // by the mean values of all reference values and all overshoot values,
 648 // respectively.  Both horizontal and vertical blue zones (i.e., adjusting
 649 // vertical and horizontal coordinate values, respectively) are supported.
 650 //
 651 // For the cjk auto-hinter, the overshoot should be smaller than the
 652 // reference for top zones, and vice versa for bottom zones.
 653 //
 654 //   CJK_TOP
 655 //     Take the maximum flat and round coordinate values of the blue string
 656 //     characters.  If not set, take the minimum values.
 657 //
 658 //   CJK_RIGHT
 659 //     A synonym for CJK_TOP.  If CJK_HORIZ is set, this flag indicates the
 660 //     right blue zone, taking horizontal maximum values.
 661 //
 662 //   CJK_HORIZ
 663 //     Define a blue zone for horizontal hinting (i.e., vertical blue
 664 //     zones).  If not set, this is a blue zone for vertical hinting.
 665 
 666 
 667 AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
 668 
 669   AF_BLUE_STRINGSET_ADLM
 670     { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
 671     { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0                                 }
 672     { AF_BLUE_STRING_ADLAM_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
 673                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 674     { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   0                                 }
 675     { AF_BLUE_STRING_MAX,                  0                                 }
 676 
 677   AF_BLUE_STRINGSET_ARAB
 678     { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     }
 679     { AF_BLUE_STRING_ARABIC_BOTTOM, 0                              }
 680     { AF_BLUE_STRING_ARABIC_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL }
 681     { AF_BLUE_STRING_MAX,           0                              }
 682 
 683   AF_BLUE_STRINGSET_ARMN
 684     { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 685     { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 }
 686     { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
 687     { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
 688                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 689     { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 }
 690     { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 }
 691     { AF_BLUE_STRING_MAX,                      0                                 }
 692 
 693   AF_BLUE_STRINGSET_AVST
 694     { AF_BLUE_STRING_AVESTAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 695     { AF_BLUE_STRING_AVESTAN_BOTTOM, 0                          }
 696     { AF_BLUE_STRING_MAX,            0                          }
 697 
 698   AF_BLUE_STRINGSET_BAMU
 699     { AF_BLUE_STRING_BAMUM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 700     { AF_BLUE_STRING_BAMUM_BOTTOM, 0                          }
 701     { AF_BLUE_STRING_MAX,          0                          }
 702 
 703   AF_BLUE_STRINGSET_BENG
 704     { AF_BLUE_STRING_BENGALI_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
 705     { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP        }
 706     { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP      |
 707                                    AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
 708                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 709     { AF_BLUE_STRING_BENGALI_BASE, 0                                 }
 710     { AF_BLUE_STRING_MAX,          0                                 }
 711 
 712   AF_BLUE_STRINGSET_BUHD
 713     { AF_BLUE_STRING_BUHID_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
 714     { AF_BLUE_STRING_BUHID_LARGE,  AF_BLUE_PROPERTY_LATIN_TOP        }
 715     { AF_BLUE_STRING_BUHID_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP      |
 716                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 717     { AF_BLUE_STRING_BUHID_BOTTOM, 0                                 }
 718     { AF_BLUE_STRING_MAX,          0                                 }
 719 
 720   AF_BLUE_STRINGSET_CAKM
 721     { AF_BLUE_STRING_CHAKMA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
 722     { AF_BLUE_STRING_CHAKMA_BOTTOM,    0                          }
 723     { AF_BLUE_STRING_CHAKMA_DESCENDER, 0                          }
 724     { AF_BLUE_STRING_MAX,              0                          }
 725 
 726   AF_BLUE_STRINGSET_CANS
 727     { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,             AF_BLUE_PROPERTY_LATIN_TOP        }
 728     { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,          0                                 }
 729     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
 730                                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 731     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM,    0                                 }
 732     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        }
 733     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,     0                                 }
 734     { AF_BLUE_STRING_MAX,                                0                                 }
 735 
 736   AF_BLUE_STRINGSET_CARI
 737     { AF_BLUE_STRING_CARIAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 738     { AF_BLUE_STRING_CARIAN_BOTTOM, 0                          }
 739     { AF_BLUE_STRING_MAX,           0                          }
 740 
 741   AF_BLUE_STRINGSET_CHER
 742     { AF_BLUE_STRING_CHEROKEE_CAPITAL,         AF_BLUE_PROPERTY_LATIN_TOP        }
 743     { AF_BLUE_STRING_CHEROKEE_CAPITAL,         0                                 }
 744     { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
 745     { AF_BLUE_STRING_CHEROKEE_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
 746                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 747     { AF_BLUE_STRING_CHEROKEE_SMALL,           0                                 }
 748     { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0                                 }
 749     { AF_BLUE_STRING_MAX,                      0                                 }
 750 
 751   AF_BLUE_STRINGSET_COPT
 752     { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
 753     { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0                                 }
 754     { AF_BLUE_STRING_COPTIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
 755                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 756     { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   0                                 }
 757     { AF_BLUE_STRING_MAX,                   0                                 }
 758 
 759   AF_BLUE_STRINGSET_CPRT
 760     { AF_BLUE_STRING_CYPRIOT_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 761     { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0                          }
 762     { AF_BLUE_STRING_CYPRIOT_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP }
 763     { AF_BLUE_STRING_CYPRIOT_SMALL,  0                          }
 764     { AF_BLUE_STRING_MAX,            0                          }
 765 
 766   AF_BLUE_STRINGSET_CYRL
 767     { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 768     { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 }
 769     { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
 770                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 771     { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                 }
 772     { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                 }
 773     { AF_BLUE_STRING_MAX,                      0                                 }
 774 
 775   AF_BLUE_STRINGSET_DEVA
 776     { AF_BLUE_STRING_DEVANAGARI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
 777     { AF_BLUE_STRING_DEVANAGARI_HEAD,   AF_BLUE_PROPERTY_LATIN_TOP        }
 778     { AF_BLUE_STRING_DEVANAGARI_BASE,   AF_BLUE_PROPERTY_LATIN_TOP      |
 779                                         AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
 780                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 781     { AF_BLUE_STRING_DEVANAGARI_BASE,   0                                 }
 782     { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 }
 783     { AF_BLUE_STRING_MAX,               0                                 }
 784 
 785   AF_BLUE_STRINGSET_DSRT
 786     { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
 787     { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0                                 }
 788     { AF_BLUE_STRING_DESERET_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
 789                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 790     { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   0                                 }
 791     { AF_BLUE_STRING_MAX,                    0                                 }
 792 
 793   AF_BLUE_STRINGSET_ETHI
 794     { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 795     { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0                          }
 796     { AF_BLUE_STRING_MAX,             0                          }
 797 
 798   // blue zones for Mtavruli are missing (not yet defined in Unicode)
 799   AF_BLUE_STRINGSET_GEOR
 800     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
 801                                                    AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 802     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM,    0                                 }
 803     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
 804     { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0                                 }
 805     { AF_BLUE_STRING_MAX,                          0                                 }
 806 
 807   AF_BLUE_STRINGSET_GEOK
 808     { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
 809     { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0                                 }
 810     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
 811                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 812     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM,    0                                 }
 813     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
 814     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0                                 }
 815     { AF_BLUE_STRING_MAX,                         0                                 }
 816 
 817   AF_BLUE_STRINGSET_GLAG
 818     { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
 819     { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0                                 }
 820     { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
 821                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 822     { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   0                                 }
 823     { AF_BLUE_STRING_MAX,                       0                                 }
 824 
 825   AF_BLUE_STRINGSET_GOTH
 826     { AF_BLUE_STRING_GOTHIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 827     { AF_BLUE_STRING_GOTHIC_BOTTOM, 0                          }
 828     { AF_BLUE_STRING_MAX,           0                          }
 829 
 830   AF_BLUE_STRINGSET_GREK
 831     { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 832     { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 }
 833     { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
 834     { AF_BLUE_STRING_GREEK_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
 835                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 836     { AF_BLUE_STRING_GREEK_SMALL,           0                                 }
 837     { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 }
 838     { AF_BLUE_STRING_MAX,                   0                                 }
 839 
 840   AF_BLUE_STRINGSET_GUJR
 841     { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
 842                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 843     { AF_BLUE_STRING_GUJARATI_BOTTOM,    0                                 }
 844     { AF_BLUE_STRING_GUJARATI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
 845     { AF_BLUE_STRING_GUJARATI_DESCENDER, 0                                 }
 846     { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
 847     { AF_BLUE_STRING_MAX,                0                                 }
 848 
 849   AF_BLUE_STRINGSET_GURU
 850     { AF_BLUE_STRING_GURMUKHI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        }
 851     { AF_BLUE_STRING_GURMUKHI_HEAD,      AF_BLUE_PROPERTY_LATIN_TOP        }
 852     { AF_BLUE_STRING_GURMUKHI_BASE,      AF_BLUE_PROPERTY_LATIN_TOP      |
 853                                          AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
 854                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 855     { AF_BLUE_STRING_GURMUKHI_BOTTOM,    0                                 }
 856     { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
 857     { AF_BLUE_STRING_MAX,                0                                 }
 858 
 859   AF_BLUE_STRINGSET_HEBR
 860     { AF_BLUE_STRING_HEBREW_TOP,       AF_BLUE_PROPERTY_LATIN_TOP  |
 861                                        AF_BLUE_PROPERTY_LATIN_LONG   }
 862     { AF_BLUE_STRING_HEBREW_BOTTOM,    0                             }
 863     { AF_BLUE_STRING_HEBREW_DESCENDER, 0                             }
 864     { AF_BLUE_STRING_MAX,              0                             }
 865 
 866   AF_BLUE_STRINGSET_KALI
 867     { AF_BLUE_STRING_KAYAH_LI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
 868                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 869     { AF_BLUE_STRING_KAYAH_LI_BOTTOM,          0                                 }
 870     { AF_BLUE_STRING_KAYAH_LI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
 871     { AF_BLUE_STRING_KAYAH_LI_DESCENDER,       0                                 }
 872     { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0                                 }
 873     { AF_BLUE_STRING_MAX,                      0                                 }
 874 
 875   AF_BLUE_STRINGSET_KHMR
 876     { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
 877                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 878     { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP,   AF_BLUE_PROPERTY_LATIN_SUB_TOP    }
 879     { AF_BLUE_STRING_KHMER_BOTTOM,          0                                 }
 880     { AF_BLUE_STRING_KHMER_DESCENDER,       0                                 }
 881     { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0                                 }
 882     { AF_BLUE_STRING_MAX,                   0                                 }
 883 
 884   AF_BLUE_STRINGSET_KHMS
 885     { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
 886                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 887     { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 }
 888     { AF_BLUE_STRING_MAX,                         0                                 }
 889 
 890   AF_BLUE_STRINGSET_KNDA
 891     { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 892     { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          }
 893     { AF_BLUE_STRING_MAX,            0                          }
 894 
 895   AF_BLUE_STRINGSET_LAO
 896     { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
 897                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 898     { AF_BLUE_STRING_LAO_BOTTOM,         0                                 }
 899     { AF_BLUE_STRING_LAO_ASCENDER,       AF_BLUE_PROPERTY_LATIN_TOP        }
 900     { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP        }
 901     { AF_BLUE_STRING_LAO_DESCENDER,      0                                 }
 902     { AF_BLUE_STRING_MAX,                0                                 }
 903 
 904   AF_BLUE_STRINGSET_LATN
 905     { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 906     { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 }
 907     { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 908     { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
 909                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 910     { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 }
 911     { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 }
 912     { AF_BLUE_STRING_MAX,                   0                                 }
 913 
 914   AF_BLUE_STRINGSET_LATB
 915     { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 916     { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 }
 917     { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 918     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
 919                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 920     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 }
 921     { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 }
 922     { AF_BLUE_STRING_MAX,                        0                                 }
 923 
 924   AF_BLUE_STRINGSET_LATP
 925     { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 926     { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 }
 927     { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
 928     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
 929                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 930     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 }
 931     { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 }
 932     { AF_BLUE_STRING_MAX,                        0                                 }
 933 
 934   AF_BLUE_STRINGSET_LISU
 935     { AF_BLUE_STRING_LISU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 936     { AF_BLUE_STRING_LISU_BOTTOM, 0                          }
 937     { AF_BLUE_STRING_MAX,         0                          }
 938 
 939   AF_BLUE_STRINGSET_MLYM
 940     { AF_BLUE_STRING_MALAYALAM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 941     { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0                          }
 942     { AF_BLUE_STRING_MAX,              0                          }
 943 
 944   AF_BLUE_STRINGSET_MYMR
 945     { AF_BLUE_STRING_MYANMAR_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
 946                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 947     { AF_BLUE_STRING_MYANMAR_BOTTOM,    0                                 }
 948     { AF_BLUE_STRING_MYANMAR_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
 949     { AF_BLUE_STRING_MYANMAR_DESCENDER, 0                                 }
 950     { AF_BLUE_STRING_MAX,               0                                 }
 951 
 952   AF_BLUE_STRINGSET_NKOO
 953     { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
 954     { AF_BLUE_STRING_NKO_BOTTOM,       0                                 }
 955     { AF_BLUE_STRING_NKO_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
 956                                        AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
 957     { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0                                 }
 958     { AF_BLUE_STRING_MAX,              0                                 }
 959 
 960   AF_BLUE_STRINGSET_NONE
 961     { AF_BLUE_STRING_MAX, 0 }
 962 
 963   AF_BLUE_STRINGSET_OLCK
 964     { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }
 965     { AF_BLUE_STRING_OL_CHIKI, 0                          }
 966     { AF_BLUE_STRING_MAX,      0                          }
 967 
 968   AF_BLUE_STRINGSET_ORKH
 969     { AF_BLUE_STRING_OLD_TURKIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 970     { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0                          }
 971     { AF_BLUE_STRING_MAX,               0                          }
 972 
 973   AF_BLUE_STRINGSET_OSGE
 974     { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP       }
 975     { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    0                                }
 976     { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                }
 977     { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP     |
 978                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT  }
 979     { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      0                                }
 980     { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP       }
 981     { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                }
 982     { AF_BLUE_STRING_MAX,                     0                                }
 983 
 984   AF_BLUE_STRINGSET_OSMA
 985     { AF_BLUE_STRING_OSMANYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 986     { AF_BLUE_STRING_OSMANYA_BOTTOM, 0                          }
 987     { AF_BLUE_STRING_MAX,            0                          }
 988 
 989   AF_BLUE_STRINGSET_SAUR
 990     { AF_BLUE_STRING_SAURASHTRA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
 991     { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0                          }
 992     { AF_BLUE_STRING_MAX,               0                          }
 993 
 994   AF_BLUE_STRINGSET_SHAW
 995     { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
 996     { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                 }
 997     { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                 }
 998     { AF_BLUE_STRING_SHAVIAN_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
 999                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
1000     { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0                                 }
1001     { AF_BLUE_STRING_MAX,                  0                                 }
1002 
1003   AF_BLUE_STRINGSET_SINH
1004     { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
1005     { AF_BLUE_STRING_SINHALA_BOTTOM,    0                          }
1006     { AF_BLUE_STRING_SINHALA_DESCENDER, 0                          }
1007     { AF_BLUE_STRING_MAX,               0                          }
1008 
1009   AF_BLUE_STRINGSET_SUND
1010     { AF_BLUE_STRING_SUNDANESE_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
1011     { AF_BLUE_STRING_SUNDANESE_BOTTOM,    0                          }
1012     { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0                          }
1013     { AF_BLUE_STRING_MAX,                 0                          }
1014 
1015   AF_BLUE_STRINGSET_TAML
1016     { AF_BLUE_STRING_TAMIL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
1017     { AF_BLUE_STRING_TAMIL_BOTTOM, 0                          }
1018     { AF_BLUE_STRING_MAX,          0                          }
1019 
1020   AF_BLUE_STRINGSET_TAVT
1021     { AF_BLUE_STRING_TAI_VIET_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
1022     { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0                          }
1023     { AF_BLUE_STRING_MAX,             0                          }
1024 
1025   AF_BLUE_STRINGSET_TELU
1026     { AF_BLUE_STRING_TELUGU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
1027     { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          }
1028     { AF_BLUE_STRING_MAX,           0                          }
1029 
1030   AF_BLUE_STRINGSET_TFNG
1031     { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }
1032     { AF_BLUE_STRING_TIFINAGH, 0                          }
1033     { AF_BLUE_STRING_MAX,      0                          }
1034 
1035   AF_BLUE_STRINGSET_THAI
1036     { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
1037                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
1038     { AF_BLUE_STRING_THAI_BOTTOM,          0                                 }
1039     { AF_BLUE_STRING_THAI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
1040     { AF_BLUE_STRING_THAI_LARGE_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
1041     { AF_BLUE_STRING_THAI_DESCENDER,       0                                 }
1042     { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0                                 }
1043     { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 }
1044     { AF_BLUE_STRING_MAX,                  0                                 }
1045 
1046   AF_BLUE_STRINGSET_VAII
1047     { AF_BLUE_STRING_VAI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
1048     { AF_BLUE_STRING_VAI_BOTTOM, 0                          }
1049     { AF_BLUE_STRING_MAX,        0                          }
1050 
1051 #ifdef AF_CONFIG_OPTION_CJK
1052 
1053   AF_BLUE_STRINGSET_HANI
1054     { AF_BLUE_STRING_CJK_TOP,    AF_BLUE_PROPERTY_CJK_TOP     }
1055     { AF_BLUE_STRING_CJK_BOTTOM, 0                            }
1056 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
1057     { AF_BLUE_STRING_CJK_LEFT,   AF_BLUE_PROPERTY_CJK_HORIZ   }
1058     { AF_BLUE_STRING_CJK_RIGHT,  AF_BLUE_PROPERTY_CJK_HORIZ |
1059                                  AF_BLUE_PROPERTY_CJK_RIGHT   }
1060 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
1061     { AF_BLUE_STRING_MAX,        0                            }
1062 
1063 #endif /* AF_CONFIG_OPTION_CJK                */
1064 
1065 
1066 // END