30 Jun 2019
If we're not running a full blown desktop environment like GNOME,
KDE or XFCE,
the chances of getting good font rendering in a post
Xorg installation after a
default linux base (think of arch or voidlinux) install is zero.
This guide serves as a list of todo items to get decent font rendering with these sort of installs.
The default install in most distros come prepackaged with "decent" fonts like
BitStream or Dejavu. However, installing a font set with more glyph coverage is needed in
this day and age. The google font package has some nice fonts. Especially the Noto Series.
I like this set as it comes with a Sans, Serif and Mono variant. Not to mention the large language
coverage. In ubuntu, the set comes in a package called
fonts-noto. Install it with
$ sudo apt install fonts-noto.
If your distro's package manager doesn't find the font package(look for the keyword
download the font package from its website and put it in a folder in
$HOME/.fonts/"fontname". Mine looks like
$ ls -l ~/.fonts RobotoMono/ RobotoSlab/ msttcorefonts/ noto/
And those individual folders should contain the
.ttf font files.
$ ls -a ~/.fonts/RobotoMono/ ./ RobotoMono-Italic.ttf RobotoMono-Regular.ttf ../ RobotoMono-Light.ttf RobotoMono-Thin.ttf
Now do an
$ fc-cache -vf and our font database would be updated. To see if a font
is installed and registered, try a
$ fc-list | grep "Noto"
If you don't have it already, create
$HOME/.config/fontconfig/fonts.conf and paste this in.
Please read the comments inside before making the file. Now open up a tool like
lxappearance and set your UI font to
Sans. You'll see that programs like firefox
start using the fonts mentioned in the
fonts.conf file too.
Note: I've noticed that both chrome and firefox render the
$ curl https://blog.aktsbot.in/files/fonts.conf > $HOME/.config/fontconfig/fonts.conf should download and set the file.
Create a file called
$HOME/.Xresources and paste this in
Xft.autohint: 0 Xft.antialias: 1 Xft.hinting: true Xft.hintstyle: hintslight Xft.dpi: 131 Xft.rgba: rgb Xft.lcdfilter: lcddefault
As a side note, the dpi value changes from monitor to monitor. To figure out your
ideal dpi, run
$ xdpyinfo | grep -B 2 resolution. For me it gave the following. So, I went with
screen #0: dimensions: 1600x900 pixels (310x174 millimeters) resolution: 131x131 dots per inch
Make sure your dpi values in
fonts.conf files are the same. Then when you start
your window manager, make sure to source this file. I start my i3wm session from the tty
by issuing a
$ startx. So I add the source command to my
~$ cat .xinitrc #!/bin/sh xrdb -merge $HOME/.Xresources # <--- this line xset b off & # more config options ... exec ck-launch-session dbus-launch i3 ~$
The information regarding our monitor can be found by doing a
~$ xrandr --props | grep 'connected' | grep -v 'dis' LVDS1 connected primary 1600x900+0+0 (normal left inverted right x axis y axis) 310mm x 170mm
We now create a file
root with this info
$ cat /etc/X11/xorg.conf.d/20-monitor.conf Section "Monitor" Identifier "LVDS1" DisplaySize 310 170 EndSection
Now we toggle infinality by modifying/creating the file
~$ cat /etc/profile.d/freetype2.sh # Subpixel hinting mode can be chosen by setting the right TrueType interpreter # version. The available settings are: # # truetype:interpreter-version=35 # Classic mode (default in 2.6) # truetype:interpreter-version=38 # Infinality mode # truetype:interpreter-version=40 # Minimal mode (default in 2.7) # # There are more properties that can be set, separated by whitespace. Please # refer to the FreeType documentation for details. # Uncomment and configure below export FREETYPE_PROPERTIES="truetype:interpreter-version=38"
Note: If you're unsure about the dpi setting, a value of
96 is usually a safe bet.
If you're running firefox, type in
about:config in the URL bar and make these changes.
Each one is a separate entry. Again, match the dpi with your values
gfx.font_rendering.fontconfig.max_generic_substitutions = 127 layout.css.dpi = 131
With that we now have pixel perfect font rendering.
Happy Hacking & have a great day!