fedora25配置 Infinality 字体渲染增强

Fedora 25 字体渲染引擎 freetype 及字体配置工具 fontconfig 采用的是未经优化的编译及设置,字体渲染效果比较差。而某些 Linux 发行版的桌面字体渲染看起来很好,甚至能够接近苹果 mac OS 系统的效果,实际上是对 freetype 字体渲染引擎进行了修改的缘故。为此,我们可以通过安装经过修改的 freetype 及 fontconfig 软件包来实现基于 Infinality 的字体渲染效果。

Infinality 是一个致力于改善 Fedora 等主流 Linux 操作系统字体渲染效果的解决方案,包括重新优化编译的 freetype 库,fontconfig 配置包等。原 Infinality 网站已经很久没有再更新了,现在又有新的开发人员在 github 上继续进行 Infinality 的开发,并为 Fedora 23/24 提供了打包好的 repo 软件源。新的 Infinality 官网为 https://danielrenninghoff.com (目前2017.4.19,FZUG 已添加了最新版本的 freetype, fontconfig 软件包)。

Infinality 安装配置方法

  1. 安装基于 Infinality 优化的 freetype 字体渲染引擎库和 fontconfig 字体配置包
$ dnf install --allowerasing cairo-infinality fontconfig-infinality freetype-infinality

注意,通过 --allowerasing 参数可以使 dnf 卸载有冲突的老库再安装新的 Infinality 库。

  1. 编辑 Infinality 配置文件
    安装完毕后,可在 /usr/share/doc 目录下找到两个目录:freetype-infinality 和 fontconfig-infinality。这两个目录中都有 README 等自述文件比较详细地介绍了 Infinality 优化编译字体渲染引擎库的相关配置方法。根据其文档说明,我们需要执行以下操作:
$ cp /usr/share/doc/freetype-infinality/infinality-settings-generic /etc/profile.d/infinality-settings-generic.sh
$ cp /usr/share/doc/freetype-infinality/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 文件中的 XFT_SETTINGS 变量中的 Xft.autohint 设置为 0

Xft.hinting 设置为 1

将 Xft.hintstyle 设置为 hintfull

将 USE_STYLE 设置为 INFINALITY(作者推荐设置);

将 /etc/X11/xinit/xinitrc.d/infinality-settings.sh 文件的 INFINALITY_FT 设置为 ultimate3(作者推荐)。

这里注意,之所以将 Xft.hintstyle 设置为 hintfull,是因为 Infinality 优化后的字体渲染引擎内部对 full 级别的微调指令做了更好的优化,特别是搭配 google 官方的 Noto Sans CJK 字体(经过 hinted)能够达到最好效果,比 hintslight 要好很多!这个情况 Infinality 作者也在 /etc/profile.d/infinality-settings-generic.sh 文件注释中解释得比较清楚了。

其他微调

另外要注意,Noto Sans CJK 字体基线高度和 DejaVu Sans 字体不同,如果采用混用方式,即拉丁字母采用 DejaVu,中文采用 Noto,会导致文字行间隔太小,影响美观。所以最好的办法是,所有字符全都用 Noto Sans CJK 字体来显示,包括 Mono 等宽字符情况。虽然 Infinality 优化字体渲染软件包安装后会自带一些 fontconfig 配置,但是对于中文字体来说,我们希望 Infinality 提供的 Noto Sans CJK SC 中文字体能够具有最高优先级,

我们可以创建一个名为 65-0-nonlatin-custom.conf 的文本文件,放置于 /etc/fonts/conf.d 目录下,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match>
        <test name="lang" compare="contains">
            <string>zh-cn</string>
        </test>
        <test name="family">
            <string>monospace</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans Mono CJK SC</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>zh-tw</string>
        </test>
        <test name="family">
            <string>monospace</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans Mono CJK TC</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>jp</string>
        </test>
        <test name="family">
            <string>monospace</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans Mono CJK JP</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>zh-cn</string>
        </test>
        <test name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans CJK SC</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>zh-tw</string>
        </test>
        <test name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans CJK TC</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>jp</string>
        </test>
        <test name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans CJK JP</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>zh-cn</string>
        </test>
        <test name="family">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans CJK SC</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>zh-tw</string>
        </test>
        <test name="family">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans CJK TC</string>
        </edit>
    </match>

    <match>
        <test name="lang" compare="contains">
            <string>jp</string>
        </test>
        <test name="family">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Sans CJK JP</string>
        </edit>
    </match>
