Click Here to Install Silverlight*
United StatesChange|All Microsoft Sites

Typography Home   Typography Home

Developing fonts > Tools & SDKs > VTT resources

Visual TrueType Training Notes

Microsoft Typography
February 1999

Preparing a Font

Good Outlines

The basic rule for creating outlines for properly hinted TrueType is: "Garbage in, Garbage out."

Visually equal vs Mathematically equal

In type design there are visual and subtle differences made to stems that appear visually equal but are in actuality mathematically not equal. This is the purpose of font hinting, to regularize outlines for low resolution and correct these mathematical errors.

Any mathematical differences should be there for esthetic, design and visual purposes and not because of poor outline design. A straight line should be exactly a straight line. Hinting should not be used to correct poorly designed or converted outlines. The job of hinting will be much easier with well marked outlines.

Ikarus to TrueType: Spline Lab from Projective Solutions
PostScript to TrueType: Macromedia Fontographer 4.1

Most fonts today are designed at some stage in cubic beziers. Most commercial font tools do an acceptable conversion from cubic beziers to quadratic beziers (the outline format for TrueType.) Specifically the Macintosh version of Macromedia Fontographer 4.1 creates reasonably faithful TrueType outlines. Any conversion from one format to another and/or from one unit of measure to another will be susceptible to degradation of the design. The best possible method of converting formats is one that allows control in the settings of the curve fit and post conversion editing.

Pseudo Hinting
Relationships with Rules is Pseudo Hinting

In hinting we are applying rules to distances and points on an outline to control its position and create a controlled bitmap.

Before we begin hinting we should think more globally about the typeface as a family. We will then work in groups within each font, then use specific models to represent the group, then we will work on the individual shapes of the bitmaps at each size.

The first control we should use on a glyph is one to control how its height will relate to other similar glyphs and how it will relate to other members in the family.

Let's begin by looking at the uppercase group within the regular weight of the typeface.

The main model characters in the uppercase are the 'O', 'H', and 'V'. I choose these since they will represent the round, the flat and straight stems, and the simplest diagonal.

Beginning with the 'O'.

  1. We will control the top and bottom to be the same height at all sizes with other round uppercase and relate it to the uppercase flat. Since the rounds are a visual overshoot, at low sizes we need to make them equal to the flat heights, but greater than the flat heights at low sizes.
  2. Next we want to control the black image of the glyph. This is very simple since there are only two vertical features that will be represented by pixels and they are the round strokes at the top and bottom of the 'O'. We will start at the controlled height point and relate the opposite point across this stem to the controlled point.
  3. Next we will work in the horizontal direction. We want to link inward from the sidebearing. We'll control the left side from the sidebearing to the outside of the glyph.
  4. Next we'll control the right side from the sidebearing
  5. Then as we did for the vertical direction we'll control the round left side and round right side.

Now to hint the 'H' we use a similar method

  1. Same as the 'O' we'll control the vertical height
  2. Then we'll have to control the vertical bar and keep it centered between the vertical height and baseline.
  3. Then horizontally we can use the same method of linking in from the sidebearing from the left and one from the right.
  4. Then finally we want to control the left stem and right stem.

Now the final model glyph the 'V'

  1. In the vertical we will control the top and bottom as we did with the 'H'.
  2. In the horizontal we want the left and right sides to be symmetrical from the middle.
  3. And we want to control the left and right stroke to be the same and the same as other strokes.

Now let's go back and add some more information to these simple links.

  • We want to add specific group control settings for the 'links' and 'heights'.
  • We want to add additional information to these 'links' to say weather these distances should be always a pixel or can they collapse. Stems should be always a pixel and sidebearings can sometimes collapse to no pixels.
  • We want to add if the controlled point should be on a grid boundary. Stems should always be on a grid boundary.

Tool Summary

The Visual TrueType tool runs on a Macintosh or Windows. It opens Windows .ttf font files. On a Macintosh it opens only 'data' files. Not Mac font suitcases (resource files).

Note: The CD-ROM contains READ ONLY files. After copying the template .txt files to your local hard disk, uncheck the 'read only' attribute. To do this, select the file and with a right mouse click select the menu item 'properties.' Uncheck the setting for read only.

If these files are not read/write an error dialog will appear in VTT when running the Prepare font menu item.

There are two main User Interface views.

