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.