Fedora 24 Linux 环境下实现 Infinality 字体渲染增强及 Java 字体渲染改善的方法,fedorainfinality


Fedora 24 Linux 桌面环境默认字体渲染引擎 freetype 及字体配置工具 fontconfig 采用的是未经优化的编译及设置,字体渲染效果比较差。而某些 Linux 发行版的桌面字体渲染看起来很好,甚至能够接近苹果 Mac OS X 系统的效果,实际上是对 freetype 字体渲染引擎进行了修改的缘故。为此,我们可以通过安装 Infinality 的改版 freetype 及 fontconfig 软件包来实现基于 Infinality 的字体渲染效果。Infinality 是一个致力于改善 Fedora 等主流 Linux 操作系统字体渲染效果的解决方案,包括重新优化编译过的 freetype 库,fontconfig 配置包等。原 Infinality 网站已经很久没有再更新了,但现在又有新的开发人员在 github 上继续进行 Infinality 的开发,并为 Fedora 23/24 提供了打包好的 repo 软件源。新的 Infinality 官网(其实是新作者的博客)网址为 https://danielrenninghoff.com,可以访问其官网了解有关 Infinality 目前的具体开发情况及开发者未来的计划。下面介绍在 Fedora 24 上的 Infinality 安装配置方法:

1、安装 Infinality 的 repo 软件源,使用下面的命令:

# dnf install http://rpm.danielrenninghoff.com/infinality/fedora/$(rpm -E %fedora)/noarch/infinality-ultimate-repo-$(rpm -E %fedora)-1.noarch.rpm

2、通过 Infinality 的软件源安装相关优化编译过的字体渲染引擎库,使用下面的命令:

# dnf install --allowerasing cairo-infinality-ultimate fontconfig-infinality-ultimate freetype-infinality-ultimate

注意,这里使用了 dnf 的 --allowerasing 参数,表明你所安装的 Infinality 字体渲染引擎库与系统默认安装的库是相冲突的,通过 --allowerasing 参数可以使 dnf 卸载相应冲突的老库再安装新的 Infinality 库。

3、安装 Infinality 优化过的字体。Infinality 专门提供了一组优化过的字体,配合 Infinality 字体渲染引擎将能达到非常好的效果。这组字体包括 CJK 中日韩字体,且均内置了比较好的 hinting 微调信息,使用下面的命令:

# dnf install --allowerasing ibfonts-meta-base ibfonts-meta-extended-lt ibfonts-meta-extended

注意,这将会自动安装很多相关的字体包。

4、删除 VL Gothic 及 naver-nanumgothic(名字可能拼写不准,但大致是这样)日文字体。由于 Infinality 默认的 fontconfig 配置会将日文字体优先级提高排列在中文字体前面,这会导致很多程序特别是 Java 程序默认的中文显示使用日文字体,会导致字型难看且出现方框(日文汉字数量少,导致中文显示不完全)。所以最简单的办法就是删除这两个默认安装的日文字体,使用下面的命令:

# dnf remove vlgothic-fonts naver-nanumgothic-fonts

需要注意的是,Infinality 官网服务器的访问可能比较慢,会导致 dnf 安装软件包时出错,可以多试几次直至安装成功。安装完毕后,可在 /usr/share/doc 目录下找到两个目录:freetype-infinality-ultimate 和 fontconfig-infinality-ultimate。这两个目录中都有 README 等自述文件比较详细地介绍了 Infinality 优化编译字体渲染引擎库的相关配置方法。根据其文档说明,我们需要执行以下操作:

# cp /usr/share/doc/freetype-infinality-ultimate/infinality-settings-generic /etc/profile.d/infinality-settings-generic.sh
# cp /usr/share/doc/freetype-infinality-ultimate/infinality-settings.sh /etc/X11/xinit/xinitrc.d
# chmod a+x /etc/X11/xinit/xinitrc.d/infinality-settings.sh

