WPF font quality

font-sizefontswpf

I'm developing a WPF app but I've noticed that at certain font sizes the text doesn't render as nicely as the samples you see in Control Panel -> Fonts. I'm using large Segoe UI fonts (FontSize="36"), and the effect is more noticeable on the upright lines, e.g. a letter "U" might be slightly thicker on one side than the other.
).

The font quality improves at certain font sizes, e.g. FontSize="48" (which I believe is the equivalent of 36pt), but using a limited number of font sizes isn't always practical.

I can improve the font quality by applying the following properties to the TextBlock:-

TextOptions.TextFormattingMode="Display" TextOptions.TextRenderingMode="ClearType"

Given the improvement in quality I'm curious to know why WPF doesn't do this for all text, or is it down to performance? I was thinking of creating a global style to apply this to all controls, or will this cause a problem?

(I tried uploading a screenshot but SO must store images at a low quality, and you couldn't really make out the font problem).

Best Answer

Here is the blog post that the WPF Text team wrote about this feature.

Note for the TextFormattingMode:

Ideal Ideal text metrics are the metrics which have been used to format text since the introduction of WPF. These metrics result in glyphs’ shapes maintaining high fidelity with their outlines from the font file. The glyphs’ final placement is not taken into account when creating glyph bitmaps or positioning the glyphs relative to each other.

Display In this new formatting mode, WPF uses GDI compatible text metrics. This ensures that every glyph has a width of multiple whole pixels and is positioned on whole pixels. The use of GDI compatible text metrics also means that glyph sizes and line breaking is similar to GDI based frameworks. That said, glyph sizes are not the only input into the line breaking algorithm used by WPF. Even though we use the same metrics as GDI, our line breaking will not be exactly the same.

Since these properties are new in .NET 4.0, they kept the original WPF algorithm as default, which is Ideal mode.

For the TextRenderingMode

Auto This mode will use ClearType unless system settings have been set to specifically disable ClearType on the machine.

Aliased No antialiasing will be used to draw text.

Grayscale Grayscale antialiasing will be used to draw text.

ClearType ClearType antialising will be used to draw text.

Since Auto is default, you will generally get ClearType rendering.

Now, because these are attached properties, and they inherit, you can just set them at the root Window. No need to create a bunch of Styles.