sdk-world v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Loading...
Searching...
No Matches
afadjust.c
1/****************************************************************************
2 *
3 * afadjust.c
4 *
5 * Auto-fitter routines to adjust components based on charcode (body).
6 *
7 * Copyright (C) 2023-2025 by
8 * David Turner, Robert Wilhelm, and Werner Lemberg.
9 *
10 * Written by Craig White <gerzytet@gmail.com>.
11 *
12 * This file is part of the FreeType project, and may only be used,
13 * modified, and distributed under the terms of the FreeType project
14 * license, LICENSE.TXT. By continuing to use, modify, or distribute
15 * this file you indicate that you have read the license and
16 * understand and accept it fully.
17 *
18 */
19
20#include "afadjust.h"
21#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
22# include "afgsub.h"
23#endif
24
25#include <freetype/freetype.h>
29
30#define AF_ADJUSTMENT_DATABASE_LENGTH \
31 ( sizeof ( adjustment_database ) / \
32 sizeof ( adjustment_database[0] ) )
33
34#undef FT_COMPONENT
35#define FT_COMPONENT afadjust
36
37
39 {
40 FT_UInt32 codepoint;
41 FT_UInt32 flags;
42
43 } AF_AdjustmentDatabaseEntry;
44
45
46 /*
47 All entries in this list must be sorted by ascending Unicode code
48 points. The table entries are 3 numbers consisting of:
49
50 - Unicode code point.
51 - The vertical adjustment type. This should be a combination of the
52 AF_ADJUST_XXX and AF_IGNORE_XXX macros.
53 */
54 static AF_AdjustmentDatabaseEntry adjustment_database[] =
55 {
56 /* C0 Controls and Basic Latin */
57 { 0x21, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ! */
58 { 0x51, AF_IGNORE_CAPITAL_BOTTOM } , /* Q */
59 { 0x3F, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ? */
60 { 0x69, AF_ADJUST_UP }, /* i */
61 { 0x6A, AF_ADJUST_UP }, /* j */
62#if 0
63 /* XXX TODO */
64 { 0x7E, AF_ADJUST_TILDE_TOP }, /* ~ */
65#endif
66
67 /* C1 Controls and Latin-1 Supplement */
68 { 0xA1, AF_ADJUST_UP }, /* ¡ */
69 { 0xA6, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ¦ */
70 { 0xAA, AF_ADJUST_UP }, /* ª */
71 { 0xBA, AF_ADJUST_UP }, /* º */
72 { 0xBF, AF_ADJUST_UP }, /* ¿ */
73
74 { 0xC0, AF_ADJUST_UP }, /* À */
75 { 0xC1, AF_ADJUST_UP }, /* Á */
76 { 0xC2, AF_ADJUST_UP }, /* Â */
77 { 0xC3, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ã */
78 { 0xC4, AF_ADJUST_UP }, /* Ä */
79 { 0xC5, AF_ADJUST_UP }, /* Å */
80 { 0xC7, AF_IGNORE_CAPITAL_BOTTOM }, /* Ç */
81 { 0xC8, AF_ADJUST_UP }, /* È */
82 { 0xC9, AF_ADJUST_UP }, /* É */
83 { 0xCA, AF_ADJUST_UP }, /* Ê */
84 { 0xCB, AF_ADJUST_UP }, /* Ë */
85 { 0xCC, AF_ADJUST_UP }, /* Ì */
86 { 0xCD, AF_ADJUST_UP }, /* Í */
87 { 0xCE, AF_ADJUST_UP }, /* Î */
88 { 0xCF, AF_ADJUST_UP }, /* Ï */
89
90 { 0xD1, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ñ */
91 { 0xD2, AF_ADJUST_UP }, /* Ò */
92 { 0xD3, AF_ADJUST_UP }, /* Ó */
93 { 0xD4, AF_ADJUST_UP }, /* Ô */
94 { 0xD5, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Õ */
95 { 0xD6, AF_ADJUST_UP }, /* Ö */
96 { 0xD8, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ø */
97 { 0xD9, AF_ADJUST_UP }, /* Ù */
98 { 0xDA, AF_ADJUST_UP }, /* Ú */
99 { 0xDB, AF_ADJUST_UP }, /* Û */
100 { 0xDC, AF_ADJUST_UP }, /* Ü */
101 { 0xDD, AF_ADJUST_UP }, /* Ý */
102
103 { 0xE0, AF_ADJUST_UP }, /* à */
104 { 0xE1, AF_ADJUST_UP }, /* á */
105 { 0xE2, AF_ADJUST_UP }, /* â */
106 { 0xE3, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ã */
107 { 0xE4, AF_ADJUST_UP }, /* ä */
108 { 0xE5, AF_ADJUST_UP }, /* å */
109 { 0xE7, AF_IGNORE_SMALL_BOTTOM }, /* ç */
110 { 0xE8, AF_ADJUST_UP }, /* è */
111 { 0xE9, AF_ADJUST_UP }, /* é */
112 { 0xEA, AF_ADJUST_UP }, /* ê */
113 { 0xEB, AF_ADJUST_UP }, /* ë */
114 { 0xEC, AF_ADJUST_UP }, /* ì */
115 { 0xED, AF_ADJUST_UP }, /* í */
116 { 0xEE, AF_ADJUST_UP }, /* î */
117 { 0xEF, AF_ADJUST_UP }, /* ï */
118
119 { 0xF1, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ñ */
120 { 0xF2, AF_ADJUST_UP }, /* ò */
121 { 0xF3, AF_ADJUST_UP }, /* ó */
122 { 0xF4, AF_ADJUST_UP }, /* ô */
123 { 0xF5, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* õ */
124 { 0xF6, AF_ADJUST_UP }, /* ö */
125 { 0xF8, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ø */
126 { 0xF9, AF_ADJUST_UP }, /* ù */
127 { 0xFA, AF_ADJUST_UP }, /* ú */
128 { 0xFB, AF_ADJUST_UP }, /* û */
129 { 0xFC, AF_ADJUST_UP }, /* ü */
130 { 0xFD, AF_ADJUST_UP }, /* ý */
131 { 0xFF, AF_ADJUST_UP }, /* ÿ */
132
133 /* Latin Extended-A */
134 { 0x100, AF_ADJUST_UP }, /* Ā */
135 { 0x101, AF_ADJUST_UP }, /* ā */
136 { 0x102, AF_ADJUST_UP }, /* Ă */
137 { 0x103, AF_ADJUST_UP }, /* ă */
138 { 0x104, AF_IGNORE_CAPITAL_BOTTOM }, /* Ą */
139 { 0x105, AF_IGNORE_SMALL_BOTTOM }, /* ą */
140 { 0x106, AF_ADJUST_UP }, /* Ć */
141 { 0x107, AF_ADJUST_UP }, /* ć */
142 { 0x108, AF_ADJUST_UP }, /* Ĉ */
143 { 0x109, AF_ADJUST_UP }, /* ĉ */
144 { 0x10A, AF_ADJUST_UP }, /* Ċ */
145 { 0x10B, AF_ADJUST_UP }, /* ċ */
146 { 0x10C, AF_ADJUST_UP }, /* Č */
147 { 0x10D, AF_ADJUST_UP }, /* č */
148 { 0x10E, AF_ADJUST_UP }, /* Ď */
149
150 { 0x112, AF_ADJUST_UP }, /* Ē */
151 { 0x113, AF_ADJUST_UP }, /* ē */
152 { 0x114, AF_ADJUST_UP }, /* Ĕ */
153 { 0x115, AF_ADJUST_UP }, /* ĕ */
154 { 0x116, AF_ADJUST_UP }, /* Ė */
155 { 0x117, AF_ADJUST_UP }, /* ė */
156 { 0x118, AF_IGNORE_CAPITAL_BOTTOM }, /* Ę */
157 { 0x119, AF_IGNORE_SMALL_BOTTOM }, /* ę */
158 { 0x11A, AF_ADJUST_UP }, /* Ě */
159 { 0x11B, AF_ADJUST_UP }, /* ě */
160 { 0x11C, AF_ADJUST_UP }, /* Ĝ */
161 { 0x11D, AF_ADJUST_UP }, /* ĝ */
162 { 0x11E, AF_ADJUST_UP }, /* Ğ */
163 { 0x11F, AF_ADJUST_UP }, /* ğ */
164
165 { 0x120, AF_ADJUST_UP }, /* Ġ */
166 { 0x121, AF_ADJUST_UP }, /* ġ */
167 { 0x122, AF_ADJUST_DOWN }, /* Ģ */
168 { 0x123, AF_ADJUST_UP }, /* ģ */
169 { 0x124, AF_ADJUST_UP }, /* Ĥ */
170 { 0x125, AF_ADJUST_UP }, /* ĥ */
171 { 0x128, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ĩ */
172 { 0x129, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ĩ */
173 { 0x12A, AF_ADJUST_UP }, /* Ī */
174 { 0x12B, AF_ADJUST_UP }, /* ī */
175 { 0x12C, AF_ADJUST_UP }, /* Ĭ */
176 { 0x12D, AF_ADJUST_UP }, /* ĭ */
177 { 0x12E, AF_IGNORE_CAPITAL_BOTTOM }, /* Į */
178 { 0x12F, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* į */
179
180 { 0x130, AF_ADJUST_UP }, /* İ */
181 { 0x133, AF_ADJUST_UP }, /* ij */
182 { 0x134, AF_ADJUST_UP }, /* Ĵ */
183 { 0x135, AF_ADJUST_UP }, /* ĵ */
184 { 0x136, AF_ADJUST_DOWN }, /* Ķ */
185 { 0x137, AF_ADJUST_DOWN }, /* ķ */
186 { 0x139, AF_ADJUST_UP }, /* Ĺ */
187 { 0x13A, AF_ADJUST_UP }, /* ĺ */
188 { 0x13B, AF_ADJUST_DOWN }, /* Ļ */
189 { 0x13C, AF_ADJUST_DOWN }, /* ļ */
190
191 { 0x143, AF_ADJUST_UP }, /* Ń */
192 { 0x144, AF_ADJUST_UP }, /* ń */
193 { 0x145, AF_ADJUST_DOWN }, /* Ņ */
194 { 0x146, AF_ADJUST_DOWN }, /* ņ */
195 { 0x147, AF_ADJUST_UP }, /* Ň */
196 { 0x148, AF_ADJUST_UP }, /* ň */
197 { 0x14C, AF_ADJUST_UP }, /* Ō */
198 { 0x14D, AF_ADJUST_UP }, /* ō */
199 { 0x14E, AF_ADJUST_UP }, /* Ŏ */
200 { 0x14F, AF_ADJUST_UP }, /* ŏ */
201
202 { 0x150, AF_ADJUST_UP }, /* Ő */
203 { 0x151, AF_ADJUST_UP }, /* ő */
204 { 0x154, AF_ADJUST_UP }, /* Ŕ */
205 { 0x155, AF_ADJUST_UP }, /* ŕ */
206 { 0x156, AF_ADJUST_DOWN }, /* Ŗ */
207 { 0x157, AF_ADJUST_DOWN }, /* ŗ */
208 { 0x158, AF_ADJUST_UP }, /* Ř */
209 { 0x159, AF_ADJUST_UP }, /* ř */
210 { 0x15A, AF_ADJUST_UP }, /* Ś */
211 { 0x15B, AF_ADJUST_UP }, /* ś */
212 { 0x15C, AF_ADJUST_UP }, /* Ŝ */
213 { 0x15D, AF_ADJUST_UP }, /* ŝ */
214 { 0x15E, AF_IGNORE_CAPITAL_BOTTOM }, /* Ş */
215 { 0x15F, AF_IGNORE_SMALL_BOTTOM }, /* ş */
216
217 { 0x160, AF_ADJUST_UP }, /* Š */
218 { 0x161, AF_ADJUST_UP }, /* š */
219 { 0x162, AF_IGNORE_CAPITAL_BOTTOM }, /* Ţ */
220 { 0x163, AF_IGNORE_SMALL_BOTTOM }, /* ţ */
221 { 0x164, AF_ADJUST_UP }, /* Ť */
222 { 0x168, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ũ */
223 { 0x169, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ũ */
224 { 0x16A, AF_ADJUST_UP }, /* Ū */
225 { 0x16B, AF_ADJUST_UP }, /* ū */
226 { 0x16C, AF_ADJUST_UP }, /* Ŭ */
227 { 0x16D, AF_ADJUST_UP }, /* ŭ */
228 { 0x16E, AF_ADJUST_UP }, /* Ů */
229 { 0x16F, AF_ADJUST_UP }, /* ů */
230
231 { 0x170, AF_ADJUST_UP }, /* Ű */
232 { 0x171, AF_ADJUST_UP }, /* ű */
233 { 0x172, AF_IGNORE_CAPITAL_BOTTOM }, /* Ų */
234 { 0x173, AF_IGNORE_SMALL_BOTTOM }, /* ų */
235 { 0x174, AF_ADJUST_UP }, /* Ŵ */
236 { 0x175, AF_ADJUST_UP }, /* ŵ */
237 { 0x176, AF_ADJUST_UP }, /* Ŷ */
238 { 0x177, AF_ADJUST_UP }, /* ŷ */
239 { 0x178, AF_ADJUST_UP }, /* Ÿ */
240 { 0x179, AF_ADJUST_UP }, /* Ź */
241 { 0x17A, AF_ADJUST_UP }, /* ź */
242 { 0x17B, AF_ADJUST_UP }, /* Ż */
243 { 0x17C, AF_ADJUST_UP }, /* ż */
244 { 0x17D, AF_ADJUST_UP }, /* Ž */
245 { 0x17E, AF_ADJUST_UP }, /* ž */
246
247 /* Latin Extended-B */
248 { 0x187, AF_IGNORE_CAPITAL_TOP }, /* Ƈ */
249 { 0x188, AF_IGNORE_SMALL_TOP }, /* ƈ */
250
251 { 0x1A0, AF_IGNORE_CAPITAL_TOP }, /* Ơ */
252 { 0x1A1, AF_IGNORE_SMALL_TOP }, /* ơ */
253 { 0x1A5, AF_IGNORE_SMALL_TOP }, /* ƥ */
254 { 0x1AB, AF_IGNORE_SMALL_BOTTOM }, /* ƫ */
255 { 0x1AE, AF_IGNORE_CAPITAL_BOTTOM }, /* Ʈ */
256 { 0x1AF, AF_IGNORE_CAPITAL_TOP }, /* Ư */
257
258 { 0x1B0, AF_IGNORE_SMALL_TOP }, /* ư */
259 { 0x1B4, AF_IGNORE_SMALL_TOP }, /* ƴ */
260
261 { 0x1C3, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ǃ */
262 { 0x1C4, AF_ADJUST_UP }, /* DŽ */
263#if 0
264 { 0x1C5, AF_ADJUST_UP }, /* Dž */
265 { 0x1C6, AF_ADJUST_UP }, /* dž */
266 { 0x1C8, AF_ADJUST_UP }, /* Lj */
267 { 0x1C9, AF_ADJUST_UP }, /* lj */
268 { 0x1CB, AF_ADJUST_UP }, /* Nj */
269#endif
270 { 0x1CC, AF_ADJUST_UP }, /* nj */
271 { 0x1CD, AF_ADJUST_UP }, /* Ǎ */
272 { 0x1CE, AF_ADJUST_UP }, /* ǎ */
273 { 0x1CF, AF_ADJUST_UP }, /* Ǐ */
274
275 { 0x1D0, AF_ADJUST_UP }, /* ǐ */
276 { 0x1D1, AF_ADJUST_UP }, /* Ǒ */
277 { 0x1D2, AF_ADJUST_UP }, /* ǒ */
278 { 0x1D3, AF_ADJUST_UP }, /* Ǔ */
279 { 0x1D4, AF_ADJUST_UP }, /* ǔ */
280 { 0x1D5, AF_ADJUST_UP2 }, /* Ǖ */
281 { 0x1D6, AF_ADJUST_UP2 }, /* ǖ */
282 { 0x1D7, AF_ADJUST_UP2 }, /* Ǘ */
283 { 0x1D8, AF_ADJUST_UP2 }, /* ǘ */
284 { 0x1D9, AF_ADJUST_UP2 }, /* Ǚ */
285 { 0x1DA, AF_ADJUST_UP2 }, /* ǚ */
286 { 0x1DB, AF_ADJUST_UP2 }, /* Ǜ */
287 { 0x1DC, AF_ADJUST_UP2 }, /* ǜ */
288 { 0x1DE, AF_ADJUST_UP2 }, /* Ǟ */
289 { 0x1DF, AF_ADJUST_UP2 }, /* ǟ */
290
291 { 0x1E0, AF_ADJUST_UP2 }, /* Ǡ */
292 { 0x1E1, AF_ADJUST_UP2 }, /* ǡ */
293 { 0x1E2, AF_ADJUST_UP }, /* Ǣ */
294 { 0x1E3, AF_ADJUST_UP }, /* ǣ */
295 { 0x1E6, AF_ADJUST_UP }, /* Ǧ */
296 { 0x1E7, AF_ADJUST_UP }, /* ǧ */
297 { 0x1E8, AF_ADJUST_UP }, /* Ǩ */
298 { 0x1E9, AF_ADJUST_UP }, /* ǩ */
299 { 0x1EA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ǫ */
300 { 0x1EB, AF_IGNORE_SMALL_BOTTOM }, /* ǫ */
301 { 0x1EC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ǭ */
302 { 0x1ED, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ǭ */
303 { 0x1EE, AF_ADJUST_UP }, /* Ǯ */
304 { 0x1EF, AF_ADJUST_UP }, /* ǯ */
305
306 { 0x1F0, AF_ADJUST_UP }, /* ǰ */
307 { 0x1F4, AF_ADJUST_UP }, /* Ǵ */
308 { 0x1F5, AF_ADJUST_UP }, /* ǵ */
309 { 0x1F8, AF_ADJUST_UP }, /* Ǹ */
310 { 0x1F9, AF_ADJUST_UP }, /* ǹ */
311 { 0x1FA, AF_ADJUST_UP2 }, /* Ǻ */
312 { 0x1FB, AF_ADJUST_UP2 }, /* ǻ */
313 { 0x1FC, AF_ADJUST_UP }, /* Ǽ */
314 { 0x1FD, AF_ADJUST_UP }, /* ǽ */
315 { 0x1FE, AF_ADJUST_UP }, /* Ǿ */
316 { 0x1FF, AF_ADJUST_UP }, /* ǿ */
317
318 { 0x200, AF_ADJUST_UP }, /* Ȁ */
319 { 0x201, AF_ADJUST_UP }, /* ȁ */
320 { 0x202, AF_ADJUST_UP }, /* Ȃ */
321 { 0x203, AF_ADJUST_UP }, /* ȃ */
322 { 0x204, AF_ADJUST_UP }, /* Ȅ */
323 { 0x205, AF_ADJUST_UP }, /* ȅ */
324 { 0x206, AF_ADJUST_UP }, /* Ȇ */
325 { 0x207, AF_ADJUST_UP }, /* ȇ */
326 { 0x208, AF_ADJUST_UP }, /* Ȉ */
327 { 0x209, AF_ADJUST_UP }, /* ȉ */
328 { 0x20A, AF_ADJUST_UP }, /* Ȋ */
329 { 0x20B, AF_ADJUST_UP }, /* ȋ */
330 { 0x20C, AF_ADJUST_UP }, /* Ȍ */
331 { 0x20D, AF_ADJUST_UP }, /* ȍ */
332 { 0x20E, AF_ADJUST_UP }, /* Ȏ */
333 { 0x20F, AF_ADJUST_UP }, /* ȏ */
334
335 { 0x210, AF_ADJUST_UP }, /* Ȑ */
336 { 0x211, AF_ADJUST_UP }, /* ȑ */
337 { 0x212, AF_ADJUST_UP }, /* Ȓ */
338 { 0x213, AF_ADJUST_UP }, /* ȓ */
339 { 0x214, AF_ADJUST_UP }, /* Ȕ */
340 { 0x215, AF_ADJUST_UP }, /* ȕ */
341 { 0x216, AF_ADJUST_UP }, /* Ȗ */
342 { 0x217, AF_ADJUST_UP }, /* ȗ */
343 { 0x218, AF_ADJUST_DOWN }, /* Ș */
344 { 0x219, AF_ADJUST_DOWN }, /* ș */
345 { 0x21A, AF_ADJUST_DOWN }, /* Ț */
346 { 0x21B, AF_ADJUST_DOWN }, /* ț */
347 { 0x21E, AF_ADJUST_UP }, /* Ȟ */
348 { 0x21F, AF_ADJUST_UP }, /* ȟ */
349
350 { 0x224, AF_IGNORE_CAPITAL_BOTTOM }, /* Ȥ */
351 { 0x225, AF_IGNORE_SMALL_BOTTOM }, /* ȥ */
352 { 0x226, AF_ADJUST_UP }, /* Ȧ */
353 { 0x227, AF_ADJUST_UP }, /* ȧ */
354 { 0x228, AF_IGNORE_CAPITAL_BOTTOM }, /* Ȩ */
355 { 0x229, AF_IGNORE_SMALL_BOTTOM }, /* ȩ */
356 { 0x22A, AF_ADJUST_UP2 }, /* Ȫ */
357 { 0x22B, AF_ADJUST_UP2 }, /* ȫ */
358 { 0x22C, AF_ADJUST_UP2 }, /* Ȭ */
359 { 0x22D, AF_ADJUST_UP2 }, /* ȭ */
360 { 0x22E, AF_ADJUST_UP }, /* Ȯ */
361 { 0x22F, AF_ADJUST_UP }, /* ȯ */
362
363 { 0x230, AF_ADJUST_UP2 }, /* Ȱ */
364 { 0x231, AF_ADJUST_UP2 }, /* ȱ */
365 { 0x232, AF_ADJUST_UP }, /* Ȳ */
366 { 0x233, AF_ADJUST_UP }, /* ȳ */
367 { 0x23A, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ⱥ */
368 { 0x23B, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ȼ */
369 { 0x23F, AF_IGNORE_SMALL_BOTTOM }, /* ȿ */
370
371 { 0x240, AF_IGNORE_SMALL_BOTTOM }, /* ɀ */
372 { 0x249, AF_ADJUST_UP }, /* ɉ */
373
374 /* IPA Extensions */
375 { 0x256, AF_IGNORE_SMALL_BOTTOM }, /* ɖ */
376
377 { 0x260, AF_IGNORE_SMALL_TOP }, /* ɠ */
378 { 0x267, AF_IGNORE_SMALL_BOTTOM }, /* ɧ */
379 { 0x268, AF_ADJUST_UP }, /* ɨ */
380
381 { 0x272, AF_IGNORE_SMALL_BOTTOM }, /* ɲ */
382 { 0x273, AF_IGNORE_SMALL_BOTTOM }, /* ɳ */
383 { 0x27B, AF_IGNORE_SMALL_BOTTOM }, /* ɻ */
384 { 0x27D, AF_IGNORE_SMALL_BOTTOM }, /* ɽ */
385
386 { 0x282, AF_IGNORE_SMALL_BOTTOM }, /* ʂ */
387 { 0x288, AF_IGNORE_SMALL_BOTTOM }, /* ʈ */
388
389 { 0x290, AF_IGNORE_SMALL_BOTTOM }, /* ʐ */
390 { 0x29B, AF_IGNORE_SMALL_TOP }, /* ʛ */
391
392 { 0x2A0, AF_IGNORE_SMALL_TOP }, /* ʠ */
393
394 /* Spacing Modifier Letters */
395 { 0x2B2, AF_ADJUST_UP }, /* ʲ */
396 { 0x2B5, AF_IGNORE_SMALL_BOTTOM }, /* ʵ */
397
398 /* Greek and Coptic */
399 { 0x390, AF_ADJUST_UP2 }, /* ΐ */
400
401 { 0x3AA, AF_ADJUST_UP }, /* Ϊ */
402 { 0x3AB, AF_ADJUST_UP }, /* Ϋ */
403 { 0x3AC, AF_ADJUST_UP }, /* ά */
404 { 0x3AD, AF_ADJUST_UP }, /* έ */
405 { 0x3AE, AF_ADJUST_UP }, /* ή */
406 { 0x3AF, AF_ADJUST_UP }, /* ί */
407
408 { 0x3B0, AF_ADJUST_UP2 }, /* ΰ */
409
410 { 0x3CA, AF_ADJUST_UP }, /* ϊ */
411 { 0x3CB, AF_ADJUST_UP }, /* ϋ */
412 { 0x3CC, AF_ADJUST_UP }, /* ό */
413 { 0x3CD, AF_ADJUST_UP }, /* ύ */
414 { 0x3CE, AF_ADJUST_UP }, /* ώ */
415 { 0x3CF, AF_IGNORE_CAPITAL_BOTTOM }, /* Ϗ */
416
417 { 0x3D4, AF_ADJUST_UP }, /* ϔ */
418 { 0x3D7, AF_IGNORE_SMALL_BOTTOM }, /* ϗ */
419 { 0x3D9, AF_IGNORE_SMALL_BOTTOM }, /* ϙ */
420
421 { 0x3E2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ϣ */
422 { 0x3E3, AF_IGNORE_SMALL_BOTTOM }, /* ϣ */
423
424 { 0x3F3, AF_ADJUST_UP }, /* ϳ */
425
426 /* Cyrillic */
427 { 0x400, AF_ADJUST_UP }, /* Ѐ */
428 { 0x401, AF_ADJUST_UP }, /* Ё */
429 { 0x403, AF_ADJUST_UP }, /* Ѓ */
430 { 0x407, AF_ADJUST_UP }, /* Ї */
431 { 0x40C, AF_ADJUST_UP }, /* Ќ */
432 { 0x40D, AF_ADJUST_UP }, /* Ѝ */
433 { 0x40E, AF_ADJUST_UP }, /* Ў */
434 { 0x40F, AF_IGNORE_CAPITAL_BOTTOM }, /* Џ */
435
436 { 0x419, AF_ADJUST_UP }, /* Й */
437
438 { 0x426, AF_IGNORE_CAPITAL_BOTTOM }, /* Ц */
439 { 0x429, AF_IGNORE_CAPITAL_BOTTOM }, /* Щ */
440
441 { 0x439, AF_ADJUST_UP }, /* й */
442
443 { 0x446, AF_IGNORE_SMALL_BOTTOM }, /* ц */
444 { 0x449, AF_IGNORE_SMALL_BOTTOM }, /* щ */
445
446 { 0x450, AF_ADJUST_UP }, /* ѐ */
447 { 0x451, AF_ADJUST_UP }, /* ё */
448 { 0x453, AF_ADJUST_UP }, /* ѓ */
449 { 0x456, AF_ADJUST_UP }, /* і */
450 { 0x457, AF_ADJUST_UP }, /* ї */
451 { 0x458, AF_ADJUST_UP }, /* ј */
452 { 0x45C, AF_ADJUST_UP }, /* ќ */
453 { 0x45D, AF_ADJUST_UP }, /* ѝ */
454 { 0x45E, AF_ADJUST_UP }, /* ў */
455 { 0x45F, AF_IGNORE_SMALL_BOTTOM }, /* џ */
456
457 { 0x476, AF_ADJUST_UP }, /* Ѷ */
458 { 0x477, AF_ADJUST_UP }, /* ѷ */
459 { 0x47C, AF_ADJUST_UP2 }, /* Ѽ */
460 { 0x47D, AF_ADJUST_UP2 }, /* ѽ */
461 { 0x47E, AF_ADJUST_UP }, /* Ѿ */
462 { 0x47F, AF_ADJUST_UP }, /* ѿ */
463
464 { 0x480, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҁ */
465 { 0x481, AF_IGNORE_SMALL_BOTTOM }, /* ҁ */
466 { 0x48A, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ҋ */
467 { 0x48B, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ҋ */
468
469 { 0x490, AF_IGNORE_CAPITAL_TOP }, /* Ґ */
470 { 0x491, AF_IGNORE_SMALL_TOP }, /* ґ */
471 { 0x496, AF_IGNORE_CAPITAL_BOTTOM }, /* Җ */
472 { 0x497, AF_IGNORE_SMALL_BOTTOM }, /* җ */
473 { 0x498, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҙ */
474 { 0x499, AF_IGNORE_SMALL_BOTTOM }, /* ҙ */
475 { 0x49A, AF_IGNORE_CAPITAL_BOTTOM }, /* Қ */
476 { 0x49B, AF_IGNORE_SMALL_BOTTOM }, /* қ */
477
478 { 0x4A2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ң */
479 { 0x4A3, AF_IGNORE_SMALL_BOTTOM }, /* ң */
480 { 0x4AA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҫ */
481 { 0x4AB, AF_IGNORE_SMALL_BOTTOM }, /* ҫ */
482 { 0x4AC, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҭ */
483 { 0x4AD, AF_IGNORE_SMALL_BOTTOM }, /* ҭ */
484
485 { 0x4B2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҳ */
486 { 0x4B3, AF_IGNORE_SMALL_BOTTOM }, /* ҳ */
487 { 0x4B4, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҵ */
488 { 0x4B5, AF_IGNORE_SMALL_BOTTOM }, /* ҵ */
489 { 0x4B6, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҷ */
490 { 0x4B7, AF_IGNORE_SMALL_BOTTOM }, /* ҷ */
491 { 0x4BE, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҿ */
492 { 0x4BF, AF_IGNORE_SMALL_BOTTOM }, /* ҿ */
493
494 { 0x4C1, AF_ADJUST_UP }, /* Ӂ */
495 { 0x4C2, AF_ADJUST_UP }, /* ӂ */
496 { 0x4C5, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӆ */
497 { 0x4C6, AF_IGNORE_SMALL_BOTTOM }, /* ӆ */
498 { 0x4C9, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӊ */
499 { 0x4CA, AF_IGNORE_SMALL_BOTTOM }, /* ӊ */
500 { 0x4CB, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӌ */
501 { 0x4CC, AF_IGNORE_SMALL_BOTTOM }, /* ӌ */
502 { 0x4CD, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӎ */
503 { 0x4CE, AF_IGNORE_SMALL_BOTTOM }, /* ӎ */
504
505 { 0x4D0, AF_ADJUST_UP }, /* Ӑ */
506 { 0x4D1, AF_ADJUST_UP }, /* ӑ */
507 { 0x4D2, AF_ADJUST_UP }, /* Ӓ */
508 { 0x4D3, AF_ADJUST_UP }, /* ӓ */
509 { 0x4D6, AF_ADJUST_UP }, /* Ӗ */
510 { 0x4D7, AF_ADJUST_UP }, /* ӗ */
511 { 0x4DA, AF_ADJUST_UP }, /* Ӛ */
512 { 0x4DB, AF_ADJUST_UP }, /* ӛ */
513 { 0x4DC, AF_ADJUST_UP }, /* Ӝ */
514 { 0x4DD, AF_ADJUST_UP }, /* ӝ */
515 { 0x4DE, AF_ADJUST_UP }, /* Ӟ */
516 { 0x4DF, AF_ADJUST_UP }, /* ӟ */
517
518 { 0x4E2, AF_ADJUST_UP }, /* Ӣ */
519 { 0x4E3, AF_ADJUST_UP }, /* ӣ */
520 { 0x4E4, AF_ADJUST_UP }, /* Ӥ */
521 { 0x4E5, AF_ADJUST_UP }, /* ӥ */
522 { 0x4E6, AF_ADJUST_UP }, /* Ӧ */
523 { 0x4E7, AF_ADJUST_UP }, /* ӧ */
524 { 0x4EA, AF_ADJUST_UP }, /* Ӫ */
525 { 0x4EB, AF_ADJUST_UP }, /* ӫ */
526 { 0x4EC, AF_ADJUST_UP }, /* Ӭ */
527 { 0x4ED, AF_ADJUST_UP }, /* ӭ */
528 { 0x4EE, AF_ADJUST_UP }, /* Ӯ */
529 { 0x4EF, AF_ADJUST_UP }, /* ӯ */
530
531 { 0x4F0, AF_ADJUST_UP }, /* Ӱ */
532 { 0x4F1, AF_ADJUST_UP }, /* ӱ */
533 { 0x4F2, AF_ADJUST_UP }, /* Ӳ */
534 { 0x4F3, AF_ADJUST_UP }, /* ӳ */
535 { 0x4F4, AF_ADJUST_UP }, /* Ӵ */
536 { 0x4F5, AF_ADJUST_UP }, /* ӵ */
537 { 0x4F6, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӷ */
538 { 0x4F7, AF_IGNORE_SMALL_BOTTOM }, /* ӷ */
539 { 0x4F8, AF_ADJUST_UP }, /* Ӹ */
540 { 0x4F9, AF_ADJUST_UP }, /* ӹ */
541 { 0x4FA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӻ */
542 { 0x4FB, AF_IGNORE_SMALL_BOTTOM }, /* ӻ */
543
544 /* Cyrillic Supplement */
545 { 0x506, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԇ */
546 { 0x507, AF_IGNORE_SMALL_BOTTOM }, /* ԇ */
547
548 { 0x524, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԥ */
549 { 0x525, AF_IGNORE_SMALL_BOTTOM }, /* ԥ */
550 { 0x526, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԧ */
551 { 0x527, AF_IGNORE_SMALL_BOTTOM }, /* ԧ */
552 { 0x52E, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԯ */
553 { 0x52F, AF_IGNORE_SMALL_BOTTOM }, /* ԯ */
554
555 /* Cherokee */
556 { 0x13A5, AF_ADJUST_UP }, /* Ꭵ */
557
558 /* Phonetic Extensions */
559 { 0x1D09, AF_ADJUST_DOWN }, /* ᴉ */
560
561 { 0x1D4E, AF_ADJUST_DOWN }, /* ᵎ */
562
563 { 0x1D51, AF_IGNORE_SMALL_BOTTOM }, /* ᵑ */
564
565 { 0x1D62, AF_ADJUST_UP }, /* ᵢ */
566
567 /* Phonetic Extensions Supplement */
568 { 0x1D80, AF_IGNORE_SMALL_BOTTOM }, /* ᶀ */
569 { 0x1D81, AF_IGNORE_SMALL_BOTTOM }, /* ᶁ */
570 { 0x1D82, AF_IGNORE_SMALL_BOTTOM }, /* ᶂ */
571 { 0x1D84, AF_IGNORE_SMALL_BOTTOM }, /* ᶄ */
572 { 0x1D85, AF_IGNORE_SMALL_BOTTOM }, /* ᶅ */
573 { 0x1D86, AF_IGNORE_SMALL_BOTTOM }, /* ᶆ */
574 { 0x1D87, AF_IGNORE_SMALL_BOTTOM }, /* ᶇ */
575 { 0x1D89, AF_IGNORE_SMALL_BOTTOM }, /* ᶉ */
576 { 0x1D8A, AF_IGNORE_SMALL_BOTTOM }, /* ᶊ */
577 { 0x1D8C, AF_IGNORE_SMALL_BOTTOM }, /* ᶌ */
578 { 0x1D8D, AF_IGNORE_SMALL_BOTTOM }, /* ᶍ */
579 { 0x1D8E, AF_IGNORE_SMALL_BOTTOM }, /* ᶎ */
580 { 0x1D8F, AF_IGNORE_SMALL_BOTTOM }, /* ᶏ */
581
582 { 0x1D90, AF_IGNORE_SMALL_BOTTOM }, /* ᶐ */
583 { 0x1D91, AF_IGNORE_SMALL_BOTTOM }, /* ᶑ */
584 { 0x1D92, AF_IGNORE_SMALL_BOTTOM }, /* ᶒ */
585 { 0x1D93, AF_IGNORE_SMALL_BOTTOM }, /* ᶓ */
586 { 0x1D94, AF_IGNORE_SMALL_BOTTOM }, /* ᶔ */
587 { 0x1D95, AF_IGNORE_SMALL_BOTTOM }, /* ᶕ */
588 { 0x1D96, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ᶖ */
589 { 0x1D97, AF_IGNORE_SMALL_BOTTOM }, /* ᶗ */
590 { 0x1D98, AF_IGNORE_SMALL_BOTTOM }, /* ᶘ */
591 { 0x1D99, AF_IGNORE_SMALL_BOTTOM }, /* ᶙ */
592 { 0x1D9A, AF_IGNORE_SMALL_BOTTOM }, /* ᶚ */
593
594 { 0x1DA4, AF_ADJUST_UP }, /* ᶤ */
595 { 0x1DA8, AF_ADJUST_UP }, /* ᶨ */
596 { 0x1DA9, AF_IGNORE_SMALL_BOTTOM }, /* ᶩ */
597 { 0x1DAA, AF_IGNORE_SMALL_BOTTOM }, /* ᶪ */
598 { 0x1DAC, AF_IGNORE_SMALL_BOTTOM }, /* ᶬ */
599 { 0x1DAE, AF_IGNORE_SMALL_BOTTOM }, /* ᶮ */
600 { 0x1DAF, AF_IGNORE_SMALL_BOTTOM }, /* ᶯ */
601
602 { 0x1DB3, AF_IGNORE_SMALL_BOTTOM }, /* ᶳ */
603 { 0x1DB5, AF_IGNORE_SMALL_BOTTOM }, /* ᶵ */
604 { 0x1DBC, AF_IGNORE_SMALL_BOTTOM }, /* ᶼ */
605
606 /* Latin Extended Additional */
607 { 0x1E00, AF_ADJUST_DOWN }, /* Ḁ */
608 { 0x1E01, AF_ADJUST_DOWN }, /* ḁ */
609 { 0x1E02, AF_ADJUST_UP }, /* Ḃ */
610 { 0x1E03, AF_ADJUST_UP }, /* ḃ */
611 { 0x1E04, AF_ADJUST_DOWN }, /* Ḅ */
612 { 0x1E05, AF_ADJUST_DOWN }, /* ḅ */
613 { 0x1E06, AF_ADJUST_DOWN }, /* Ḇ */
614 { 0x1E07, AF_ADJUST_DOWN }, /* ḇ */
615 { 0x1E08, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ḉ */
616 { 0x1E09, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ḉ */
617 { 0x1E0A, AF_ADJUST_UP }, /* Ḋ */
618 { 0x1E0B, AF_ADJUST_UP }, /* ḋ */
619 { 0x1E0C, AF_ADJUST_DOWN }, /* Ḍ */
620 { 0x1E0D, AF_ADJUST_DOWN }, /* ḍ */
621 { 0x1E0E, AF_ADJUST_DOWN }, /* Ḏ */
622 { 0x1E0F, AF_ADJUST_DOWN }, /* ḏ */
623
624 { 0x1E10, AF_ADJUST_DOWN }, /* Ḑ */
625 { 0x1E11, AF_ADJUST_DOWN }, /* ḑ */
626 { 0x1E12, AF_ADJUST_DOWN }, /* Ḓ */
627 { 0x1E13, AF_ADJUST_DOWN }, /* ḓ */
628 { 0x1E14, AF_ADJUST_UP2 }, /* Ḕ */
629 { 0x1E15, AF_ADJUST_UP2 }, /* ḕ */
630 { 0x1E16, AF_ADJUST_UP2 }, /* Ḗ */
631 { 0x1E17, AF_ADJUST_UP2 }, /* ḗ */
632 { 0x1E18, AF_ADJUST_DOWN }, /* Ḙ */
633 { 0x1E19, AF_ADJUST_DOWN }, /* ḙ */
634 { 0x1E1A, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ḛ */
635 { 0x1E1B, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ḛ */
636 { 0x1E1C, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ḝ */
637 { 0x1E1D, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ḝ */
638 { 0x1E1E, AF_ADJUST_UP }, /* Ḟ */
639 { 0x1E1F, AF_ADJUST_UP }, /* ḟ */
640
641 { 0x1E20, AF_ADJUST_UP }, /* Ḡ */
642 { 0x1E21, AF_ADJUST_UP }, /* ḡ */
643 { 0x1E22, AF_ADJUST_UP }, /* Ḣ */
644 { 0x1E23, AF_ADJUST_UP }, /* ḣ */
645 { 0x1E24, AF_ADJUST_DOWN }, /* Ḥ */
646 { 0x1E25, AF_ADJUST_DOWN }, /* ḥ */
647 { 0x1E26, AF_ADJUST_UP }, /* Ḧ */
648 { 0x1E27, AF_ADJUST_UP }, /* ḧ */
649 { 0x1E28, AF_IGNORE_CAPITAL_BOTTOM }, /* Ḩ */
650 { 0x1E29, AF_IGNORE_SMALL_BOTTOM }, /* ḩ */
651 { 0x1E2A, AF_ADJUST_DOWN }, /* Ḫ */
652 { 0x1E2B, AF_ADJUST_DOWN }, /* ḫ */
653 { 0x1E2C, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ḭ */
654 { 0x1E2D, AF_ADJUST_UP | AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ḭ */
655 { 0x1E2E, AF_ADJUST_UP2 }, /* Ḯ */
656 { 0x1E2F, AF_ADJUST_UP2 }, /* ḯ */
657
658 { 0x1E30, AF_ADJUST_UP }, /* Ḱ */
659 { 0x1E31, AF_ADJUST_UP }, /* ḱ */
660 { 0x1E32, AF_ADJUST_DOWN }, /* Ḳ */
661 { 0x1E33, AF_ADJUST_DOWN }, /* ḳ */
662 { 0x1E34, AF_ADJUST_DOWN }, /* Ḵ */
663 { 0x1E35, AF_ADJUST_DOWN }, /* ḵ */
664 { 0x1E36, AF_ADJUST_DOWN }, /* Ḷ */
665 { 0x1E37, AF_ADJUST_DOWN }, /* ḷ */
666 { 0x1E38, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ḹ */
667 { 0x1E39, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ḹ */
668 { 0x1E3A, AF_ADJUST_DOWN }, /* Ḻ */
669 { 0x1E3B, AF_ADJUST_DOWN }, /* ḻ */
670 { 0x1E3C, AF_ADJUST_DOWN }, /* Ḽ */
671 { 0x1E3D, AF_ADJUST_DOWN }, /* ḽ */
672 { 0x1E3E, AF_ADJUST_UP }, /* Ḿ */
673 { 0x1E3F, AF_ADJUST_UP }, /* ḿ */
674
675 { 0x1E40, AF_ADJUST_UP }, /* Ṁ */
676 { 0x1E41, AF_ADJUST_UP }, /* ṁ */
677 { 0x1E42, AF_ADJUST_DOWN }, /* Ṃ */
678 { 0x1E43, AF_ADJUST_DOWN }, /* ṃ */
679 { 0x1E44, AF_ADJUST_UP }, /* Ṅ */
680 { 0x1E45, AF_ADJUST_UP }, /* ṅ */
681 { 0x1E46, AF_ADJUST_DOWN }, /* Ṇ */
682 { 0x1E47, AF_ADJUST_DOWN }, /* ṇ */
683 { 0x1E48, AF_ADJUST_DOWN }, /* Ṉ */
684 { 0x1E49, AF_ADJUST_DOWN }, /* ṉ */
685 { 0x1E4A, AF_ADJUST_DOWN }, /* Ṋ */
686 { 0x1E4B, AF_ADJUST_DOWN }, /* ṋ */
687 { 0x1E4C, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṍ */
688 { 0x1E4D, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṍ */
689 { 0x1E4E, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṏ */
690 { 0x1E4F, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṏ */
691
692 { 0x1E50, AF_ADJUST_UP2 }, /* Ṑ */
693 { 0x1E51, AF_ADJUST_UP2 }, /* ṑ */
694 { 0x1E52, AF_ADJUST_UP2 }, /* Ṓ */
695 { 0x1E53, AF_ADJUST_UP2 }, /* ṓ */
696 { 0x1E54, AF_ADJUST_UP }, /* Ṕ */
697 { 0x1E55, AF_ADJUST_UP }, /* ṕ */
698 { 0x1E56, AF_ADJUST_UP }, /* Ṗ */
699 { 0x1E57, AF_ADJUST_UP }, /* ṗ */
700 { 0x1E58, AF_ADJUST_UP }, /* Ṙ */
701 { 0x1E59, AF_ADJUST_UP }, /* ṙ */
702 { 0x1E5A, AF_ADJUST_DOWN }, /* Ṛ */
703 { 0x1E5B, AF_ADJUST_DOWN }, /* ṛ */
704 { 0x1E5C, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ṝ */
705 { 0x1E5D, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ṝ */
706 { 0x1E5E, AF_ADJUST_DOWN }, /* Ṟ */
707 { 0x1E5F, AF_ADJUST_DOWN }, /* ṟ */
708
709 { 0x1E60, AF_ADJUST_UP }, /* Ṡ */
710 { 0x1E61, AF_ADJUST_UP }, /* ṡ */
711 { 0x1E62, AF_ADJUST_DOWN }, /* Ṣ */
712 { 0x1E63, AF_ADJUST_DOWN }, /* ṣ */
713 { 0x1E64, AF_ADJUST_UP }, /* Ṥ */
714 { 0x1E65, AF_ADJUST_UP }, /* ṥ */
715 { 0x1E66, AF_ADJUST_UP }, /* Ṧ */
716 { 0x1E67, AF_ADJUST_UP }, /* ṧ */
717 { 0x1E68, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ṩ */
718 { 0x1E69, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ṩ */
719 { 0x1E6A, AF_ADJUST_UP }, /* Ṫ */
720 { 0x1E6B, AF_ADJUST_UP }, /* ṫ */
721 { 0x1E6C, AF_ADJUST_DOWN }, /* Ṭ */
722 { 0x1E6D, AF_ADJUST_DOWN }, /* ṭ */
723 { 0x1E6E, AF_ADJUST_DOWN }, /* Ṯ */
724 { 0x1E6F, AF_ADJUST_DOWN }, /* ṯ */
725
726 { 0x1E70, AF_ADJUST_DOWN }, /* Ṱ */
727 { 0x1E71, AF_ADJUST_DOWN }, /* ṱ */
728 { 0x1E72, AF_ADJUST_DOWN }, /* Ṳ */
729 { 0x1E73, AF_ADJUST_DOWN }, /* ṳ */
730 { 0x1E74, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ṵ */
731 { 0x1E75, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ṵ */
732 { 0x1E76, AF_ADJUST_DOWN }, /* Ṷ */
733 { 0x1E77, AF_ADJUST_DOWN }, /* ṷ */
734 { 0x1E78, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṹ */
735 { 0x1E79, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṹ */
736 { 0x1E7A, AF_ADJUST_UP2 }, /* Ṻ */
737 { 0x1E7B, AF_ADJUST_UP2 }, /* ṻ */
738 { 0x1E7C, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ṽ */
739 { 0x1E7D, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ṽ */
740 { 0x1E7E, AF_ADJUST_DOWN }, /* Ṿ */
741 { 0x1E7F, AF_ADJUST_DOWN }, /* ṿ */
742
743 { 0x1E80, AF_ADJUST_UP }, /* Ẁ */
744 { 0x1E81, AF_ADJUST_UP }, /* ẁ */
745 { 0x1E82, AF_ADJUST_UP }, /* Ẃ */
746 { 0x1E83, AF_ADJUST_UP }, /* ẃ */
747 { 0x1E84, AF_ADJUST_UP }, /* Ẅ */
748 { 0x1E85, AF_ADJUST_UP }, /* ẅ */
749 { 0x1E86, AF_ADJUST_UP }, /* Ẇ */
750 { 0x1E87, AF_ADJUST_UP }, /* ẇ */
751 { 0x1E88, AF_ADJUST_DOWN }, /* Ẉ */
752 { 0x1E89, AF_ADJUST_DOWN }, /* ẉ */
753 { 0x1E8A, AF_ADJUST_UP }, /* Ẋ */
754 { 0x1E8B, AF_ADJUST_UP }, /* ẋ */
755 { 0x1E8C, AF_ADJUST_UP }, /* Ẍ */
756 { 0x1E8D, AF_ADJUST_UP }, /* ẍ */
757 { 0x1E8E, AF_ADJUST_UP }, /* Ẏ */
758 { 0x1E8F, AF_ADJUST_UP }, /* ẏ */
759
760 { 0x1E90, AF_ADJUST_UP }, /* Ẑ */
761 { 0x1E91, AF_ADJUST_UP }, /* ẑ */
762 { 0x1E92, AF_ADJUST_DOWN }, /* Ẓ */
763 { 0x1E93, AF_ADJUST_DOWN }, /* ẓ */
764 { 0x1E94, AF_ADJUST_DOWN }, /* Ẕ */
765 { 0x1E95, AF_ADJUST_DOWN }, /* ẕ */
766 { 0x1E96, AF_ADJUST_DOWN }, /* ẖ */
767 { 0x1E97, AF_ADJUST_UP }, /* ẗ */
768 { 0x1E98, AF_ADJUST_UP }, /* ẘ */
769 { 0x1E99, AF_ADJUST_UP }, /* ẙ */
770 { 0x1E9A, AF_ADJUST_UP }, /* ẚ */
771 { 0x1E9B, AF_ADJUST_UP }, /* ẛ */
772
773 { 0x1EA0, AF_ADJUST_DOWN }, /* Ạ */
774 { 0x1EA1, AF_ADJUST_DOWN }, /* ạ */
775 { 0x1EA2, AF_ADJUST_UP }, /* Ả */
776 { 0x1EA3, AF_ADJUST_UP }, /* ả */
777 { 0x1EA4, AF_ADJUST_UP2 }, /* Ấ */
778 { 0x1EA5, AF_ADJUST_UP2 }, /* ấ */
779 { 0x1EA6, AF_ADJUST_UP2 }, /* Ầ */
780 { 0x1EA7, AF_ADJUST_UP2 }, /* ầ */
781 { 0x1EA8, AF_ADJUST_UP2 }, /* Ẩ */
782 { 0x1EA9, AF_ADJUST_UP2 }, /* ẩ */
783 { 0x1EAA, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ẫ */
784 { 0x1EAB, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ẫ */
785 { 0x1EAC, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ậ */
786 { 0x1EAD, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ậ */
787 { 0x1EAE, AF_ADJUST_UP2 }, /* Ắ */
788 { 0x1EAF, AF_ADJUST_UP2 }, /* ắ */
789
790 { 0x1EB0, AF_ADJUST_UP2 }, /* Ằ */
791 { 0x1EB1, AF_ADJUST_UP2 }, /* ằ */
792 { 0x1EB2, AF_ADJUST_UP2 }, /* Ẳ */
793 { 0x1EB3, AF_ADJUST_UP2 }, /* ẳ */
794 { 0x1EB4, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ẵ */
795 { 0x1EB5, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ẵ */
796 { 0x1EB6, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ặ */
797 { 0x1EB7, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ặ */
798 { 0x1EB8, AF_ADJUST_DOWN }, /* Ẹ */
799 { 0x1EB9, AF_ADJUST_DOWN }, /* ẹ */
800 { 0x1EBA, AF_ADJUST_UP }, /* Ẻ */
801 { 0x1EBB, AF_ADJUST_UP }, /* ẻ */
802 { 0x1EBC, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ẽ */
803 { 0x1EBD, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ẽ */
804 { 0x1EBE, AF_ADJUST_UP2 }, /* Ế */
805 { 0x1EBF, AF_ADJUST_UP2 }, /* ế */
806
807 { 0x1EC0, AF_ADJUST_UP2 }, /* Ề */
808 { 0x1EC1, AF_ADJUST_UP2 }, /* ề */
809 { 0x1EC2, AF_ADJUST_UP2 }, /* Ể */
810 { 0x1EC3, AF_ADJUST_UP2 }, /* ể */
811 { 0x1EC4, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ễ */
812 { 0x1EC5, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ễ */
813 { 0x1EC6, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ệ */
814 { 0x1EC7, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ệ */
815 { 0x1EC8, AF_ADJUST_UP }, /* Ỉ */
816 { 0x1EC9, AF_ADJUST_UP }, /* ỉ */
817 { 0x1ECA, AF_ADJUST_DOWN }, /* Ị */
818 { 0x1ECB, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ị */
819 { 0x1ECC, AF_ADJUST_DOWN }, /* Ọ */
820 { 0x1ECD, AF_ADJUST_DOWN }, /* ọ */
821 { 0x1ECE, AF_ADJUST_UP }, /* Ỏ */
822 { 0x1ECF, AF_ADJUST_UP }, /* ỏ */
823
824 { 0x1ED0, AF_ADJUST_UP2 }, /* Ố */
825 { 0x1ED1, AF_ADJUST_UP2 }, /* ố */
826 { 0x1ED2, AF_ADJUST_UP2 }, /* Ồ */
827 { 0x1ED3, AF_ADJUST_UP2 }, /* ồ */
828 { 0x1ED4, AF_ADJUST_UP2 }, /* Ổ */
829 { 0x1ED5, AF_ADJUST_UP2 }, /* ổ */
830 { 0x1ED6, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ỗ */
831 { 0x1ED7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ỗ */
832 { 0x1ED8, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ộ */
833 { 0x1ED9, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ộ */
834 { 0x1EDA, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ớ */
835 { 0x1EDB, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ớ */
836 { 0x1EDC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ờ */
837 { 0x1EDD, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ờ */
838 { 0x1EDE, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ở */
839 { 0x1EDF, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ở */
840
841 { 0x1EE0, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_CAPITAL_TOP }, /* Ỡ */
842 { 0x1EE1, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_SMALL_TOP }, /* ỡ */
843 { 0x1EE2, AF_ADJUST_DOWN | AF_IGNORE_CAPITAL_TOP }, /* Ợ */
844 { 0x1EE3, AF_ADJUST_DOWN | AF_IGNORE_SMALL_TOP }, /* ợ */
845 { 0x1EE4, AF_ADJUST_DOWN }, /* Ụ */
846 { 0x1EE5, AF_ADJUST_DOWN }, /* ụ */
847 { 0x1EE6, AF_ADJUST_UP }, /* Ủ */
848 { 0x1EE7, AF_ADJUST_UP }, /* ủ */
849 { 0x1EE8, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ứ */
850 { 0x1EE9, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ứ */
851 { 0x1EEA, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ừ */
852 { 0x1EEB, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ừ */
853 { 0x1EEC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ử */
854 { 0x1EED, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ử */
855 { 0x1EEE, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_CAPITAL_TOP }, /* Ữ */
856 { 0x1EEF, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_SMALL_TOP }, /* ữ */
857
858 { 0x1EF0, AF_ADJUST_DOWN | AF_IGNORE_CAPITAL_TOP }, /* Ự */
859 { 0x1EF1, AF_ADJUST_DOWN | AF_IGNORE_SMALL_TOP }, /* ự */
860 { 0x1EF2, AF_ADJUST_UP }, /* Ỳ */
861 { 0x1EF3, AF_ADJUST_UP }, /* ỳ */
862 { 0x1EF4, AF_ADJUST_DOWN }, /* Ỵ */
863 { 0x1EF5, AF_ADJUST_DOWN }, /* ỵ */
864 { 0x1EF6, AF_ADJUST_UP }, /* Ỷ */
865 { 0x1EF7, AF_ADJUST_UP }, /* ỷ */
866 { 0x1EF8, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ỹ */
867 { 0x1EF9, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ỹ */
868
869 /* Greek Extended */
870 { 0x1F00, AF_ADJUST_UP }, /* ἀ */
871 { 0x1F01, AF_ADJUST_UP }, /* ἁ */
872 { 0x1F02, AF_ADJUST_UP }, /* ἂ */
873 { 0x1F03, AF_ADJUST_UP }, /* ἃ */
874 { 0x1F04, AF_ADJUST_UP }, /* ἄ */
875 { 0x1F05, AF_ADJUST_UP }, /* ἅ */
876 { 0x1F06, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἆ */
877 { 0x1F07, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἇ */
878
879 { 0x1F10, AF_ADJUST_UP }, /* ἐ */
880 { 0x1F11, AF_ADJUST_UP }, /* ἑ */
881 { 0x1F12, AF_ADJUST_UP }, /* ἒ */
882 { 0x1F13, AF_ADJUST_UP }, /* ἓ */
883 { 0x1F14, AF_ADJUST_UP }, /* ἔ */
884 { 0x1F15, AF_ADJUST_UP }, /* ἕ */
885
886 { 0x1F20, AF_ADJUST_UP }, /* ἠ */
887 { 0x1F21, AF_ADJUST_UP }, /* ἡ */
888 { 0x1F22, AF_ADJUST_UP }, /* ἢ */
889 { 0x1F23, AF_ADJUST_UP }, /* ἣ */
890 { 0x1F24, AF_ADJUST_UP }, /* ἤ */
891 { 0x1F25, AF_ADJUST_UP }, /* ἥ */
892 { 0x1F26, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἦ */
893 { 0x1F27, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἧ */
894
895 { 0x1F30, AF_ADJUST_UP }, /* ἰ */
896 { 0x1F31, AF_ADJUST_UP }, /* ἱ */
897 { 0x1F32, AF_ADJUST_UP }, /* ἲ */
898 { 0x1F33, AF_ADJUST_UP }, /* ἳ */
899 { 0x1F34, AF_ADJUST_UP }, /* ἴ */
900 { 0x1F35, AF_ADJUST_UP }, /* ἵ */
901 { 0x1F36, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἶ */
902 { 0x1F37, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἷ */
903
904 { 0x1F40, AF_ADJUST_UP }, /* ὀ */
905 { 0x1F41, AF_ADJUST_UP }, /* ὁ */
906 { 0x1F42, AF_ADJUST_UP }, /* ὂ */
907 { 0x1F43, AF_ADJUST_UP }, /* ὃ */
908 { 0x1F44, AF_ADJUST_UP }, /* ὄ */
909 { 0x1F45, AF_ADJUST_UP }, /* ὅ */
910
911 { 0x1F50, AF_ADJUST_UP }, /* ὐ */
912 { 0x1F51, AF_ADJUST_UP }, /* ὑ */
913 { 0x1F52, AF_ADJUST_UP }, /* ὒ */
914 { 0x1F53, AF_ADJUST_UP }, /* ὓ */
915 { 0x1F54, AF_ADJUST_UP }, /* ὔ */
916 { 0x1F55, AF_ADJUST_UP }, /* ὕ */
917 { 0x1F56, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὖ */
918 { 0x1F57, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὗ */
919
920 { 0x1F60, AF_ADJUST_UP }, /* ὠ */
921 { 0x1F61, AF_ADJUST_UP }, /* ὡ */
922 { 0x1F62, AF_ADJUST_UP }, /* ὢ */
923 { 0x1F63, AF_ADJUST_UP }, /* ὣ */
924 { 0x1F64, AF_ADJUST_UP }, /* ὤ */
925 { 0x1F65, AF_ADJUST_UP }, /* ὥ */
926 { 0x1F66, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὦ */
927 { 0x1F67, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὧ */
928
929 { 0x1F70, AF_ADJUST_UP }, /* ὰ */
930 { 0x1F71, AF_ADJUST_UP }, /* ά */
931 { 0x1F72, AF_ADJUST_UP }, /* ὲ */
932 { 0x1F73, AF_ADJUST_UP }, /* έ */
933 { 0x1F74, AF_ADJUST_UP }, /* ὴ */
934 { 0x1F75, AF_ADJUST_UP }, /* ή */
935 { 0x1F76, AF_ADJUST_UP }, /* ὶ */
936 { 0x1F77, AF_ADJUST_UP }, /* ί */
937 { 0x1F78, AF_ADJUST_UP }, /* ὸ */
938 { 0x1F79, AF_ADJUST_UP }, /* ό */
939 { 0x1F7A, AF_ADJUST_UP }, /* ὺ */
940 { 0x1F7B, AF_ADJUST_UP }, /* ύ */
941 { 0x1F7C, AF_ADJUST_UP }, /* ὼ */
942 { 0x1F7D, AF_ADJUST_UP }, /* ώ */
943
944 { 0x1F80, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾀ */
945 { 0x1F81, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾁ */
946 { 0x1F82, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾂ */
947 { 0x1F83, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾃ */
948 { 0x1F84, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾄ */
949 { 0x1F85, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾅ */
950 { 0x1F86, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾆ */
951 { 0x1F87, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾇ */
952 { 0x1F88, AF_ADJUST_DOWN }, /* ᾈ */
953 { 0x1F89, AF_ADJUST_DOWN }, /* ᾉ */
954 { 0x1F8A, AF_ADJUST_DOWN }, /* ᾊ */
955 { 0x1F8B, AF_ADJUST_DOWN }, /* ᾋ */
956 { 0x1F8C, AF_ADJUST_DOWN }, /* ᾌ */
957 { 0x1F8D, AF_ADJUST_DOWN }, /* ᾍ */
958 { 0x1F8E, AF_ADJUST_DOWN }, /* ᾎ */
959 { 0x1F8F, AF_ADJUST_DOWN }, /* ᾏ */
960
961 { 0x1F90, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾐ */
962 { 0x1F91, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾑ */
963 { 0x1F92, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾒ */
964 { 0x1F93, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾓ */
965 { 0x1F94, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾔ */
966 { 0x1F95, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾕ */
967 { 0x1F96, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾖ */
968 { 0x1F97, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾗ */
969 { 0x1F98, AF_ADJUST_DOWN }, /* ᾘ */
970 { 0x1F99, AF_ADJUST_DOWN }, /* ᾙ */
971 { 0x1F9A, AF_ADJUST_DOWN }, /* ᾚ */
972 { 0x1F9B, AF_ADJUST_DOWN }, /* ᾛ */
973 { 0x1F9C, AF_ADJUST_DOWN }, /* ᾜ */
974 { 0x1F9D, AF_ADJUST_DOWN }, /* ᾝ */
975 { 0x1F9E, AF_ADJUST_DOWN }, /* ᾞ */
976 { 0x1F9F, AF_ADJUST_DOWN }, /* ᾟ */
977
978 { 0x1FA0, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾠ */
979 { 0x1FA1, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾡ */
980 { 0x1FA2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾢ */
981 { 0x1FA3, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾣ */
982 { 0x1FA4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾤ */
983 { 0x1FA5, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾥ */
984 { 0x1FA6, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾦ */
985 { 0x1FA7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾧ */
986 { 0x1FA8, AF_ADJUST_DOWN }, /* ᾨ */
987 { 0x1FA9, AF_ADJUST_DOWN }, /* ᾩ */
988 { 0x1FAA, AF_ADJUST_DOWN }, /* ᾪ */
989 { 0x1FAB, AF_ADJUST_DOWN }, /* ᾫ */
990 { 0x1FAC, AF_ADJUST_DOWN }, /* ᾬ */
991 { 0x1FAD, AF_ADJUST_DOWN }, /* ᾭ */
992 { 0x1FAE, AF_ADJUST_DOWN }, /* ᾮ */
993 { 0x1FAF, AF_ADJUST_DOWN }, /* ᾯ */
994
995 { 0x1FB0, AF_ADJUST_UP }, /* ᾰ */
996 { 0x1FB1, AF_ADJUST_UP }, /* ᾱ */
997 { 0x1FB2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾲ */
998 { 0x1FB3, AF_ADJUST_DOWN }, /* ᾳ */
999 { 0x1FB4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾴ */
1000 { 0x1FB6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ᾶ */
1001 { 0x1FB7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾷ */
1002 { 0x1FB8, AF_ADJUST_UP }, /* Ᾰ */
1003 { 0x1FB9, AF_ADJUST_UP }, /* Ᾱ */
1004 { 0x1FBC, AF_ADJUST_DOWN }, /* ᾼ */
1005
1006 { 0x1FC2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῂ */
1007 { 0x1FC3, AF_ADJUST_DOWN }, /* ῃ */
1008 { 0x1FC4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῄ */
1009 { 0x1FC6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῆ */
1010 { 0x1FC7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ῇ */
1011 { 0x1FCC, AF_ADJUST_DOWN }, /* ῌ */
1012
1013 { 0x1FD0, AF_ADJUST_UP }, /* ῐ */
1014 { 0x1FD1, AF_ADJUST_UP }, /* ῑ */
1015 { 0x1FD2, AF_ADJUST_UP2 }, /* ῒ */
1016 { 0x1FD3, AF_ADJUST_UP2 }, /* ΐ */
1017 { 0x1FD6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῖ */
1018 { 0x1FD7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ῗ */
1019 { 0x1FD8, AF_ADJUST_UP }, /* Ῐ */
1020 { 0x1FD9, AF_ADJUST_UP }, /* Ῑ */
1021
1022 { 0x1FE0, AF_ADJUST_UP }, /* ῠ */
1023 { 0x1FE1, AF_ADJUST_UP }, /* ῡ */
1024 { 0x1FE2, AF_ADJUST_UP2 }, /* ῢ */
1025 { 0x1FE3, AF_ADJUST_UP2 }, /* ΰ */
1026 { 0x1FE4, AF_ADJUST_UP }, /* ῤ */
1027 { 0x1FE5, AF_ADJUST_UP }, /* ῥ */
1028 { 0x1FE6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῦ */
1029 { 0x1FE7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ῧ */
1030 { 0x1FE8, AF_ADJUST_UP }, /* Ῠ */
1031 { 0x1FE9, AF_ADJUST_UP }, /* Ῡ */
1032 { 0x1FF2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῲ */
1033 { 0x1FF3, AF_ADJUST_DOWN }, /* ῳ */
1034 { 0x1FF4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῴ */
1035 { 0x1FF6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῶ */
1036 { 0x1FF7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ῷ */
1037 { 0x1FFC, AF_ADJUST_DOWN }, /* ῼ */
1038
1039 /* General Punctuation */
1040 { 0x203C, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ‼ */
1041 { 0x203D, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ‽ */
1042
1043 { 0x2047, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁇ */
1044 { 0x2048, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁈ */
1045 { 0x2049, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁉ */
1046
1047 /* Superscripts and Subscripts */
1048 { 0x2071, AF_ADJUST_UP }, /* ⁱ */
1049
1050 /* Currency Symbols */
1051 { 0x20AB, AF_ADJUST_DOWN }, /* ₫ */
1052
1053 { 0x20C0, AF_ADJUST_DOWN }, /* ⃀ */
1054
1055 /* Number Forms */
1056 { 0x2170, AF_ADJUST_UP }, /* ⅰ */
1057 { 0x2171, AF_ADJUST_UP }, /* ⅱ */
1058 { 0x2172, AF_ADJUST_UP }, /* ⅲ */
1059 { 0x2173, AF_ADJUST_UP }, /* ⅳ */
1060 { 0x2175, AF_ADJUST_UP }, /* ⅵ */
1061 { 0x2176, AF_ADJUST_UP }, /* ⅶ */
1062 { 0x2177, AF_ADJUST_UP }, /* ⅷ */
1063 { 0x2178, AF_ADJUST_UP }, /* ⅸ */
1064 { 0x217A, AF_ADJUST_UP }, /* ⅺ */
1065 { 0x217B, AF_ADJUST_UP }, /* ⅻ */
1066
1067 /* Latin Extended-C */
1068 { 0x2C64, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɽ */
1069 { 0x2C67, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱨ */
1070 { 0x2C68, AF_IGNORE_SMALL_BOTTOM } , /* ⱨ */
1071 { 0x2C69, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱪ */
1072 { 0x2C6A, AF_IGNORE_SMALL_BOTTOM } , /* ⱪ */
1073 { 0x2C6B, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱬ */
1074 { 0x2C6C, AF_IGNORE_SMALL_BOTTOM } , /* ⱬ */
1075 { 0x2C6E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɱ */
1076
1077 { 0x2C7C, AF_ADJUST_UP }, /* ⱼ */
1078 { 0x2C7E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ȿ */
1079 { 0x2C7F, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɀ */
1080
1081 /* Coptic */
1082 { 0x2CC2, AF_ADJUST_UP }, /* Ⳃ */
1083 { 0x2CC3, AF_ADJUST_UP }, /* ⳃ */
1084
1085 /* Supplemental Punctuation */
1086 { 0x2E18, AF_ADJUST_UP }, /* ⸘ */
1087
1088 { 0x2E2E, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⸮ */
1089
1090 /* Cyrillic Extended-B */
1091 { 0xA640, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꙁ */
1092 { 0xA641, AF_IGNORE_SMALL_BOTTOM } , /* ꙁ */
1093 { 0xA642, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꙃ */
1094 { 0xA643, AF_IGNORE_SMALL_BOTTOM } , /* ꙃ */
1095
1096 { 0xA680, AF_IGNORE_CAPITAL_TOP } , /* Ꚁ */
1097 { 0xA681, AF_IGNORE_SMALL_TOP } , /* ꚁ */
1098 { 0xA688, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚉ */
1099 { 0xA689, AF_IGNORE_SMALL_BOTTOM } , /* ꚉ */
1100 { 0xA68A, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚋ */
1101 { 0xA68B, AF_IGNORE_SMALL_BOTTOM } , /* ꚋ */
1102 { 0xA68E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚏ */
1103 { 0xA68F, AF_IGNORE_SMALL_BOTTOM } , /* ꚏ */
1104
1105 { 0xA690, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚑ */
1106 { 0xA691, AF_IGNORE_SMALL_BOTTOM } , /* ꚑ */
1107 { 0xA696, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚗ */
1108 { 0xA697, AF_IGNORE_SMALL_BOTTOM } , /* ꚗ */
1109
1110 /* Latin Extended-D */
1111 { 0xA726, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꜧ */
1112 { 0xA727, AF_IGNORE_SMALL_BOTTOM } , /* ꜧ */
1113
1114 { 0xA756, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꝗ */
1115 { 0xA758, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꝙ */
1116
1117 { 0xA771, AF_IGNORE_SMALL_BOTTOM } , /* ꝱ */
1118 { 0xA772, AF_IGNORE_SMALL_BOTTOM } , /* ꝲ */
1119 { 0xA773, AF_IGNORE_SMALL_BOTTOM } , /* ꝳ */
1120 { 0xA774, AF_IGNORE_SMALL_BOTTOM } , /* ꝴ */
1121 { 0xA776, AF_IGNORE_SMALL_BOTTOM } , /* ꝶ */
1122
1123 { 0xA790, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꞑ */
1124 { 0xA791, AF_IGNORE_SMALL_BOTTOM } , /* ꞑ */
1125 { 0xA794, AF_IGNORE_SMALL_BOTTOM } , /* ꞔ */
1126 { 0xA795, AF_IGNORE_SMALL_BOTTOM } , /* ꞕ */
1127
1128 { 0xA7C0, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ꟁ */
1129 { 0xA7C1, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ꟁ */
1130 { 0xA7C4, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꞔ */
1131 { 0xA7C5, AF_IGNORE_CAPITAL_BOTTOM } , /* Ʂ */
1132 { 0xA7C6, AF_IGNORE_CAPITAL_BOTTOM } , /* Ᶎ */
1133 { 0xA7CC, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ꟍ */
1134 { 0xA7CD, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ꟍ */
1135
1136 /* Latin Extended-E */
1137 { 0xAB3C, AF_IGNORE_SMALL_BOTTOM } , /* ꬼ */
1138
1139 { 0xAB46, AF_IGNORE_SMALL_BOTTOM } , /* ꭆ */
1140
1141 { 0xAB5C, AF_IGNORE_SMALL_BOTTOM } , /* ꭜ */
1142
1143 { 0xAB66, AF_IGNORE_SMALL_BOTTOM } , /* ꭦ */
1144 { 0xAB67, AF_IGNORE_SMALL_BOTTOM } , /* ꭧ */
1145 };
1146
1147
1148 FT_LOCAL_DEF( FT_UInt32 )
1149 af_adjustment_database_lookup( FT_UInt32 codepoint )
1150 {
1151 /* Binary search for database entry */
1152 FT_Offset low = 0;
1153 FT_Offset high = AF_ADJUSTMENT_DATABASE_LENGTH - 1;
1154
1155
1156 while ( high >= low )
1157 {
1158 FT_Offset mid = ( low + high ) / 2;
1159 FT_UInt32 mid_codepoint = adjustment_database[mid].codepoint;
1160
1161
1162 if ( mid_codepoint < codepoint )
1163 low = mid + 1;
1164 else if ( mid_codepoint > codepoint )
1165 high = mid - 1;
1166 else
1167 return adjustment_database[mid].flags;
1168 }
1169
1170 return 0;
1171 }
1172
1173
1174#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
1175
1176 static FT_Error
1177 add_substitute( FT_Int glyph_idx,
1178 size_t value,
1179 FT_UInt32 codepoint,
1180 FT_Hash reverse_map,
1181 FT_Hash subst_map,
1182 FT_Memory memory )
1183 {
1184 FT_Error error;
1185
1186 FT_Int first_substitute = (FT_Int)( value & 0xFFFF );
1187
1188 FT_UInt used = reverse_map->used;
1189
1190
1191 /*
1192 OpenType features like 'unic' map lowercase letter glyphs to uppercase
1193 forms (and vice versa), which could lead to the use of wrong entries
1194 in the adjustment database. For this reason we don't overwrite,
1195 prioritizing cmap entries.
1196
1197 XXX Note, however, that this cannot cover all cases since there might
1198 be contradictory entries for glyphs not in the cmap. A possible
1199 solution might be to specially mark pairs of related lowercase and
1200 uppercase characters in the adjustment database that have diacritics
1201 on different vertical sides (for example, U+0122 'Ģ' and U+0123 'ģ').
1202 The auto-hinter could then perform a topological analysis to do the
1203 right thing.
1204 */
1205 error = ft_hash_num_insert_no_overwrite( first_substitute, codepoint,
1206 reverse_map, memory );
1207 if ( error )
1208 return error;
1209
1210 if ( reverse_map->used > used )
1211 {
1212 size_t* subst = ft_hash_num_lookup( first_substitute, subst_map );
1213
1214
1215 if ( subst )
1216 {
1217 error = add_substitute( first_substitute, *subst, codepoint,
1218 reverse_map, subst_map, memory );
1219 if ( error )
1220 return error;
1221 }
1222 }
1223
1224 /* The remaining substitutes. */
1225 if ( value & 0xFFFF0000U )
1226 {
1227 FT_UInt num_substitutes = value >> 16;
1228
1229 FT_UInt i;
1230
1231
1232 for ( i = 1; i <= num_substitutes; i++ )
1233 {
1234 FT_Int idx = glyph_idx + (FT_Int)( i << 16 );
1235 size_t* substitute = ft_hash_num_lookup( idx, subst_map );
1236
1237
1238 used = reverse_map->used;
1239
1240 error = ft_hash_num_insert_no_overwrite( *substitute,
1241 codepoint,
1242 reverse_map,
1243 memory );
1244 if ( error )
1245 return error;
1246
1247 if ( reverse_map->used > used )
1248 {
1249 size_t* subst = ft_hash_num_lookup( *substitute, subst_map );
1250
1251
1252 if ( subst )
1253 {
1254 error = add_substitute( *substitute, *subst, codepoint,
1255 reverse_map, subst_map, memory );
1256 if ( error )
1257 return error;
1258 }
1259 }
1260 }
1261 }
1262
1263 return FT_Err_Ok;
1264 }
1265
1266#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
1267
1268
1269 /* Construct a 'reverse cmap' (i.e., a mapping from glyph indices to */
1270 /* character codes) for all glyphs that an input code point could turn */
1271 /* into. */
1272 /* */
1273 /* If HarfBuzz support is not available, this is the direct inversion */
1274 /* of the cmap table, otherwise the mapping gets extended with data */
1275 /* from the 'GSUB' table. */
1276 FT_LOCAL_DEF( FT_Error )
1277 af_reverse_character_map_new( FT_Hash *map,
1278 AF_StyleMetrics metrics )
1279 {
1280 FT_Error error;
1281
1282 AF_FaceGlobals globals = metrics->globals;
1283 FT_Face face = globals->face;
1284 FT_Memory memory = face->memory;
1285
1286 FT_CharMap old_charmap;
1287
1288 FT_UInt32 codepoint;
1289 FT_Offset i;
1290
1291
1292 FT_TRACE4(( "af_reverse_character_map_new:"
1293 " building reverse character map (style `%s')\n",
1294 af_style_names[metrics->style_class->style] ));
1295
1296 /* Search for a unicode charmap. */
1297 /* If there isn't one, create a blank map. */
1298
1299 /* Back up `face->charmap` because `find_unicode_charmap` sets it. */
1300 old_charmap = face->charmap;
1301
1302 if ( ( error = find_unicode_charmap( face ) ) )
1303 goto Exit;
1304
1305 *map = NULL;
1306 if ( FT_QNEW( *map ) )
1307 goto Exit;
1308
1309 error = ft_hash_num_init( *map, memory );
1310 if ( error )
1311 goto Exit;
1312
1313 /* Initialize reverse cmap with data directly from the cmap table. */
1314 for ( i = 0; i < AF_ADJUSTMENT_DATABASE_LENGTH; i++ )
1315 {
1316 FT_Int cmap_glyph;
1317
1318
1319 /*
1320 We cannot restrict `codepoint` to character ranges; we have no
1321 control what data the script-specific portion of the GSUB table
1322 actually holds.
1323
1324 An example is `arial.ttf` version 7.00; in this font, there are
1325 lookups for Cyrillic (lookup 43), Greek (lookup 44), and Latin
1326 (lookup 45) that map capital letter glyphs to small capital glyphs.
1327 It is tempting to expect that script-specific versions of the 'c2sc'
1328 feature only use script-specific lookups. However, this is not the
1329 case in this font: the feature uses all three lookups regardless of
1330 the script.
1331
1332 The auto-hinter, while assigning glyphs to styles, uses the first
1333 coverage result it encounters for a particular glyph. For example,
1334 if the coverage for Cyrillic is tested before Latin (as is currently
1335 the case), glyphs without a cmap entry that are covered in 'c2sc'
1336 are treated as Cyrillic.
1337
1338 If we now look at glyph 3498, which is a small-caps version of the
1339 Latin character 'A grave' (U+00C0, glyph 172), we can see that it is
1340 registered as belonging to a Cyrillic style due to the algorithm
1341 just described. As a result, checking only for characters from the
1342 Latin range would miss this glyph; we thus have to test all
1343 character codes in the database.
1344 */
1345 codepoint = adjustment_database[i].codepoint;
1346
1347 cmap_glyph = (FT_Int)FT_Get_Char_Index( face, codepoint );
1348 if ( cmap_glyph == 0 )
1349 continue;
1350
1351 error = ft_hash_num_insert( cmap_glyph, codepoint, *map, memory );
1352 if ( error )
1353 goto Exit;
1354 }
1355
1356#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
1357
1358 if ( ft_hb_enabled( globals ) )
1359 {
1360 hb_font_t *hb_font;
1361 hb_face_t *hb_face;
1362
1363 hb_set_t *gsub_lookups;
1364 hb_script_t script;
1365
1366 unsigned int script_count = 1;
1367 hb_tag_t script_tags[2] = { HB_TAG_NONE, HB_TAG_NONE };
1368
1369 FT_Hash subst_map = NULL;
1370
1371 hb_codepoint_t idx;
1372 FT_UInt hash_idx;
1373 FT_Int glyph_idx;
1374 size_t value;
1375
1376
1377 /* No need to check whether HarfBuzz has allocation issues; */
1378 /* it continues to work in such cases and simply returns */
1379 /* 'empty' objects that do nothing. */
1380
1381 hb_font = globals->hb_font;
1382 hb_face = hb( font_get_face )( hb_font );
1383
1384 gsub_lookups = hb( set_create )();
1385
1386 script = af_hb_scripts[metrics->style_class->script];
1387
1388 hb( ot_tags_from_script_and_language )( script, NULL,
1389 &script_count, script_tags,
1390 NULL, NULL );
1391
1392 /* Compute set of all script-specific GSUB lookups. */
1393 hb( ot_layout_collect_lookups )( hb_face,
1394 HB_OT_TAG_GSUB,
1395 script_tags, NULL, NULL,
1396 gsub_lookups );
1397
1398#ifdef FT_DEBUG_LEVEL_TRACE
1399 {
1400 FT_Bool have_idx = FALSE;
1401
1402
1403 FT_TRACE4(( " GSUB lookups to check:\n" ));
1404
1405 FT_TRACE4(( " " ));
1406 idx = HB_SET_VALUE_INVALID;
1407 while ( hb( set_next )( gsub_lookups, &idx ) )
1408 if ( globals->gsub_lookups_single_alternate[idx] )
1409 {
1410 have_idx = TRUE;
1411 FT_TRACE4(( " %u", idx ));
1412 }
1413 if ( !have_idx )
1414 FT_TRACE4(( " (none)" ));
1415 FT_TRACE4(( "\n" ));
1416
1417 FT_TRACE4(( "\n" ));
1418 }
1419#endif
1420
1421 if ( FT_QNEW( subst_map ) )
1422 goto Exit_HarfBuzz;
1423
1424 error = ft_hash_num_init( subst_map, memory );
1425 if ( error )
1426 goto Exit_HarfBuzz;
1427
1428 idx = HB_SET_VALUE_INVALID;
1429 while ( hb( set_next )( gsub_lookups, &idx ) )
1430 {
1431 FT_UInt32 offset = globals->gsub_lookups_single_alternate[idx];
1432
1433
1434 /* Put all substitutions into a single hash table. Note that */
1435 /* the hash values usually contain more than a single character */
1436 /* code; this can happen if different 'SingleSubst' subtables */
1437 /* map a given glyph index to different substitutions, or if */
1438 /* 'AlternateSubst' subtable entries are present. */
1439 if ( offset )
1440 af_map_lookup( globals, subst_map, offset );
1441 }
1442
1443 /*
1444 Now iterate over the collected substitution data in `subst_map`
1445 (using recursion to resolve one-to-many mappings) and insert the
1446 data into the reverse cmap.
1447
1448 As an example, suppose we have the following cmap and substitution
1449 data:
1450
1451 cmap: X -> a
1452 Y -> b
1453 Z -> c
1454
1455 substitutions: a -> b
1456 b -> c, d
1457 d -> e
1458
1459 The reverse map now becomes as follows.
1460
1461 a -> X
1462 b -> Y
1463 c -> Z (via cmap, ignoring mapping from 'b')
1464 d -> Y (via 'b')
1465 e -> Y (via 'b' and 'd')
1466 */
1467
1468 hash_idx = 0;
1469 while ( ft_hash_num_iterator( &hash_idx,
1470 &glyph_idx,
1471 &value,
1472 subst_map ) )
1473 {
1474 size_t* val;
1475
1476
1477 /* Ignore keys that do not point to the first substitute. */
1478 if ( (FT_UInt)glyph_idx & 0xFFFF0000U )
1479 continue;
1480
1481 /* Ignore glyph indices that are not related to accents. */
1482 val = ft_hash_num_lookup( glyph_idx, *map );
1483 if ( !val )
1484 continue;
1485
1486 codepoint = *val;
1487
1488 error = add_substitute( glyph_idx, value, codepoint,
1489 *map, subst_map, memory );
1490 if ( error )
1491 break;
1492 }
1493
1494 Exit_HarfBuzz:
1495 hb( set_destroy )( gsub_lookups );
1496
1497 ft_hash_num_free( subst_map, memory );
1498 FT_FREE( subst_map );
1499
1500 if ( error )
1501 goto Exit;
1502 }
1503
1504#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
1505
1506 FT_TRACE4(( " reverse character map built successfully"
1507 " with %u entries\n", ( *map )->used ));
1508
1509#ifdef FT_DEBUG_LEVEL_TRACE
1510
1511 {
1512 FT_UInt cnt;
1513
1514
1515 FT_TRACE7(( " gidx code flags\n" ));
1516 /* " XXXXX 0xXXXX XXXXXXXXXXX..." */
1517 FT_TRACE7(( " ------------------------------\n" ));
1518
1519 for ( cnt = 0; cnt < globals->glyph_count; cnt++ )
1520 {
1521 size_t* val;
1522 FT_UInt32 adj_type;
1523
1524 const char* flag_names[] =
1525 {
1526 "up", /* AF_ADJUST_UP */
1527 "down", /* AF_ADJUST_DOWN */
1528 "double up", /* AF_ADJUST_UP2 */
1529 "double down", /* AF_ADJUST_DOWN2 */
1530
1531 "top tilde", /* AF_ADJUST_TILDE_TOP */
1532 "bottom tilde", /* AF_ADJUST_TILDE_BOTTOM */
1533 "below-top tilde", /* AF_ADJUST_TILDE_TOP2 */
1534 "above-bottom tilde", /* AF_ADJUST_TILDE_BOTTOM2 */
1535
1536 "ignore capital top", /* AF_IGNORE_CAPITAL_TOP */
1537 "ignore capital bottom", /* AF_IGNORE_CAPITAL_BOTTOM */
1538 "ignore small top", /* AF_IGNORE_SMALL_TOP */
1539 "ignore small bottom", /* AF_IGNORE_SMALL_BOTTOM */
1540 };
1541 size_t flag_names_size = sizeof ( flag_names ) / sizeof ( char* );
1542
1543 char flag_str[256];
1544 int need_comma;
1545
1546 size_t j;
1547
1548
1549 val = ft_hash_num_lookup( (FT_Int)cnt, *map );
1550 if ( !val )
1551 continue;
1552 codepoint = *val;
1553
1554 adj_type = af_adjustment_database_lookup( codepoint );
1555 if ( !adj_type )
1556 continue;
1557
1558 flag_str[0] = '\0';
1559 need_comma = 0;
1560
1561 for ( j = 0; j < flag_names_size; j++ )
1562 {
1563 if ( adj_type & (1 << j ) )
1564 {
1565 if ( !need_comma )
1566 need_comma = 1;
1567 else
1568 strcat( flag_str, ", " );
1569 strcat( flag_str, flag_names[j] );
1570 }
1571 }
1572
1573 FT_TRACE7(( " %5u 0x%04X %s\n", cnt, codepoint, flag_str ));
1574 }
1575 }
1576
1577#endif /* FT_DEBUG_LEVEL_TRACE */
1578
1579
1580 Exit:
1581 face->charmap = old_charmap;
1582
1583 if ( error )
1584 {
1585 FT_TRACE4(( " error while building reverse character map."
1586 " Using blank map.\n" ));
1587
1588 if ( *map )
1589 ft_hash_num_free( *map, memory );
1590
1591 FT_FREE( *map );
1592 *map = NULL;
1593 return error;
1594 }
1595
1596 return FT_Err_Ok;
1597 }
1598
1599
1600 FT_LOCAL_DEF( FT_Error )
1601 af_reverse_character_map_done( FT_Hash map,
1602 FT_Memory memory )
1603 {
1604 if ( map )
1605 ft_hash_num_free( map, memory );
1606 FT_FREE( map );
1607
1608 return FT_Err_Ok;
1609 }
1610
1611
1612/* END */
hb_script_t