The 'avar' table

Introduction

In drawing a glyph with variations, the coordinates specified by the user must be mapped from the space defined by the axes' minimum, default, and maximum values into a normalized space of -1.0, 0 and 1.0. The Axis Variation table (tag: 'avar') allows the font to modify the mapping between axis values and these normalized values, which are represented as shortFrac values. The default mapping to normalized coordinates can be represented by the following pseudo-code fragment:

if (userValue < axisDefault)
  normalizedValue = (userValue - axisDefault) / (axisDefault - axisMin)
else
  normalizedValue = (userValue - axisDefault) / (axisMax - axisDefault)

If there is an Axis Variation table, then the normalized value may then be remapped, allowing the font to specify non-linear changes in how the variations are applied.

  • NOTE: The material in this chapter only applies to TrueType fonts.

Axis Variation Table Formats

The Axis Variation Header is shown in the following table:

Type

Name

Meaning

fixed32 version Table version; set to 0x00010000.
int32 axisCount The number of variation axes.
shortFracSegment segment[axisCount] The segment maps for each axis.

The shortFracSegment format is as follows:

Type

Name

Meaning

uint16 pairCount The number of pairs for this axis.
shortFracCorrespondence correspondence[pairCount] The array of correspondence values.

The shortFracCorrespondence structure is shown in the following table:

Type

Name

Meaning

shortFrac fromCoord Value in normalized user space.
shortFrac toCoord Value in normalized axis space.

The shortFracSegment defines a mapping between the user's coordinate (fromCoord), and the coordinate along the variation axis (toCoord). The mapping is expressed as a series of correspondence points, each pair of which specifies a range in the user's space and a corresponding range in the axis' space. Using this, each value of the user's coordinate is mapped to a corresponding value in the axis' space.

Segment Example

Let's look at an example of how this mapping works. The following table shows a set of mapping data that might be present in the 'avar' table of a font.

From (user)

To (axis)

-1.0 -1.0
-0.75 -0.5
0 0
0.4 0.4
0.6 0.9
1.0 1.0

The following table shows how specified user values would be mapped into axis values, using this 'avar' data.

User value

Axis value

-1.0 -1.0
-0.75 -0.5
-0.5 -0.3333
-0.25 -0.1667
0 0
0.25 0.25
0.5 0.65
0.75 0.9375
1.0 1.0

A segment must always have at least three correspondence pairs: minus one mapping to minus one, zero mapping to zero, and one mapping to one. This implies that a segment may not change the sign of a coordinate value. The segment's pairs must be sorted on fromCoord, beginning with -1.0 and ending with 1.0.

NOTE: A shortFrac is an int16 with a bias of 14. This means it can represent numbers between 1.999 (0x7fff) and -2.0 (0x8000). 1.0 is stored as 16384 (0x4000) and -1.0 is stored as -16384 (0xc000).