The solution to the modern X font handling mystery
I wrote last time about my attempts to work
out just why xterm
was rendering the same font differently on Ubuntu
and Fedora. Thanks to comments from Adam Sampson
and some additional digging, I now have an answer and some theories.
As it happens, the answer illuminates yet more issues with modern X
font handling.
In the modern Xft/FreeType/Fontconfig world, fonts are specified more or less as a font name and a size. With most programs that allow explicit specification of the font name you can augment the name with additional attributes, partly to modify the exact font that gets matched and partly to control how it's rendered. All of this is sort of covered in the fontconfig user documentation.
(An example could be 'DejaVu Sans Mono:style=bold:hintstyle=hintslight'. This shows both a modification of the font selection process and a rendering instruction. A similar sort of syntax can be used if you want to find, eg, all of the monospace fonts on the system.)
Fontconfig also has system-wide configuration files, found in
/etc/fonts/conf.d/
. In most packages that I'm familiar with, the
global configuration is a default and explicit specification of things
override them. However, this is not the case for fontconfig; at least
for some settings, fontconfig's global settings silently override
anything you specify explicitly. The only way to override these
settings yourself is to have a $HOME/.fonts.conf
file (and you can't
unset the settings so that you can pick them on the fly, only set them
to whatever personal global value you want).
You can probably guess the rest of the story. As spotted by Adam
Sampson, Ubuntu's fontconfig package has a global config file that is
explicitly forces hinting to be set to hintslight
, while Fedora has
no config file and is defaulting to hintfull
. Because this is set in
a global config file you can't override it on the xterm
command line,
which fooled me into thinking that this setting wasn't the culprit.
(You can include ':hintstyle=hint<whatever>' in a -fa
argument all you
want, but it is silently ignored.)
Overriding that (with a personal .fonts.conf
file that forces
hintfull
hinting) got Ubuntu rendering to be almost the same as
Fedora rendering. The remaining difference turns out to be due to the
specific versions and compilation options of my version of FreeType. Interestingly, this is not just a small visual
difference; at least under some circumstances the Ubuntu FreeType
library renders DejaVu Sans Mono characters a pixel or so taller than
my Fedora FreeType library does, meaning that an 80x50 xterm on Ubuntu
is visibly taller than a Fedora 80x50 xterm. (They are both the same
width.)
I don't know for sure why gnome-terminal, Firefox, and TK applications were unaffected by this, but my theory is that all of them use the Gnome preferences system. Gnome has its own preferences settings for how to render fonts and these appear to completely override fontconfig's views on the subject, so Gnome applications were using the 'right' hinting style for my tastes. I would have probably seen the same rendering of DejaVu Sans Mono in any other Gnome application that used it as the monospace font (a good example is probably gedit).
(Why this happened for some fonts and not for others presumably has to do with how the fonts were hinted, or maybe some fonts specify that they can only be hinted at some levels. I don't know if this means that the fonts that weren't affected are less hinted than DejaVu Sans Mono and so on, or just hinted differently.)
|
|