Home   All Products  |   Support  |   Search  | Home  

Microsoft Typography | Developer | VOLT specification
UI | Main | Proj window | Glyph grp | Subs tool | Posi tool | Glyph def | Proof tool | Output

Positioning Tool


The Positioning Tool allows the user to edit all kinds of positioning lookups, including contextual ones. It pops up with a positioning lookup is double-clicked in the Project Window.



The tool consists of five major parts: the Lookup Definition part, the Glyph Enumeration part, the Positioning (graphical) part, the Positioning Data List and the Contextual part. The Lookup Definition part has the following components:

  1. Lookup Name field
  2. Lookup Type drop-down list. The list enumerates all possible positioning lookup types (except contextual) and lets the user choose the appropriate type.
    If some information has already been entered for the lookup that is not appropriate for the newly assigned lookup type, the user is warned ("When changing the lookup type some information will be scrapped. OK to proceed?" (OK/Cancel)). The type of lookup affects what kind of positioning operations can be done in the Positioning Panel and how the information will be interpreted and compiled.
  3. Lookup Flag fields: the "Process Base Glyphs" checkbox and the "Process Marks" drop-down list. Identical to the ones used in the Substitution Tool (see).

The Positioning part has the following components:

  1. Glyph Choice List(s). In a class-based lookup, allows the user to select which particular shape from the glyph group being positioned she would like to see in the Positioning Panel. The positioning data is shared among the members of a group, so after positioning one glyph from the group the user may go through the other elements and see how the resulting positions look there. Initialized with the first glyph(s) of the group. Disabled if we are not positioning groups (it's not a class-based positioning lookup).
  2. Direction Field: a drop-down list that contains only four entries: "Left-To-Right", "Right-To-Left", "Top-To-Bottom" and "Bottom-To-Top". Lets the user choose the direction. The contents of this field affects how the glyphs will be displayed relative to each other in the Positioning Panel.
  3. "Current Component" drop-down list. Lets the user specify which component he is currently working on. The corresponding component's anchor (for mark-to-ligature type of lookups) and it's width anchor (the caret position) are highlighted and movable on the Positioning Panel (see below). Also, the numerical positioning data in the Positioning Data list represent the values for the currently selected component.
  4. "Total Components" field (not editable). Indicates how many components are present in the first glyph to be positioned. This information is important for representing the mark-to-ligature type of lookups. This information can be updated using the Glyph Definition Tool.
  5. The Positioning Panel (described below). Allows to position one or two glyphs visually. The glyphs to be positioned (the first glyph and possibly the second glyph) are selected in the Glyph Enumeration part of the Positioning Tool.
  6. The Size Run. Represents the resulting look of the positioned glyphs at different resolutions. Scrolls with the Size Number Run left and right.
  7. The Size Number Run. The sequence of consecutive numbers representing ppem sizes, each number under the corresponding item in the Size Run. The sizes that have device corrections to them are shown in bold face. One number (the "current" or "selected" size) is highlighted. The sequence can be scrolled left and right with two arrows on it's sides; the Size Run scrolls with the numbers.
  8. "Device Correction Mode" and "Correct at this Size" checkboxes. By checking the "Device Correction Mode" box the user indicates that she wants to make an adjustment at selected size. After checking this box any changes to anchor or width positions affect the selected ppem size only. This field is unchecked by default and gets unchecked every time the size selection changes.
    The "Correct at this Size" field indicates if corrections exist for the particular ppem size. This field gets reset every time the selected size changes. By un-checking this box device corrections at a particular size can be erased.
    Both checkboxes are disabled if snapping to contour is on.
  9. "Snap First to Contour" and "Snap Second to Contour" check boxes. Indicate that the corresponding anchors have to be snapped to the closest contour points. Unchecked by default; get unchecked every time the anchors or glyphs get repositioned on the Positioning Panel. Checking one of these boxes is likely to cause visual movement on the Positioning Panel as anchors are being snapped to the nearest contour points. Snapping to contour is enabled only for anchor positioning or ligature caret positioning, and only when working with individual glyphs (not groups).
  10. "Lock first Anchor" and "Lock Second Anchor" checkboxes. The user may check those to make sure that the chosen anchors are not moved accidentally. For example, if the anchors on all marks have been already placed to their desired position, the user may lock them and work only with anchors on base glyphs now.
    This setting is a property of an anchor and it is global and round-tripped. That is, if a used locked the default anchor on the acute sign, it will appear locked on any other positioning that involved the acute sign, until the user chooses to unlock it.

The Positioning Data List contains a table with 2 columns and three rows. Each column contains data for one glyph; in case of single positioning lookup the second column is empty. The data in the rows are:

  1. dx and dy offsets. For anchor positioning lookups these are the offsets for the base/mark/entry/exit anchors (exit for the first glyph and entry for the second). For adjustment lookups these are the x and y displacement values for the glyphs;
  2. adv - the change in width. It is either the change in width in an adjustment lookup, or the current component's width in caret positioning lookups.

If a component is selected, the data in the first column are the data for the selected component in the first glyph.

One can type into the cells of the Positioning Data List instead of using the Positioning Panel to move them. The changes are immediately reflected on the Positioning Panel.

The Glyph Enumeration part has six columns, three for the first glyph to be positioned and three for the second. For single adjustment lookups, the second three columns are empty and disabled. For cursive positioning they repeat the contents of the first three.

Out of the three columns the first one contains glyph shapes and the second one glyph names, very much like in the Glyph Group Tool. Editing and other operations happen in exact same way as with the Glyph Group Tool. The only difference is that the entries in the glyph shape columns are selectable (although still not editable). Once an entry has been selected for both glyphs in a positioning pair (single glyph in single positioning lookup), the glyph shapes appear in the Positioning Panel allowing the user to edit their relative position.

If a glyph group is used, it is represented by its first member shown in a different color (e.g. blue), just like in the Substitution Tool. On the Positioning Panel, one can choose which glyph of the group to use for positioning. Please note however that use of glyph groups forces the lookup to become class-based. Thus anchor points and adjustment values are shared between the members of the group; repositioning one glyph of the group changes the position for all of them.

Also note that the glyph groups used for first or second glyphs in the lookup cannot intersect (which makes sense as you cannot position the same glyph twice); if they do, a compilation error will occur.

The third column for each glyph contains the name of the anchor to be used in positioning for this lookup. For adjustment lookups, this column is empty and disabled. For cursive attachment, the first anchor name column always reads "Exit" and the second one "Entry" (note that the rest of the columns display exactly the same information for the first and the second glyph for cursive attachment lookups). Each glyph can have as many named anchors as needed, but only one can be used in a particular lookup. Multi-component glyphs (ligatures) have one anchor point per name per component; that is, a name corresponds to an array of anchor points in this case. The named anchors are global: if one uses the same anchor name in a different lookup, the anchor coordinates are shared between lookups and changing one will affect the other. The anchor name is initialized as 'dflt' which should work fine where only one anchor is needed.

Finally, the Contextual part allows the user to specify the context in which positioning should occur. Each context has the left-hand part and a right-hand part and has to be presented in the form <left-hand part> | <right-hand part>. We have two columns in the contextual part, one represent contexts as glyph names and one for actual shapes.

The glyph name representation can be edited just like glyph names in the Glyph Group Tool with the difference that there can be many names on the same line. The glyph shape representation is updated automatically. If a glyph group is used in a context, it is represented by the shape of its first member shown in a different color (e.g. blue), just like in the Substitution Tool.

Semantics: if the Contextual part is not empty, all positioning described in the lookup happens only within one of the contexts specified. E.g. if there we position capA with acute and grave accents and the contexts are defined as (space - small letter) and (space - space), the actual sequences where positioning will occur are (space - capA - acute - small letter), (space - capA - grave - small letter), (space - capA - acute - space) and (space - capA - grave - space).

Positioning Panel

The Positioning Panel contains shapes and anchors for the user to move to establish positioning data. The elements the user sees on the Positioning Panel vary depending on what lookup type she is currently working on.

Single Adjustment Lookups

For a single adjustment lookup, the user sees:

  • the glyph shape that can be grabbed and moved around;
  • the width anchor that can be moved left and right to change the glyph's width
  • the outlines of the original positions of the glyph and width anchor

Pair Adjustment Lookups

For a pair adjustment lookup, the user sees:

  • two glyph shapes (for the first and the second glyph in the pair) that can be grabbed and moved around
  • two width anchors (for the first and the second glyph in the pair) and can be moved left and right to change glyphs' width
  • the outlines of original glyph positions and width anchors.

The "original" positions are positions of glyphs put next to each other in the writing direction and with their positions not affected by OTL processing.

Cursive Attachment Lookups

For a cursive attachment lookup, the user sees:

  • two glyph shapes and one anchor that all can be moved independently

The anchor positions for the exit anchor of the first glyph and the entry anchor of the second glyph are derived from each pair.

Mark To Base Attachment Lookups and Mark To Mark Attachment Lookups

For mark to base or mark to mark attachment lookups, the user sees:

  • the glyph shape for the base or first mark
  • the glyph shapes for the mark to be positioned, and one anchor, that all can be moved independently

The positions of anchors with names as specified in the Glyph Enumeration part for both glyphs are derived from each pair.

Mark to Ligature Attachment Lookups

For mark to ligature attachment lookups, the user sees:

  • the glyph shape for the base
  • glyph shapes and anchors for the marks, one per ligature component. Only one (for the currently selected component) mark and anchor is enabled, the rest have the "disabled" look and cannot be moved
  • (disabled) delimiters of components set up by caret positioning

Caret Positioning

This is not a lookup as such; the results of this "lookup" are compiled into the Caret Positioning Table in GDEF. The user sees:

  • the glyph shape
  • width anchors - delimiters between components. Only one (for the currently selected component) is "enabled" and can be moved left and right to specify the widths of components; the rest are "disabled". The dw row in the positioning data list reflects the position of the currently selected width anchor.

The default positions of width anchors divide the glyph width into equal parts.


Changing Lookup Type

Selecting from the Lookup Type drop-down list changes the lookup type. The user has to confirm the lookup type change if the lookup information is not empty and there can be data loss. The transition that should be supported without data loss is mark-to-base to mark-to-ligature.

Changing Lookup Flags

Changing lookup flags happens exactly as in Substitution Tool.

Adding and Removing Glyphs to be Positioned

The glyph name columns for the first and second glyph are editable just like the glyph name column in the Glyph Group Tool. The glyph shape columns are updated automatically (again, just like in the Glyph Group Tool).

For single adjustment lookups, the columns for the second glyph are disabled. For cursive attachment, they get updated automatically with the copy of the information for the first glyph (except for anchor names that change from "Exit" to "Entry").

One can sort the glyphs by glyph name or glyph ID or by anchor name by clicking on the column headers. The sorting of glyphs in the positioning lookups does not affect the behavior and does not have to round-trip.

Renaming Anchors

The anchor names next to glyphs to be positioned are editable for attachment lookups. Once an anchor is renamed, the global anchor data is updated as well. If an anchor with exact same name existed for the exact same glyph, a dialog pops up. The user can choose to either replace edited reference with a reference to the anchor with the conflicting name, or to replace the data stored for the anchor with the new name with the data stored for the currently edited anchor, or cancel.


Positioning starts with selecting one (for single adjustment) or two shapes from the glyph shape columns in the Glyph Enumeration. The shapes together with appropriate anchors appear in the Positioning Panel. At the same time the numerical representation of the positioning data appears in the Positioning Data List.

If shaping information exists for the selected pair, it will be reflected in the positions and the data that is displayed. Please not that the positioning information may come from this lookup (for 'adjustment' lookups) or from the global pool of named anchor positions (for 'attachment' lookups).

For 'adjustment' lookups the contours of the "original" or default positions of the glyphs are always displayed. These positions are calculated for the scenario when glyphs are put next to each other, in the order of the writing direction (taken from the Direction field) such that all entries in the positioning data list are zeros. Of course the adjustment may happen from a different original position but we don't try to display all possible situations.

The composition of the movable parts on the Positioning Panel is described above. All movements are immediately reflected in the Positioning Data List.

During positioning one can:

    1. change the glyph to show the position with (if we are positioning a group i.e. creating a class-based positioning lookup);
    2. Change the "current" component. This disables the current copy of the anchor and the mark shape and enables a different one that corresponds to the newly selected component.
    3. Change the number of components in a ligature (ligature caret positioning only). That creates additional copies of width anchors and/or mark shapes for positioning. Please note that the data about ligature components and component widths are "global" in the project; changing it in one place may affect the others. The user gets a warning ("Are you sure?" OK/Cancel) when trying to decrease the number of components because it may cause some positioning data to be lost. There is also a compilation warning if a substitution is introduced with the total number of components on the left not matching the number of components on the right.

Adding Device Corrections

Adding device correction starts from choosing a size from the Size Number Run. The sizes that have corrections to then are displayed in bold face. The size number is selected (highlighted); if there are device corrections at this size, the "Correct at this Size" checkbox will be already checked.

The user has to check the "Device Correction Mode" checkbox to indicate that device corrections are being inputted.

Un-checking the "Correct at this Size" box erases all corrections made at the selected size.

When the "Device Correction Mode" box is checked, the positioning changes made on the Positioning Panel affect the selected size only. The changes are to be snapped to the grid of the selected size. (It would be great to change the display on the Positioning Panel to bitmapped at the selected size as well. It would also be great not to change the physical size of letters but to switch to bigger pixels instead). The changes are also reflected in the Size Run shape for the selected size.

To exit size correction mode one deselects the current size by either clicking on a different size or un-checking the "Device Correction Mode" checkbox.

When "Correct at this Size" is selected, the "snap to contour" checkboxes are disabled - they are mutually exclusive. They are also disables for single and pair adjustment lookups.

Snapping to Glyph Contour

By checking the "Snap 1st to Contour" and "Snap 2nd to Contour" checkboxes the user indicates that the closest contour point is to be used instead of the actual coordinates. Snapping to contour will move the anchor to the closest contour position of the 1st or 2nd glyph respectively.

The anchor points that have been snapped to glyph contours have to be stored as references to contour points. Every time the anchor is used the respective "snap to contour" box will appear checked.

Any movement of the glyphs or anchors will uncheck the corresponding "snap to contour" checkbox.

Adding and Removing Contexts

The users can add or remove the contexts in the "Contexts" text filed just like they would add/remove glyph names in the Glyph Group Tool.

Contexts cannot be defined for the "Caret Positioning" lookup (which does not really translate to a lookup in OTL).


Glyph names and contexts can be scrolled up and down. Long contexts can be scrolled left and right.


Positioning lookups are compiled to adequately represent all information inputted via methods described above.

The information from "Ligature Caret" "lookups" is used to compile the LigCaretList table in GDEF.

The contour points used are also saved in the AttachList table in GDEF for contour point management optimization.

Contextual Lookups

When context is specified, two lookups are created instead of one. The first lookup is a contextual positioning lookup defining the applicability of the positioning operations by matching the defined contexts. It is the only lookup that can be included into features.

If the contexts do match, the second lookup is performed on the input sequence (which is one or two glyphs between the contexts). The second lookup does all positioning operations specified by the user. The second lookup however can be accessed only via the first one, that is, in the specified context.


The "Left Context" is always translated into the backtracking sequence, and "Right Context" becomes a look-ahead.


All positioning information, including device corrections and contour point numbers has to round-trip. The order of glyphs/groups in the Glyph Enumeration does not have to round-trip; the order of contexts does.

this page was last updated 13 August 1999
© 1999 Microsoft Corporation. All rights reserved. Terms of use.
comments to the MST group: how to contact us


UI | Main | Proj window | Glyph grp | Subs tool | Posi tool | Glyph def | Proof tool | Output
Microsoft Typography | Developer | VOLT specification