shithub: freetype+ttf2subf

ref: 978eefee5401abee6bf702c6bcde9afb47893145
dir: /src/autofit/afblue.dat/

View raw version
// afblue.dat
//
//   Auto-fitter data for blue strings.
//
// Copyright (C) 2013-2022 by
// David Turner, Robert Wilhelm, and Werner Lemberg.
//
// This file is part of the FreeType project, and may only be used,
// modified, and distributed under the terms of the FreeType project
// license, LICENSE.TXT.  By continuing to use, modify, or distribute
// this file you indicate that you have read the license and
// understand and accept it fully.


// This file contains data specific to blue zones.  It gets processed by
// a script to simulate `jagged arrays', with enumeration values holding
// offsets into the arrays.
//
// The format of the file is rather simple:  A section starts with three
// labels separated by whitespace and followed by a colon (everything in a
// single line); the first label gives the name of the enumeration template,
// the second the name of the array template, and the third the name of the
// `maximum' template.  The script then fills the corresponding templates
// (indicated by `@' characters around the name).
//
// A section contains one or more data records.  Each data record consists
// of two or more lines.  The first line holds the enumeration name, and the
// remaining lines the corresponding array data.
//
// There are two possible representations for array data.
//
// - A string of characters or character clusters (for example, representing
//   Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double
//   quotes, using C syntax, where the elements are separated by spaces.
//   There can be only one string per line, thus the starting and ending
//   double quote must be the first and last character in the line,
//   respectively, ignoring whitespace before and after the string.  If
//   there are multiple strings (in multiple lines), they are concatenated
//   to a single string.  In the output, a string gets represented as a
//   series of singles bytes, followed by a zero byte.  The enumeration
//   values simply hold byte offsets to the start of the corresponding
//   strings.
//
//   For strings, the `maximum' template holds the maximum number of
//   non-space characters in all strings.
//
// - Data blocks enclosed in balanced braces, which get copied verbatim and
//   which can span multiple lines.  The opening brace of a block must be
//   the first character of a line (ignoring whitespace), and the closing
//   brace the last (ignoring whitespace also).  The script appends a comma
//   character after each block and counts the number of blocks to set the
//   enumeration values.
//
//   For data blocks, the `maximum' template holds the maximum number of
//   array elements.
//
// A section can contain either strings only or data blocks only.
//
// A comment line starts with `//'; it gets removed.  A preprocessor
// directive line (using the standard syntax of `cpp') starts with `#' and
// gets copied verbatim to both the enumeration and the array.  Whitespace
// outside of a string is insignificant.
//
// Preprocessor directives are ignored while the script computes maximum
// values; this essentially means that the maximum values can easily be too
// large.  Given that the purpose of those values is to create local
// fixed-size arrays at compile time for further processing of the blue zone
// data, this isn't a problem.  Note the final zero byte of a string is not
// counted.  Note also that the count holds the number of UTF-8 encoded
// characters, not bytes.


// The blue zone string data, to be used in the blue stringsets below.

AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:

  AF_BLUE_STRING_ADLAM_CAPITAL_TOP
    "𞤌 𞤅 𞤈 𞤏 𞤔 𞤚"
  AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM
    "𞤂 𞤖"
  AF_BLUE_STRING_ADLAM_SMALL_TOP
    "𞤬 𞤮 𞤻 𞤼 𞤾"
  AF_BLUE_STRING_ADLAM_SMALL_BOTTOM
    "𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀"

  AF_BLUE_STRING_ARABIC_TOP
    "ا إ ل ك ط ظ"
  AF_BLUE_STRING_ARABIC_BOTTOM
    "ت ث ط ظ ك"
  // We don't necessarily have access to medial forms via Unicode in case
  // Arabic presentational forms are missing.  The only character that is
  // guaranteed to have the same vertical position with joining (this is,
  // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both
  // round and flat curves.
  AF_BLUE_STRING_ARABIC_JOIN
    "ـ"

  AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP
    "Ա Մ Ւ Ս Բ Գ Դ Օ"
  AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM
    "Ւ Ո Դ Ճ Շ Ս Տ Օ"
  AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER
    "ե է ի մ վ ֆ ճ"
  AF_BLUE_STRING_ARMENIAN_SMALL_TOP
    "ա յ ւ ս գ շ ր օ"
  AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM
    "հ ո ճ ա ե ծ ս օ"
  AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER
    "բ ը ի լ ղ պ փ ց"

  AF_BLUE_STRING_AVESTAN_TOP
    "𐬀 𐬁 𐬐 𐬛"
  AF_BLUE_STRING_AVESTAN_BOTTOM
    "𐬀 𐬁"

  AF_BLUE_STRING_BAMUM_TOP
    "ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ"
  AF_BLUE_STRING_BAMUM_BOTTOM
    "ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲"

  AF_BLUE_STRING_BENGALI_BASE
    "অ ড ত ন ব ভ ল ক"
  AF_BLUE_STRING_BENGALI_TOP
    "ই ট ঠ ি ী ৈ ৗ"
  AF_BLUE_STRING_BENGALI_HEAD
    "ও এ ড ত ন ব ল ক"

  AF_BLUE_STRING_BUHID_TOP
    "ᝐ ᝈ"
  AF_BLUE_STRING_BUHID_LARGE
    "ᝅ ᝊ ᝎ"
  AF_BLUE_STRING_BUHID_SMALL
    "ᝂ ᝃ ᝉ ᝌ"
  AF_BLUE_STRING_BUHID_BOTTOM
    "ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ"

  AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP
    "ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ"
  AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM
    "ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ"
  AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP
    "ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ"
  AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM
    "ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ"
  AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP
    "ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ"
  AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM
    "ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ"

  AF_BLUE_STRING_CARIAN_TOP
    "𐊧 𐊫 𐊬 𐊭 𐊱 𐊺 𐊼 𐊿"
  AF_BLUE_STRING_CARIAN_BOTTOM
    "𐊣 𐊧 𐊷 𐋀 𐊫 𐊸 𐋉"

  AF_BLUE_STRING_CHAKMA_TOP
    "𑄃 𑄅 𑄉 𑄙 𑄗"
  AF_BLUE_STRING_CHAKMA_BOTTOM
    "𑄅 𑄛 𑄝 𑄗 𑄓"
  AF_BLUE_STRING_CHAKMA_DESCENDER
    "𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢"

  AF_BLUE_STRING_CHEROKEE_CAPITAL
    "Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ"
  AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER
    "ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ"
  AF_BLUE_STRING_CHEROKEE_SMALL
    "ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ"
  AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER
    "ᏸ ꮐ ꭹ ꭻ"

  AF_BLUE_STRING_COPTIC_CAPITAL_TOP
    "Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ"
  AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM
    "Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ"
  AF_BLUE_STRING_COPTIC_SMALL_TOP
    "ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ"
  AF_BLUE_STRING_COPTIC_SMALL_BOTTOM
    "ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ"

  AF_BLUE_STRING_CYPRIOT_TOP
    "𐠍 𐠙 𐠳 𐠱 𐠅 𐠓 𐠣 𐠦"
  AF_BLUE_STRING_CYPRIOT_BOTTOM
    "𐠃 𐠊 𐠛 𐠣 𐠳 𐠵 𐠐"
  AF_BLUE_STRING_CYPRIOT_SMALL
    "𐠈 𐠏 𐠖"

  AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP
    "Б В Е П З О С Э"
  AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM
    "Б В Е Ш З О С Э"
  AF_BLUE_STRING_CYRILLIC_SMALL
    "х п н ш е з о с"
  AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER
    "р у ф"

  AF_BLUE_STRING_DESERET_CAPITAL_TOP
    "𐐂 𐐄 𐐋 𐐗 𐐑"
  AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM
    "𐐀 𐐂 𐐄 𐐗 𐐛"
  AF_BLUE_STRING_DESERET_SMALL_TOP
    "𐐪 𐐬 𐐳 𐐿 𐐹"
  AF_BLUE_STRING_DESERET_SMALL_BOTTOM
    "𐐨 𐐪 𐐬 𐐿 𐑃"

  AF_BLUE_STRING_DEVANAGARI_BASE
    "क न म उ छ ट ठ ड"
  AF_BLUE_STRING_DEVANAGARI_TOP
    "ई ऐ ओ औ ि ी ो ौ"
  // note that some fonts have extreme variation in the height of the
  // round head elements; for this reason we also define the `base'
  // blue zone, which must be always present
  AF_BLUE_STRING_DEVANAGARI_HEAD
    "क म अ आ थ ध भ श"
  AF_BLUE_STRING_DEVANAGARI_BOTTOM
    "ु ृ"

  AF_BLUE_STRING_ETHIOPIC_TOP
    "ሀ ሃ ዘ ፐ ማ በ ዋ ዐ"
  AF_BLUE_STRING_ETHIOPIC_BOTTOM
    "ለ ሐ በ ዘ ሀ ሪ ዐ ጨ"

  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP
    "გ დ ე ვ თ ი ო ღ"
  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM
    "ა ზ მ ს შ ძ ხ პ"
  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER
    "ს ხ ქ ზ მ შ ჩ წ"
  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER
    "ე ვ ჟ ტ უ ფ ქ ყ"

  AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP
    "Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ"
  AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM
    "Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ"

  AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP
    "ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ"
  AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM
    "ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ"
  AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER
    "ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ"
  AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER
    "ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ"

  AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP
    "Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ"
  AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM
    "Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ"

  AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP
    "Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ"
  AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM
    "Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ"
  AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP
    "ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ"
  AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM
    "ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ"

  AF_BLUE_STRING_GOTHIC_TOP
    "𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾"
  AF_BLUE_STRING_GOTHIC_BOTTOM
    "𐌶 𐌴 𐍃 𐍈"

  AF_BLUE_STRING_GREEK_CAPITAL_TOP
    "Γ Β Ε Ζ Θ Ο Ω"
  AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM
    "Β Δ Ζ Ξ Θ Ο"
  AF_BLUE_STRING_GREEK_SMALL_BETA_TOP
    "β θ δ ζ λ ξ"
  AF_BLUE_STRING_GREEK_SMALL
    "α ε ι ο π σ τ ω"
  AF_BLUE_STRING_GREEK_SMALL_DESCENDER
    "β γ η μ ρ φ χ ψ"

  AF_BLUE_STRING_GUJARATI_TOP
    "ત ન ઋ ઌ છ ટ ર ૦"
  AF_BLUE_STRING_GUJARATI_BOTTOM
    "ખ ગ ઘ ઞ ઇ ઈ ઠ જ"
  AF_BLUE_STRING_GUJARATI_ASCENDER
    "ઈ ઊ િ ી લી શ્ચિ જિ સી"
  AF_BLUE_STRING_GUJARATI_DESCENDER
    "ુ ૃ ૄ ખુ છૃ છૄ"
  AF_BLUE_STRING_GUJARATI_DIGIT_TOP
    "૦ ૧ ૨ ૩ ૭"

  AF_BLUE_STRING_GURMUKHI_BASE
    "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ"
  AF_BLUE_STRING_GURMUKHI_HEAD
    "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ"
  AF_BLUE_STRING_GURMUKHI_TOP
    "ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ"
  AF_BLUE_STRING_GURMUKHI_BOTTOM
    "ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ"
  AF_BLUE_STRING_GURMUKHI_DIGIT_TOP
    "੦ ੧ ੨ ੩ ੭"

  AF_BLUE_STRING_HEBREW_TOP
    "ב ד ה ח ך כ ם ס"
  AF_BLUE_STRING_HEBREW_BOTTOM
    "ב ט כ ם ס צ"
  AF_BLUE_STRING_HEBREW_DESCENDER
    "ק ך ן ף ץ"

  AF_BLUE_STRING_KANNADA_TOP
    "ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ"
  AF_BLUE_STRING_KANNADA_BOTTOM
    "ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭"

  AF_BLUE_STRING_KAYAH_LI_TOP
    "꤅ ꤏ ꤁ ꤋ ꤀ ꤍ"
  AF_BLUE_STRING_KAYAH_LI_BOTTOM
    "꤈ ꤘ ꤀ ꤍ ꤢ"
  AF_BLUE_STRING_KAYAH_LI_ASCENDER
    "ꤖ ꤡ"
  AF_BLUE_STRING_KAYAH_LI_DESCENDER
    "ꤑ ꤜ ꤞ"
  AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER
    "ꤑ꤬ ꤜ꤭ ꤔ꤬"

  AF_BLUE_STRING_KHMER_TOP
    "ខ ទ ន ឧ ឩ ា"
  AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP
    "ក្ក ក្ខ ក្គ ក្ថ"
  AF_BLUE_STRING_KHMER_BOTTOM
    "ខ ឃ ច ឋ ប ម យ ឲ"
  AF_BLUE_STRING_KHMER_DESCENDER
    "ត្រ រៀ ឲ្យ អឿ"
  AF_BLUE_STRING_KHMER_LARGE_DESCENDER
    "ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ"

  AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP
    "᧠ ᧡"
  AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM
    "᧶ ᧹"

  AF_BLUE_STRING_LAO_TOP
    "າ ດ ອ ມ ລ ວ ຣ ງ"
  AF_BLUE_STRING_LAO_BOTTOM
    "າ ອ ບ ຍ ຣ ຮ ວ ຢ"
  AF_BLUE_STRING_LAO_ASCENDER
    "ປ ຢ ຟ ຝ"
  AF_BLUE_STRING_LAO_LARGE_ASCENDER
    "ໂ ໄ ໃ"
  AF_BLUE_STRING_LAO_DESCENDER
    "ງ ຊ ຖ ຽ ໆ ຯ"

  AF_BLUE_STRING_LATIN_CAPITAL_TOP
    "T H E Z O C Q S"
  AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM
    "H E Z L O C U S"
  AF_BLUE_STRING_LATIN_SMALL_F_TOP
    "f i j k d b h"
  AF_BLUE_STRING_LATIN_SMALL_TOP
    "u v x z o e s c"
  AF_BLUE_STRING_LATIN_SMALL_BOTTOM
    "n r x z o e s c"
  AF_BLUE_STRING_LATIN_SMALL_DESCENDER
    "p q g j y"

  // we assume that both the subscript and superscript ranges
  // don't contain oldstyle digits (actually, most fonts probably
  // have digits only in those ranges)
  AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP
    "₀ ₃ ₅ ₇ ₈"
  AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM
    "₀ ₁ ₂ ₃ ₈"
  AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP
    "ᵢ ⱼ ₕ ₖ ₗ"
  AF_BLUE_STRING_LATIN_SUBS_SMALL
    "ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ"
  AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER
    "ᵦ ᵧ ᵨ ᵩ ₚ"

  AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP
    "⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ"
  AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM
    "⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ"
  AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP
    "ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ"
  AF_BLUE_STRING_LATIN_SUPS_SMALL
    "ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ"
  AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER
    "ᵖ ʸ ᵍ"

  AF_BLUE_STRING_LISU_TOP
    "ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ"
  AF_BLUE_STRING_LISU_BOTTOM
    "ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ"

  AF_BLUE_STRING_MALAYALAM_TOP
    "ഒ ട ഠ റ ച പ ച്ച പ്പ"
  AF_BLUE_STRING_MALAYALAM_BOTTOM
    "ട ഠ ധ ശ ഘ ച ഥ ല"

  AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP
    "𖹀 𖹁 𖹂 𖹃 𖹏 𖹚 𖹟"
  AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM
    "𖹀 𖹁 𖹂 𖹃 𖹏 𖹚 𖹒 𖹓"
  AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP
    "𖹤 𖹬 𖹧 𖹴 𖹶 𖹾"
  AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP
    "𖹠 𖹡 𖹢 𖹹 𖹳 𖹮"
  AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM
    "𖹠 𖹡 𖹢 𖹳 𖹭 𖹽"
  AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER
    "𖹥 𖹨 𖹩"
  AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP
    "𖺀 𖺅 𖺈 𖺄 𖺍"

  AF_BLUE_STRING_MONGOLIAN_TOP_BASE
    "ᠳ ᠴ ᠶ ᠽ ᡂ ᡊ ‍ᡡ‍ ‍ᡳ‍"
  AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE
    "ᡃ"

  AF_BLUE_STRING_MYANMAR_TOP
    "ခ ဂ င ဒ ဝ ၥ ၊ ။"
  AF_BLUE_STRING_MYANMAR_BOTTOM
    "င ဎ ဒ ပ ဗ ဝ ၊ ။"
  AF_BLUE_STRING_MYANMAR_ASCENDER
    "ဩ ြ ၍ ၏ ၆ ါ ိ"
  AF_BLUE_STRING_MYANMAR_DESCENDER
    "ဉ ည ဥ ဩ ဨ ၂ ၅ ၉"

  AF_BLUE_STRING_NKO_TOP
    "ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ"
  AF_BLUE_STRING_NKO_BOTTOM
    "߀ ߘ ߡ ߠ ߥ"
  AF_BLUE_STRING_NKO_SMALL_TOP
    "ߏ ߛ ߋ"
  AF_BLUE_STRING_NKO_SMALL_BOTTOM
    "ߎ ߏ ߛ ߋ"

  AF_BLUE_STRING_OL_CHIKI
    "ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ"

  AF_BLUE_STRING_OLD_TURKIC_TOP
    "𐰗 𐰘 𐰧"
  AF_BLUE_STRING_OLD_TURKIC_BOTTOM
    "𐰉 𐰗 𐰦 𐰧"

  AF_BLUE_STRING_OSAGE_CAPITAL_TOP
    "𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆"
  AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM
    "𐒰 𐓍 𐓂 𐒿 𐓎 𐒹"
  AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER
    "𐒼 𐒽 𐒾"
  AF_BLUE_STRING_OSAGE_SMALL_TOP
    "𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮"
  AF_BLUE_STRING_OSAGE_SMALL_BOTTOM
    "𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶"
  AF_BLUE_STRING_OSAGE_SMALL_ASCENDER
    "𐓤 𐓦 𐓸 𐓹 𐓛"
  AF_BLUE_STRING_OSAGE_SMALL_DESCENDER
    "𐓤 𐓥 𐓦"

  AF_BLUE_STRING_OSMANYA_TOP
    "𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣"
  AF_BLUE_STRING_OSMANYA_BOTTOM
    "𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩"

  AF_BLUE_STRING_ROHINGYA_TOP
    "𐴃 𐴀 𐴆 𐴖 𐴕"
  AF_BLUE_STRING_ROHINGYA_BOTTOM
    "𐴔 𐴖 𐴕 𐴑 𐴐"
  AF_BLUE_STRING_ROHINGYA_JOIN
    "ـ"

  AF_BLUE_STRING_SAURASHTRA_TOP
    "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ"
  AF_BLUE_STRING_SAURASHTRA_BOTTOM
    "ꢂ ꢨ ꢺ ꢤ ꢎ"

  AF_BLUE_STRING_SHAVIAN_TOP
    "𐑕 𐑙"
  AF_BLUE_STRING_SHAVIAN_BOTTOM
    "𐑔 𐑖 𐑗 𐑹 𐑻"
  AF_BLUE_STRING_SHAVIAN_DESCENDER
    "𐑟 𐑣"
  AF_BLUE_STRING_SHAVIAN_SMALL_TOP
    "𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼"
  AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM
    "𐑴 𐑻 𐑹"

  AF_BLUE_STRING_SINHALA_TOP
    "ඉ ක ඝ ඳ ප ය ල ෆ"
  AF_BLUE_STRING_SINHALA_BOTTOM
    "එ ඔ ඝ ජ ට ථ ධ ර"
  AF_BLUE_STRING_SINHALA_DESCENDER
    "ද ඳ උ ල තූ තු බු දු"

  AF_BLUE_STRING_SUNDANESE_TOP
    "ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ"
  AF_BLUE_STRING_SUNDANESE_BOTTOM
    "ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ"
  AF_BLUE_STRING_SUNDANESE_DESCENDER
    "ᮼ ᳄"

  AF_BLUE_STRING_TAI_VIET_TOP
    "ꪆ ꪔ ꪒ ꪖ ꪫ"
  AF_BLUE_STRING_TAI_VIET_BOTTOM
    "ꪉ ꪫ ꪮ"

  AF_BLUE_STRING_TAMIL_TOP
    "உ ஒ ஓ ற ஈ க ங ச"
  AF_BLUE_STRING_TAMIL_BOTTOM
    "க ச ல ஶ உ ங ட ப"

  AF_BLUE_STRING_TELUGU_TOP
    "ఇ ఌ ఙ ఞ ణ ఱ ౯"
  AF_BLUE_STRING_TELUGU_BOTTOM
    "అ క చ ర ఽ ౨ ౬"

  AF_BLUE_STRING_THAI_TOP
    "บ เ แ อ ก า"
  AF_BLUE_STRING_THAI_BOTTOM
    "บ ป ษ ฯ อ ย ฮ"
  AF_BLUE_STRING_THAI_ASCENDER
    "ป ฝ ฟ"
  AF_BLUE_STRING_THAI_LARGE_ASCENDER
    "โ ใ ไ"
  AF_BLUE_STRING_THAI_DESCENDER
    "ฎ ฏ ฤ ฦ"
  AF_BLUE_STRING_THAI_LARGE_DESCENDER
    "ญ ฐ"
  AF_BLUE_STRING_THAI_DIGIT_TOP
    "๐ ๑ ๓"

  AF_BLUE_STRING_TIFINAGH
    "ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ"

  AF_BLUE_STRING_VAI_TOP
    "ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ"
  AF_BLUE_STRING_VAI_BOTTOM
    "ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ"