One is the high contrast view and the second is the 3D View.

Both views use the same visual representation of the glyph and hints.

Hints are entered visually with tools, by selecting an icon in the icon tray.

From either top to bottom or left to right:

The first three and last three icons are for navigation and display. The first three are panning, zooming-in and zooming-out. There are quicker short cut keys for these functions. On Windows holding the 'Alt' and clicking will zoom in and the 'Ctrl' key will zoom out. Holding the 'Ctrl' and the RIGHT mouse will allow you to pan the window. On the Mac the 'control' key is used to zoom out and the 'option' key is for zooming in. The 'command' key is used for panning.

A power key combination of a click and the 'Ctrl' + 'Alt' keys zooms the window into a resolution that one font unit is equal to one pixel. This is good for viewing detail. A second click returns the window to a view where the glyph image fills the window.

While were talking about key options, the 'shift' key is used to change any the settings of a VTT hint.

The last three icons, starting with a snapshot window lets you capture the current window. It creates a new window and allows navigation and measuring capabilities.

The recycle icon will jump to the previous glyph that was displayed before the current glyph.

The final icon allows the text string of the current size to be displayed at the top and a PPEM size ramp to display at the bottom of the main window.

All the remaining tools are for editing outlines or inputting hints. The outline editing tools are for simple corrections, not major revisions to outlines.

Classifying Features & Character Groups
Hierarchy of Values



VTT provides a measuring tool that is used for compiling character feature distances and heights.

In measuring features we put glyphs into groups and classify their group features in a similar manner to the criteria used to design type.

Family wide values

Height and stem values should be compared across all fonts in the family. This is to maintain the consistency that might be distorted by using varying values for heights, which are actually very similar visually between family members.

Stem values between similar weights should be compared and made the same to maintain consistent and correct weight at low resolution. Often Italics are lighter than upright styles, but should use the same values as the upright style to maintain the low resolution weight.

Group specific values

Glyphs are organized into groups and the values for those groups are compared with other groups in the font as well as other fonts of similar weight.

VTT 4.2 Control Program

VTT 4.2 and its Control Program allows for user defined Groups. When measuring groups consider which groups you may want to define and use these groups when measuring glyphs. These groups can be specific for a script or language or just simply expanding the Latin group beyond the default Uppercase, Lowercase, Figures and Other groups. Control values then can be created and assigned a specific glyph Group category.

The VTT 4.2 Control Program is the central area for creating the font control values and global font data. For specific information about the Control Program see the VTT 4.2 release notes document.

Glyph specific values

When a feature is repeated it then should have a control value. Features that are not repeated on a glyph such as a flourish distance do not require control over their distance value.

Making a CVT table

To create the control value table we will open the font in VTT.

Then we will select the menu item 'Prepare font' to create a Cvt template where we can input the values. The Cvt template has entries for all common typographic features that may require reguralizing by using control values. These entries also contain VTT Cvt attributes (specified in hexadecimal) that are predefined and matched to a specific Cvt number. These attributes help during the hinting process by tagging Cvt with information the VTT compiler uses to automatically lookup proper Cvts for specific hints.

Making a Control Program with VTT 4.2

Making a Control Program is the same as making CVT table, with the added functionality of creating the PreProgram, the ability to add delta commands directly to CVT values and use CVT inheritance. When 'Prepare font' is run, a template for the Control Program is imported. The Control Program template has default settings for such items as Control value cut-ins, controlling when hinting is used and when it is not, defaults for controlling pixel drop outs, and Control value entries for common typographic features and common CVT inheritance.

Hinting with VTT - Pseudo to real code

Using our pseudo code models we will transfer this theory into Visual TrueType hints.

UC Group Models (H,O,V)

H is the model for all uppercase straight stem and flat glyphs. O is the model for all uppercase round and overshoot glyphs, and the V is the model for all uppercase diagonal stroke glyphs.

LC Group Models (n, o, v)

The n is the model for lowercase straight stems, the o is the model for all lowercase round and overshoot glyphs, and the v or x are the models for all lowercase diagonal and flat glyphs.

Figure Group Models (1, 0)

The figure 1 is the model for figure straight stems and the figure 0 is the model for figure rounds.

Font wide comparison (stems & break points)

Once the three major groups have hints, we can compare the thickness of stems and make corrections.

