summaryrefslogtreecommitdiffstats
path: root/src/autofit/afblue.dat
blob: 74a472d41678ed8065244d05230f2fd236ebaad1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
//  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"

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

#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