#ifdef AF_CONFIG_OPTION_CJK

  AF_BLUE_STRING_CJK_TOP
    "他 们 你 來 們 到 和 地"
    " 对 對 就 席 我 时 時 會"
    " 来 為 能 舰 說 说 这 這"
    " 齊 |"
    " 军 同 已 愿 既 星 是 景"
    " 民 照 现 現 理 用 置 要"
    " 軍 那 配 里 開 雷 露 面"
    " 顾"
  AF_BLUE_STRING_CJK_BOTTOM
    "个 为 人 他 以 们 你 來"
    " 個 們 到 和 大 对 對 就"
    " 我 时 時 有 来 為 要 說"
    " 说 |"
    " 主 些 因 它 想 意 理 生"
    " 當 看 着 置 者 自 著 裡"
    " 过 还 进 進 過 道 還 里"
    " 面"

#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT

  AF_BLUE_STRING_CJK_LEFT
    " 些 们 你 來 們 到 和 地"
    " 她 将 將 就 年 得 情 最"
    " 样 樣 理 能 說 说 这 這"
    " 通 |"
    " 即 吗 吧 听 呢 品 响 嗎"
    " 师 師 收 断 斷 明 眼 間"
    " 间 际 陈 限 除 陳 随 際"
    " 隨"
  AF_BLUE_STRING_CJK_RIGHT
    "事 前 學 将 將 情 想 或"
    " 政 斯 新 样 樣 民 沒 没"
    " 然 特 现 現 球 第 經 谁"
    " 起 |"
    " 例 別 别 制 动 動 吗 嗎"
    " 增 指 明 朝 期 构 物 确"
    " 种 調 调 費 费 那 都 間"
    " 间"