When will the stems of the regular weight become two pixels. If the stems become thick too soon the user will think the font is the bold version.

To control this we have set aside three Cvts.

Cvt 65 is reserved for the value of the thinnest stem in the X or Y direction. We want to make sure all stems are one pixel and often the Y straight stem value is the thinnest that can be used. This PPEM size of 17 is usually the setting. If it is anything lower the stems at 12 point VGA would be too heavy.

After the stems are allowed to expand to 2 pixels we will use Cvt 66 to be the control for all X stems and Cvt 67 will be used for all Y stems.

The guidelines for the Cvts are:

Cvt 65: the thinnest Y stem

Cvt 66: the most major X stem usually the lowercase X straight stem value.

Cvt 67: the most major Y stem often the same as Cvt 65


After Cvts 65,66, and 67 have been set we will look at the code that does the work to control the stems.

The general term of inheritance is used to describe the use of one or more value superceding the actual control value.

In the Pre-program, since this is global code and is executed before the glyph's hints, there are a series of calls to a function 31 in the 'Font Program'.

Searching for: "use of inheritance (function 31):"

The function calls are listed by group.

The first two calls are to control the major X and major Y Cvts. This makes all control values in the font equal to Cvt 65 up till the set value in the call[] functions.

Syntax: CALL[], cvt#, control_cvt#, max_ppem, 31

The first thing we will set is the max_ppem value to 17. This is the Maximum PPEM size that will use the main font Cvt.

After the first two calls each main stem Cvt is controlled in a similar manner. The X Cvt or Y Cvt are set to the max_ppem size defined. This may often be the same ppem size as the first two settings of 17. In some fonts the round glyph features maybe a larger pixel size than the straight at too small a ppem size. Setting this threshold to that larger ppem size can control them.

Using Inheritance with the Control Program in VTT 4.2 The method of implementing inheritance for Control Values has been simplified and optimised in VTT 4.2. It is no longer necessary to add or edit the PreProgram directly. Inheritance is used in the Control Program of VTT 4.2 directly when any CVT is defined. It is performed with a simple method of making a CVT equal to another parent CVT or relative to another CVT. When a CVT is relative to another CVT its value is the difference between the two actual distances. Such as the overshoot amount of the top of an Uppercase O being relative to the top of the H.

In the example above for controlling a global stem control value (CVT 65), a global X direction control value (CVT 66) and a Y direction control value (CVT 67). We define the CVT and its value and then using the syntax of 'equals' we make this CVT equivalent to another CVT till a specified PPEM size. In the example below is copied from the Control Program template with real values added. CVT 66 is made equal to CVT 65 until 16PPEM (or is free at 17ppem). The Informative commands AnyGroup, AnyColor, AnyDirection and AnyCatagory are used to define these CVTs.

    65: 170 
	/* replace the 0 with the actual 
	weight of the grand parent cvt */
    66: 200 = 65 @17 
	/* replace the 0 with weight of 
	parent x distances */
    67: 180 = 65 @17
	 /* replace the 0 with weight of 
	parent y distances */

Below is an example of making a CVT relative to another CVT. This is used in the heights CVTs for controlling the overshoot amounts. In the Control Program template CVT 3 is made relative to CVT 2 and CVT 9 is made relative to CVT 8. These CVTs are for the tops and bottoms of the uppercase characters. The @42 signifies they will be made equivalent till 41ppem (free at 42ppem). This gives you the ability to control when the round glyphs would overshoot the flat glyphs. This technique could also be used for making round stroke relative to straight (square) strokes.

     2:     1465          
 	/* replace the 0 with the actual cap height */
     8:     0           
	/* the base "height" remains 0 */
     3:     25 ~  2 @42  
	/* replace the 0 with the actual cap height 
	overshoot */
     9:    -25 ~  8 @42  
	/* replace the 0 with the base height 
	undershoot */

Finalizing models

Before we move on to all other glyphs we should finalize the positioning and bitmap images of all the models. Then as we begin hinting the rest of the glyphs we will have properly spacing and correct images to compare with the current glyph being hinted.


Delta hints or exceptions are conditional hints that alter points to effect the bitmap pattern at a specific PPEM size. These are used to move bitmaps, remove pixels or alter Cvt amounts.

