1// afblue.dat 2// 3// Auto-fitter data for blue strings. 4// 5// Copyright 2013-2017 by 6// David Turner, Robert Wilhelm, and Werner Lemberg. 7// 8// This file is part of the FreeType project, and may only be used, 9// modified, and distributed under the terms of the FreeType project 10// license, LICENSE.TXT. By continuing to use, modify, or distribute 11// this file you indicate that you have read the license and 12// understand and accept it fully. 13 14 15// This file contains data specific to blue zones. It gets processed by 16// a script to simulate `jagged arrays', with enumeration values holding 17// offsets into the arrays. 18// 19// The format of the file is rather simple: A section starts with three 20// labels separated by whitespace and followed by a colon (everything in a 21// single line); the first label gives the name of the enumeration template, 22// the second the name of the array template, and the third the name of the 23// `maximum' template. The script then fills the corresponding templates 24// (indicated by `@' characters around the name). 25// 26// A section contains one or more data records. Each data record consists 27// of two or more lines. The first line holds the enumeration name, and the 28// remaining lines the corresponding array data. 29// 30// There are two possible representations for array data. 31// 32// - A string of characters or character clusters (for example, representing 33// Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double 34// quotes, using C syntax, where the elements are separated by spaces. 35// There can be only one string per line, thus the starting and ending 36// double quote must be the first and last character in the line, 37// respectively, ignoring whitespace before and after the string. If 38// there are multiple strings (in multiple lines), they are concatenated 39// to a single string. In the output, a string gets represented as a 40// series of singles bytes, followed by a zero byte. The enumeration 41// values simply hold byte offsets to the start of the corresponding 42// strings. 43// 44// For strings, the `maximum' template holds the maximum number of 45// non-space characters in all strings. 46// 47// - Data blocks enclosed in balanced braces, which get copied verbatim and 48// which can span multiple lines. The opening brace of a block must be 49// the first character of a line (ignoring whitespace), and the closing 50// brace the last (ignoring whitespace also). The script appends a comma 51// character after each block and counts the number of blocks to set the 52// enumeration values. 53// 54// For data blocks, the `maximum' template holds the maximum number of 55// array elements. 56// 57// A section can contain either strings only or data blocks only. 58// 59// A comment line starts with `//'; it gets removed. A preprocessor 60// directive line (using the standard syntax of `cpp') starts with `#' and 61// gets copied verbatim to both the enumeration and the array. Whitespace 62// outside of a string is insignificant. 63// 64// Preprocessor directives are ignored while the script computes maximum 65// values; this essentially means that the maximum values can easily be too 66// large. Given that the purpose of those values is to create local 67// fixed-size arrays at compile time for further processing of the blue zone 68// data, this isn't a problem. Note the final zero byte of a string is not 69// counted. Note also that the count holds the number of UTF-8 encoded 70// characters, not bytes. 71 72 73// The blue zone string data, to be used in the blue stringsets below. 74 75AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: 76 77 AF_BLUE_STRING_ARABIC_TOP 78 "ا إ ل ك ط ظ" 79 AF_BLUE_STRING_ARABIC_BOTTOM 80 "ت ث ط ظ ك" 81 // We don't necessarily have access to medial forms via Unicode in case 82 // Arabic presentational forms are missing. The only character that is 83 // guaranteed to have the same vertical position with joining (this is, 84 // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both 85 // round and flat curves. 86 AF_BLUE_STRING_ARABIC_JOIN 87 "ـ" 88 89 AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP 90 "Ա Մ Ւ Ս Բ Գ Դ Օ" 91 AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM 92 "Ւ Ո Դ Ճ Շ Ս Տ Օ" 93 AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER 94 "ե է ի մ վ ֆ ճ" 95 AF_BLUE_STRING_ARMENIAN_SMALL_TOP 96 "ա յ ւ ս գ շ ր օ" 97 AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM 98 "հ ո ճ ա ե ծ ս օ" 99 AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER 100 "բ ը ի լ ղ պ փ ց" 101 102 AF_BLUE_STRING_BENGALI_BASE 103 "অ ড ত ন ব ভ ল ক" 104 AF_BLUE_STRING_BENGALI_TOP 105 "ই ট ঠ ি ী ৈ ৗ" 106 AF_BLUE_STRING_BENGALI_HEAD 107 "ও এ ড ত ন ব ল ক" 108 109 AF_BLUE_STRING_CHEROKEE_CAPITAL 110 "Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ" 111 AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER 112 "ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ" 113 AF_BLUE_STRING_CHEROKEE_SMALL 114 "ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ" 115 AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER 116 "ᏸ ꮐ ꭹ ꭻ" 117 118 AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP 119 "Б В Е П З О С Э" 120 AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM 121 "Б В Е Ш З О С Э" 122 AF_BLUE_STRING_CYRILLIC_SMALL 123 "х п н ш е з о с" 124 AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER 125 "р у ф" 126 127 AF_BLUE_STRING_DEVANAGARI_BASE 128 "क म अ आ थ ध भ श" 129 AF_BLUE_STRING_DEVANAGARI_TOP 130 "ई ऐ ओ औ ि ी ो ौ" 131 // note that some fonts have extreme variation in the height of the 132 // round head elements; for this reason we also define the `base' 133 // blue zone, which must be always present 134 AF_BLUE_STRING_DEVANAGARI_HEAD 135 "क म अ आ थ ध भ श" 136 AF_BLUE_STRING_DEVANAGARI_BOTTOM 137 "ु ृ" 138 139 AF_BLUE_STRING_ETHIOPIC_TOP 140 "ሀ ሃ ዘ ፐ ማ በ ዋ ዐ" 141 AF_BLUE_STRING_ETHIOPIC_BOTTOM 142 "ለ ሐ በ ዘ ሀ ሪ ዐ ጨ" 143 144 AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP 145 "გ დ ე ვ თ ი ო ღ" 146 AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM 147 "ა ზ მ ს შ ძ ხ პ" 148 AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER 149 "ს ხ ქ ზ მ შ ჩ წ" 150 AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER 151 "ე ვ ჟ ტ უ ფ ქ ყ" 152 153 AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP 154 "Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ" 155 AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM 156 "Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ" 157 158 AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP 159 "ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ" 160 AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM 161 "ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ" 162 AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER 163 "ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ" 164 AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER 165 "ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ" 166 167 AF_BLUE_STRING_GREEK_CAPITAL_TOP 168 "Γ Β Ε Ζ Θ Ο Ω" 169 AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM 170 "Β Δ Ζ Ξ Θ Ο" 171 AF_BLUE_STRING_GREEK_SMALL_BETA_TOP 172 "β θ δ ζ λ ξ" 173 AF_BLUE_STRING_GREEK_SMALL 174 "α ε ι ο π σ τ ω" 175 AF_BLUE_STRING_GREEK_SMALL_DESCENDER 176 "β γ η μ ρ φ χ ψ" 177 178 AF_BLUE_STRING_GUJARATI_TOP 179 "ત ન ઋ ઌ છ ટ ર ૦" 180 AF_BLUE_STRING_GUJARATI_BOTTOM 181 "ખ ગ ઘ ઞ ઇ ઈ ઠ જ" 182 AF_BLUE_STRING_GUJARATI_ASCENDER 183 "ઈ ઊ િ ી લી શ્ચિ જિ સી" 184 AF_BLUE_STRING_GUJARATI_DESCENDER 185 "ુ ૃ ૄ ખુ છૃ છૄ" 186 AF_BLUE_STRING_GUJARATI_DIGIT_TOP 187 "૦ ૧ ૨ ૩ ૭" 188 189 AF_BLUE_STRING_GURMUKHI_BASE 190 "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" 191 AF_BLUE_STRING_GURMUKHI_HEAD 192 "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" 193 AF_BLUE_STRING_GURMUKHI_TOP 194 "ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ" 195 AF_BLUE_STRING_GURMUKHI_BOTTOM 196 "ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ" 197 AF_BLUE_STRING_GURMUKHI_DIGIT_TOP 198 "੦ ੧ ੨ ੩ ੭" 199 200 AF_BLUE_STRING_HEBREW_TOP 201 "ב ד ה ח ך כ ם ס" 202 AF_BLUE_STRING_HEBREW_BOTTOM 203 "ב ט כ ם ס צ" 204 AF_BLUE_STRING_HEBREW_DESCENDER 205 "ק ך ן ף ץ" 206 207 AF_BLUE_STRING_KANNADA_TOP 208 "ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ" 209 AF_BLUE_STRING_KANNADA_BOTTOM 210 "ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭" 211 212 AF_BLUE_STRING_KHMER_TOP 213 "ខ ទ ន ឧ ឩ ា" 214 AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP 215 "ក្ក ក្ខ ក្គ ក្ថ" 216 AF_BLUE_STRING_KHMER_BOTTOM 217 "ខ ឃ ច ឋ ប ម យ ឲ" 218 AF_BLUE_STRING_KHMER_DESCENDER 219 "ត្រ រៀ ឲ្យ អឿ" 220 AF_BLUE_STRING_KHMER_LARGE_DESCENDER 221 "ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ" 222 223 AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP 224 "᧠ ᧡" 225 AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM 226 "᧶ ᧹" 227 228 AF_BLUE_STRING_LAO_TOP 229 "າ ດ ອ ມ ລ ວ ຣ ງ" 230 AF_BLUE_STRING_LAO_BOTTOM 231 "າ ອ ບ ຍ ຣ ຮ ວ ຢ" 232 AF_BLUE_STRING_LAO_ASCENDER 233 "ປ ຢ ຟ ຝ" 234 AF_BLUE_STRING_LAO_LARGE_ASCENDER 235 "ໂ ໄ ໃ" 236 AF_BLUE_STRING_LAO_DESCENDER 237 "ງ ຊ ຖ ຽ ໆ ຯ" 238 239 AF_BLUE_STRING_LATIN_CAPITAL_TOP 240 "T H E Z O C Q S" 241 AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM 242 "H E Z L O C U S" 243 AF_BLUE_STRING_LATIN_SMALL_F_TOP 244 "f i j k d b h" 245 AF_BLUE_STRING_LATIN_SMALL_TOP 246 "u v x z o e s c" 247 AF_BLUE_STRING_LATIN_SMALL_BOTTOM 248 "n r x z o e s c" 249 AF_BLUE_STRING_LATIN_SMALL_DESCENDER 250 "p q g j y" 251 252 // we assume that both the subscript and superscript ranges 253 // don't contain oldstyle digits (actually, most fonts probably 254 // have digits only in those ranges) 255 AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP 256 "₀ ₃ ₅ ₇ ₈" 257 AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM 258 "₀ ₁ ₂ ₃ ₈" 259 AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP 260 "ᵢ ⱼ ₕ ₖ ₗ" 261 AF_BLUE_STRING_LATIN_SUBS_SMALL 262 "ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ" 263 AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER 264 "ᵦ ᵧ ᵨ ᵩ ₚ" 265 266 AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP 267 "⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ" 268 AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM 269 "⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ" 270 AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP 271 "ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ" 272 AF_BLUE_STRING_LATIN_SUPS_SMALL 273 "ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ" 274 AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER 275 "ᵖ ʸ ᵍ" 276 277 AF_BLUE_STRING_MALAYALAM_TOP 278 "ഒ ട ഠ റ ച പ ച്ച പ്പ" 279 AF_BLUE_STRING_MALAYALAM_BOTTOM 280 "ട ഠ ധ ശ ഘ ച ഥ ല" 281 282 AF_BLUE_STRING_MYANMAR_TOP 283 "ခ ဂ င ဒ ဝ ၥ ၊ ။" 284 AF_BLUE_STRING_MYANMAR_BOTTOM 285 "င ဎ ဒ ပ ဗ ဝ ၊ ။" 286 AF_BLUE_STRING_MYANMAR_ASCENDER 287 "ဩ ြ ၍ ၏ ၆ ါ ိ" 288 AF_BLUE_STRING_MYANMAR_DESCENDER 289 "ဉ ည ဥ ဩ ဨ ၂ ၅ ၉" 290 291 AF_BLUE_STRING_SINHALA_TOP 292 "ඉ ක ඝ ඳ ප ය ල ෆ" 293 AF_BLUE_STRING_SINHALA_BOTTOM 294 "එ ඔ ඝ ජ ට ථ ධ ර" 295 AF_BLUE_STRING_SINHALA_DESCENDER 296 "ද ඳ උ ල තූ තු බු දු" 297 298 AF_BLUE_STRING_TAMIL_TOP 299 "உ ஒ ஓ ற ஈ க ங ச" 300 AF_BLUE_STRING_TAMIL_BOTTOM 301 "க ச ல ஶ உ ங ட ப" 302 303 AF_BLUE_STRING_TELUGU_TOP 304 "ఇ ఌ ఙ ఞ ణ ఱ ౯" 305 AF_BLUE_STRING_TELUGU_BOTTOM 306 "అ క చ ర ఽ ౨ ౬" 307 308 AF_BLUE_STRING_THAI_TOP 309 "บ เ แ อ ก า" 310 AF_BLUE_STRING_THAI_BOTTOM 311 "บ ป ษ ฯ อ ย ฮ" 312 AF_BLUE_STRING_THAI_ASCENDER 313 "ป ฝ ฟ" 314 AF_BLUE_STRING_THAI_LARGE_ASCENDER 315 "โ ใ ไ" 316 AF_BLUE_STRING_THAI_DESCENDER 317 "ฎ ฏ ฤ ฦ" 318 AF_BLUE_STRING_THAI_LARGE_DESCENDER 319 "ญ ฐ" 320 AF_BLUE_STRING_THAI_DIGIT_TOP 321 "๐ ๑ ๓" 322 323 324#ifdef AF_CONFIG_OPTION_CJK 325 326 AF_BLUE_STRING_CJK_TOP 327 "他 们 你 來 們 到 和 地" 328 " 对 對 就 席 我 时 時 會" 329 " 来 為 能 舰 說 说 这 這" 330 " 齊 |" 331 " 军 同 已 愿 既 星 是 景" 332 " 民 照 现 現 理 用 置 要" 333 " 軍 那 配 里 開 雷 露 面" 334 " 顾" 335 AF_BLUE_STRING_CJK_BOTTOM 336 "个 为 人 他 以 们 你 來" 337 " 個 們 到 和 大 对 對 就" 338 " 我 时 時 有 来 為 要 說" 339 " 说 |" 340 " 主 些 因 它 想 意 理 生" 341 " 當 看 着 置 者 自 著 裡" 342 " 过 还 进 進 過 道 還 里" 343 " 面" 344 345#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT 346 347 AF_BLUE_STRING_CJK_LEFT 348 " 些 们 你 來 們 到 和 地" 349 " 她 将 將 就 年 得 情 最" 350 " 样 樣 理 能 說 说 这 這" 351 " 通 |" 352 " 即 吗 吧 听 呢 品 响 嗎" 353 " 师 師 收 断 斷 明 眼 間" 354 " 间 际 陈 限 除 陳 随 際" 355 " 隨" 356 AF_BLUE_STRING_CJK_RIGHT 357 "事 前 學 将 將 情 想 或" 358 " 政 斯 新 样 樣 民 沒 没" 359 " 然 特 现 現 球 第 經 谁" 360 " 起 |" 361 " 例 別 别 制 动 動 吗 嗎" 362 " 增 指 明 朝 期 构 物 确" 363 " 种 調 调 費 费 那 都 間" 364 " 间" 365 366#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ 367 368#endif /* AF_CONFIG_OPTION_CJK */ 369 370 371// The blue zone stringsets, as used in the script styles, cf. `afstyles.h'. 372// 373// The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some 374// explanations. 375// 376// A blue zone in general is defined by a reference and an overshoot line. 377// During the hinting process, all coordinate values between those two lines 378// are set equal to the reference value, provided that the blue zone is not 379// wider than 0.75 pixels (otherwise the blue zone gets ignored). All 380// entries must have `AF_BLUE_STRING_MAX' as the final line. 381// 382// During the glyph analysis, edges are sorted from bottom to top, and then 383// sequentially checked, edge by edge, against the blue zones in the order 384// given below. 385// 386// 387// latin auto-hinter 388// ----------------- 389// 390// Characters in a blue string are automatically classified as having a flat 391// (reference) or a round (overshoot) extremum. The blue zone is then set 392// up by the mean values of all flat extrema and all round extrema, 393// respectively. Only horizontal blue zones (i.e., adjusting vertical 394// coordinate values) are supported. 395// 396// Some scripts like Khmer need character composition to get all necessary 397// blue zones, since Unicode only provides an abstract data model that 398// doesn't represent all possible glyph shapes. For such character 399// clusters, the HarfBuzz library is used to convert them into the 400// corresponding glyphs. The largest glyph element (where `largest' can be 401// either `largest ascender' or `largest descender') then defines the 402// corresponding flat or round extremum. 403// 404// For the latin auto-hinter, the overshoot should be larger than the 405// reference for top zones, and vice versa for bottom zones. 406// 407// LATIN_TOP 408// Take the maximum flat and round coordinate values of the blue string 409// characters for computing the blue zone's reference and overshoot 410// values. 411// 412// If not set, take the minimum values. 413// 414// Mutually exclusive with `LATIN_SUB_TOP'. 415// 416// LATIN_SUB_TOP 417// For all glyphs of a character cluster, compute the maximum flat 418// and round coordinate values of each component, then take the 419// smallest of the maximum values. The idea is to get the top of 420// subscript glyphs, as used in Khmer, for example. Note that 421// this mechanism doesn't work for ordinary ligatures. 422// 423// This flags indicates a secondary blue zone: It gets removed if 424// there is a non-LATIN_SUB_TOP blue zone at the same coordinate 425// value (after scaling). 426// 427// Mutually exclusive with `LATIN_TOP'. 428// 429// LATIN_NEUTRAL 430// Ignore round extrema and define the blue zone with flat values only. 431// Both top and bottom of contours can match. This is useful for 432// scripts like Devanagari where vowel signs attach to the base 433// character and are implemented as components of composite glyphs. 434// 435// If not set, both round and flat extrema are taken into account. 436// Additionally, only the top or the bottom of a contour can match, 437// depending on the LATIN_TOP flag. 438// 439// Neutral blue zones should always follow non-neutral blue zones. 440// 441// LATIN_X_HEIGHT 442// Scale all glyphs vertically from the corresponding script to make the 443// reference line of this blue zone align on the grid. The scaling 444// takes place before all other blue zones get aligned to the grid. 445// Only one blue character string of a script style can have this flag. 446// 447// LATIN_LONG 448// Apply an additional constraint for blue zone values: Don't 449// necessarily use the extremum as-is but a segment of the topmost (or 450// bottommost) contour that is longer than a heuristic threshold, and 451// which is not too far away vertically from the real extremum. This 452// ensures that small bumps in the outline are ignored (for example, the 453// `vertical serifs' found in many Hebrew glyph designs). 454// 455// The segment must be at least EM/25 font units long, and the distance 456// to the extremum must be smaller than EM/4. 457// 458// 459// cjk auto-hinter 460// --------------- 461// 462// Characters in a blue string are *not* automatically classified. Instead, 463// first come the characters used for the overshoot value, then the 464// character `|', then the characters used for the reference value 465// (everything separated by space characters). The blue zone is then set up 466// by the mean values of all reference values and all overshoot values, 467// respectively. Both horizontal and vertical blue zones (i.e., adjusting 468// vertical and horizontal coordinate values, respectively) are supported. 469// 470// For the cjk auto-hinter, the overshoot should be smaller than the 471// reference for top zones, and vice versa for bottom zones. 472// 473// CJK_TOP 474// Take the maximum flat and round coordinate values of the blue string 475// characters. If not set, take the minimum values. 476// 477// CJK_RIGHT 478// A synonym for CJK_TOP. If CJK_HORIZ is set, this flag indicates the 479// right blue zone, taking horizontal maximum values. 480// 481// CJK_HORIZ 482// Define a blue zone for horizontal hinting (i.e., vertical blue 483// zones). If not set, this is a blue zone for vertical hinting. 484 485 486AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: 487 488 AF_BLUE_STRINGSET_ARAB 489 { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 490 { AF_BLUE_STRING_ARABIC_BOTTOM, 0 } 491 { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL } 492 { AF_BLUE_STRING_MAX, 0 } 493 494 AF_BLUE_STRINGSET_ARMN 495 { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 496 { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 } 497 { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 498 { AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 499 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 500 { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 } 501 { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 } 502 { AF_BLUE_STRING_MAX, 0 } 503 504 AF_BLUE_STRINGSET_BENG 505 { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 506 { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } 507 { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | 508 AF_BLUE_PROPERTY_LATIN_NEUTRAL | 509 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 510 { AF_BLUE_STRING_BENGALI_BASE, 0 } 511 { AF_BLUE_STRING_MAX, 0 } 512 513 AF_BLUE_STRINGSET_CHER 514 { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP } 515 { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 } 516 { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 517 { AF_BLUE_STRING_CHEROKEE_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | 518 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 519 { AF_BLUE_STRING_CHEROKEE_SMALL, 0 } 520 { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 } 521 { AF_BLUE_STRING_MAX, 0 } 522 523 AF_BLUE_STRINGSET_CYRL 524 { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 525 { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 } 526 { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | 527 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 528 { AF_BLUE_STRING_CYRILLIC_SMALL, 0 } 529 { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 } 530 { AF_BLUE_STRING_MAX, 0 } 531 532 AF_BLUE_STRINGSET_DEVA 533 { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 534 { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } 535 { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | 536 AF_BLUE_PROPERTY_LATIN_NEUTRAL | 537 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 538 { AF_BLUE_STRING_DEVANAGARI_BASE, 0 } 539 { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 } 540 { AF_BLUE_STRING_MAX, 0 } 541 542 AF_BLUE_STRINGSET_ETHI 543 { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 544 { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 } 545 { AF_BLUE_STRING_MAX, 0 } 546 547 // blue zones for Mtavruli are missing (not yet defined in Unicode) 548 AF_BLUE_STRINGSET_GEOR 549 { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 550 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 551 { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM, 0 } 552 { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 553 { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0 } 554 { AF_BLUE_STRING_MAX, 0 } 555 556 AF_BLUE_STRINGSET_GEOK 557 { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 558 { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0 } 559 { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 560 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 561 { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM, 0 } 562 { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 563 { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 } 564 { AF_BLUE_STRING_MAX, 0 } 565 566 AF_BLUE_STRINGSET_GREK 567 { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 568 { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 } 569 { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 570 { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | 571 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 572 { AF_BLUE_STRING_GREEK_SMALL, 0 } 573 { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 } 574 { AF_BLUE_STRING_MAX, 0 } 575 576 AF_BLUE_STRINGSET_GUJR 577 { AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 578 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 579 { AF_BLUE_STRING_GUJARATI_BOTTOM, 0 } 580 { AF_BLUE_STRING_GUJARATI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 581 { AF_BLUE_STRING_GUJARATI_DESCENDER, 0 } 582 { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 583 { AF_BLUE_STRING_MAX, 0 } 584 585 AF_BLUE_STRINGSET_GURU 586 { AF_BLUE_STRING_GURMUKHI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 587 { AF_BLUE_STRING_GURMUKHI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } 588 { AF_BLUE_STRING_GURMUKHI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | 589 AF_BLUE_PROPERTY_LATIN_NEUTRAL | 590 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 591 { AF_BLUE_STRING_GURMUKHI_BOTTOM, 0 } 592 { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 593 { AF_BLUE_STRING_MAX, 0 } 594 595 AF_BLUE_STRINGSET_HEBR 596 { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 597 AF_BLUE_PROPERTY_LATIN_LONG } 598 { AF_BLUE_STRING_HEBREW_BOTTOM, 0 } 599 { AF_BLUE_STRING_HEBREW_DESCENDER, 0 } 600 { AF_BLUE_STRING_MAX, 0 } 601 602 AF_BLUE_STRINGSET_KNDA 603 { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 604 { AF_BLUE_STRING_KANNADA_BOTTOM, 0 } 605 { AF_BLUE_STRING_MAX, 0 } 606 607 AF_BLUE_STRINGSET_KHMR 608 { AF_BLUE_STRING_KHMER_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 609 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 610 { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP, AF_BLUE_PROPERTY_LATIN_SUB_TOP } 611 { AF_BLUE_STRING_KHMER_BOTTOM, 0 } 612 { AF_BLUE_STRING_KHMER_DESCENDER, 0 } 613 { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0 } 614 { AF_BLUE_STRING_MAX, 0 } 615 616 AF_BLUE_STRINGSET_KHMS 617 { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 618 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 619 { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 } 620 { AF_BLUE_STRING_MAX, 0 } 621 622 AF_BLUE_STRINGSET_LAO 623 { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 624 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 625 { AF_BLUE_STRING_LAO_BOTTOM, 0 } 626 { AF_BLUE_STRING_LAO_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 627 { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 628 { AF_BLUE_STRING_LAO_DESCENDER, 0 } 629 { AF_BLUE_STRING_MAX, 0 } 630 631 AF_BLUE_STRINGSET_LATN 632 { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 633 { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 } 634 { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 635 { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 636 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 637 { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 } 638 { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 } 639 { AF_BLUE_STRING_MAX, 0 } 640 641 AF_BLUE_STRINGSET_LATB 642 { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 643 { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 } 644 { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 645 { AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | 646 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 647 { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 } 648 { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 } 649 { AF_BLUE_STRING_MAX, 0 } 650 651 AF_BLUE_STRINGSET_LATP 652 { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 653 { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 } 654 { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 655 { AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | 656 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 657 { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 } 658 { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 } 659 { AF_BLUE_STRING_MAX, 0 } 660 661 AF_BLUE_STRINGSET_MLYM 662 { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 663 { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 } 664 { AF_BLUE_STRING_MAX, 0 } 665 666 AF_BLUE_STRINGSET_MYMR 667 { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 668 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 669 { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 } 670 { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 671 { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 } 672 { AF_BLUE_STRING_MAX, 0 } 673 674 AF_BLUE_STRINGSET_NONE 675 { AF_BLUE_STRING_MAX, 0 } 676 677 AF_BLUE_STRINGSET_SINH 678 { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 679 { AF_BLUE_STRING_SINHALA_BOTTOM, 0 } 680 { AF_BLUE_STRING_SINHALA_DESCENDER, 0 } 681 { AF_BLUE_STRING_MAX, 0 } 682 683 AF_BLUE_STRINGSET_TAML 684 { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 685 { AF_BLUE_STRING_TAMIL_BOTTOM, 0 } 686 { AF_BLUE_STRING_MAX, 0 } 687 688 AF_BLUE_STRINGSET_TELU 689 { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } 690 { AF_BLUE_STRING_TELUGU_BOTTOM, 0 } 691 { AF_BLUE_STRING_MAX, 0 } 692 693 AF_BLUE_STRINGSET_THAI 694 { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | 695 AF_BLUE_PROPERTY_LATIN_X_HEIGHT } 696 { AF_BLUE_STRING_THAI_BOTTOM, 0 } 697 { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 698 { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } 699 { AF_BLUE_STRING_THAI_DESCENDER, 0 } 700 { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 } 701 { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 } 702 { AF_BLUE_STRING_MAX, 0 } 703 704 705#ifdef AF_CONFIG_OPTION_CJK 706 707 AF_BLUE_STRINGSET_HANI 708 { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP } 709 { AF_BLUE_STRING_CJK_BOTTOM, 0 } 710#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT 711 { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ } 712 { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | 713 AF_BLUE_PROPERTY_CJK_RIGHT } 714#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ 715 { AF_BLUE_STRING_MAX, 0 } 716 717#endif /* AF_CONFIG_OPTION_CJK */ 718 719 720// END 721