shithub: freetype+ttf2subf

ref: e1ca18d4492d819e2deeb4302a9d3ed037f64ebb
dir: /src/autofit/afblue.dat/

View raw version
//  afblue.dat
//
//    Auto-fitter data for blue strings.
//
//  Copyright 2013-2015 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_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_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_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
    "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 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
    "ᵖʸᵍ"

  // 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
    "అ క చ ర ఽ ౨ ౬"

  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
    "๐ ๑ ๓"


#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_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_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_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,           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_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_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                                 }


#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