The DeltaC is a low level TrueType delta that does not have a Visual TrueType tool. This instruction is commonly placed in the 'pre-program' and is used to alter specific Cvt values at specific sizes. This is a good way to lighten or embolden a font, group or feature more globally than with a local Delta hint.

Using Deltas in the Control Program of VTT 4.2

The DeltaC low level TrueType instruction can now be created with the higher level command Delta directly in the Control Program to a specific CVT.

67: 0 = 65 @17 Delta (1 @17, -1 @31..36)

Hinting what's left

When hinting the remainders, use the group models for comparison. Use H and O's for spacing uppercase, use n, o for lowercase and zeros for figures. Any punctuation is considered primarily lowercase any monetary symbols are considered figures.

Dealing with Italics

Use of the VTT stroke tool can eliminate inconsistent stepping patterns on stems. Some additional settings are necessary to help VTT control italic slope and help the stroke tool control the pixel patterns.

Cvt 36: is a value used by a function to compute the font's italic angle. This value should be equal to the X distance (italic run) of the uppercase 'H' glyph when the angel is measured from the baseline to the Cap Height (italic rise.)

The italic angle tool is used to set the current glyph's italic angle.


With composites we reference a base glyph and a diacritic.

When you go to a composite glyph, there will not be any Visual Hint data.

You need to look at the text of the TrueType instructions in the window called "Glyph program" in the high contrast UI and "Glyph Assembly" in the 3D UI mode. At first this window is empty, but by recompiling (ctrl-R or command-R) the window the instructions are displayed.

Common instructions for a composite created by Fontographer.

OFFSET[R], 36, 0, 0
OFFSET[R], 142, 84, 299

The OVERLAP[]instruction is an unused instruction in the Windows rasterizer. They both can be removed.

OFFSET[R], 36, 0, 0
OFFSET[R], 142, 84, 299

We will add,


This is an instruction that will make the metrics (advance width) of this glyph equal to the metrics of the first glyph specified by the first OFFSET[R]

OFFSET[R], 36, 0, 0
OFFSET[R], 142, 84, 299


In composites, the hinting of the base glyphs may alter or effect the position of the bitmap. We can use function calls to check the bitmaps at all sizes.

In VTT there are two functions used for composite. Functions 79 and 80. (tutorial page 25)

Function 79 is used to correct diacritic's bitmap from being to low and crashing in the base glyph.

Function 80 is used to keep the bitmaps centered.

I generally use the X corrections with function 80 first then followed by the Y correction, function 79.

Recalculate maxp

The last step before we can complete the font is to recalculate values that may have changed due to hinting. Running the menu item 'recalculate maxp' will set some of the global maximum values in the 'maxp' table.

Additional Font Properties

Using the Font Properties editor either at the beginning or on the source file will eliminate the need to re-entering the data more than once.

Adding new tables from the hinted font-running Cachette

Cachette is a Windows console too that will create 'VDMX', 'hdmx' and 'LTSH' tables.

Source File, Shipping files and what's the difference?

As in programming it is more efficient to have binary data only in files. But to read this data in a human readable form computers have to 'decompile' this information into text (asci text).

It is not always possible to decompile all types of binary data. TrueType fonts can not be decompiled in all cases. This is the reason the production of TrueType fonts in VTT requires the use of a source file of human readable information called a 'source' file.

  • The source file is the master file for the font.
  • The shippable file is one without human readable information. Only information necessary for rasterizers to create bitmap images.

Only make changes to source files. Create shipping files from source files. Never alter shipping files without reflecting these changes in the source file.

Never delete the source file.

If the source file is not present the shipping .ttf file can not be edited in VTT.

Ship Font

After we recalculate maxp and have all changes completed and fixed, we select the menu item Ship Font to create the shippable font file.

Ship Font strips the human readable ascii text tables from the font file and creates a font with only necessary data tables. The shipped font file can not be edited by VTT. VTT works only with source files that contain the ASCII text table.

Always rename your font when running Ship Font.

After ship font is run you can test the font. After testing, any corrections should be made to the source file, then recalculate the maxp table and run Ship font again.

Corrections to any metrics in tables other than the 'glyf' table can be performed on the Macintosh with Apple's TrueEdit.

Top of page

© 2017 Microsoft Corporation. All rights reserved. Contact Us |Terms of Use |Trademarks |Privacy & Cookies