Fonts and text metrics

This topic discusses the outline fonts provided by Windows, font metric values that may change between versions of Windows, and guidance for how to use font metrics in your desktop apps.

  • For info specific to font metrics in DirectWrite, see Text Metrics.
  • For details on managing text in apps using GDI, see the topics in Fonts and Text.

For more detailed information on font usage and type specifications, see the Microsoft typography site.

Available fonts

The outline fonts supplied with Windows are delivered as OpenType fonts with TrueType outlines (Windows also supports OpenType fonts in the CFF format). For lists of all fonts supplied by Windows, see Microsoft typography: fonts by product or family. All Windows outline fonts conform to the latest version of the OpenType specification.

For a list of all the current and legacy UI fonts, see Locked font metrics below.

Font modifications

To assure backwards compatibility, fonts are rarely removed from Windows. However, fonts are often modified. Modifications may include adding characters, redrawing existing characters, modifying hints, or adding or modifying support for advanced OpenType features and complex script shaping.

Locked font metrics

Note that some values associated with UI fonts and default fonts used in Microsoft apps are locked. UI fonts are used to render UI elements like captions, dialogs, and menus. Very few changes are made to these fonts, given their high visibility and frequent use. However, because the reported values associated with these fonts are locked, there may be discrepancies between reported and actual font values.

The following reported values are locked for UI and default fonts, and may be inaccurately reported:

Here's a list of the UI fonts shipped with Windows 8.1 (affected by locked values):

Script nameUI font
ArabicSegoe UI
ArmenianSegoe UI
BengaliNirmala UI
BopomofoMicrosoft JhengHei UI
BrailleSegoe UI Symbol
BugineseLeelawadee UI
Canadian Aboriginal SyllabicsGadugi
CherokeeGadugi
CopticSegoe UI Symbol
Chinese (Simplified)Microsoft YaHei UI
Chinese (Traditional)Microsoft JhengHei UI
CyrillicSegoe UI
DevanagariNirmala UI
DeseretSegoe UI Symbol
EthiopicEbrima
GeorgianSegoe UI
GlagoliticSegoe UI Symbol
GothicSegoe UI Symbol
GreekSegoe UI
GujaratiNirmala UI
GurmukhiNirmala UI
HebrewSegoe UI
Old ItalicSegoe UI Symbol
JavaneseJavanese Text
JapaneseMeiryo UI
KannadaMirmala UI
KhmerLeelawadee UI
KoreanMalgun Gothic
LaoLeelawadee UI
LatinSegoe UI
MalayalamNirmala UI
MongolianMongolian Baiti
MyanmarMyanmar Text
N'KoEbrima
OghamSegoe UI Symbol
Ol ChikiNirmala UI
Old TurkicSegoe UI Symbol
OriyaNirmala UI
OsmanyaEbrima
Phags-paMicrosoft PhagsPa
RunicSegoe UI Symbol
Sora SompengNirmala UI
SinhalaNirmala UI
SyriacEstrangelo Edessa
Tai LeMicrosoft Tai Le
New Tai LueMicrosoft New Tai Lue
TamilNirmala UI
TeluguNirmala UI
TifinaghEbrima
ThaanaMV Boli
ThaiLeelawadee UI
TibetanMicrosoft Himalaya
VaiEbrima
YiMicrosoft Yi Baiti

 

Here's a list of the legacy UI fonts which are also affected by locked values:

Script name (legacy)UI font (legacy)
BengaliVrinda
Canadian Aboriginal SyllabicsEuphemia
CherokeePlantagenet
Chinese (Simplified)Microsoft YaHei and SimSun
Chinese (Traditional)MingLiU and Microsoft JhengHei
DevanagariMangal
European languagesTahoma
GujaratiShruti
GurmukhiRaavi
JapaneseMeiryo and MS Gothic UI
KannadaTunga
KhmerKhmer
KoreanGulim
LaoLao UI
MalayalamKartika
Middle Eastern languagesTahoma
OriyaKalinga
SinhaleseIskoola Pota
TamilLatha and Vijaya
TeluguGautami
ThaiLeelawadee and Tahoma

 

These fonts are used as defaults in Microsoft apps and are also affected by locked values:

  • Arial
  • Calibri
  • Cambria
  • Consolas
  • Courier New
  • MS Mincho
  • Times New Roman
  • Verdana

Dynamic font metrics

Other than the locked metrics listed above, font values are accurately reported. If a font is changed in a new version of Windows, dynamic font values will differ between the new and old. For example, when a glyph is added to a font, values in the font’s header may change. Clipping could result if these values (which include xMin, xMax, yMin, and yMax, and report the minimum and maximum bounding box for glyphs in the font) were locked and didn't report true values.

Important  If you use dynamic font values in your app (like those in TEXTMETRIC), these values will change if fonts are modified in future versions of Windows. Don't use these actual values in situations where text must stay static.
 

Guidelines for using font metrics

  • Compute screen metrics and font metrics (e.g., average width) when an app is launched, and use these values to lay out your app. This will provide consistently accurate rendering, and your layout will respond to changes in fonts or accommodate font fallback. For an overview of font fallback and font linking, see Globalization Step by Step: Fonts. See Using Font Fallback for Uniscribe-specific info.
    • To compute a base metric, render representative text for your intended language/script.
    • For controls that just contain a single line of unwrapped text, lay them out to fit the full width of the untrimmed text.
    • For controls with multiple lines, get the total length, divide by the character length, and you’ve got a solid width to work with. Note that this is trickier for complex scripts where a single ‘character’ to the reader may be multiple code points.
  • Use sTypoAscender, sTypoDescender, and unitsPerEm (from the OS/2 table) to calculate vertical spacing. sTypoAscender is used to determine the optimum offset from the top of a text frame to the first baseline and sTypoDescender determines the optimum offset from the bottom of a text frame to the last baseline.
  • If you’re using DirectWrite, create a layout using IDWriteTextLayout. IDWriteTextLayout provides ascender + descender + lineGap in natural layout. You can access these specific values with DWRITE_FONT_METRICS. For info on this interface, see Text Formatting and Layout.
  • If you’re using GDI, render off screen, then inspect the layout (for example, the line length or characters per line) and recalculate the final layout parameters used in actual rendering.
  • Don’t build layouts statically based on particular values for particular versions of fonts. Actual values may change from release to release.

Related topics

Reference
IDWriteTextLayout
DWRITE_FONT_METRICS
TEXTMETRIC
unitsPerEm
OS/2 table
Vertical Device metrics table (VDMX)
Microsoft typography: fonts by product or family
Conceptual
Text Metrics (DirectWrite)
Fonts and Text (GDI)
Microsoft Typography

 

 

Show: