// afblue.dat // // Auto-fitter data for blue strings. // // Copyright 2013, 2014 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, holding the size of the largest array element. 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 in UTF-8 encoding enclosed in double quotes, // using C syntax. 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. Space characters within the string are ignored too. 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. // // - 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. // // 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 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_CYRILLIC_CAPITAL_TOP "БВЕПЗОСЭ" AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM "БВЕШЗОСЭ" AF_BLUE_STRING_CYRILLIC_SMALL "хпншезос" AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER "руф" // we separate the letters with spaces to avoid ligatures; // this is just for convenience to simplify reading 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_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_HEBREW_TOP "בדהחךכםס" AF_BLUE_STRING_HEBREW_BOTTOM "בטכםסצ" AF_BLUE_STRING_HEBREW_DESCENDER "קךןףץ" AF_BLUE_STRING_LATIN_CAPITAL_TOP "THEZOCQS" AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM "HEZLOCUS" AF_BLUE_STRING_LATIN_SMALL_F_TOP "fijkdbh" AF_BLUE_STRING_LATIN_SMALL "xzroesc" AF_BLUE_STRING_LATIN_SMALL_DESCENDER "pqgjy" // we separate the letters with spaces to avoid ligatures; // this is just for convenience to simplify reading AF_BLUE_STRING_TELUGU_TOP "ఇ ఌ ఙ ఞ ణ ఱ ౯" AF_BLUE_STRING_TELUGU_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. // // 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. // // 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. 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_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_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_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_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, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT } { AF_BLUE_STRING_LATIN_SMALL, 0 } { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 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 } #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