home » 2012 » 09 » You too can have beautiful Linux fonts

You too can have beautiful Linux fonts

fonts linux

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:

Georgia font in Windows 7

And how it looks in Ubuntu:

Georgia font 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:

Zoomed 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:

Infinality Georgia font

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.

Reddit comparison

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.