#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */

#endif /* AF_CONFIG_OPTION_CJK                */


// The blue zone stringsets, as used in the script styles, cf. `afstyles.h'.
//
// The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some
// explanations.
//
// A blue zone in general is defined by a reference and an overshoot line.
// During the hinting process, all coordinate values between those two lines
// are set equal to the reference value, provided that the blue zone is not
// wider than 0.75 pixels (otherwise the blue zone gets ignored).  All
// entries must have `AF_BLUE_STRING_MAX' as the final line.
//
// During the glyph analysis, edges are sorted from bottom to top, and then
// sequentially checked, edge by edge, against the blue zones in the order
// given below.
//
//
// latin auto-hinter
// -----------------
//
// Characters in a blue string are automatically classified as having a flat
// (reference) or a round (overshoot) extremum.  The blue zone is then set
// up by the mean values of all flat extrema and all round extrema,
// respectively.  Only horizontal blue zones (i.e., adjusting vertical
// coordinate values) are supported.
//
// Some scripts like Khmer need character composition to get all necessary
// blue zones, since Unicode only provides an abstract data model that
// doesn't represent all possible glyph shapes.  For such character
// clusters, the HarfBuzz library is used to convert them into the
// corresponding glyphs.  The largest glyph element (where `largest' can be
// either `largest ascender' or `largest descender') then defines the
// corresponding flat or round extremum.
//
// For the latin auto-hinter, the overshoot should be larger than the
// reference for top zones, and vice versa for bottom zones.
//
//   LATIN_TOP
//     Take the maximum flat and round coordinate values of the blue string
//     characters for computing the blue zone's reference and overshoot
//     values.
//
//     If not set, take the minimum values.
//
//     Mutually exclusive with `LATIN_SUB_TOP'.
//
//   LATIN_SUB_TOP
//     For all glyphs of a character cluster, compute the maximum flat
//     and round coordinate values of each component, then take the
//     smallest of the maximum values.  The idea is to get the top of
//     subscript glyphs, as used in Khmer, for example.  Note that
//     this mechanism doesn't work for ordinary ligatures.
//
//     This flags indicates a secondary blue zone: It gets removed if
//     there is a non-LATIN_SUB_TOP blue zone at the same coordinate
//     value (after scaling).
//
//     Mutually exclusive with `LATIN_TOP'.
//
//   LATIN_NEUTRAL
//     Ignore round extrema and define the blue zone with flat values only.
//     Both top and bottom of contours can match.  This is useful for
//     scripts like Devanagari where vowel signs attach to the base
//     character and are implemented as components of composite glyphs.
//
//     If not set, both round and flat extrema are taken into account.
//     Additionally, only the top or the bottom of a contour can match,
//     depending on the LATIN_TOP flag.
//
//     Neutral blue zones should always follow non-neutral blue zones.
//
//   LATIN_X_HEIGHT
//     Scale all glyphs vertically from the corresponding script to make the
//     reference line of this blue zone align on the grid.  The scaling
//     takes place before all other blue zones get aligned to the grid.
//     Only one blue character string of a script style can have this flag.
//
//   LATIN_LONG
//     Apply an additional constraint for blue zone values: Don't
//     necessarily use the extremum as-is but a segment of the topmost (or
//     bottommost) contour that is longer than a heuristic threshold, and
//     which is not too far away vertically from the real extremum.  This
//     ensures that small bumps in the outline are ignored (for example, the
//     `vertical serifs' found in many Hebrew glyph designs).
//
//     The segment must be at least EM/25 font units long, and the distance
//     to the extremum must be smaller than EM/4.
//
//
// cjk auto-hinter
// ---------------
//
// Characters in a blue string are *not* automatically classified.  Instead,
// first come the characters used for the overshoot value, then the
// character `|', then the characters used for the reference value
// (everything separated by space characters).  The blue zone is then set up
// by the mean values of all reference values and all overshoot values,
// respectively.  Both horizontal and vertical blue zones (i.e., adjusting
// vertical and horizontal coordinate values, respectively) are supported.
//
// For the cjk auto-hinter, the overshoot should be smaller than the
// reference for top zones, and vice versa for bottom zones.
//
//   CJK_TOP
//     Take the maximum flat and round coordinate values of the blue string
//     characters.  If not set, take the minimum values.
//
//   CJK_RIGHT
//     A synonym for CJK_TOP.  If CJK_HORIZ is set, this flag indicates the
//     right blue zone, taking horizontal maximum values.
//
//   CJK_HORIZ
//     Define a blue zone for horizontal hinting (i.e., vertical blue
//     zones).  If not set, this is a blue zone for vertical hinting.


AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:

  AF_BLUE_STRINGSET_ADLM
    { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0                                 }
    { AF_BLUE_STRING_ADLAM_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   0                                 }
    { AF_BLUE_STRING_MAX,                  0                                 }

  AF_BLUE_STRINGSET_ARAB
    { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     }
    { AF_BLUE_STRING_ARABIC_BOTTOM, 0                              }
    { AF_BLUE_STRING_ARABIC_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL }
    { AF_BLUE_STRING_MAX,           0                              }

  AF_BLUE_STRINGSET_ARMN
    { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 }
    { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 }
    { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                      0                                 }

  AF_BLUE_STRINGSET_AVST
    { AF_BLUE_STRING_AVESTAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_AVESTAN_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,            0                          }

  AF_BLUE_STRINGSET_BAMU
    { AF_BLUE_STRING_BAMUM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_BAMUM_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,          0                          }

  AF_BLUE_STRINGSET_BENG
    { AF_BLUE_STRING_BENGALI_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP      |
                                   AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_BENGALI_BASE, 0                                 }
    { AF_BLUE_STRING_MAX,          0                                 }

  AF_BLUE_STRINGSET_BUHD
    { AF_BLUE_STRING_BUHID_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_BUHID_LARGE,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_BUHID_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP      |
                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_BUHID_BOTTOM, 0                                 }
    { AF_BLUE_STRING_MAX,          0                                 }

  AF_BLUE_STRINGSET_CAKM
    { AF_BLUE_STRING_CHAKMA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_CHAKMA_BOTTOM,    0                          }
    { AF_BLUE_STRING_CHAKMA_DESCENDER, 0                          }
    { AF_BLUE_STRING_MAX,              0                          }

  AF_BLUE_STRINGSET_CANS
    { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,       0                                 }
    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
                                                      AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0                                 }
    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,  0                                 }
    { AF_BLUE_STRING_MAX,                             0                                 }

  AF_BLUE_STRINGSET_CARI
    { AF_BLUE_STRING_CARIAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_CARIAN_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,           0                          }

  AF_BLUE_STRINGSET_CHER
    { AF_BLUE_STRING_CHEROKEE_CAPITAL,         AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_CHEROKEE_CAPITAL,         0                                 }
    { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_CHEROKEE_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_CHEROKEE_SMALL,           0                                 }
    { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                      0                                 }

  AF_BLUE_STRINGSET_COPT
    { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0                                 }
    { AF_BLUE_STRING_COPTIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   0                                 }
    { AF_BLUE_STRING_MAX,                   0                                 }

  AF_BLUE_STRINGSET_CPRT
    { AF_BLUE_STRING_CYPRIOT_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0                          }
    { AF_BLUE_STRING_CYPRIOT_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_CYPRIOT_SMALL,  0                          }
    { AF_BLUE_STRING_MAX,            0                          }

  AF_BLUE_STRINGSET_CYRL
    { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 }
    { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                 }
    { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                      0                                 }

  AF_BLUE_STRINGSET_DEVA
    { AF_BLUE_STRING_DEVANAGARI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_DEVANAGARI_HEAD,   AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_DEVANAGARI_BASE,   AF_BLUE_PROPERTY_LATIN_TOP      |
                                        AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
                                        AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_DEVANAGARI_BASE,   0                                 }
    { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 }
    { AF_BLUE_STRING_MAX,               0                                 }

  AF_BLUE_STRINGSET_DSRT
    { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0                                 }
    { AF_BLUE_STRING_DESERET_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   0                                 }
    { AF_BLUE_STRING_MAX,                    0                                 }

  AF_BLUE_STRINGSET_ETHI
    { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,             0                          }

  AF_BLUE_STRINGSET_GEOR
    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM,    0                                 }
    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0                                 }
    { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM,     0                                 }
    { AF_BLUE_STRING_MAX,                          0                                 }

  AF_BLUE_STRINGSET_GEOK
    { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0                                 }
    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM,    0                                 }
    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                         0                                 }

  AF_BLUE_STRINGSET_GLAG
    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0                                 }
    { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   0                                 }
    { AF_BLUE_STRING_MAX,                       0                                 }

  AF_BLUE_STRINGSET_GOTH
    { AF_BLUE_STRING_GOTHIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_GOTHIC_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,           0                          }

  AF_BLUE_STRINGSET_GREK
    { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 }
    { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GREEK_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_GREEK_SMALL,           0                                 }
    { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                   0                                 }

  AF_BLUE_STRINGSET_GUJR
    { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_GUJARATI_BOTTOM,    0                                 }
    { AF_BLUE_STRING_GUJARATI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GUJARATI_DESCENDER, 0                                 }
    { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_MAX,                0                                 }

  AF_BLUE_STRINGSET_GURU
    { AF_BLUE_STRING_GURMUKHI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GURMUKHI_HEAD,      AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_GURMUKHI_BASE,      AF_BLUE_PROPERTY_LATIN_TOP      |
                                         AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_GURMUKHI_BOTTOM,    0                                 }
    { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_MAX,                0                                 }

  AF_BLUE_STRINGSET_HEBR
    { AF_BLUE_STRING_HEBREW_TOP,       AF_BLUE_PROPERTY_LATIN_TOP  |
                                       AF_BLUE_PROPERTY_LATIN_LONG   }
    { AF_BLUE_STRING_HEBREW_BOTTOM,    0                             }
    { AF_BLUE_STRING_HEBREW_DESCENDER, 0                             }
    { AF_BLUE_STRING_MAX,              0                             }

  AF_BLUE_STRINGSET_KNDA
    { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,            0                          }

  AF_BLUE_STRINGSET_KALI
    { AF_BLUE_STRING_KAYAH_LI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_KAYAH_LI_BOTTOM,          0                                 }
    { AF_BLUE_STRING_KAYAH_LI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_KAYAH_LI_DESCENDER,       0                                 }
    { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                      0                                 }

  AF_BLUE_STRINGSET_KHMR
    { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP,   AF_BLUE_PROPERTY_LATIN_SUB_TOP    }
    { AF_BLUE_STRING_KHMER_BOTTOM,          0                                 }
    { AF_BLUE_STRING_KHMER_DESCENDER,       0                                 }
    { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                   0                                 }

  AF_BLUE_STRINGSET_KHMS
    { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 }
    { AF_BLUE_STRING_MAX,                         0                                 }

  AF_BLUE_STRINGSET_LAO
    { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_LAO_BOTTOM,         0                                 }
    { AF_BLUE_STRING_LAO_ASCENDER,       AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LAO_DESCENDER,      0                                 }
    { AF_BLUE_STRING_MAX,                0                                 }

  AF_BLUE_STRINGSET_LATN
    { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 }
    { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 }
    { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                   0                                 }

  AF_BLUE_STRINGSET_LATB
    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 }
    { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 }
    { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                        0                                 }

  AF_BLUE_STRINGSET_LATP
    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 }
    { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 }
    { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,                        0                                 }

  AF_BLUE_STRINGSET_LISU
    { AF_BLUE_STRING_LISU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_LISU_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,         0                          }

  AF_BLUE_STRINGSET_MLYM
    { AF_BLUE_STRING_MALAYALAM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,              0                          }

  AF_BLUE_STRINGSET_MEDF
    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM,  0                                 }
    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM,    0                                 }
    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_MAX,                         0                                 }

  AF_BLUE_STRINGSET_MONG
    { AF_BLUE_STRING_MONGOLIAN_TOP_BASE,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0                          }
    { AF_BLUE_STRING_MAX,                   0                          }

  AF_BLUE_STRINGSET_MYMR
    { AF_BLUE_STRING_MYANMAR_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                        AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_MYANMAR_BOTTOM,    0                                 }
    { AF_BLUE_STRING_MYANMAR_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_MYANMAR_DESCENDER, 0                                 }
    { AF_BLUE_STRING_MAX,               0                                 }

  AF_BLUE_STRINGSET_NKOO
    { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_NKO_BOTTOM,       0                                 }
    { AF_BLUE_STRING_NKO_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
                                       AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0                                 }
    { AF_BLUE_STRING_MAX,              0                                 }

  AF_BLUE_STRINGSET_NONE
    { AF_BLUE_STRING_MAX, 0 }

  AF_BLUE_STRINGSET_OLCK
    { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_OL_CHIKI, 0                          }
    { AF_BLUE_STRING_MAX,      0                          }

  AF_BLUE_STRINGSET_ORKH
    { AF_BLUE_STRING_OLD_TURKIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,               0                          }

  AF_BLUE_STRINGSET_OSGE
    { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP       }
    { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    0                                }
    { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                }
    { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP     |
                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT  }
    { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      0                                }
    { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP       }
    { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                }
    { AF_BLUE_STRING_MAX,                     0                                }

  AF_BLUE_STRINGSET_OSMA
    { AF_BLUE_STRING_OSMANYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_OSMANYA_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,            0                          }

  AF_BLUE_STRINGSET_ROHG
    { AF_BLUE_STRING_ROHINGYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     }
    { AF_BLUE_STRING_ROHINGYA_BOTTOM, 0                              }
    { AF_BLUE_STRING_ROHINGYA_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL }
    { AF_BLUE_STRING_MAX,             0                              }

  AF_BLUE_STRINGSET_SAUR
    { AF_BLUE_STRING_SAURASHTRA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,               0                          }

  AF_BLUE_STRINGSET_SHAW
    { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                 }
    { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                 }
    { AF_BLUE_STRING_SHAVIAN_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0                                 }
    { AF_BLUE_STRING_MAX,                  0                                 }

  AF_BLUE_STRINGSET_SINH
    { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_SINHALA_BOTTOM,    0                          }
    { AF_BLUE_STRING_SINHALA_DESCENDER, 0                          }
    { AF_BLUE_STRING_MAX,               0                          }

  AF_BLUE_STRINGSET_SUND
    { AF_BLUE_STRING_SUNDANESE_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_SUNDANESE_BOTTOM,    0                          }
    { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0                          }
    { AF_BLUE_STRING_MAX,                 0                          }

  AF_BLUE_STRINGSET_TAML
    { AF_BLUE_STRING_TAMIL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_TAMIL_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,          0                          }

  AF_BLUE_STRINGSET_TAVT
    { AF_BLUE_STRING_TAI_VIET_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,             0                          }

  AF_BLUE_STRINGSET_TELU
    { AF_BLUE_STRING_TELUGU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,           0                          }

  AF_BLUE_STRINGSET_THAI
    { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
    { AF_BLUE_STRING_THAI_BOTTOM,          0                                 }
    { AF_BLUE_STRING_THAI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_THAI_LARGE_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
    { AF_BLUE_STRING_THAI_DESCENDER,       0                                 }
    { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0                                 }
    { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 }
    { AF_BLUE_STRING_MAX,                  0                                 }

  AF_BLUE_STRINGSET_TFNG
    { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_TIFINAGH, 0                          }
    { AF_BLUE_STRING_MAX,      0                          }

  AF_BLUE_STRINGSET_VAII
    { AF_BLUE_STRING_VAI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
    { AF_BLUE_STRING_VAI_BOTTOM, 0                          }
    { AF_BLUE_STRING_MAX,        0                          }

#ifdef AF_CONFIG_OPTION_CJK

  AF_BLUE_STRINGSET_HANI
    { AF_BLUE_STRING_CJK_TOP,    AF_BLUE_PROPERTY_CJK_TOP     }
    { AF_BLUE_STRING_CJK_BOTTOM, 0                            }
#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
    { AF_BLUE_STRING_CJK_LEFT,   AF_BLUE_PROPERTY_CJK_HORIZ   }
    { AF_BLUE_STRING_CJK_RIGHT,  AF_BLUE_PROPERTY_CJK_HORIZ |
                                 AF_BLUE_PROPERTY_CJK_RIGHT   }
#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
    { AF_BLUE_STRING_MAX,        0                            }

#endif /* AF_CONFIG_OPTION_CJK                */


// END