1% ttfautohint 2% Werner Lemberg 3% 4 5<!-- 6 Copyright (C) 2011-2021 by Werner Lemberg. 7 8 This file is part of the ttfautohint library, and may only be used, 9 modified, and distributed under the terms given in `COPYING'. By 10 continuing to use, modify, or distribute this file you indicate that you 11 have read `COPYING' and understand and accept it fully. 12 13 The file `COPYING' mentioned in the previous paragraph is distributed 14 with the ttfautohint library. 15--> 16 17 18--- 19header-includes: 20 - \hyphenation{ttf-auto-hint} 21--- 22 23 24Introduction 25============ 26 27**ttfautohint** is a library written in\ C that takes a TrueType font as 28the input, removes its bytecode instructions (if any), and returns a new 29font where all glyphs are bytecode hinted using the information given by 30FreeType's auto-hinting module. The idea is to provide the excellent 31quality of the auto-hinter on platforms that don't use FreeType. 32 33The library has a central API function, `TTF_autohint`, which is described 34[below](#the-ttfautohint-api). 35 36Bundled with the library there are two front-end programs, [`ttfautohint` 37and `ttfautohintGUI`](#ttfautohint-and-ttfautohintgui), being a command line 38program and an application with a Graphics User Interface (GUI), 39respectively. 40 41 42What exactly are hints? 43----------------------- 44 45To cite [Wikipedia](https://en.wikipedia.org/wiki/Font_hinting): 46 47> **Font hinting** (also known as **instructing**) is the use of 48> mathematical instructions to adjust the display of an outline font so that 49> it lines up with a rasterized grid. At low screen resolutions, hinting is 50> critical for producing a clear, legible text. It can be accompanied by 51> antialiasing and (on liquid crystal displays) subpixel rendering for 52> further clarity. 53 54and Apple's [TrueType Reference 55Manual](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM03/Chap3.html#features): 56 57> For optimal results, a font instructor should follow these guidelines: 58> 59> - At small sizes, chance effects should not be allowed to magnify small 60> differences in the original outline design of a glyph. 61> 62> - At large sizes, the subtlety of the original design should emerge. 63 64In general, there are three possible ways to hint a glyph. 65 66 1. The font contains hints (in the original sense of this word) to guide 67 the rasterizer, telling it which shapes of the glyphs need special 68 consideration. The hinting logic is partly in the font and partly in 69 the rasterizer. More sophisticated rasterizers are able to produce 70 better rendering results. 71 72 This is how PostScript Type\ 1 and CFF hints work. 73 74 2. The font contains exact instructions (also called *bytecode*) on how to 75 move the points of its outlines, depending on the resolution of the 76 output device, and which intentionally distort the (outline) shape to 77 produce a well-rasterized result. The hinting logic is in the font; 78 ideally, all rasterizers simply process these instructions to get the 79 same result on all platforms. 80 81 This is how TrueType hints work. 82 83 3. The font gets auto-hinted (at run-time). The hinting logic is 84 completely in the rasterizer. No hints in the font are used or needed; 85 instead, the rasterizer scans and analyzes the glyphs to apply 86 corrections by itself. 87 88 This is how FreeType's auto-hinter works; see 89 [below](#background-and-technical-details) for more. 90 91 92What problems can arise with TrueType hinting? 93---------------------------------------------- 94 95While it is relatively easy to specify PostScript hints (either manually or 96by an auto-hinter that works at font creation time), creating TrueType 97hints is far more difficult. There are at least two reasons: 98 99 - TrueType instructions form a programming language, operating at a very 100 low level. They are comparable to assembler code, thus lacking all 101 high-level concepts to make programming more comfortable. 102 103 Here an example how such code looks like: 104 105 ``` 106 SVTCA[0] 107 PUSHB[ ] /* 3 values pushed */ 108 18 1 0 109 CALL[ ] 110 PUSHB[ ] /* 2 values pushed */ 111 15 4 112 MIRP[01001] 113 PUSHB[ ] /* 3 values pushed */ 114 7 3 0 115 CALL[ ] 116 ``` 117 118 Another major obstacle is the fact that font designers usually aren't 119 programmers. 120 121 - It is very time consuming to manually hint glyphs. Given that the 122 number of specialists for TrueType hinting is very limited, hinting a 123 large set of glyphs for a font or font family can become very expensive. 124 125 126Why ttfautohint? 127---------------- 128 129The ttfautohint library brings the excellent quality of FreeType rendering 130to platforms that don't use FreeType, yet require hinting for text to look 131good -- like Microsoft Windows. Roughly speaking, it converts the glyph 132analysis done by FreeType's auto-hinting module to TrueType bytecode. 133Internally, the auto-hinter's algorithm resembles PostScript hinting 134methods; it thus combines all three hinting methods discussed 135[previously](#what-exactly-are-hints). 136 137The simple interface of the front-ends (both on the command line and with 138the GUI) allows quick hinting of a whole font with a few mouse clicks or a 139single command on the prompt. As a result, you get better rendering results 140with web browsers, for example. 141 142Across Windows rendering environments today, fonts processed with 143ttfautohint look best with ClearType enabled. This is the default for 144Windows\ 7 and higher. Good visual results are also seen in recent MacOS\ X 145versions and GNU/Linux systems (including Android, ChromeOS, and other 146mobile operating systems) that use FreeType for rendering glyphs. 147 148 149'Smooth' hinting 150---------------- 151 152Fundamentally, there are two approaches to hinting. The older approach, 153let's call it 'sharp', popular when text was rendered in pure 154black-and-white, was to make all stems round to full pixels so that in a 155text line, all stems would be either one pixel or (at a larger point size) 156two pixels. When grayscale antialiasing came about, this approach actually 157started harming the rendering rather than helping it, because the horizontal 158and vertical stems would render very dark but round or diagonal stems would 159render very light. 160 161So a new approach was developed, let's call it 'fuzzy', where all stems and 162other elements are equalized so that in grayscale (or ClearType) rendering, 163they all are of roughly equal color. This means that stems are not rounded 164to full pixels but in fact to fractions of a pixel. However, with 165black-and-white renderers, this approach yields poor results because in 166black-and-white you cannot render a fraction of a pixel, so some stems 167become one pixel and some become two. 168 169The TrueType auto-hinters in [FontForge] and [FontLab Studio], to name two 170well-known font editors, take the 'sharp' approach, while the TrueType 171auto-hinter in ttfautohint takes the 'fuzzy' approach. 172 173In theory, a hybrid approach is possible, using TrueType conditional hints: 174If the rasterizer is black-and-white, 'sharp' rendering could happen, while 175if the rasterizer is ClearType, the 'fuzzy' rendering could be used. It is 176not intended to add black-and-white auto-hinting to ttfautohint. However, 177it is planned to develop an interface so that ttfautohint can cooperate with 178font editors, providing this hybrid hinting. 179 180 181 182`ttfautohint` and `ttfautohintGUI` 183================================== 184 185On all supported platforms (GNU/Linux, Windows, and Mac OS\ X), the GUI 186looks quite similar; the used toolkit is [Qt], which in turn uses the 187platform's native widgets. 188 189![`ttfautohintGUI` on GNU/Linux running KDE](img/ttfautohintGUI.png) 190 191Both the GUI and console version share the same features, to be discussed in 192the next subsection. 193 194**Warning: ttfautohint cannot always process a font a second time.** 195If the font contains composite glyphs, and option [`-c`](#hint-composites) 196is used, reprocessing with ttfautohint will fail. For this reason it is 197strongly recommended to *not* delete the original, unhinted font so that you 198can always rerun ttfautohint. 199 200 201Calling `ttfautohint` 202--------------------- 203 204``` 205 ttfautohint [OPTION]... [IN-FILE [OUT-FILE]] 206``` 207 208The command-line binary, `ttfautohint`, works like a Unix filter, this is, 209it reads data from standard input if no input file name is given, and it 210sends its output to standard output if no output file name is specified. 211 212A typical call looks like the following. 213 214``` 215 ttfautohint -v -t -m foo-control.txt foo.ttf foo-autohinted.ttf 216``` 217 218For demonstration purposes, here the same using a pipe and redirection. 219Note that Windows's default command line interpreter, `cmd.exe`, doesn't 220support piping with binary files, unfortunately. 221 222``` 223 cat foo.ttf | ttfautohint -v -t -m foo-control.txt > foo-autohinted.ttf 224``` 225 226 227Calling `ttfautohintGUI` 228------------------------ 229 230``` 231 ttfautohintGUI [OPTION]... 232``` 233 234`ttfautohintGUI` doesn't send any output to a console; however, it accepts 235(almost) the same command line options as `ttfautohint` to provide 236customized default values of the GUI. 237 238The following command line options are not available in `ttfautohintGUI`: 239[`--control-file`](#control-instructions-file), 240[`--reference`](#blue-zone-reference-font), 241[`--reference-index`](#reference-face-index). Note, however, that the 242corresponding functionality can be selected interactively. 243 244Two options, namely `--ttfa-info` and `--debug`, emit information at 245standard output and standard error, respectively; they are thus not 246available in `ttfautohintGUI`, too, and there is no corresponding GUI 247functionality either. 248 249 250Options 251------- 252 253Long options can be given with one or two dashes, and with and without an 254equal sign between option and argument. This means that the following forms 255are acceptable: `-foo=`*bar*, `--foo=`*bar*, `-foo`\ *bar*, and 256`--foo`\ *bar*. 257 258Below, the section title refers to the command's label in the GUI (if 259applicable), then comes the name of the corresponding long command line 260option and its short equivalent, followed by a description. 261 262Background and technical details on the meaning of the various options are 263given [afterwards](#background-and-technical-details). 264 265### Control Instructions File 266 267`--control-file=`*file*, `-m`\ *file* 268: Specify the name of a control instructions file to manually tweak the 269 hinting process. This feature can be used to correct glitches in 270 ttfautohint's hinting algorithm. The syntax used in a control 271 instructions file is given [below](#control-instructions). 272 273 `ttfautohintGUI` doesn't have this command line option. 274 275### Blue Zone Reference Font 276 277`--reference=`*file*, `-R`\ *file* 278: Derive all blue zones from the given font, which can either be a normal 279 TrueType font or a TrueType collection – for the latter you can select 280 the face index with a [separate option](#reference-face-index). 281 282 Use this to harmonize font families, avoiding ugly height differences at 283 small sizes. 284 285 ![Fira Regular and Bold (version 4.106), auto-hinted with ttfautohint 286 and displayed at 16px using Internet Explorer\ 11 under Windows\ 8.1. 287 The bold series shown on the right side uses the regular variant as 288 the reference font.](img/fira-16px-ie11-win81.png) 289 290 To make this work the reference font must obviously be similar enough to 291 the font to be hinted; in particular, it must have proper blue zone 292 characters so that ttfautohint can derive blue zones at all. 293 294 `ttfautohintGUI` doesn't have this command line option. 295 296### Hint Set Range Minimum, Hint Set Range Maximum 297 298See '[Hint Sets](#hint-sets)' for a definition and explanation. 299 300`--hinting-range-min=`*n*, `-l`\ *n* 301: The minimum PPEM value (in pixels) at which hint sets are created. The 302 default value for *n* is\ 8. 303 304`--hinting-range-max=`*n*, `-r`\ *n* 305: The maximum PPEM value (in pixels) at which hint sets are created. The 306 default value for *n* is 50. 307 308Increasing the range given by `-l` and `-r` normally makes the font's 309bytecode larger. 310 311### Default Script 312 313`--default-script=`*s*, `-D`\ *s* 314: Set default script to tag *s*, which is a string consisting of four 315 lowercase characters like `latn` or `dflt`. It is needed to specify the 316 OpenType default script: After applying all features that are handled 317 specially (like small caps or superscript), ttfautohint uses this value 318 for the remaining features. The default value is `latn`. See 319 [below](#opentype-features) for more details. 320 321### Fallback Script 322 323`--fallback-script=`*s*, `-f`\ *s* 324: Set fallback script to tag *s*, which is a string consisting of four 325 characters like `latn` or `dflt`. It gets used for all glyphs that 326 can't be assigned to a script automatically. The default value is 327 `none`. See [below](#scripts) for more details. 328 329`--fallback-scaling`, `-S` 330: Use scaling for glyphs covered by the fallback script, not hinting. See 331 [below](#scripts) for more details. 332 333### Hinting Limit 334 335`--hinting-limit=`*n*, `-G`\ *n* 336: The *hinting limit* is the PPEM value (in pixels) where hinting gets 337 switched off (using the `INSTCTRL` bytecode instruction, not the `gasp` 338 table data); it does not influence the file size. The default value for 339 *n* is 200, which means that the font is not hinted for PPEM values 340 larger than 200. 341 342 Note that hinting in the range 'hinting-range-max' up to 'hinting-limit' 343 uses the hinting configuration for 'hinting-range-max'. 344 345 To omit a hinting limit, use `--hinting-limit=0` (or check the 'No 346 Hinting Limit' box in the GUI). Since this causes internal math 347 overflow in the rasterizer for large pixel values (>\ 1500px approx.) it 348 is strongly recommended to not use this except for testing purposes. 349 350### x Height Increase Limit 351 352`--increase-x-height=`*n*, `-x`\ *n* 353: Normally, ttfautohint rounds the x\ height to the pixel grid, with a 354 slight preference for rounding up (to use the terminology of TrueType's 355 'Super Round' bytecode instruction, the threshold is 5/8px). If this 356 flag is set, values in the PPEM range 6 to\ *n* are much more often 357 rounded up (setting the threshold to 13/16px). The default value for 358 *n* is 14. Use this flag to increase the legibility of small sizes if 359 necessary; you might get weird rendering results otherwise for glyphs 360 like 'a' or 'e', depending on the font design. 361 362 To switch off this feature, use `--increase-x-height=0` (or check the 363 'No x\ Height Increase' box in the GUI). To switch off rounding the 364 x\ height to the pixel grid in general, either partially or completely, 365 see '[x Height Snapping Exceptions](#x-height-snapping-exceptions)'. 366 367 The following FontForge snapshot images use the font '[Mertz 368 Bold](https://github.com/vernnobile/mertzFont/tree/master/FINAL/Mertz-Bold)' 369 from Vernon Adams. 370 371 ![At 17px, without option `-x` and `-a qqq`, the hole in glyph 'e' looks 372 very grey in the FontForge snapshot, and the GDI ClearType rendering 373 (which is the default on older Windows versions) fills it completely 374 with black because it uses B/W rendering along the y\ axis. 375 ttfautohint's 'smooth' stem width algorithm intentionally aligns 376 horizontal lines to non-integer (but still discrete) values to avoid 377 large glyph shape distortions.](img/e-17px-x14.png) 378 379 ![The same, this time with option `-x 17` (and 380 `-a qqq`).](img/e-17px-x17.png) 381 382### x Height Snapping Exceptions 383 384`--x-height-snapping-exceptions=`*string*, `-X`\ *string* 385: A list of comma separated PPEM values or value ranges at which no 386 x\ height snapping shall be applied. A value range has the form 387 *value*~1~`-`*value*~2~, meaning *value*~1~\ <= PPEM <=\ *value*~2~. 388 *value*~1~ or *value*~2~ (or both) can be missing; a missing value is 389 replaced by the beginning or end of the whole interval of valid PPEM 390 values, respectively (6\ to 32767). Whitespace is not significant; 391 superfluous commas are ignored, and ranges must be specified in 392 increasing order. For example, the string `"7-9, 11, 13-"` means the 393 values 7, 8, 9, 11, 13, 14, 15, etc. Consequently, if the supplied 394 argument is `"-"`, no x\ height snapping takes place at all. The 395 default is the empty string (`""`), meaning no snapping exceptions. 396 397 Normally, x\ height snapping means a slight increase in the overall 398 vertical glyph size so that the height of lowercase glyphs gets aligned 399 to the pixel grid (this is a global feature, affecting *all* glyphs of a 400 font). However, having larger vertical glyph sizes is not always 401 desired, especially if it is not possible to adjust the `usWinAscent` 402 and `usWinDescent` values from the font's `OS/2` table so that they are 403 not too tight. See '[Windows Compatibility](#windows-compatibility)' 404 for more details. 405 406### Fallback Stem Width 407 408`--fallback-stem-width=`*n*, `-H`\ *n* 409: Set the horizontal stem width (hinting) value for all scripts that lack 410 proper standard characters in the font. The value is given in font 411 units and must be a positive integer. If not set, ttfautohint uses a 412 hard-coded default (50\ units at 2048 units per EM, and linearly scaled 413 for other UPEM values, for example 24\ units at 1000 UPEM). 414 415 For symbol fonts, you need option `--fallback-script` too (to set up a 416 script at all). 417 418 In the GUI, uncheck the 'Default Fallback Stem Width' box to activate 419 this feature. 420 421### Windows Compatibility 422 423`--windows-compatibility`, `-W` 424: This option makes ttfautohint add two artificial blue zones, positioned 425 at the `usWinAscent` and `usWinDescent` values (from the font's `OS/2` 426 table). The idea is to help ttfautohint so that the hinted glyphs stay 427 within this horizontal stripe since older versions of Windows clip 428 everything that lies outside. 429 430 There is a general problem with tight values for `usWinAscent` and 431 `usWinDescent`; a good description is given in the [Vertical Metrics 432 How-To](http://typophile.com/node/13081). Additionally, there is a 433 special problem with tight values if used in combination with 434 ttfautohint because the auto-hinter tends to slightly increase the 435 vertical glyph dimensions at smaller sizes to improve legibility. This 436 enlargement can make the heights and depths of glyphs exceed the range 437 given by `usWinAscent` and `usWinDescent`. 438 439 If ttfautohint is part of the font creation tool chain, and the font 440 designer can adjust those two values, a better solution instead of using 441 option `-W` is to reserve some vertical space for 'padding': For the 442 auto-hinter, the difference between a top or bottom outline point before 443 and after hinting is less than 1px, thus a vertical padding of 2px is 444 sufficient. Assuming a minimum hinting size of 6ppem, adding two pixels 445 gives an increase factor of 8÷6 = 1.33. This is near to the default 446 baseline-to-baseline distance used by TeX and other sophisticated text 447 processing applications, namely 1.2×designsize, which gives satisfying 448 results in most cases. It is also near to the factor 1.25 recommended 449 in the abovementioned how-to. For example, if the vertical extension of 450 the largest glyph is 2000 units (assuming that it approximately 451 represents the designsize), the sum of `usWinAscent` and `usWinDescent` 452 could be 1.25×2000 = 2500. 453 454 In case ttfautohint is used as an auto-hinting tool for fonts that can 455 be no longer modified to change the metrics, option `-W` in combination 456 with '`-X "-"`' to suppress any vertical enlargement should prevent 457 almost all clipping. 458 459### Adjust Subglyphs 460 461`--adjust-subglyphs`, `-p` 462: *Adjusting subglyphs* makes a font's original bytecode be applied to all 463 glyphs before it is replaced with bytecode created by ttfautohint. This 464 makes only sense if your font already has some hints in it that modify 465 the shape even at EM size (normally 2048px); in particular, some CJK 466 fonts need this because the bytecode is used to scale and shift 467 subglyphs (hence the option's long name). For most fonts, however, this 468 is not the case. 469 470### Hint Composites 471 472`--composites`, `-c` 473: By default, the components of a composite glyph get hinted separately. 474 If this flag is set, the composite glyph itself gets hinted (and the 475 hints of the components are ignored). Using this flag increases the 476 bytecode size a lot, however, it *might* yield better hinting results – 477 usually, it doesn't. 478 479 If this option is used (and a font actually contains composite glyphs), 480 ttfautohint currently cannot reprocess its own output for technical 481 reasons, see [below](#the-.ttfautohint-glyph). 482 483### Symbol Font 484 485`--symbol`, `-s` 486: Process a font that ttfautohint would refuse otherwise because it can't 487 find a single standard character for any of the supported scripts. 488 489 For all scripts that lack proper standard characters, ttfautohint uses a 490 default (hinting) value for the standard stem width instead of deriving 491 it from a script's set of standard characters (for the latin script, one 492 of them is character 'o'). 493 494 Use this option – usually in combination with the 495 [`--fallback-script`](#fallback-script) and/or 496 [`--fallback-stem-width`](#fallback-stem-width) option – to hint symbol 497 or dingbat fonts or math glyphs, for example. 498 499### Dehint 500 501`--dehint`, `-d` 502: Strip off all hints without generating new hints. Consequently, all 503 other hinting options are ignored. This option is intended for testing 504 purposes. 505 506### ttfautohint Info 507 508`--no-info`, `-n` 509: Don't add ttfautohint version and command line information to the 510 version string or strings (with name ID\ 5) in the font's `name` table. 511 In the GUI, it corresponds to value 'None' in the 'ttfautohint 512 info' combo box. 513 514 This option is mutually exclusive with option `-I`. 515 516`--detailed-info`, `-I` 517: Add ttfautohint version and command line information to the version 518 string or strings (with name ID\ 5) in the font's `name` table. In the 519 GUI, it corresponds to value 'Version and Parameters' in the 520 'ttfautohint info' combo box. 521 522 This option is mutually exclusive with option `-n`. 523 524If neither `-n` nor `-I` is set, the string '`ttfautohint (vNNN)`' gets 525added to the `name` table (with *NNN* the current version); this correponds 526to value 'Version' in the 'ttfautohint info' combo box. 527 528### Add TTFA Info Table 529 530`--ttfa-table`, `-t` 531: Add an SFNT table called `TTFA` to the output font that holds a dump of 532 all parameters; the data resembles the format of the `--debug` option's 533 parameter listing. In particular, it lists all ttfautohint control 534 instructions (which are *not* shown in the `name` table info). This 535 option is mainly for archival purposes so that all information used to 536 create a font is stored in the font itself. Note that such a `TTFA` 537 table gets ignored by all TrueType rendering engines. 538 539 Forthcoming versions of the ttfautohint front-ends will be able to use 540 this data so that a font can be processed another time with exactly the 541 same parameters, thus providing a means for round-tripping fonts. 542 543### Family Suffix 544 545`--family-suffix=`*string*, `-F`\ *string* 546: A string that gets appended to the family name in entries with IDs 1, 4, 547 6, 16, and\ 21 in the font's `name` table. Allowed input is ASCII in 548 the range 0x20-0x7E except characters `%()/<>[]{}`. 549 550 Assuming an input family name 'Foo', a full name 'Foo Bold', and a 551 family suffix '\ 1', the output family name will be 'Foo 1' and the 552 full name 'Foo 1 Bold'. For the PostScript name in ID\ 6, ttfautohint 553 uses the suffix with space characters removed (for example 'Foo1Bold'). 554 555 This option is mainly for testing purposes, enabling the operating 556 system to simultaneously display several instances of a font that are 557 processed with different ttfautohint parameters. 558 559### Reference Face Index 560 561`--reference-index=`*n*, `-Z`\ *n* 562: Set the face index for the [blue zone reference 563 font](#blue-zone-reference-font) if the font is a TrueType collection 564 (`.ttc`). For normal TrueType fonts, the value is always zero (which is 565 also the default). 566 567 `ttfautohintGUI` doesn't have this command line option. 568 569### Stem Width and Positioning Mode 570 571`--stem-width-mode=`*string*, `-a`\ *string* 572: ttfautohint provides three different algorithms for computing horizontal 573 stem widths and the positioning of blue zones. 574 575 - 'natural': No adjustments to stem widths, discrete blue zone 576 positioning. This is what FreeType uses for its 'light' 577 (auto-)hinting mode. Essentially no glyph shape distortion, low 578 contrast. 579 580 - 'quantized': Both stem widths and blue zone positions are slightly 581 quantized to take discrete values. For example, stem values 50, 51, 582 72, 76, and 100 would become 50, 74, and 100 (or something similar). 583 More glyph shape distortion but increased contrast. 584 585 - 'strong: If active, stem widths and blue zones are snapped and 586 positioned to integer pixel values as much as possible. This gives 587 high contrast, but glyph shape distortion can be significant. 588 589 These three algorithms are mapped onto three possible rendering targets. 590 591 - Grayscale rendering, with or without optimization for subpixel 592 positioning (e.g., Android). 593 594 - 'GDI ClearType' rendering: the rasterizer version, as returned by the 595 GETINFO bytecode instruction, is in the range 36\ <= version <=\ 38 596 and ClearType is enabled (e.g., Windows XP). 597 598 - 'DirectWrite ClearType' rendering: the rasterizer version, as returned 599 by the GETINFO bytecode instruction, is >=\ 39, ClearType is enabled, 600 and subpixel positioning is enabled also (e.g., Internet Explorer\ 9 601 running on Windows\ 7). 602 603 GDI ClearType uses a mode similar to B/W rendering along the vertical 604 axis, while DW ClearType applies grayscale rendering. Additionally, 605 only DW ClearType provides subpixel positioning along the x\ axis. For 606 what it's worth, the rasterizers version\ 36 and version\ 38 in 607 Microsoft Windows are two completely different rendering engines. 608 609 [Note that the GDI framework on Windows\ 10 no longer uses B/W rendering 610 along the vertical axis; we consequently treat it as DW ClearType also. 611 We test this by looking at bit\ 11 of the GETINFO instruction, which 612 was introduced in rasterizer version\ 40.] 613 614 The command line option expects *string* to contain exactly three 615 letters with possible values '`n`' for natural, '`q`' for quantized, and 616 '`s`' for strong stem width and positioning mode. The first, second, 617 and third letter correspond to grayscale, GDI ClearType, and DW 618 ClearType rendering, respectively. The default value is `qsq`, which 619 means that the 'quantized' algorithm gets used for grayscale and DW 620 ClearType, and the 'strong' algorithm for GDI ClearType. For example, 621 to use the 'natural' algorithm for all three rendering targets, use 622 option `-a nnn`. 623 624 In the GUI, simply select the desired stem width algorithm in the three 625 combo boxes. 626 627 ![This image shows different versions of glyph 'g' of the font 628 [Merriweather-Black](https://fonts.google.com/specimen/Merriweather) 629 as displayed with the 'ftgrid' demo program of FreeType. Top left is 630 unhinted, top right is hinted using ttfautohint natural stem width 631 mode. Bottom left and right uses the quantized and strong stem width 632 modes, respectively.](img/Merriweather-Black-g-21px-comparison.png) 633 634`--strong-stem-width=`*string*, `-w`\ *string* 635 636: This option is deprecated and has been replaced with the more versatile 637 option [`--stem-width-mode`](#stem-width-and-positioning-mode). The 638 table below shows the corresponding arguments. 639 640 `-w` `-a` 641 ------ ------ 642 `""` `qqq` 643 `g` `sqq` 644 `G` `qsq` 645 `D` `qqs` 646 `gG` `ssq` 647 `gD` `sqs` 648 `GD` `qss` 649 `gGD` `sss` 650 651### Miscellaneous 652 653Watch input files\ \ \ (`ttfautohintGUI` only) 654: If this checkbox is set, automatically regenerate the output file as 655 soon as an input file (either the font, the control instructions file, 656 or the reference font) gets modified. 657 658 Pressing the 'Run' button starts watching. If an error occurs, watching 659 stops and must be restarted with the 'Run' button. 660 661`--ignore-restrictions`, `-i` 662: By default, fonts that have bit\ 1 set in the 'fsType' field of the 663 `OS/2` table are rejected. If you have a permission of the font's legal 664 owner to modify the font, specify this command line option. 665 666 If this option is not set, `ttfautohintGUI` shows a dialogue to handle 667 such fonts if necessary. 668 669`--help`, `-h` 670: On the console, print a brief documentation on standard output and exit. 671 This doesn't work with `ttfautohintGUI` on MS Windows. 672 673`--version`, `-v` 674: On the console, print version information on standard output and exit. 675 This doesn't work with `ttfautohintGUI` on MS Windows. 676 677`--ttfa-info`, `-T`\ \ \ (not in `ttfautohintGUI`) 678: Print [`TTFA` table](#add-ttfa-info-table) of the input font on standard 679 output if present, then exit. 680 681`--debug`\ \ \ (not in `ttfautohintGUI`) 682: Print *a lot* of debugging information on standard error while 683 processing a font (you should redirect stderr to a file). 684 685 To reduce the amount of debug data it is recommended to restrict the 686 hinting process to a single PPEM value, e.g., 687 688 ``` 689 ttfautohint --debug -l 15 -r 15 ... > debug.txt 2>&1 690 ``` 691 692 693 694Background and Technical Details 695================================ 696 697[Real-Time Grid Fitting of Typographic 698Outlines](https://www.tug.org/TUGboat/tb24-3/lemberg.pdf) is a scholarly 699paper that describes FreeType's auto-hinter in some detail. Regarding the 700described data structures it is slightly out of date, but the algorithm 701itself hasn't changed in general. 702 703The next few subsections are mainly based on this article, introducing some 704important concepts. Note that ttfautohint only does hinting along the 705vertical direction (modifying y\ coordinates only). 706 707 708Segments and Edges 709------------------ 710 711A glyph consists of one or more *contours* (this is, closed curves). For 712example, glyph 'O' consists of two contours, while glyph 'I' has only one. 713 714![The letter 'O' has two contours, an inner and an outer one, while letter 715 'I' has only an outer contour.](img/o-and-i) 716 717A *segment* is a series of consecutive points of a contour (including its 718Bézier control points) that are approximately aligned along a coordinate 719axis. A segment has one of three possible directions: left, right, or none 720(which means neither left nor right), derived from the TrueType outline 721directions. ttfautohint itself creates segments that contain at least two 722points. Using control instructions, however, it is possible to create 723one-point segments, which are useful for fine-tuning the hinting process. 724 725![A serif. Contour and control points are represented by squares and 726 circles, respectively. The bottom 'line' DE is approximately aligned 727 along the horizontal axis, thus it forms a segment of 7\ points. Together 728 with the two other horizontal segments, BC and FG, they form two edges 729 (BC+FG, DE).](img/segment-edge) 730 731An *edge* corresponds to a single coordinate value (allowing for a small 732threshold) on the main dimension that collects one or more segments, all 733pointing into the same direction (either left or right, all others are 734ignored). While finding segments is done on the unscaled outline, finding 735edges is bound to the device resolution. See [below](#hint-sets) for an 736example. 737 738In general, segments and edges pointing into different directions 'repel' 739each other, thus preventing alignment on the same vertical coordinate if 740they are near. Note that this is a simplification, but it should help 741understand how to manipulate and/or create segments in control instructions 742files. 743 744The analysis to find segments and edges is specific to a writing 745system, see [below](#writing-systems). 746 747 748Feature Analysis 749---------------- 750 751The auto-hinter analyzes a font in two steps. Right now, everything 752described here happens for the horizontal axis only, providing vertical 753hinting. 754 755 * Global Analysis 756 757 This affects the hinting of all glyphs, trying to give them a uniform 758 appearance. 759 760 + Compute standard horizontal stem width of the font. The value 761 is normally taken from glyphs that resemble letter 'o'. 762 763 If, for a given script, there is no glyph for at least one standard 764 character in the input font, a fallback stem width gets used. See 765 also option [`--fallback-stem-width`](#fallback-stem-width). 766 767 The stem width(s) found by the algorithm can be overridden with the 768 [`width`](#stem-width-adjustments) control instruction. 769 770 + Compute blue zones, see [below](#blue-zones). 771 772 If the stem widths of single glyphs differ by a large value, or if 773 ttfautohint fails to find proper blue zones, hinting becomes quite poor, 774 possibly leading even to severe shape distortions. 775 776 777Table: script-specific standard characters of the 'latin' writing system 778 779 Script Standard characters 780 -------- --------------------- 781 `adlm` '', U+1E90C, ADLAM CAPITAL LETTER O 782 '', U+1E92E, ADLAM SMALL LETTER O 783 `arab` 'ـ', U+0640, ARABIC TATWEEL 784 'ل', U+0644, ARABIC LETTER LAM 785 'ح', U+062D, ARABIC LETTER HAH 786 `armn` 'օ', U+0585, ARMENIAN SMALL LETTER OH 787 'Օ', U+0555, ARMENIAN CAPITAL LETTER OH 788 `avst` '', U+10B1A, AVESTAN LETTER THE 789 `bamu` 'ꛁ', U+A6C1, BAMUM LETTER YUQ 790 'ꛯ', U+A6EF, BAMUM LETTER KOGHOM 791 `beng` '০', U+09E6, BENGALI DIGIT ZERO 792 '৪', U+09EA, BENGALI DIGIT FOUR 793 `buhd` 'ᝋ', U+174B, BUHID LETTER MA 794 'ᝏ', U+174F, BUHID LETTER WA 795 `cakm` '', U+11124, CHAKMA LETTER WAA 796 '', U+11109, CHAKMA LETTER GAA 797 '', U+1111B, CHAKMA LETTER PAA 798 `cans` 'ᑌ', U+144C, CANADIAN SYLLABICS TE 799 'ᓚ', U+14DA, CANADIAN SYLLABICS LA 800 `cari` '', U+102AB, CARIAN LETTER O 801 '', U+102C9, CARIAN LETTER RR 802 `cher` 'Ꭴ', U+13A4, CHEROKEE LETTER U 803 'Ꮕ', U+13C5, CHEROKEE LETTER NV 804 'ꮕ', U+AB95, CHEROKEE SMALL LETTER NV 805 `copt` 'Ⲟ', U+2C9E, COPTIC CAPITAL LETTER O 806 'ⲟ', U+2C9F, COPTIC SMALL LETTER O 807 `cprt` '', U+10805, CYPRIOT SYLLABLE JA 808 '', U+10823, CYPRIOT SYLLABLE RA 809 `cyrl` '\Cyrillic{}о\cyrillic{}', U+043E, CYRILLIC SMALL LETTER O 810 '\Cyrillic{}О\cyrillic{}', U+041E, CYRILLIC CAPITAL LETTER O 811 `deva` 'ठ', U+0920, DEVANAGARI LETTER TTHA 812 'व', U+0935, DEVANAGARI LETTER VA 813 'ट', U+091F, DEVANAGARI LETTER TTA 814 `dsrt` '', U+10404, DESERET CAPITAL LETTER LONG O 815 '', U+1042C, DESERET SMALL LETTER LONG O 816 `ethi` 'ዐ', U+12D0, ETHIOPIC SYLLABLE PHARYNGEAL A 817 `geor` 'ი', U+10D8, GEORGIAN LETTER IN 818 'ე', U+10D4, GEORGIAN LETTER EN 819 'ა', U+10D0, GEORGIAN LETTER AN 820 'Ი', U+1C98, GEORGIAN MTAVRULI CAPITAL LETTER IN 821 `geok` 'Ⴖ', U+10B6, GEORGIAN CAPITAL LETTER GHAN 822 'Ⴑ', U+10B1, GEORGIAN CAPITAL LETTER SAN 823 'ⴙ', U+2D19, GEORGIAN SMALL LETTER CHIN 824 `glag` 'Ⱅ', U+2C15, GLAGOLITIC CAPITAL LETTER TVRIDO 825 'ⱅ', U+2C45, GLAGOLITIC SMALL LETTER TVRIDO 826 `goth` '', U+10334, GOTHIC LETTER AIHVUS 827 '', U+1033E, GOTHIC LETTER JER 828 '', U+10343, GOTHIC LETTER SAUIL 829 `grek` '\Greek{}ο\greek{}', U+03BF, GREEK SMALL LETTER OMICRON 830 '\Greek{}Ο\greek{}', U+039F, GREEK CAPITAL LETTER OMICRON 831 `gujr` 'ટ', U+0A9F, GUJARATI LETTER TTA 832 '૦', U+0AE6, GUJARATI DIGIT ZERO 833 `guru` 'ਠ', U+0A20, GURMUKHI LETTER TTHA 834 'ਰ', U+0A30, GURMUKHI LETTER RA 835 '੦', U+0A66, GURMUKHI DIGIT ZERO 836 `hebr` 'ם', U+05DD, HEBREW LETTER FINAL MEM 837 `hmnp` '', U+1E128, NYIAKENG PUACHUE HMONG LETTER O 838 `kali` 'ꤍ', U+A90D, KAYAH LI LETTER NGA 839 '꤀', U+A900, KAYAH LI DIGIT ZERO 840 `knda` '೦', U+0CE6, KANNADA DIGIT ZERO 841 'ಬ', U+0CAC, KANNADA LETTER BA 842 `khmr` '០', U+17E0, KHMER DIGIT ZERO 843 `lao` '໐', U+0ED0, LAO DIGIT ZERO 844 `latn` '\Latin{}o\latin{}', U+006F, LATIN SMALL LETTER O 845 '\Latin{}O\latin{}', U+004F, LATIN CAPITAL LETTER O 846 '\Latin{}0\latin{}', U+0030, DIGIT ZERO 847 `lisu` 'ꓳ', U+A4F3, LISU LETTER 848 `medf` '', U+16E61, MEDEFAIDRIN SMALL LETTER S 849 '', U+16E5B, MEDEFAIDRIN CAPITAL LETTER N 850 '', U+16E6F, MEDEFAIDRIN SMALL LETTER E 851 `mlym` 'ഠ', U+0D20, MALAYALAM LETTER TTHA 852 'റ', U+0D31, MALAYALAM LETTER RRA 853 `mong` '\Mongolian{}ᡂ\mongolian{}', U+1842, MONGOLIAN LETTER CHI 854 '\Mongolian{}ᠪ\mongolian{}', U+182A, MONGOLIAN LETTER BA 855 `mymr` 'ဝ', U+101D, MYANMAR LETTER WA 856 'င', U+1004, MYANMAR LETTER NGA 857 'ဂ', U+1002, MYANMAR LETTER GA 858 `nkoo` 'ߋ', U+07CB, NKO LETTER EE 859 '߀', U+07C0, NKO DIGIT ZERO 860 `olck` 'ᱛ', U+1C5B, OL CHIKI LETTER AT 861 `orkh` '', U+10C17, OLD TURKIC LETTER YENISEI AY 862 `osge` '', U+104C2, OSAGE CAPITAL LETTER O 863 '', U+104EA, OSAGE SMALL LETTER O 864 `osma` '', U+10486, OSMANYA LETTER DEEL 865 '', U+104A0, OSMANYA DIGIT ZERO 866 `rohg` '', HANIFI ROHINGYA DIGIT ZERO 867 `saur` 'ꢝ', U+A89D, SAURASHTRA LETTER TTHA 868 '꣐', U+A8D0, SAURASHTRA DIGIT ZERO 869 `shaw` '', U+10474, SHAVIAN LETTER OAK 870 `sinh` 'ට', U+0DA7, SINHALA LETTER ALPAPRAANA TTAYANNA 871 `sund` '᮰', U+1BB0, SUNDANESE DIGIT ZERO 872 `taml` '௦', U+0BE6, TAMIL DIGIT ZERO 873 `tavt` 'ꪒ', U+AA92, TAI VIET LETTER LOW DO 874 'ꪫ', U+AAAB, TAI VIET LETTER HIGH VO 875 `telu` '౦', U+0C66, TELUGU DIGIT ZERO 876 '౧', U+0C67, TELUGU DIGIT ONE 877 `tfng` 'ⵔ', U+2D54, TIFINAGH LETTER YAR 878 `thai` 'า', U+0E32, THAI CHARACTER SARA AA 879 'ๅ', U+0E45, THAI CHARACTER LAKKHANGYAO 880 '๐', U+0E50, THAI DIGIT ZERO 881 `vaii` 'ꘓ', U+A613, VAI SYMBOL FEENG 882 'ꖜ', U+A59C, VAI SYLLABLE BHU 883 'ꖴ', U+A5B4, VAI SYLLABLE KU 884 `yezi` '', U+10E8B, YEZIDI LETTER DAL 885 '', U+10EA6, YEZIDI LETTER EW 886 887 888Table: standard characters of the 'latin' writing system, special scripts 889 890 Script Standard characters 891 ---------- --------------------- 892 `khms` '᧡', U+19E1, KHMER SYMBOL MUOY KOET 893 '᧪', U+19EA, KHMER SYMBOL DAP KOET 894 `latb` '\Latin{}ₒ\latin{}', U+2092, LATIN SUBSCRIPT SMALL LETTER O 895 '\Latin{}₀\latin{}', U+2080, SUBSCRIPT ZERO 896 `latp` '\Latin{}ᵒ\latin{}', U+1D52, MODIFIER LETTER SMALL O 897 '\Latin{}ᴼ\latin{}', U+1D3C, MODIFIER LETTER CAPITAL O 898 '\Latin{}⁰\latin{}', U+2070, SUPERSCRIPT ZERO 899 900 901 * Glyph Analysis 902 903 This is a per-glyph operation. 904 905 + Find segments and edges. 906 907 + Link edges to set up stems and serifs. The abovementioned paper 908 gives more details on what exactly constitutes a stem or a serif and 909 how the algorithm works. 910 911 912Blue Zones 913---------- 914 915![Two blue zones relevant to the glyph 'a'. Vertical point coordinates of 916 *all* glyphs within these zones are aligned, provided the blue zone is 917 active (this is, its vertical size is smaller than 918 3/4\ pixels).](img/blue-zones) 919 920Outlines of certain characters are used to determine *blue zones*. This 921concept is the same as with Type\ 1 fonts: All glyph points that lie in 922certain small horizontal zones get aligned vertically. 923 924The tables below show the blue zone characters of all available scripts of 925the latin writing system; the values are hard-coded in the source code. 926Since the auto-hinter takes mean values it is not necessary that all 927characters of a zone are present. 928 929'Round' characters in blue zones (e.g., the top and bottom of 'O' or the 930bottom of 'g') are used to control overshoot handling. 931 932Blue zones marked with an asterisk are x\ height blue zones, which are 933adjusted to be on the pixel grid (to improve rendering at small sizes) by 934scaling the remaining blue zones before they are adjusted to the grid. See 935also option [`--increase-x-height`](#x-height-increase-limit). 936 937 938Table: `adlm` (Adlam) blue zones 939 940 ID Blue zone Characters 941 ---- ----------- ------------ 942 1 top of capital letters 943 2 bottom of capital letters 944 3* top of small letters 945 4 bottom of small letters 946 947 948Table: `arab` (Arabic) blue zones 949 950 ID Blue zone Characters 951 ---- ----------- ------------ 952 1 top of letters with vertical stroke ا إ ل ك ط ظ 953 2 bottom of letters ت ث ط ظ ك 954 3 glyph joining ـ 955 956 957Table: `armn` (Armenian) blue zones 958 959 ID Blue zone Characters 960 ---- ----------- ------------ 961 1 top of capital letters Ա Մ Ւ Փ Բ Գ Դ Օ 962 2 bottom of capital letters Ւ Ո Փ Ճ Շ Ս Տ Օ 963 3 top of ascenders of small letters ե է ի մ վ փ ֆ փ 964 4* top of small letters ա յ ւ ս գ ջ ր օ 965 5 bottom of small letters հ ո ճ ա ե ծ ս օ 966 6 bottom of descenders of small letters բ ը ի լ ղ պ փ ց 967 968 969Table: `avst` (Avestan) blue zones 970 971 ID Blue zone Characters 972 ---- ----------- ------------ 973 1 top of letters 974 2 bottom of letters 975 976 977Table: `bamu` (Bamum) blue zones 978 979 ID Blue zone Characters 980 ---- ----------- ------------ 981 1 top of letters ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ 982 2 bottom of letters ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲ 983 984 985Table: `beng` (Bengali) blue zones 986 987 ID Blue zone Characters 988 ---- ----------- ------------ 989 1 baseline (flat glyphs only) অ ড ত ন ব ভ ল ক 990 2 top of ascenders ই ট ঠ ি ী ৈ ৗ 991 3* top of baseline ও এ ড ত ন ব ল ক 992 4 bottom of base characters অ ড ত ন ব ভ ল ক 993 994Contrary to scripts like latin, the baseline in Bengali is on the top, and 995we hint from top to bottom. 996 997 998Table: `buhd` (Buhid) blue zones 999 1000 ID Blue zone Characters 1001 ---- ----------- ------------ 1002 1 top of letters ᝐ ᝈ 1003 2 top of large letters ᝅ ᝊ ᝎ 1004 3* top of small letters ᝂ ᝃ ᝉ ᝌ 1005 4 bottom of letters ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ 1006 1007 1008Table: `cakm` (Chakma) blue zones 1009 1010 ID Blue zone Characters 1011 ---- ----------- ------------ 1012 1 top of letters 1013 2 bottom of letters 1014 3 bottom of descenders of letters 1015 1016 1017Table: `cans` (Canadian Syllabics) blue zones 1018 1019 ID Blue zone Characters 1020 ---- ----------- ------------ 1021 1 top of letters ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ 1022 2 bottom of letters ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ 1023 3* top of small letters ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ 1024 4 bottom of small letters ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ 1025 5 top of superscript letters ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ 1026 6 bottom of superscript letters ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ 1027 1028 1029Table: `cari` (Carian) blue zones 1030 1031 ID Blue zone Characters 1032 ---- ----------- ------------ 1033 1 top of letters 1034 2 bottom of letters 1035 1036 1037Table: `cher` (Cherokee) blue zones 1038 1039 ID Blue zone Characters 1040 ---- ----------- ------------ 1041 1 top of capital letters Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ 1042 2 bottom of capital letters Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ 1043 3 top of ascenders of small letters ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ 1044 4* top of small letters ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ 1045 5 bottom of small letters ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ 1046 6 bottom of descenders of small letters ᏸ ꮐ ꭹ ꭻ 1047 1048 1049Table: `copt` (Coptic) blue zones 1050 1051 ID Blue zone Characters 1052 ---- ----------- ------------ 1053 1 top of capital letters Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ 1054 2 bottom of capital letters Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ 1055 3* top of small letters ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ 1056 4 bottom of small letters ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ 1057 1058 1059Table: `cprt` (Cypriot) blue zones 1060 1061 ID Blue zone Characters 1062 ---- ----------- ------------ 1063 1 top of letters 1064 2 bottom of letters 1065 3 top of small letters 1066 4 bottom of small letters 1067 1068 1069Table: `cyrl` (Cyrillic) blue zones 1070 1071 ID Blue zone Characters 1072 ---- ----------- ------------ 1073 1 top of capital letters \Cyrillic{}Б В Е П З О С Э\cyrillic{} 1074 2 bottom of capital letters \Cyrillic{}Б В Е Ш З О С Э\cyrillic{} 1075 3* top of small letters \Cyrillic{}х п н ш е з о с\cyrillic{} 1076 4 bottom of small letters \Cyrillic{}х п н ш е з о с\cyrillic{} 1077 5 bottom of descenders of small letters \Cyrillic{}р у ф\cyrillic{} 1078 1079 1080Table: `deva` (Devanagari) blue zones 1081 1082 ID Blue zone Characters 1083 ---- ----------- ------------ 1084 1 top of ascenders ई ऐ ओ औ ि ी ो ौ 1085 2 top of baseline क म अ आ थ ध भ श 1086 3* top of baseline (flat glyphs only) क न म उ छ ट ठ ड 1087 4 bottom of base characters क न म उ छ ट ठ ड 1088 5 bottom of descenders ु ृ 1089 1090Contrary to scripts like latin, the baseline in Devanagari is on the top, 1091and we hint from top to bottom. Note that some fonts have extreme variation 1092in the height of the round elements in Zone\ 3; for this reason we also 1093define Zone\ 1, which must be always present. 1094 1095 1096Table: `dsrt` (Deseret) blue zones 1097 1098 ID Blue zone Characters 1099 ---- ----------- ------------ 1100 1 top of capital letters 1101 2 bottom of capital letters 1102 3* top of small letters 1103 4 bottom of small letters 1104 1105 1106Table: `ethi` (Ethiopian) blue zones 1107 1108 ID Blue zone Characters 1109 ---- ----------- ------------ 1110 1 top of letters ሀ ሃ ዘ ፐ ማ በ ዋ ዐ 1111 2 bottom of letters ለ ሐ በ ዘ ሀ ሪ ዐ ጨ 1112 1113 1114Table: `geok` (Georgian Khutsuri) blue zones 1115 1116 ID Blue zone Characters 1117 ---- ----------- ------------ 1118 1 top of Asomtavruli letters Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ 1119 2 bottom of Asomtavruli letters Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ 1120 3* top of Nuskhuri letters ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ 1121 4 bottom of Nuskhuri letters ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ 1122 5 top of ascender Nuskhuri letters ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ 1123 6 bottom of Nuskhuri descender letters ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ 1124 1125Georgian Asomtavruli and Nuskhuri form the old ecclesiastical script, 1126Khutsuri. Note that fonts show a great variation in height and depth of 1127ascender and descender letter forms. 1128 1129 1130Table: `geor` (Georgian Mkhedruli) blue zones 1131 1132 ID Blue zone Characters 1133 ---- ----------- ------------ 1134 1* top of Mkhedruli letters გ დ ე ვ თ ი ო ღ 1135 2 bottom of Mkhedruli letters ა ზ მ ს შ ძ ხ ჰ 1136 3 top of ascender Mkhedruli letters ს ხ ქ ზ მ შ ჩ წ 1137 4 bottom of descender Mkhedruli letters ე ვ ჟ ტ უ ფ ქ ყ 1138 5 top of ascender Mtavruli letters Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ 1139 6 bottom of descender Mtavruli letters Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ 1140 1141 1142Table: `glag` (Glagolitic) blue zones 1143 1144 ID Blue zone Characters 1145 ---- ----------- ------------ 1146 1 top of capital letters Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ 1147 2 bottom of capital letters Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ 1148 3* top of small letters ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ 1149 4 bottom of small letters ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ 1150 1151 1152Table: `goth` (Gothic) blue zones 1153 1154 ID Blue zone Characters 1155 ---- ----------- ------------ 1156 1 top of letters 1157 2 bottom of letters 1158 1159 1160Table: `grek` (Greek) blue zones 1161 1162 ID Blue zone Characters 1163 ---- ----------- ------------ 1164 1 top of capital letters \Greek{}Γ Β Ε Ζ Θ Ο Ω\greek{} 1165 2 bottom of capital letters \Greek{}Β Δ Ζ Ξ Θ Ο\greek{} 1166 3 top of 'small beta' like letters \Greek{}β θ δ ζ λ ξ\greek{} 1167 4* top of small letters \Greek{}α ε ι ο π σ τ ω\greek{} 1168 5 bottom of small letters \Greek{}α ε ι ο π σ τ ω\greek{} 1169 6 bottom of descenders of small letters \Greek{}β γ η μ ρ φ χ ψ\greek{} 1170 1171 1172Table: `gujr` (Gujarati) blue zones 1173 1174 ID Blue zone Characters 1175 ---- ----------- ------------ 1176 1* top of letters ત ન ઋ ઌ છ ટ ર ૦ 1177 2 bottom of letters ખ ગ ઘ ઞ ઇ ઈ ઠ જ 1178 3 top of ascenders ઈ ઊ િ ી લી શ્ચિ જિ સી 1179 4 bottom of descenders ુ ૃ ૄ ખુ છૃ છૄ 1180 5 top of Gujarati digits ૦ ૧ ૨ ૩ ૭ 1181 1182 1183Table: `guru` (Gurmukhi) blue zones 1184 1185 ID Blue zone Characters 1186 ---- ----------- ------------ 1187 1 top of ascenders ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ 1188 2 top of baseline ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ 1189 3* top of baseline (flat glyphs only) ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ 1190 4 bottom of characters ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ 1191 5 top of Gurmukhi digits ੦ ੧ ੨ ੩ ੭ 1192 1193 1194Table: `hebr` (Hebrew) blue zones 1195 1196 ID Blue zone Characters 1197 ---- ----------- ------------ 1198 1 top of letters ב ד ה ח ך כ ם ס 1199 2 bottom of letters ב ט כ ם ס צ 1200 3 bottom of descenders of letters ק ך ן ף ץ 1201 1202 1203Table: `hmnp` (Nyiakeng Puachue Hmong) blue zones 1204 1205 ID Blue zone Characters 1206 ---- ----------- ------------ 1207 1 top of letters 1208 2 bottom of letters 1209 1210 1211Table: `kali` (Kayah Li) blue zones 1212 1213 ID Blue zone Characters 1214 ---- ----------- ------------ 1215 1* top of letters ꤅ ꤏ ꤁ ꤋ ꤀ ꤍ 1216 2 bottom of letters ꤈ ꤘ ꤀ ꤍ ꤢ 1217 3 top of ascending letters ꤖ ꤡ 1218 4 bottom of descending letters ꤑ ꤜ ꤞ 1219 5 bottom of large descending letters ꤑ꤬ ꤜ꤭ ꤔ꤬ 1220 1221 1222Table: `khmr` (Khmer) blue zones 1223 1224 ID Blue zone Characters 1225 ---- ----------- ------------ 1226 1* top of letters ខ ទ ន ឧ ឩ ា 1227 2 top of subscript cluster components ក្ក ក្ខ ក្គ ក្ថ 1228 3 bottom of letters ខ ឃ ច ឋ ប ម យ ឲ 1229 4 bottom of descenders ត្រ រៀ ឲ្យ អឿ 1230 5 bottom of large descenders ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ 1231 1232 1233Table: `khms` (Khmer Symbols) blue zones 1234 1235 ID Blue zone Characters 1236 ---- ----------- ------------ 1237 1* top of symbols for waxing ᧠ ᧡ 1238 2 bottom of symbols for waning ᧶ ᧹ 1239 1240Khmer symbols are used for lunar dates. 1241 1242 1243Table: `knda` (Kannada) blue zones 1244 1245 ID Blue zone Characters 1246 ---- ----------- ------------ 1247 1 top of letters ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ 1248 2 bottom of letters ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭ 1249 1250 1251Table: `lao` (Lao) blue zones 1252 1253 ID Blue zone Characters 1254 ---- ----------- ------------ 1255 1* top of letters າ ດ ອ ມ ລ ວ ຣ ງ 1256 2 bottom of letters າ ອ ບ ຍ ຣ ຮ ວ ຢ 1257 3 top of ascenders ປ ຢ ຟ ຝ 1258 4 top of large ascenders ໂ ໄ ໃ 1259 5 bottom of descenders ງ ຊ ຖ ຽ ໆ ຯ 1260 1261 1262Table: `latb` (Latin Subscripts) blue zones 1263 1264 ID Blue zone Characters 1265 ---- ----------- ------------ 1266 1 top of capital characters \Latin{}₀ ₃ ₅ ₇ ₈\latin{} 1267 2 bottom of capital characters \Latin{}₀ ₁ ₂ ₃ ₈\latin{} 1268 3 top of 'small f' like characters \Latin{}ᵢ ⱼ ₕ ₖ ₗ\latin{} 1269 4* top of small characters \Latin{}ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ\latin{} 1270 5 bottom of small characters \Latin{}ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ\latin{} 1271 6 bottom of descenders of small characters \Latin{}ᵦ ᵧ ᵨ ᵩ ₚ\latin{} 1272 1273Subscript latin characters are similar to normal latin characters. 1274 1275 1276Table: `latn` (Latin) blue zones 1277 1278 ID Blue zone Characters 1279 ---- ----------- ------------ 1280 1 top of capital letters \Latin{}T H E Z O C Q S\latin{} 1281 2 bottom of capital letters \Latin{}H E Z L O C U S\latin{} 1282 3 top of 'small f' like letters \Latin{}f i j k d b h\latin{} 1283 4* top of small letters \Latin{}u v x z o e s c\latin{} 1284 5 bottom of small letters \Latin{}n r x z o e s c\latin{} 1285 6 bottom of descenders of small letters \Latin{}p q g j y\latin{} 1286 1287 1288Table: `latp` (Latin Superscripts) blue zones 1289 1290 ID Blue zone Characters 1291 ---- ----------- ------------ 1292 1 top of capital characters \Latin{}⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ\latin{} 1293 2 bottom of capital characters \Latin{}⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ\latin{} 1294 3 top of 'small f' like characters \Latin{}ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ\latin{} 1295 4* top of small characters \Latin{}ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ\latin{} 1296 5 bottom of small characters \Latin{}ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ\latin{} 1297 6 bottom of descenders of small characters \Latin{}ᵖ ʸ ᵍ\latin{} 1298 1299Superscript latin characters are similar to normal latin characters. 1300 1301 1302Table: `lisu` (Lisu) blue zones 1303 1304 ID Blue zone Characters 1305 ---- ----------- ------------ 1306 1 top of letters ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ 1307 2 bottom of letters ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ 1308 1309 1310Table: `medf` (Medefaidrin) blue zones 1311 1312 ID Blue zone Characters 1313 ---- ----------- ------------ 1314 1 top of capital letters 1315 2 bottom of capital letters 1316 3 top of ascenders of small letters 1317 4* top of small letters 1318 5 bottom of small letters 1319 6 bottom of descenders of small letters 1320 7 top of Medefaidrin digits 1321 1322 1323Table: `mlym` (Malayalam) blue zones 1324 1325 ID Blue zone Characters 1326 ---- ----------- ------------ 1327 1 top of letters ഒ ട ഠ റ ച പ ച്ച പ്പ 1328 2 bottom of letters ട ഠ ധ ശ ഘ ച ഥ ല 1329 1330 1331Table: `mong` (Mongolian) blue zones 1332 1333 ID Blue zone Characters 1334 ---- ----------- ------------ 1335 1 top of base stem \Mongolian{}ᠳ ᠴ ᠶ ᠽ ᡂ ᡊ ᡡ ᡳ\mongolian{} 1336 2 bottom of base stem \Mongolian{}ᡃ\mongolian{} 1337 1338 1339Table: `mymr` (Myanmar) blue zones 1340 1341 ID Blue zone Characters 1342 ---- ----------- ------------ 1343 1* top of letters ခ ဂ င ဒ ဝ ၥ ၊ ။ 1344 2 bottom of letters င ဎ ဒ ပ ဗ ဝ ၊ ။ 1345 3 top of ascenders of characters ဩ ြ ၍ ၏ ၆ ါ ိ 1346 3 bottom of descenders of letters ဉ ည ဥ ဩ ဨ ၂ ၅ ၉ 1347 1348 1349Table: `nkoo` (N'Ko) blue zones 1350 1351 ID Blue zone Characters 1352 ---- ----------- ------------ 1353 1 top of letters ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ 1354 2 bottom of letters ߀ ߘ ߡ ߠ ߥ 1355 3* top of small letters ߏ ߛ ߋ 1356 4 bottom of small letters ߎ ߏ ߛ ߋ 1357 1358 1359Table: `olck` (Ol Chiki) blue zones 1360 1361 ID Blue zone Characters 1362 ---- ----------- ------------ 1363 1 top of letters ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ 1364 2 bottom of letters ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ 1365 1366 1367Table: `orkh` (Old Turkic) blue zones 1368 1369 ID Blue zone Characters 1370 ---- ----------- ------------ 1371 1 top of letters 1372 2 bottom of letters 1373 1374 1375Table: `osge` (Osage) blue zones 1376 1377 ID Blue zone Characters 1378 ---- ----------- ------------ 1379 1 top of capital letters 1380 2 bottom of capital letters 1381 3 bottom of descenders of capital letters 1382 4* top of small letters 1383 5 bottom of small letters 1384 6 top of ascenders of small letters 1385 7 bottom of descenders of small letters 1386 1387 1388Table: `osma` (Osmanya) blue zones 1389 1390 ID Blue zone Characters 1391 ---- ----------- ------------ 1392 1 top of letters 1393 2 bottom of letters 1394 1395 1396Table: `rohg` (Hanifi Rohingya) blue zones 1397 1398 ID Blue zone Characters 1399 ---- ----------- ------------ 1400 1 top of letters with vertical stroke 1401 2 bottom of letters 1402 3 glyph joining ـ 1403 1404 1405Table: `saur` (Saurashtra) blue zones 1406 1407 ID Blue zone Characters 1408 ---- ----------- ------------ 1409 1 top of letters ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ 1410 2 bottom of letters ꢂ ꢨ ꢺ ꢤ ꢎ 1411 1412 1413Table: `shaw` (Shavian) blue zones 1414 1415 ID Blue zone Characters 1416 ---- ----------- ------------ 1417 1 top of letters 1418 2 bottom of letters 1419 3 bottom of descenders of letters 1420 4* top of small letters 1421 5 bottom of small letters 1422 1423 1424Table: `sinh` (Sinhala) blue zones 1425 1426 ID Blue zone Characters 1427 ---- ----------- ------------ 1428 1 top of letters ඉ ක ඝ ඳ ප ය ල ෆ 1429 2 bottom of letters එ ඔ ඝ ජ ට ථ ධ ර 1430 3 bottom of descenders of letters ද ඳ උ ල තූ තු බු දු 1431 1432 1433Table: `sund` (Sundanese) blue zones 1434 1435 ID Blue zone Characters 1436 ---- ----------- ------------ 1437 1 top of letters ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ 1438 2 bottom of letters ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ 1439 3 bottom of descenders of letters ᮼ ᳄ 1440 1441 1442Table: `taml` (Tamil) blue zones 1443 1444 ID Blue zone Characters 1445 ---- ----------- ------------ 1446 1 top of letters உ ஒ ஓ ற ஈ க ங ச 1447 2 bottom of letters க ச ல ஶ உ ங ட ப 1448 1449 1450Table: `tavt` (Tai Viet) blue zones 1451 1452 ID Blue zone Characters 1453 ---- ----------- ------------ 1454 1 top of letters ꪆ ꪔ ꪒ ꪖ ꪫ 1455 2 bottom of letters ꪉ ꪫ ꪮ 1456 1457 1458Table: `telu` (Telugu) blue zones 1459 1460 ID Blue zone Characters 1461 ---- ----------- ------------ 1462 1 top of letters ఇ ఌ ఙ ఞ ణ ఱ ౯ 1463 2 bottom of letters అ క చ ర ఽ ౨ ౬ 1464 1465 1466Table: `tfng` (Tifinagh) blue zones 1467 1468 ID Blue zone Characters 1469 ---- ----------- ------------ 1470 1 top of letters ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ 1471 2 bottom of letters ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ 1472 1473 1474Table: `thai` (Thai) blue zones 1475 1476 ID Blue zone Characters 1477 ---- ----------- ------------ 1478 1* top of letters บ เ แ อ ก า 1479 2 bottom of letters บ ป ษ ฯ อ ย ฮ 1480 3 top of ascenders of letters ป ฝ ฟ 1481 4 top of large ascenders of letters โ ใ ไ 1482 5 bottom of descenders of letters ฎ ฏ ฤ ฦ 1483 6 bottom of large descenders of letters ญ ฐ 1484 7 top of Thai digits ๐ ๑ ๓ 1485 1486 1487Table: `vaii` (Vai) blue zones 1488 1489 ID Blue zone Characters 1490 ---- ----------- ------------ 1491 1 top of letters ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ 1492 2 bottom of letters ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ 1493 1494 1495Table: `yezi` (Yezidi) blue zones 1496 1497 ID Blue zone Characters 1498 ---- ----------- ------------ 1499 1* top of letters 1500 2 bottom of letters 1501 3 top of ascenders of letters 1502 4 bottom of descenders of letters 1503 1504 1505![This image shows the relevant glyph terms for vertical blue zone 1506 positions.](img/glyph-terms) 1507 1508 1509Grid Fitting 1510------------ 1511 1512Aligning outlines along the grid lines is called *grid fitting*. It doesn't 1513necessarily mean that the outlines are positioned *exactly* on the grid, 1514however, especially if you want a smooth appearance at different sizes. 1515This is the central routine of the auto-hinter; its actions are highly 1516dependent on the used writing system. Currently, only one writing system is 1517available (latin), providing support for scripts like Latin or Greek. 1518 1519 * Align edges linked to blue zones. 1520 1521 * Fit edges to the pixel grid. 1522 1523 * Align serif edges. 1524 1525 * Handle remaining 'strong' points. Such points are not part of an edge 1526 but are still important for defining the shape. This roughly 1527 corresponds to the `IP` TrueType instruction. 1528 1529 * Everything else (the 'weak' points) is handled with an 'IUP' 1530 instruction. 1531 1532The following images illustrate the hinting process, using glyph 'a' from 1533the freely available font '[Ubuntu Book](https://design.ubuntu.com/font/)'. The 1534manual hints were added by [Dalton Maag Ltd], the used application to create 1535the hinting debug snapshots was [FontForge]. 1536 1537![Before hinting.](img/a-before-hinting.png) 1538 1539![After hinting, using manual hints.](img/a-after-hinting.png) 1540 1541![After hinting, using ttfautohint. Note that the hinting process 1542 doesn't change horizontal positions.](img/a-after-autohinting.png) 1543 1544 1545Hint Sets 1546--------- 1547 1548In ttfautohint terminology, a *hint set* is the *optimal* configuration for 1549a given PPEM (pixel per EM) value. 1550 1551In the range given by the `--hinting-range-min` and `--hinting-range-max` 1552options, ttfautohint creates hint sets for every PPEM value. For each 1553glyph, ttfautohint automatically determines whether a new set should be 1554emitted for a PPEM value if it finds that it differs from a previous one. 1555For some glyphs it is possible that one set covers, say, the range 15568px-1000px, while other glyphs need 10 or more such sets. 1557 1558In the PPEM range below `--hinting-range-min`, ttfautohint always uses just 1559one set, in the PPEM range between `--hinting-range-max` and 1560`--hinting-limit`, it also uses just one set. 1561 1562One of the hinting configuration parameters is the decision which segments 1563form an edge. For example, let us assume that two segments get aligned on a 1564single horizontal edge at 11px, while two edges are used at 12px. This 1565change makes ttfautohint emit a new hint set to accomodate this situation. 1566The next images illustrate this, using a Cyrillic letter (glyph 'afii10108') 1567from the 'Ubuntu book' font, processed with ttfautohint. 1568 1569![Before hinting, size 11px.](img/afii10108-11px-before-hinting.png) 1570 1571![After hinting, size 11px. Segments 43-27-28 and 14-15 are aligned on a 1572 single edge, as are segments 26-0-1 and 1573 20-21.](img/afii10108-11px-after-hinting.png) 1574 1575![Before hinting, size 12px.](img/afii10108-12px-before-hinting.png) 1576 1577![After hinting, size 12px. The segments are not aligned. While 1578 segments 43-27-28 and 20-21 now have almost the same horizontal position, 1579 they don't form an edge because the outlines passing through the segments 1580 point into different directions.](img/afii10108-12px-after-hinting.png) 1581 1582Obviously, the more hint sets get emitted, the larger the bytecode 1583ttfautohint adds to the output font. To find a good value\ *n* for 1584`--hinting-range-max`, some experimentation is necessary since *n* depends 1585on the glyph shapes in the input font. If the value is too low, the hint 1586set created for the PPEM value\ *n* (this hint set gets used for all larger 1587PPEM values) might distort the outlines too much in the PPEM range given 1588by\ *n* and the value set by `--hinting-limit` (at which hinting gets 1589switched off). If the value is too high, the font size increases due to 1590more hint sets without any noticeable hinting effects. 1591 1592Similar arguments hold for `--hinting-range-min` except that there is no 1593lower limit at which hinting is switched off. 1594 1595An example. Let's assume that we have a hinting range 10\ <= ppem <=\ 100, 1596and the hinting limit is set to 250. For a given glyph, ttfautohint finds 1597out that four hint sets must be computed to exactly cover this hinting 1598range: 10-15, 16-40, 41-80, and 81-100. For PPEM values below 10ppem, the 1599hint set covering 10-15ppem is used, for PPEM values larger than 100 the 1600hint set covering 81-100ppem is used. For PPEM values larger than 250, no 1601hinting gets applied. 1602 1603 1604Composite Glyphs 1605---------------- 1606 1607The ttfautohint library (and programs) supports two solutions for handling 1608composite glyphs, to be controlled with option 1609[`--composites`](#hint-composites). This section contains some general 1610information, then covers the case where the option is off, while the next 1611section describes how ttfautohint behaves if this option is activated. 1612 1613Regardless of the `--composites` option, ttfautohint performs a scan over 1614all composite glyphs to assure that components of a composite glyph inherit 1615its style, as described [later](#opentype-features). However, components 1616that are shifted vertically will be skipped. For example, if the glyph 1617'Agrave' uses a shifted 'grave' accent glyph, the accent is ignored. On the 1618other hand, if there is a glyph 'agrave' that uses the same 'grave' glyph 1619vertically unshifted, 'grave' does inherit the style. 1620 1621If `--composites` is off, components are hinted separately, then put 1622together. Separate hinting implies that the current style's blue zones are 1623applied to all subglyphs in its original, unshifted positions. In case you 1624want to shift components vertically, it is *mandatory* to set bit\ 2 1625(value\ 4), `ROUND_XY_TO_GRID`, in the flag variable of the composite glyph 1626description to get visually pleasing results, as the images below 1627demonstrate. 1628 1629![Here, the subscript glyphs are composites each having a single element 1630 that is shifted down. If option `--composites` is not used, subglyphs are 1631 hinted before they are glued together (possibly applying scaling and 1632 shifting). Because the `ROUND_XY_TO_GRID` flag isn't set, the vertical 1633 translation doesn't align the subglyph to the pixel grid, causing severe 1634 distortions.](img/composite-no-round-xy-to-grid.png) 1635 1636![The same as before, but with `ROUND_XY_TO_GRID` set. Now the subscript 1637 glyphs look identical to the 1638 superscripts.](img/composite-round-xy-to-grid.png) 1639 1640![For comparison purposes, here the result *with* option `--composites` (and 1641 no `ROUND_XY_TO_GRID`). The composite glyphs as a whole get hinted; 1642 consequently, the subscript glyphs get separate blue zones. At the 1643 displayed size of 16ppem the vertical positions of the subscript blue 1644 zones are rounded differently if compared to the superscript zones, thus 1645 the smaller glyph height.](img/composite-no-round-xy-to-grid-option-c.png) 1646 1647 1648The '\.ttfautohint' Glyph 1649------------------------- 1650 1651If option [`--composites`](#hint-composites) is used, ttfautohint doesn't 1652hint subglyphs of composite glyphs separately. Instead, it hints the whole 1653glyph, this is, composites get recursively expanded internally so that they 1654form simple glyphs, then hints are applied -- this is the normal working 1655mode of FreeType's auto-hinter. 1656 1657One problem, however, must be solved: Hinting for subglyphs (which usually 1658are used as normal glyphs also) must be deactivated so that nothing but the 1659final bytecode of the composite gets executed. 1660 1661The trick used by ttfautohint is to prepend a composite element called 1662'\.ttfautohint', a dummy glyph with a single point, and which has a single 1663job: Its bytecode increases a variable (to be more precise, it is a CVT 1664register called `cvtl_is_subglyph` in the source code), indicating that we 1665are within a composite glyph. The final bytecode of the composite glyph 1666eventually decrements this variable again. 1667 1668As an example, let's consider composite glyph 'Agrave' ('À'), which has the 1669subglyph 'A' as the base and 'grave' as its accent. After processing with 1670ttfautohint it consists of three components: '\.ttfautohint', 'A', and 1671'grave' (in this order). 1672 1673 Bytecode of Action 1674 ------------- -------- 1675 .ttfautohint increase `cvtl_is_subglyph` (now: 1) 1676 A do nothing because `cvtl_is_subglyph` > 0 1677 grave do nothing because `cvtl_is_subglyph` > 0 1678 Agrave decrease `cvtl_is_subglyph` (now: 0) 1679 apply hints because `cvtl_is_subglyph` == 0 1680 1681Some technical details (which you might skip): All glyph point indices get 1682adjusted since each '\.ttfautohint' subglyph shifts all following indices by 1683one. This must be done for both the bytecode and one subformat of 1684OpenType's `GPOS` anchor tables. 1685 1686While this approach works fine on all tested platforms, there is one single 1687drawback: Direct rendering of the '\.ttfautohint' subglyph (this is, 1688rendering as a stand-alone glyph) disables proper hinting of all glyphs in 1689the font! Under normal circumstances this never happens because 1690'\.ttfautohint' doesn't have an entry in the font's `cmap` table. (However, 1691some test and demo programs like FreeType's `ftview` application or other 1692glyph viewers that are able to bypass the `cmap` table might be affected.) 1693 1694 1695Writing Systems 1696--------------- 1697 1698In FreeType terminology, a writing system is a set of functions that 1699provides auto-hinting for certain scripts. Right now, only two writing 1700systems from FreeType's auto-hinter are available in ttfautohint: 'dummy' 1701and 'latin'. The former handles the 'no-script' case; details to 'latin' 1702follow in the next section. 1703 1704 1705Scripts 1706------- 1707 1708ttfautohint needs to know which script should be used to hint a specific 1709glyph. To do so, it checks a glyph's Unicode character code whether it 1710belongs to a given script. 1711 1712See '[Character Ranges](#character-ranges)' for a complete list of all 1713handled scripts and its ranges. This list is auto-generated from a source 1714code file, covering the 'latin' writing system. It also covers some 1715non-latin scripts (in the Unicode sense) that have similar typographical 1716properties. 1717 1718In ttfautohint, scripts are identified by four-character tags (if there are 1719less characters, spaces are appended). The value `none` indicates 'no 1720script'. 1721 1722Each script is represented by two tables to handle 'base' and 'non-base' 1723characters. For ttfautohint, a non-base character is something that should 1724not be affected by blue zones, regardless of whether this is a spacing or 1725no-spacing glyph. In other words, non-base characters are hinted using a 1726script's default stem width without applying blue zones. 1727 1728Right now, there are two pseudo-scripts that are used as fallbacks: `latb` 1729and `latp`, used for latin subscript and superscript characters, 1730respectively. Its main usage is support of phonetic alphabets like the IPA, 1731which intermix those characters with normal characters sitting on the 1732baseline, and which are not specially handled in corresponding OpenType 1733features like `sups`. 1734 1735If a glyph's character code is not covered by a script range, it is handled 1736by a *fallback script*. By default, the fallback script is `none`, which 1737indicates handling by the 'latin' writing system without applying 1738script-specific blue zones (but aligning stems to the grid if possible). 1739The fallback script can be changed; see option 1740[`--fallback-script`](#fallback-script). 1741 1742The user can also select whether uncovered glyphs are either hinted (which 1743is the default) or scaled only with the fallback script's scaling 1744parameters. This can be controlled with option 1745[`--fallback-scaling`](#fallback-script). Note that fallback scaling only 1746makes sense if the fallback script has x\ height blue zones, e.g., `cyrl` or 1747`latn`. 1748 1749As a special case, specifying `none` as a fallback script and switching on 1750fallback scaling ('`-f none -S`'), no hinting is applied at all to uncovered 1751glyphs – using `none` always implies a scaling factor of\ 1. 1752 1753 1754OpenType Features 1755----------------- 1756 1757(Please read the [OpenType specification] for details on *features*, `GSUB`, 1758and `GPOS` tables, and how they relate to scripts.) 1759 1760For modern OpenType fonts, character ranges are not sufficient to handle 1761scripts. 1762 1763 * Due to glyph substitution in the font (as specified in a font's `GSUB` 1764 table), which handles ligatures and similar typographic features, there 1765 is no longer a one-to-one mapping from an input Unicode character to a 1766 glyph index. Some ligatures, like 'fi', actually do have Unicode values 1767 for historical reasons, but most of them don't. While it is possible to 1768 map ligature glyphs into Unicode's Private Use Area (PUA), code values 1769 from this area are arbitrary by definition and thus unusable for 1770 ttfautohint. 1771 1772 * Some features like `sups` (for handling superscript) completely change 1773 the appearance and even vertical position of the affected glyphs. 1774 Obviously, the blue zones for 'normal' glyphs no longer fit, thus the 1775 auto-hinter puts them into a separate group (called *style* in FreeType 1776 speak), having its own set of blue zones. 1777 1778 1779Table: OpenType features handled specially by ttfautohint 1780 1781 Feature tag Description 1782 --------------- ------------- 1783 `c2cp` petite capitals from capitals 1784 `c2sc` small capitals from capitals 1785 `ordn` ordinals 1786 `pcap` petite capitals 1787 `sinf` scientific inferiors 1788 `smcp` small capitals 1789 `subs` subscript 1790 `sups` superscript 1791 `titl` titling 1792 1793 1794There are two conditions to get a valid style for a feature in a given 1795script. 1796 1797 1. One of the script's standard characters must be available in the 1798 feature. 1799 1800 2. The feature must provide characters to form at least one blue zone; see 1801 [above](#blue-zones). 1802 1803An additional complication is that features from the above table might use 1804data not only from the `GSUB` but also from the `GPOS` table, containing 1805information for glyph positioning. For example, the `sups` feature for 1806superscripts might use the same glyphs as the `subs` feature for subscripts, 1807simply moved up. ttfautohint skips such vertically shifted glyphs (except 1808for accessing standard characters) because glyph positioning happens after 1809hinting. Continuing our example, the `sups` feature wouldn't form a style, 1810contrary to `subs`, which holds the unshifted glyphs. 1811 1812The remaining OpenType features of a script are not handled specially; the 1813affected glyphs are simply hinted together with the 'normal' glyphs of the 1814script. 1815 1816Note that a font might still contain some features not covered yet: OpenType 1817has the concept of a *default script*; its data gets used for all scripts 1818that aren't explicitly handled in a font. By default, ttfautohint unifies 1819all affected glyphs from default script features with the `latn` script. 1820This can be changed with option [`--default-script`](#default-script), if 1821necessary. 1822 1823 1824ttfautohint uses the [HarfBuzz] library for handling OpenType features. 1825 1826 1827SFNT Tables 1828----------- 1829 1830ttfautohint touches almost all SFNT tables within a TrueType or OpenType 1831font. Note that only OpenType fonts with TrueType outlines are supported. 1832OpenType fonts with a `CFF` or `CFF2` table (this is, with PostScript 1833outlines) won't work. 1834 1835 * `glyf`: All hints in the table are replaced with new ones. If option 1836 [`--composites`](#hint-composites) is used, one glyph gets added (namely 1837 the '\.ttfautohint' glyph) and all composites get an additional 1838 component. 1839 1840 * `cvt`, `prep`, and `fpgm`: These tables get replaced with data 1841 necessary for the new hinting bytecode. 1842 1843 * `gasp`: Set up to always use grayscale rendering, for all sizes, with 1844 grid-fitting for standard hinting, and symmetric grid-fitting and 1845 symmetric smoothing for horizontal subpixel hinting (ClearType). 1846 1847 * `DSIG`: If it exists, it gets replaced with a dummy version. 1848 ttfautohint can't digitally sign a font; you have to do that afterwards. 1849 1850 * `name`: The 'version' entries are modified to add information about the 1851 parameters that have been used for calling ttfautohint. This can be 1852 controlled with the [`--no-info`](#ttfautohint-info) option. Family 1853 name entries might also be affected by option 1854 [`--family-suffix`](#family-suffix). 1855 1856 * `GPOS`, `hmtx`, `loca`, `head`, `maxp`, `post`: Updated to fit the 1857 additional '\.ttfautohint' glyph, the additional subglyphs in 1858 composites, and the new hinting bytecode. 1859 1860 * `LTSH`, `hdmx`: Since ttfautohint doesn't do any horizontal hinting, 1861 those tables are superfluous and thus removed. 1862 1863 * `VDMX`: Removed, since it depends on the original bytecode, which 1864 ttfautohint removes. A font editor might recompute the necessary data 1865 later on. 1866 1867 1868Problems 1869-------- 1870 1871### Interaction With FreeType 1872 1873Some versions of FreeType have an experimental extension for handling 1874subpixel hinting; it is off by default and can be activated by setting the 1875macro `TT_CONFIG_OPTION_SUBPIXEL_HINTING` to value\ 2 or\ 3 at compile time. 1876This code has been contributed mainly by [Infinality], being a subset of his 1877original patch. Many GNU/Linux distributions activate this code, or provide 1878packages to activate it. [Note that starting with FreeType version 2.7 the 1879Infinality extension is still available but superseded by a less aggressive 1880subpixel hinting mode, to which the explanations in this section don't 1881apply.] 1882 1883This extension changes the behaviour of many bytecode instructions to get 1884better rendering results. However, not all changes are global; some of them 1885are specific to certain fonts. For example, it contains font-specific 1886improvements for the '[DejaVu] Sans' font family. The list of affected 1887fonts is hard-coded; it can be found in FreeType's source code file 1888`ttsubpix.c`. 1889 1890If you are going to process such specially-handled fonts with ttfautohint, 1891serious rendering problems might show up. Since ttfautohint (intentionally) 1892doesn't change the font name in the `name` table, the Infinality extension 1893has no chance to recognize that the hints are different. All such problems 1894vanish if the font gets renamed in its `name` table (the name of the font 1895file itself doesn't matter), for example, by using option 1896[`--family-suffix`](#family-suffix). 1897 1898### Incorrect Unicode Character Map 1899 1900Fonts with an incorrect Unicode `cmap` table will not be properly hinted by 1901ttfautohint. Especially older fonts do cheat; for example, there exist 1902Hebrew fonts that map its glyphs to character codes 'A', 'B', etc., to make 1903them work with non-localized versions of Windows\ 98, say. 1904 1905Since ttfautohint needs to find both standard and blue zone characters, it 1906relies on correct Unicode values. If you want to handle such fonts, please 1907fix their `cmap` tables accordingly before running ttfautohint. 1908 1909### Irregular Glyph Heights 1910 1911The central concept of ttfautohint's hinting algorithm as discussed 1912[above](#segments-and-edges) is to identify horizontal segments at extremum 1913positions, especially for blue zones. If such a segment is missing, it 1914cannot be associated with a blue zone, possibly leading to irregular heights 1915for the particular glyph. 1916 1917Normally, a segment has a horizontal length of at least 20\ font units 1918(assuming 2048 units per EM)^[To be more precise, the sum of the height and 1919length of a segment must be at least 20 font units, and the height multiplied 1920by\ 14 must not exceed the length. Thus (19,1) is also a valid minimum 1921(length,height) pair, while (18,2) isn't. The value\ 20 is heuristic and 1922hard-coded, as is the value\ 14 (corresponding to a slope of approx. 19234.1°).]. Using a [Control Instructions File](#control-instructions-file), 1924however, it is possible to define additional segments at arbitrary points 1925that help overcome this restriction, making it possible to fix (most of) 1926such problems. 1927 1928### Diagonals 1929 1930ttfautohint doesn't handle diagonal lines specially. For thin outlines, 1931this might lead to strokes that look too thick at smaller sizes. A font 1932designer might compensate this to a certain amount by slightly reducing the 1933stroke width of diagonal lines. However, in many cases the sub-optimal 1934appearance of a stroke with borders that don't exactly fit the pixel grid is 1935not the outline itself but an incorrect gamma value of the monitor: People 1936tend to not properly adjust it, and the default values of most operating 1937systems are too low, causing too much darkening of such strokes. It is thus 1938of vital importance to compare ttfautohint's results with similar fonts to 1939exclude any systematic effect not related to the outlines themselves. 1940 1941 1942Extending ttfautohint with new scripts 1943-------------------------------------- 1944 1945Right now, adding new scripts to ttfautohint only works on the source code 1946level, this is, you have to patch the C\ source code. 1947 1948The process itself isn't very complicated; it is demonstrated best by 1949example. The following commits in ttfautohint add Ethiopian and Armenian, 1950respectively. 1951 1952| [https://repo.or.cz/ttfautohint.git/commitdiff/d14c7c07](https://repo.or.cz/ttfautohint.git/commitdiff/d14c7c07) 1953| [https://repo.or.cz/ttfautohint.git/commitdiff/b5022cd9](https://repo.or.cz/ttfautohint.git/commitdiff/b5022cd9) 1954 1955It shows that you have to do the following steps. 1956 1957 * Add blue zone character data to the file `lib/tablue.dat`. 1958 1959 * Add the proper Unicode ranges to `lib/taranges.c`, following the 1960 structure of similar entries. 1961 1962 * Similarly, the files `lib/tastyles.h` and `lib/ttfautohint-script.h` 1963 must be updated. The latter holds the information on the used default 1964 character or characters; it also references the corresponding script tag 1965 `HB_SCRIPT_XXX` as used by the HarfBuzz library. 1966 1967If there are any questions, please contact the [FreeType mailing 1968list](https://lists.nongnu.org/mailman/listinfo/freetype) for help. Note 1969that the script data in ttfautohint are hold in sync with FreeType's 1970auto-hinter. 1971 1972 1973Control Instructions 1974==================== 1975 1976An entry in a control instructions file has various syntax forms, which are 1977discussed here. Brackets indicate optional elements. 1978 1979 1980Common Syntax Elements 1981---------------------- 1982 1983*font‑idx* gives the index of the font in a TrueType Collection, starting 1984with value\ 0. If missing, it is set to zero. For normal TrueType fonts, 1985only value zero is valid. A font index can be specified in decimal, octal, 1986or hexadecimal format, the latter two indicated by the prefixes `0` and 1987`0x`, respectively. 1988 1989*glyph‑id* is either a glyph's name as listed in the font's `post` SFNT 1990table or a glyph index. A glyph name consists of characters from the set 1991'`A-Za-z0-9._`' only and does not start with a digit or period, with the 1992exceptions of the names '`.notdef`' and '`.null`'. A glyph index starts 1993with value\ 0 can be specified in decimal, octal, or hexadecimal format, the 1994latter two indicated by the prefixes `0` and `0x`, respectively. Glyph 1995names are internally converted to glyph indices. 1996 1997*points* are number ranges, see '[x Height Snapping 1998Exceptions](#x-height-snapping-exceptions)' for the syntax. 1999 2000Similar to the Bourne shell (`sh` or `bash`), a comment starts with 2001character '`#`'; the rest of the line is ignored. An empty line is ignored 2002also. Both the newline character and '`;`' can be used as a separator 2003between exception entries. A trailing '`\`' at the end of a line continues 2004the current line on the next one. 2005 2006A control instructions file is parsed line by line; later entries override 2007earlier entries (in case there is something to override). 2008 2009 2010Style Adjustments 2011----------------- 2012 2013This syntax form makes it possible to override the style assignment 2014algorithm of ttfautohint; see '[Scripts](#scripts)' and '[OpenType 2015Features](#opentype-features)' for more details. 2016 2017> *\[*\ font-idx\ *\]*\ \ script\ \ feature\ \ *`@`*\ \ glyph-ids 2018 2019*script* is a four-letter name^[The notable exception is the tag 'lao', 2020which originally has a trailing space as the fourth character. However, 2021ttfautohint ignores the space.] of one of the scripts supported by 2022ttfautohint. *feature* is one of the four-letter names of features 2023supported by ttfautohint. 2024 2025The elements of *glyph-ids* are a list of comma separated *glyph-id* values 2026or value ranges. Note that is not necessary that elements are specified in 2027increasing order. 2028 2029Assuming that a font contains superscript digits 'zero.sups' to 'nine.sups' 2030together with the glyphs 'a.sups' and 'o.sups', use a line 2031 2032``` 2033 cyrl sups @ zero.sups-nine.sups, a.sups, o.sups 2034``` 2035 2036to add those glyphs to the style handling Cyrillic superscript glyphs. 2037However, it is still necessary that the selected script contains proper 2038[Blue Zone characters](#blue-zones), otherwise those glyphs aren't handled 2039at all. 2040 2041Use the `--debug` command line option to see how ttfautohint assigns glyph 2042indices of a font to styles. 2043 2044 2045Stem Width Adjustments 2046---------------------- 2047 2048Use the following syntax form to adjust stem width values for a given style, 2049overriding ttfautohint's algorithm; see '[Scripts](#scripts)' and '[OpenType 2050Features](#opentype-features)' for more details. This adjustment doesn't 2051change the glyph shapes; it only influences the hinting process. 2052 2053> *\[*\ font-idx\ *\]*\ \ script\ \ feature\ \ *`w[idth]`*\ \ stem-widths 2054 2055*script* and *feature* are the same as with style adjustments; see above. 2056However, *script* can additionally be the wildcard character '`*`', which 2057indicates 'any script'. Parameter `width` can be abbreviated as '`w`'. 2058 2059*stem-widths* is an unsorted list of comma separated integer stem width 2060values (in font units); the first value gives the style's default stem 2061width. 2062 2063The effect of this adjustment depends [on the selected stem width 2064algorithm](#stem-width-and-positioning-mode). For smooth stem width 2065positioning, only the first (i.e., the default) value is used; it gets a 2066higher preference than other discrete stem width choices. For strong stem 2067width positioning, the stem widths are snapped to the provided values (if 2068not differing too much) before rounding to an integer pixel value. For 2069natural stem width positioning, this adjustment is ignored. 2070 2071A typical example is to reduce the default stem width of an extra-bold font, 2072which gets better hinted if a stem width of, say, 100 is used instead of the 2073default value 150. Let's also assume that the font further contains latin 2074subscript and superscript characters that are hinted best with a stem width 2075set to 80 font units. We can achieve this with the following lines in a 2076control instructions file. 2077 2078 2079``` 2080 * dflt width 100 2081 latb dflt width 80 2082 latp dflt width 80 2083``` 2084 2085Without the adjustment chances are very high that the 'eyes' in glyphs 'e' 2086or 'a' of extra-bold fonts are filled at smaller PPEM values. 2087 2088Use the `--debug` command line option to see how ttfautohint assigns stem 2089widths to styles by default. 2090 2091 2092Glyph Adjustments 2093----------------- 2094 2095The following syntax forms allows adjustments of a glyph's hinting process. 2096 2097### Change Direction of Points, Artificial Segments 2098 2099> *\[*\ font‑idx\ *\]*\ \ glyph‑id\ \ *`l`\[`eft`\]|`r`\[`ight`\]*\ \ points\ \ *\[*\ *`(`*\ left‑offset\ *`,`*\ right‑offset\ *`)`*\ *\]*\ 2100 2101The mutually exclusive parameters `left` and `right` (which can be 2102abbreviated as '`l`' and '`r`', respectively) indicate that the following 2103points have left or right 'out' direction, respectively, overriding 2104ttfautohint's algorithm for setting point directions. The 'out direction' 2105of a point is the direction of the outline *leaving* the point (or passing 2106the control point). If the specified direction is identical to what 2107ttfautohint computes, nothing special happens. Otherwise, a one-point 2108segment with the specified direction gets created, see 2109[above](#segments-and-edges). By default, its length is zero. Setting 2110*left‑offset* and *right‑offset*, you can change the segment's horizontal 2111start and end position relative to the point position. *left‑offset* and 2112*right‑offset* are integers measured in font units. 2113 2114The following five images, displaying glyphs 'O' and 'Q' from the font 2115[Halant-Regular](https://fonts.google.com/specimen/Halant), demonstrate 2116how to use direction changes. 2117 2118![The outlines of glyphs 'O' and 'Q', as displayed in FontForge. They are 2119 sufficiently similar to expect that ttfautohint hints them equally. 2120 However, this is not the case.](img/Halant-Regular-O-Q.png) 2121 2122![The same glyphs, shown at 12px before hinting. [Please ignore the outline 2123 distortion in the upper right of glyph 'O'; this is a bug in FontForge 2124 while running the TrueType 2125 debugger.]](img/Halant-Regular-O-Q-unhinted-12px.png) 2126 2127![Using only ttfautohint's '`-a sss`' parameter to force strong stem width 2128 and positioning, the hinting of glyph 'Q' is really bad, making the glyph 2129 vertically two pixels larger! Reason is that this glyph doesn't contain a 2130 horizontal segment at the baseline blue zone (*y*\ =\ 1; this corresponds 2131 to the segment 13-14 in the 'O' glyph). Normally, segment 1-2 would form 2132 a 'stem' with the baseline segment (as segment 7-8 does in glyph 'O'). 2133 Instead, it forms a stem with segment 19-20, which gets moved down 2134 (*y*\ =\ −1) because the whole glyph appears to be 2135 stretched.](img/Halant-Regular-O-good-Q-badly-hinted-12px.png) 2136 2137![To fix the problem, we change the direction of point\ 38 to 'left' by 2138 writing a line '`Q left 38`' (without the quotes) to a control description 2139 file `Halant-Regular.txt`. Adding option '`-m Halant-Regular.txt`' to 2140 ttfautohint, we get the shown image as a result, which is much better: 2141 Segment 1-2 now properly forms a stem with our artificial one-point 2142 segment\ 38, and the 'O'-like shape is properly positioned. However, 2143 there is still room for improvement: Segment 19-20 is also positioned at 2144 the baseline, making the connection between the 'O' shape and the tail too 2145 thin.](img/Halant-Regular-O-good-Q-better-hinted-12px.png) 2146 2147![By giving the one-point segment\ 38 a horizontal width, we can prevent 2148 that segment 19-20 gets positioned at the baseline: Replace the line in 2149 the previous image description with '`Q left 38 (−70,20)`', making the 2150 segment extend 70 font units to the left and 20 to the right of point\ 38. 2151 The exact offset values don't matter; it's only important to start left of 2152 point\ 19. Another solution to the problem is to artificially change the 2153 direction of segment 19-20 by adding a second line '`Q right 19-20`' to 2154 the control instructions file; for our 'Q' glyph, this produces almost 2155 exactly the same hinting results. Note that such direction changes only 2156 influence the hinting process; an outline's direction won't be changed at 2157 all.](img/Halant-Regular-O-good-Q-well-hinted-12px.png) 2158 2159### Unset Direction of Points 2160 2161> *\[*\ font‑idx\ *\]*\ \ glyph‑id\ \ *`n`\[`odir`\]*\ \ points\ 2162 2163Parameter `nodir` (or '`n`') sets the 'out' direction of the following 2164points to 'no direction', this is, neither left nor right. If the specified 2165direction is identical to what ttfautohint computes, nothing special 2166happens. Otherwise, ttfautohint no longer considers those points as part of 2167horizontal segments, thus treating them as ['weak'](#grid-fitting) points. 2168 2169Modifying or adding segments doesn't directly modify the outlines; it only 2170influences the hinting process. 2171 2172### Delta Exceptions 2173 2174> *\[*\ font‑idx\ *\]*\ \ glyph‑id\ \ *`t`\[`ouch`\]|`p`\[`oint`\]*\ \ points\ \ *\[*\ *`x`\[`shift`\]*\ x‑shift\ *\]*\ \ *\[*\ *`y`\[`shift`\]*\ y‑shift\ *\]*\ \ *`@`*\ \ ppems\ 2175 2176The mutually exclusive parameters `touch` and `point` (which can be 2177abbreviated as '`t`' and '`p`', respectively) make ttfautohint apply delta 2178exceptions for the given points, shifting them by the given values. Delta 2179exceptions entered with `touch` are applied before the final 'IUP' 2180(*interpolate untouched points*) instructions in a glyph's bytecode, 2181exceptions entered with `point` after 'IUP' (please consult Greg Hitchcock's 2182[ClearType Whitepaper] for more on pre-IUP and post-IUP delta hints). 2183Additionally, the `touch` parameter makes the bytecode *touch* the affected 2184points; such points are no longer affected by 'IUP' at all. Note that in 2185ClearType mode all deltas along the x\ axis are discarded, and deltas along 2186the y\ axis are only executed for touched points. As a consequence, 2187vertical delta exceptions entered with `point` should not be used in 2188ClearType mode.^[Unfortunately, there is a bug in FreeType prior to version 21892.5.4 (released in December 2014) that completely disables vertical delta 2190exceptions if subpixel hinting is activated. For this reason you should 2191expect that the `touch` parameter fails on older GNU/Linux distributions.] 2192 2193*ppems*, similar to *points*, are number ranges, see '[x Height Snapping 2194Exceptions](#x-height-snapping-exceptions)' for the syntax. 2195 2196*x‑shift* and *y‑shift* represent real numbers that get rounded to multiples 2197of 1/8 pixels. The entries for `xshift` ('`x`') and `yshift` ('`y`') are 2198optional; if missing, the corresponding value is set to zero. If both 2199values are zero, the delta exception entry is ignored as a whole. 2200 2201Values for *x‑shift* and *y‑shift* must be in the range [−1.0;1.0]. Values 2202for *ppems* must be in the range [6;53]. Values for *points* are limited by 2203the number of points in the glyph. 2204 2205Note that only character '`.`' is recognized as a decimal point, and a 2206thousands separator is not accepted. 2207 2208As an example for delta instructions, let's assume that you want to shift 2209points 2, 3, and\ 4 in glyph 'Aacute' at PPEM sizes 12 and\ 13 by a vertical 2210amount of 0.25 pixels. This corresponds to the line 2211 2212``` 2213 Aacute touch 2-4 yshift 0.25 @ 12, 13 2214``` 2215 2216in a control instructions file. Since we use `touch` and not `point`, 2217points 2, 3, and\ 4 are no longer subject to the final 'IUP' instruction, 2218which interpolates weak, untouched point positions between strong, touched 2219ones, cf. the description 2220[here](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html#IUP). 2221 2222