</fontconfig>

同时也要注意在 /etc/fonts/conf.d 目录中将其他 65 开头含有 nonlatin 字样的字体配置文件中 Noto Sans CJK 字体或者 Noto Sans Mono CJK 字体优先级排到最高。为了能够使 hint 设置最终有效,还要在 /etc/fonts 目录下创建一个 local.conf 文件(如果有则直接修改),具体内容如下:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="font">
        <edit name="autohint" mode="assign">
            <bool>false</bool>
            </edit>
        <edit name="hinting" mode="assign">
            <bool>true</bool>
        </edit>
        <edit name="hintstyle" mode="assign">
            <const>hintfull</const>
        </edit>
    </match>
</fontconfig>

关于 Java 字体

对于 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 软件源下载安装。(FZUG 未打包)

$ dnf install --allowerasing java-1.8.0-openjdk-infinality java-1.8.0-openjdk-infinality-headless java-1.8.0-openjdk-infinality-devel

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

在安装完 OpenJDK 后,仍需要进行基本的 Java 内建字体规则配置,这么做的好处是定义好 Java 内建的 Dialog、DialogInput、Monospace 等逻辑字体与系统真实字体之间的映射关系,以便在 Java Swing 程序使用各种主题的时候,如果采用默认的逻辑字体可以按照我们的要求使用 google noto sans cjk 字体。OpenJDK 仍然采用 JRE 标准的 fontconfig.OS.properties 字体配置文件,其中 OS 为当前操作系统的名字,比如 Fedora、Ubuntu 等。这里给出一个 Fedora 24 下的参考配置,文件名为 fontconfig.Fedora.properties,必须放置在 jre/lib 目录下,注意这里的拉丁字符也采用 Noto Sans CJK 字体显示,避免 DejaVu Sans 混合显示导致行间距过小问题。

这里要注意,Oracle 官方的 JRE 根据优先级规则,可以识别 fontconfig.properties,但 OpenJDK 不能识别,必须是以 fontconfig.OS.properties 这种文件名才行(OS 是当前系统的名字,比如 Fedora、Ubuntu 等)。

在安装了 Infinality 优化过的 Java 后,运行 Java Swing 程序将会发现 Swing 中的字体渲染已经完全与系统原生字体渲染完全一致,且能够跟随系统原生字体渲染调整而变化了。google 的 Noto Sans CJK 字体(官方 hinted 过)在 Infinality 优化过的 OpenJDK 中的显示效果非常好,字体 hint 微调指令起到了很好的作用。

参考

时间: 2024-10-29 19:11:42

fedora25配置 Infinality 字体渲染增强的相关文章

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

Fedora 24 Linux 桌面环境默认字体渲染引擎 freetype 及字体配置工具 fontconfig 采用的是未经优化的编译及设置,字体渲染效果比较差.而某些 Linux 发行版的桌面字体渲染看起来很好,甚至能够接近苹果 Mac OS X 系统的效果,实际上是对 freetype 字体渲染引擎进行了修改的缘故.为此,我们可以通过安装 Infinality 的改版 freetype 及 fontconfig 软件包来实现基于 Infinality 的字体渲染效果.Infinality

开始使用 Ubuntu(字体渲染去模糊+软件安装+优化配置+常见错误)(29)

1. 中文字体渲染美化 + 去模糊 步骤: 1. 解压安装 lulinux_fontsConf_181226.tar.gz,按里面的安装说明操作: 2. 开启字体渲染: 打开 unity-tweak-tool,更改字体: 3. 附件 >> lulinux_fontsConf_181226.tar.gz 2. 软件安装 chrome sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list

