1//  afblue.dat
2//
3//    Auto-fitter data for blue strings.
4//
5//  Copyright 2013, 2014 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, holding the size of the largest array element.  The
24// script then fills the corresponding templates (indicated by `@'
25// characters around the name).
26//
27// A section contains one or more data records.  Each data record consists
28// of two or more lines.  The first line holds the enumeration name, and the
29// remaining lines the corresponding array data.
30//
31// There are two possible representations for array data.
32//
33// - A string of characters in UTF-8 encoding enclosed in double quotes,
34//   using C syntax.  There can be only one string per line, thus the
35//   starting and ending double quote must be the first and last character
36//   in the line, respectively, ignoring whitespace before and after the
37//   string.  Space characters within the string are ignored too.  If there
38//   are multiple strings (in multiple lines), they are concatenated to a
39//   single string.  In the output, a string gets represented as a series of
40//   singles bytes, followed by a zero byte.  The enumeration values simply
41//   hold byte offsets to the start of the corresponding strings.
42//
43// - Data blocks enclosed in balanced braces, which get copied verbatim and
44//   which can span multiple lines.  The opening brace of a block must be
45//   the first character of a line (ignoring whitespace), and the closing
46//   brace the last (ignoring whitespace also).  The script appends a comma
47//   character after each block and counts the number of blocks to set the
48//   enumeration values.
49//
50// A section can contain either strings only or data blocks only.
51//
52// A comment line starts with `//'; it gets removed.  A preprocessor
53// directive line (using the standard syntax of `cpp') starts with `#' and
54// gets copied verbatim to both the enumeration and the array.  Whitespace
55// outside of a string is insignificant.
56//
57// Preprocessor directives are ignored while the script computes maximum
58// values; this essentially means that the maximum values can easily be too
59// large.  Given that the purpose of those values is to create local
60// fixed-size arrays at compile time for further processing of the blue zone
61// data, this isn't a problem.  Note the the final zero byte of a string is
62// not counted.  Note also that the count holds the number of UTF-8 encoded
63// characters, not bytes.
64
65
66// The blue zone string data, to be used in the blue stringsets below.
67
68AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
69
70  AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP
71    "БВЕПЗОСЭ"
72  AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM
73    "БВЕШЗОСЭ"
74  AF_BLUE_STRING_CYRILLIC_SMALL
75    "хпншезос"
76  AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER
77    "руф"
78
79  // we separate the letters with spaces to avoid ligatures;
80  // this is just for convenience to simplify reading
81  AF_BLUE_STRING_DEVANAGARI_BASE
82    "क म अ आ थ ध भ श"
83  AF_BLUE_STRING_DEVANAGARI_TOP
84    "ई ऐ ओ औ ि ी ो ौ"
85  // note that some fonts have extreme variation in the height of the
86  // round head elements; for this reason we also define the `base'
87  // blue zone, which must be always present
88  AF_BLUE_STRING_DEVANAGARI_HEAD
89    "क म अ आ थ ध भ श"
90  AF_BLUE_STRING_DEVANAGARI_BOTTOM
91    "ु ृ"
92
93  AF_BLUE_STRING_GREEK_CAPITAL_TOP
94    "ΓΒΕΖΘΟΩ"
95  AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM
96    "ΒΔΖΞΘΟ"
97  AF_BLUE_STRING_GREEK_SMALL_BETA_TOP
98    "βθδζλξ"
99  AF_BLUE_STRING_GREEK_SMALL
100    "αειοπστω"
101  AF_BLUE_STRING_GREEK_SMALL_DESCENDER
102    "βγημρφχψ"
103
104  AF_BLUE_STRING_HEBREW_TOP
105    "בדהחךכםס"
106  AF_BLUE_STRING_HEBREW_BOTTOM
107    "בטכםסצ"
108  AF_BLUE_STRING_HEBREW_DESCENDER
109    "קךןףץ"
110
111  AF_BLUE_STRING_LATIN_CAPITAL_TOP
112    "THEZOCQS"
113  AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM
114    "HEZLOCUS"
115  AF_BLUE_STRING_LATIN_SMALL_F_TOP
116    "fijkdbh"
117  AF_BLUE_STRING_LATIN_SMALL
118    "xzroesc"
119  AF_BLUE_STRING_LATIN_SMALL_DESCENDER
120    "pqgjy"
121
122#ifdef AF_CONFIG_OPTION_CJK
123
124  AF_BLUE_STRING_CJK_TOP
125    "他们你來們到和地"
126    "对對就席我时時會"
127    "来為能舰說说这這"
128    "齊 |"
129    "军同已愿既星是景"
130    "民照现現理用置要"
131    "軍那配里開雷露面"
132    "顾"
133  AF_BLUE_STRING_CJK_BOTTOM
134    "个为人他以们你來"
135    "個們到和大对對就"
136    "我时時有来為要說"
137    "说 |"
138    "主些因它想意理生"
139    "當看着置者自著裡"
140    "过还进進過道還里"
141    "面"
142
143#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
144
145  AF_BLUE_STRING_CJK_LEFT
146    "些们你來們到和地"
147    "她将將就年得情最"
148    "样樣理能說说这這"
149    "通 |"
150    "即吗吧听呢品响嗎"
151    "师師收断斷明眼間"
152    "间际陈限除陳随際"
153    "隨"
154  AF_BLUE_STRING_CJK_RIGHT
155    "事前學将將情想或"
156    "政斯新样樣民沒没"
157    "然特现現球第經谁"
158    "起 |"
159    "例別别制动動吗嗎"
160    "增指明朝期构物确"
161    "种調调費费那都間"
162    "间"
163
164#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
165
166#endif /* AF_CONFIG_OPTION_CJK                */
167
168
169// The blue zone stringsets, as used in the script styles, cf. `afstyles.h'.
170//
171// The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some
172// explanations.
173//
174// A blue zone in general is defined by a reference and an overshoot line.
175// During the hinting process, all coordinate values between those two lines
176// are set equal to the reference value, provided that the blue zone is not
177// wider than 0.75 pixels (otherwise the blue zone gets ignored).  All
178// entries must have `AF_BLUE_STRING_MAX' as the final line.
179//
180// During the glyph analysis, edges are sorted from bottom to top, and then
181// sequentially checked, edge by edge, against the blue zones in the order
182// given below.
183//
184//
185// latin auto-hinter
186// -----------------
187//
188// Characters in a blue string are automatically classified as having a flat
189// (reference) or a round (overshoot) extremum.  The blue zone is then set
190// up by the mean values of all flat extrema and all round extrema,
191// respectively.  Only horizontal blue zones (i.e., adjusting vertical
192// coordinate values) are supported.
193//
194// For the latin auto-hinter, the overshoot should be larger than the
195// reference for top zones, and vice versa for bottom zones.
196//
197//   LATIN_TOP
198//     Take the maximum flat and round coordinate values of the blue string
199//     characters for computing the blue zone's reference and overshoot
200//     values.
201//
202//     If not set, take the minimum values.
203//
204//   LATIN_NEUTRAL
205//     Ignore round extrema and define the blue zone with flat values only.
206//     Both top and bottom of contours can match.  This is useful for
207//     scripts like Devanagari where vowel signs attach to the base
208//     character and are implemented as components of composite glyphs.
209//
210//     If not set, both round and flat extrema are taken into account.
211//     Additionally, only the top or the bottom of a contour can match,
212//     depending on the LATIN_TOP flag.
213//
214//     Neutral blue zones should always follow non-neutral blue zones.
215//
216//   LATIN_X_HEIGHT
217//     Scale all glyphs vertically from the corresponding script to make the
218//     reference line of this blue zone align on the grid.  The scaling
219//     takes place before all other blue zones get aligned to the grid.
220//     Only one blue character string of a script style can have this flag.
221//
222//   LATIN_LONG
223//     Apply an additional constraint for blue zone values: Don't
224//     necessarily use the extremum as-is but a segment of the topmost (or
225//     bottommost) contour that is longer than a heuristic threshold, and
226//     which is not too far away vertically from the real extremum.  This
227//     ensures that small bumps in the outline are ignored (for example, the
228//     `vertical serifs' found in many Hebrew glyph designs).
229//
230//     The segment must be at least EM/25 font units long, and the distance
231//     to the extremum must be smaller than EM/4.
232//
233//
234// cjk auto-hinter
235// ---------------
236//
237// Characters in a blue string are *not* automatically classified.  Instead,
238// first come the characters used for the overshoot value, then the
239// character `|', then the characters used for the reference value.  The
240// blue zone is then set up by the mean values of all reference values and
241// all overshoot values, respectively.  Both horizontal and vertical blue
242// zones (i.e., adjusting vertical and horizontal coordinate values,
243// respectively) are supported.
244//
245// For the cjk auto-hinter, the overshoot should be smaller than the
246// reference for top zones, and vice versa for bottom zones.
247//
248//   CJK_TOP
249//     Take the maximum flat and round coordinate values of the blue string
250//     characters.  If not set, take the minimum values.
251//
252//   CJK_RIGHT
253//     A synonym for CJK_TOP.  If CJK_HORIZ is set, this flag indicates the
254//     right blue zone, taking horizontal maximum values.
255//
256//   CJK_HORIZ
257//     Define a blue zone for horizontal hinting (i.e., vertical blue
258//     zones).  If not set, this is a blue zone for vertical hinting.
259
260
261AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
262
263  AF_BLUE_STRINGSET_CYRL
264    { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
265    { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 }
266    { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
267                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
268    { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                 }
269    { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                 }
270    { AF_BLUE_STRING_MAX,                      0                                 }
271
272  AF_BLUE_STRINGSET_DEVA
273    { AF_BLUE_STRING_DEVANAGARI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
274    { AF_BLUE_STRING_DEVANAGARI_HEAD,   AF_BLUE_PROPERTY_LATIN_TOP        }
275    { AF_BLUE_STRING_DEVANAGARI_BASE,   AF_BLUE_PROPERTY_LATIN_TOP      |
276                                        AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
277                                        AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
278    { AF_BLUE_STRING_DEVANAGARI_BASE,   0                                 }
279    { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 }
280    { AF_BLUE_STRING_MAX,               0                                 }
281
282  AF_BLUE_STRINGSET_GREK
283    { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
284    { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 }
285    { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
286    { AF_BLUE_STRING_GREEK_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
287                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
288    { AF_BLUE_STRING_GREEK_SMALL,           0                                 }
289    { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 }
290    { AF_BLUE_STRING_MAX,                   0                                 }
291
292  AF_BLUE_STRINGSET_HEBR
293    { AF_BLUE_STRING_HEBREW_TOP,       AF_BLUE_PROPERTY_LATIN_TOP  |
294                                       AF_BLUE_PROPERTY_LATIN_LONG   }
295    { AF_BLUE_STRING_HEBREW_BOTTOM,    0                             }
296    { AF_BLUE_STRING_HEBREW_DESCENDER, 0                             }
297    { AF_BLUE_STRING_MAX,              0                             }
298
299  AF_BLUE_STRINGSET_LATN
300    { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
301    { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 }
302    { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
303    { AF_BLUE_STRING_LATIN_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
304                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
305    { AF_BLUE_STRING_LATIN_SMALL,           0                                 }
306    { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 }
307    { AF_BLUE_STRING_MAX,                   0                                 }
308
309#ifdef AF_CONFIG_OPTION_CJK
310
311  AF_BLUE_STRINGSET_HANI
312    { AF_BLUE_STRING_CJK_TOP,    AF_BLUE_PROPERTY_CJK_TOP     }
313    { AF_BLUE_STRING_CJK_BOTTOM, 0                            }
314#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
315    { AF_BLUE_STRING_CJK_LEFT,   AF_BLUE_PROPERTY_CJK_HORIZ   }
316    { AF_BLUE_STRING_CJK_RIGHT,  AF_BLUE_PROPERTY_CJK_HORIZ |
317                                 AF_BLUE_PROPERTY_CJK_RIGHT   }
318#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
319    { AF_BLUE_STRING_MAX,        0                            }
320
321#endif /* AF_CONFIG_OPTION_CJK                */
322
323
324// END
325