Last Thursday, when I wrote my blog post, I was so irritated about Ubuntu's bad font rendering I didn't know what to do. The TrueType bytecode interpreter patents have expired since long ago and I'm using mostly the same fonts on Linux and Windows so there was no way to explain Windows superior font rendering other than that it actually does a better job.
That, I cannot stand. Linux should work at least as well as Windows on everything, especially when it comes to something as crucial as font rendering.
I set out on a deep diving quest into Linux font rendering infrastructure trying to find out exactly what was wrong with it. Turns out I wasn't the only one dissatisfied with the way fonts looked. I prefer Window 7's font rendering which, to my eyes, appear much crisper and slender than how fonts look in Linux.
Take a look at the screenshots with the Georgia font below, first how it is rendered in Windows 7:
And how it looks in Ubuntu:
The difference is considerable. To my eyes, Ubuntu's version is much to thick. While both systems use almost the same technology to render the glyps, the reason for the big difference in appearance becomes clear when you zoom up:
Ubuntu's rendering is on the left and Windows on the right. Both use
subpixel anti-aliasing, but Windows variant is much lighter. And since
I prefer the Windows rendering, I set out to find what configuration
knob you can tweak in Ubuntu to get the same appearance. Turns out
there is none. Using KDE's font configuration GUI, you can change the
true type hinting from medium or full to slight which gives ligher
glyphs but distorts their shape to much. Especially Verdana and Arial
seem to be dependent on lots of hinting to render properly. You can
also edit your ~/.fonts.conf
file and change the
LCD filtering style
FreeType uses. Unfortunately, it seems
like that setting doesn't work correctly, because setting it to
something other than lcdnone
or lcddefault
has no
effect. lcdnone
disables LCD filtering entirely so you get severe
color fringes around the text.
Then I tried hacking the FreeType sources which was easier done than expected because the only thing I had to change was few lines like it is described on this wiki page. It didn't provide the results I desired though it just made the text more gray than black, not crispier like in Windows.
Then I luckily found a site called infinality.net on which someone had already published patches to FreeType and Fontconfig to improve font rendering. After twiddling with them a bit and adding a PPA repository I got some really impressive results:
This is with USE_STYLE = "WINDOWS7LIGHT"
. Infinality has many other
font rendering modes, but this is the one I like the most. It is not
exactly how it looks on Windows 7, but very close. I suspect the
remaining differences is caused by subpixel glyph positioning which
Windows 7 uses but Xorg doesn't support. The difference is even
greater when it comes to smaller sans serif fonts, which are used for
desktop GUI elements. Often they are rendered as black on gray
background.
Ubuntu's default on the left and Infinality's Windows 7 Light rendering on the right. I think the improvement in readability is huge here. There is no blur nor extraneous thickness in the menu or address field. The glyphs are well balanced so that no character looks heavier than the other.
So use the Infinality patches! They are great and you will be very pleased with the result.