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