上述两个是关键的字体渲染效果配置文件,具体的配置说明可以打开这两个文件看里面的描述。一般而言,比较合适的配置是将 /etc/profile.d/infinality-settings-generic.sh 文件中第 74 行的 XFT_SETTINGS 变量中的 Xft.hinting 设置为 1,将 Xft.hintstyle 设置为 hintslight,将第 715 行的 USE_STYLE 设置为 INFINALITY(作者推荐设置)或者 UBUNTU。将/etc/X11/xinit/xinitrc.d/infinality-settings.sh 文件中第 35 行的 INFINALITY_FT 设置为 ultimate4(比作者推荐的 ultimate3 更黑更平滑一点)。

虽然 Infinality 优化字体渲染软件包安装后会自带一些 fontconfig 配置,但是对于中文字体来说,我们希望 Infinality 提供的 Noto Sans CJK SC 中文字体能够具有最高优先级,我们可以创建一个名为 65-0-nonlatin-custom.conf 的文本文件,放置于 /etc/fonts/conf.d 目录下,该文件的内容如下:<?xml version="1.0"?>

<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="pattern">
        <test qual="any" name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Noto Sans CJK SC</string>
            <string>Droid Sans Fallback</string>
        </edit>
    </match> 

    <match target="pattern">
        <test qual="any" name="family">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Noto Sans CJK SC</string>
            <string>Droid Sans Fallback</string>
        </edit>
    </match>

    <match target="pattern">
        <test qual="any" name="family">
            <string>monospace</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
<string>Dejavu Sans Mono</string> <string>Noto Sans CJK SC</string> <string>Droid Sans Fallback</string> </edit> </match> </fontconfig>

对于 Java 程序而言,在 Linux 环境下其字体渲染总是比系统原生字体渲染效果要差。主要原因在于 Oracle 官方的 Java 内建了一套私有的字体渲染引擎,无法使用系统的 freetype 及 fontconfig 配置,且渲染效果比较差,属于和微软 cleartype 相似的渲染效果。OpenJDK 则采用的是 freetype 字体渲染引擎,但是默认并不读取系统 fontconfig 配置,且字体渲染的设置是固定的,也类似于微软 cleartype 效果,所以也不太理想。最好的办法就是,对 OpenJDK 源代码进行必要的修改,使之能够使用系统 freetype 字体渲染引擎的同时,能够读取当前系统 fontconfig 配置,并以此灵活调整 Java 中 freetype 的字体微调效果。如果自己编译 OpenJDK 的话难度较大,而 Infinality 已经提供了针对 freetype 及 fontconfig 优化编译打包好的 OpenJDK 软件包(目前基于 OpenJDK 8u92 版本代码),因此可通过 dnf 直接从 Infinality 软件源下载安装,使用下面的命令:

# dnf install --allowerasingjava-1.8.0-openjdk-infinality-ultimate java-1.8.0-openjdk-infinality-ultimate-headless java-1.8.0-openjdk-infinality-ultimate-devel
其中,前两个软件包是 OpenJDK JRE 的必要软件包,最后一个软件包是 OpenJDK JDK 的必要软件包(如果用来做 Java 开发的话)。注意,不要安装java-1.8.0-openjdk-infinality-ultimate-accessibility 软件包,因为这个软件包是 OpenJDK 为 GTK+/GNOME ATK 组件提供的接口,而 ATK 已经被废弃了,如果安装了 java-1.8.0-openjdk-infinality-ultimate-accessibility 后会导致运行很多大型 Java Swing 程序出现错误(特别是在 Swing 使用 GTK+ 本地主题时)。Infinality 优化过的 OpenJDK 安装后,其具体位置及系统中多个 Java 如何切换当前环境变量的问题,可参考 Linux 下的 alternatives 命令及其使用说明,alternatives 命令是专门用于在 Linux 中为同时安装存在的同名但不同版本的多个软件进行切换使用而设计的,比如系统中同时安装了不同版本的 Java(JDK 或 JRE)就可以使用 alternatives 来进行当前使用版本的切换操作,很方便。

在安装了 Infinality 优化过的 Java 后,运行 Java Swing 程序将会发现 Swing 中的字体渲染已经完全与系统原生字体渲染完全一致,且能够跟随系统原生字体渲染调整而变化了。

相关内容