开始使用 Manjaro(添加源+字体渲染去模糊+软件安装+优化配置+常见错误)(30)

1. 添加 archlinux 镜像源 1. 步骤一 向 /etc/pacman.d/mirrorlist 中添加国内镜像地址 1.1 方法1:自动添加 1. 输入如下命令查看国内镜像源,并按质量排序:sudo pacman-mirrors -i -c China -m rank,之后会弹出一个窗口,可以选择想要的镜像源,选择确定后会自动导入 /etc/pacman.d/mirrorlist 配置文件中. 1.2 方法2:手动添加 直接在 etc/pacman.d/mirrorlist 文件后边

超简单调整Fedora25遇到的字体小问题——字体渲染问题和输入框内容显示不全

第一个问题:字体渲染 抗锯齿效果很不舒服.如图: 锯齿很明显.解决方法,使用gnome-tweak-tool(中文名:优化工具)如果没有,请安装: dnf install -y gnome-tweak-tool 安装好之后,打开,选择Fonts(字体)--将微调和抗锯齿,修改成如图内容: 然后关闭之前打开的窗口,再重新打开,即可.效果如图: 第二个问题: 不是很容易被发现的小bug:某些输入框内容显示不全,比如使用vbox的时候有的输入框内不能完全显示输入内容,如图,注意加减号旁边应该显示输入的

Ubuntu14.04下Pycharm3.4 字体渲染

在ubuntu下搭建了django的开发环境,搭建过程十分简单,Pycharm的安装更简单,下载tar包解压并执行bin目录下的脚本即可,但是看着那个字体真心不爽.于是开始搜索调教. 1.安装打了渲染补丁OpenJDK删除之前安装的java7,通过PPA安装JDK sudo add-apt-repository ppa:no1wantdthisname/openjdk-fontfix sudo apt-get update sudo apt-get install openjdk-7-jdk 2

字体渲染详解

两年前掀起的Web字体革命让众人遗忘多年的字体渲染话题再次浮现.Web字体赋予我们自由的同时也带来新的挑战.字体选择及使用并不仅仅只是风格问题,其背后的技术实现也值关注. 我们没办法控制网站访客所用的浏览器与操作系统,因此理解字体渲染原理有助于确保网站在各类情况下都适宜阅读.截至最近,我们手头可用的"web安全"字体仍屈指可数.虽然安全字体的种类非常少,但这些字体都是针对显示屏精心制作和调整过了的,因此在字体显示效果方面不用太担心. 如今,在选择网站字体方面我们已有极大的灵活性,然而将

什么是字体渲染(Font Rendering)?

一.概述 理想中的文字指的是使用矢量图形描述出来的形状. 栅格化(Rasterization)指的是将矢量转化为像素. 三种渲染策略(Rendering Strategies) 初代:黑白渲染(black-and-white rendering) 二代:灰度渲染(Grayscale rendering) 三代:亚像素渲染(Subpixel rendering) Windows系统拥有两套图形渲染接口:GDI(图形设备接口Graphics Device Interface)与DirectWrite

LOG.ZS.0001.基于Freetype的游戏字体渲染优化思路

Total Utf8-ucs2 Html_parse Layout Render_string Init_texture Ft_load_glyph 原始 2293 1 26 708 1556 2 1403 上表用于记录优化各步骤的消耗时间. 生成的文本纹理,文本是加州宾馆的全歌词. 原始版本整个纹理的生成耗时2300毫秒左右,可以看到实际是慢得发指. 究其原因,是由于实现iron引擎的时候未进行任何性能方面的考虑. 上述时间表的构成: total : 总消耗时间 utf8-ucs2: 将utf

ubuntu下如何配置codeblocks字体颜色主题

1.在ubuntu的home中ctrl+h显示隐藏文件夹,找到一个.codeblocks的文件夹,然后那个文件夹中有一个default.conf的文件,选择打开方式gedit.然后将下面的代码复制进去,在复制进去之前,最好将你自己的配置文件备份好. 配置代码: <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <CodeBlocksConfig version=&q