• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
75AF_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
486AF_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