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

注意,这将会自动安装很多相关的字体包,特别是 google-noto-sans 字体包。但是在实际环境中,Infinality 的官方源总是访问很慢,特别是安装字体时 dnf 失败率很高,所以其实也可以不用安装上述字体,只需要确保安装谷歌官方提供的 noto cjk 字体即可,后面会讲到如何从谷歌官方网站去安装 noto cjk 字体。请注意,在安装完后上述字体后,请删除 google-noto-sans 字体包中的 cjk 中日韩字体,因为是以 ttc 方式提供的,对于 Java 程序而言配置上会出现字体识别方面的问题,因此要替换为 google 官方单独提供的 otf 格式的 noto sans cjk 字体。首先,删除 Infinality 提供的 google-noto-sans 中的 cjk 字体,使用下面的命令:

# rm -f -r /usr/share/fonts/google-noto/NotoSansCJK.ttc

然后从 https://www.google.com/get/noto 官方网站下载 Noto Sans CJK JP、Noto Sans CJK KR、Noto Sans CJK SC、Noto Sans CJK TC 四个字体包(分别对应日文、韩文、简体中文、繁体中文)。谷歌官方提供的这几个 CJK 字体包含了完整的字型、语言及区域信息,不过要注意,因为是访问谷歌官方网址,因此可能需要翻墙才行。下载后解压缩这些字体包,将会发现这些字体都是按照不同文种和不同字型单独以 otf 格式提供的。将这些字体文件全部复制到 /usr/share/fonts/google-noto 目录下,然后执行下面的命令:

$ rm -f -r ~/.cache/fontconfig/*
# rm -f -r /var/cache/fontconfig/*
# fc-cache -f -v /usr/share/fonts

这样既可完成谷歌官方 otf 格式 noto sans cjk 字体的安装。之后,就可以在系统中将 Noto Sans CJK SC(简体中文)配置为界面字体了。Noto Sans CJK 字体与思源黑体同源,并经过高质量 hinting,配合 Infinality 优化编译过的 freetype 字体渲染引擎和 fontconfig 字体配置会达到非常好的字体渲染效果。

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.autohint 设置为 0,Xft.hinting 设置为 1,将 Xft.hintstyle 设置为 hintfull(好像默认值就是这个),将第 715 行的 USE_STYLE 设置为 INFINALITY(作者推荐设置),将 /etc/X11/xinit/xinitrc.d/infinality-settings.sh 文件中第 35 行的 INFINALITY_FT 设置为 ultimate3(作者推荐的就是 ultimate3,作为默认值 )。这里注意,之所以将 Xft.hintstyle 设置为 hintfull,是因为 Infinality 优化后的字体渲染引擎内部对 full 级别的微调指令做了更好的优化,特别是搭配 google 官方的 noto 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 程序而言,在 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 --allowerasing java-1.8.-openjdk-infinality-ultimate java-1.8.-openjdk-infinality-ultimate-headless java-1.8.-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 来进行当前使用版本的切换操作,很方便。

在安装完 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 混合显示导致行间距过小问题,内容如下:

#
#
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

# Version

# Uses Fedora 9 fonts and file paths.
version=1

# Component Font Mappings

dialog.plain.latin-1=Noto Sans CJK SC Regular
dialog.plain.japanese-x0208=Noto Sans CJK JP Regular
dialog.plain.korean=Noto Sans CJK KR Regular
dialog.plain.chinese-big5=Noto Sans CJK TC Regular
dialog.plain.chinese-gb18030=Noto Sans CJK SC Regular

dialog.bold.latin-1=Noto Sans CJK SC Bold
dialog.bold.japanese-x0208=Noto Sans CJK JP Bold
dialog.bold.korean=Noto Sans CJK KR Bold
dialog.bold.chinese-big5=Noto Sans CJK TC Bold
dialog.bold.chinese-gb18030=Noto Sans CJK SC Bold

dialog.italic.latin-1=Noto Sans CJK SC Italic
dialog.italic.japanese-x0208=Noto Sans CJK JP Italic
dialog.italic.korean=Noto Sans CJK KR Italic
dialog.italic.chinese-big5=Noto Sans CJK TC Italic
dialog.italic.chinese-gb18030=Noto Sans CJK SC Italic

dialog.bolditalic.latin-1=Noto Sans CJK SC Bold Italic
dialog.bolditalic.japanese-x0208=Noto Sans CJK JP Bold Italic
dialog.bolditalic.korean=Noto Sans CJK KR Bold Italic
dialog.bolditalic.chinese-big5=Noto Sans CJK TC Bold Italic
dialog.bolditalic.chinese-gb18030=Noto Sans CJK SC Bold Italic

sansserif.plain.latin-1=Noto Sans CJK SC Regular
sansserif.plain.japanese-x0208=Noto Sans CJK JP Regular
sansserif.plain.korean=Noto Sans CJK KR Regular
sansserif.plain.chinese-big5=Noto Sans CJK TC Regular
sansserif.plain.chinese-gb18030=Noto Sans CJK SC Regular

sansserif.bold.latin-1=Noto Sans CJK SC Bold
sansserif.bold.japanese-x0208=Noto Sans CJK JP Bold
sansserif.bold.korean=Noto Sans CJK KR Bold
sansserif.bold.chinese-big5=Noto Sans CJK TC Bold
sansserif.bold.chinese-gb18030=Noto Sans CJK SC Bold

sansserif.italic.latin-1=Noto Sans CJK SC Italic
sansserif.italic.japanese-x0208=Noto Sans CJK JP Italic
sansserif.italic.korean=Noto Sans CJK KR Italic
sansserif.italic.chinese-big5=Noto Sans CJK TC Italic
sansserif.italic.chinese-gb18030=Noto Sans CJK SC Italic

sansserif.bolditalic.latin-1=Noto Sans CJK SC Bold Italic
sansserif.bolditalic.japanese-x0208=Noto Sans CJK JP Bold Italic
sansserif.bolditalic.korean=Noto Sans CJK KR Bold Italic
sansserif.bolditalic.chinese-big5=Noto Sans CJK TC Bold Italic
sansserif.bolditalic.chinese-gb18030=Noto Sans CJK SC Bold Italic

serif.plain.latin-1=DejaVu Serif Book
serif.plain.japanese-x0208=Noto Sans CJK JP Regular
serif.plain.korean=Noto Sans CJK KR Regular
serif.plain.chinese-big5=Noto Sans CJK TC Regular
serif.plain.chinese-gb18030=Noto Sans CJK SC Regular

serif.bold.latin-1=DejaVu Serif Bold
serif.bold.japanese-x0208=Noto Sans CJK JP Bold
serif.bold.korean=Noto Sans CJK KR Bold
serif.bold.chinese-big5=Noto Sans CJK TC Bold
serif.bold.chinese-gb18030=Noto Sans CJK SC Bold

serif.italic.latin-1=DejaVu Serif Italic
serif.italic.japanese-x0208=Noto Sans CJK JP Italic
serif.italic.korean=Noto Sans CJK KR Italic
serif.italic.chinese-big5=Noto Sans CJK TC Italic
serif.italic.chinese-gb18030=Noto Sans CJK SC Italic

serif.bolditalic.latin-1=DejaVu Serif Bold Italic
serif.bolditalic.japanese-x0208=Noto Sans CJK JP Bold Italic
serif.bolditalic.korean=Noto Sans CJK KR Bold Italic
serif.bolditalic.chinese-big5=Noto Sans CJK TC Bold Italic
serif.bolditalic.chinese-gb18030=Noto Sans CJK SC Bold Italic

monospaced.plain.latin-1=Noto Sans Mono CJK SC Regular
monospaced.plain.japanese-x0208=Noto Sans Mono CJK JP Regular
monospaced.plain.korean=Noto Sans Mono CJK KR Regular
monospaced.plain.chinese-big5=Noto Sans Mono CJK TC Regular
monospaced.plain.chinese-gb18030=Noto Sans Mono CJK SC Regular

monospaced.bold.latin-1=Noto Sans Mono CJK SC Bold
monospaced.bold.japanese-x0208=Noto Sans Mono CJK JP Bold
monospaced.bold.korean=Noto Sans Mono CJK KR Bold
monospaced.bold.chinese-big5=Noto Sans Mono CJK TC Bold
monospaced.bold.chinese-gb18030=Noto Sans Mono CJK SC Bold

monospaced.italic.latin-1=Noto Sans Mono CJK SC Italic
monospaced.italic.japanese-x0208=Noto Sans Mono CJK JP Italic
monospaced.italic.korean=Noto Sans Mono CJK KR Italic
monospaced.italic.chinese-big5=Noto Sans Mono CJK TC Italic
monospaced.italic.chinese-gb18030=Noto Sans Mono CJK SC Italic

monospaced.bolditalic.latin-1=Noto Sans Mono CJK SC Bold Italic
monospaced.bolditalic.japanese-x0208=Noto Sans Mono CJK JP Bold Italic
monospaced.bolditalic.korean=Noto Sans Mono CJK KR Bold Italic
monospaced.bolditalic.chinese-big5=Noto Sans Mono CJK TC Bold Italic
monospaced.bolditalic.chinese-gb18030=Noto Sans Mono CJK SC Bold Italic

dialoginput.plain.latin-1=Noto Sans Mono CJK SC Regular
dialoginput.plain.japanese-x0208=Noto Sans Mono CJK JP Regular
dialoginput.plain.korean=Noto Sans Mono CJK KR Regular
dialoginput.plain.chinese-big5=Noto Sans Mono CJK TC Regular
dialoginput.plain.chinese-gb18030=Noto Sans Mono CJK SC Regular

dialoginput.bold.latin-1=Noto Sans Mono CJK SC Bold
dialoginput.bold.japanese-x0208=Noto Sans Mono CJK JP Bold
dialoginput.bold.korean=Noto Sans Mono CJK KR Bold
dialoginput.bold.chinese-big5=Noto Sans Mono CJK TC Bold
dialoginput.bold.chinese-gb18030=Noto Sans Mono CJK SC Bold

dialoginput.italic.latin-1=Noto Sans Mono CJK SC Italic
dialoginput.italic.japanese-x0208=Noto Sans Mono CJK JP Italic
dialoginput.italic.korean=Noto Sans Mono CJK KR Italic
dialoginput.italic.chinese-big5=Noto Sans Mono CJK TC Italic
dialoginput.italic.chinese-gb18030=Noto Sans Mono CJK SC Italic

dialoginput.bolditalic.latin-1=Noto Sans Mono CJK SC Bold Italic
dialoginput.bolditalic.japanese-x0208=Noto Sans Mono CJK JP Bold Italic
dialoginput.bolditalic.korean=Noto Sans Mono CJK KR Bold Italic
dialoginput.bolditalic.chinese-big5=Noto Sans Mono CJK TC Bold Italic
dialoginput.bolditalic.chinese-gb18030=Noto Sans Mono CJK SC Bold Italic

# Search Sequences

sequence.allfonts=latin-1
sequence.allfonts.Big5=chinese-big5,latin-1
sequence.allfonts.x-euc-jp-linux=japanese-x0208,latin-1
sequence.allfonts.EUC-KR=korean,latin-1
sequence.allfonts.GB18030=chinese-gb18030,latin-1
sequence.fallback=chinese-gb18030,chinese-big5,japanese-x0208,korean,bengali,gujarati,hindi,oriya,punjabi,malayalam,tamil,telugu,sinhala

# Font File Names

filename.DejaVu_Sans_Book=/usr/share/fonts/dejavu/DejaVuSans.ttf
filename.DejaVu_Sans_Bold=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf
filename.DejaVu_Sans_Oblique=/usr/share/fonts/dejavu/DejaVuSans-Oblique.ttf
filename.DejaVu_Sans_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSans-BoldOblique.ttf

filename.DejaVu_Sans_Mono_Book=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
filename.DejaVu_Sans_Mono_Bold=/usr/share/fonts/dejavu/DejaVuSansMono-Bold.ttf
filename.DejaVu_Sans_Mono_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-Oblique.ttf
filename.DejaVu_Sans_Mono_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf

filename.DejaVu_Serif_Book=/usr/share/fonts/dejavu/DejaVuSerif.ttf
filename.DejaVu_Serif_Bold=/usr/share/fonts/dejavu/DejaVuSerif-Bold.ttf
filename.DejaVu_Serif_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-Italic.ttf
filename.DejaVu_Serif_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-BoldItalic.ttf

filename.Noto_Sans_CJK_JP_Regular=/usr/share/fonts/google-noto/NotoSansCJKjp-Regular.otf
filename.Noto_Sans_CJK_JP_Bold=/usr/share/fonts/google-noto/NotoSansCJKjp-Bold.otf
filename.Noto_Sans_CJK_JP_Italic=/usr/share/fonts/google-noto/NotoSansCJKjp-Regular.otf
filename.Noto_Sans_CJK_JP_Bold_Italic=/usr/share/fonts/google-noto/NotoSansCJKjp-Bold.otf
filename.Noto_Sans_CJK_KR_Regular=/usr/share/fonts/google-noto/NotoSansCJKkr-Regular.otf
filename.Noto_Sans_CJK_KR_Bold=/usr/share/fonts/google-noto/NotoSansCJKkr-Bold.otf
filename.Noto_Sans_CJK_KR_Italic=/usr/share/fonts/google-noto/NotoSansCJKkr-Regular.otf
filename.Noto_Sans_CJK_KR_Bold_Italic=/usr/share/fonts/google-noto/NotoSansCJKkr-Bold.otf
filename.Noto_Sans_CJK_TC_Regular=/usr/share/fonts/google-noto/NotoSansCJKtc-Regular.otf
filename.Noto_Sans_CJK_TC_Bold=/usr/share/fonts/google-noto/NotoSansCJKtc-Bold.otf
filename.Noto_Sans_CJK_TC_Italic=/usr/share/fonts/google-noto/NotoSansCJKtc-Regular.otf
filename.Noto_Sans_CJK_TC_Bold_Italic=/usr/share/fonts/google-noto/NotoSansCJKtc-Bold.otf
filename.Noto_Sans_CJK_SC_Regular=/usr/share/fonts/google-noto/NotoSansCJKsc-Regular.otf
filename.Noto_Sans_CJK_SC_Bold=/usr/share/fonts/google-noto/NotoSansCJKsc-Bold.otf
filename.Noto_Sans_CJK_SC_Italic=/usr/share/fonts/google-noto/NotoSansCJKsc-Regular.otf
filename.Noto_Sans_CJK_SC_Bold_Italic=/usr/share/fonts/google-noto/NotoSansCJKsc-Bold.otf

filename.Noto_Sans_Mono_CJK_JP_Regular=/usr/share/fonts/google-noto/NotoSansMonoCJKjp-Regular.otf
filename.Noto_Sans_Mono_CJK_JP_Bold=/usr/share/fonts/google-noto/NotoSansMonoCJKjp-Bold.otf
filename.Noto_Sans_Mono_CJK_JP_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKjp-Regular.otf
filename.Noto_Sans_Mono_CJK_JP_Bold_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKjp-Bold.otf
filename.Noto_Sans_Mono_CJK_KR_Regular=/usr/share/fonts/google-noto/NotoSansMonoCJKkr-Regular.otf
filename.Noto_Sans_Mono_CJK_KR_Bold=/usr/share/fonts/google-noto/NotoSansMonoCJKkr-Bold.otf
filename.Noto_Sans_Mono_CJK_KR_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKkr-Regular.otf
filename.Noto_Sans_Mono_CJK_KR_Bold_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKkr-Bold.otf
filename.Noto_Sans_Mono_CJK_TC_Regular=/usr/share/fonts/google-noto/NotoSansMonoCJKtc-Regular.otf
filename.Noto_Sans_Mono_CJK_TC_Bold=/usr/share/fonts/google-noto/NotoSansMonoCJKtc-Bold.otf
filename.Noto_Sans_Mono_CJK_TC_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKtc-Regular.otf
filename.Noto_Sans_Mono_CJK_TC_Bold_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKtc-Bold.otf
filename.Noto_Sans_Mono_CJK_SC_Regular=/usr/share/fonts/google-noto/NotoSansMonoCJKsc-Regular.otf
filename.Noto_Sans_Mono_CJK_SC_Bold=/usr/share/fonts/google-noto/NotoSansMonoCJKsc-Bold.otf
filename.Noto_Sans_Mono_CJK_SC_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKsc-Regular.otf
filename.Noto_Sans_Mono_CJK_SC_Bold_Italic=/usr/share/fonts/google-noto/NotoSansMonoCJKsc-Bold.otf

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

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

Fedora 24 Linux 环境下实现 Infinality 字体渲染增强及 Java 字体渲染改善的方法(修订)的更多相关文章

  1. Linux 环境下umount, 报 device is busy 的问题分析与解决方法

    在Linux环境中,有时候需要挂载外部目录或硬盘等,但当想umount时,却提示类似“umount:/home/oracle-server/backup:device is busy”这种提示. 出现 ...

  2. Linux环境下mysql报错:bash: mysql: command not found 的解决方法

    # mysql -u root-bash: mysql: command not found 原因:这是由于系统默认会查找/usr/bin下的命令. 如果这个命令不在这个目录下,当然会找不到命令. 我 ...

  3. JavaWeb入门——在Linux环境下安装Tomcat服务器

    JavaWeb入门——在Linux环境下安装Tomcat服务器 摘要:本文主要学习了如何在Linux环境下安装Tomcat服务器. 准备工作 检查Java环境变量 检查系统是否配置了Java的环境变量 ...

  4. Linux 环境下思源黑体字体与 Java 之间的兼容性问题的解决(补充说明)

    在前一篇随笔中,我讲了一下有关 Linux 环境下思源黑体与 Java 之间的兼容性问题,后来经过测试发现,默认安装的思源黑体字体同时包含简体字体和繁体字体,并且其对应的语言编码也是不同的.尝试着把繁 ...

  5. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  6. Linux环境下段错误的产生原因及调试方法小结

    转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

  7. 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

    本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...

  8. Linux环境下使用图形化界面的SVN客户端软件-RabbitVCS

    如果想在Linux环境下使用图形化界面的SVN客户端软件,那么RabbitVCS绝对是首选,可以媲美Windows环境下用的TortoiseSVN,甚至连操作都基本一样,所以强烈推荐给各位童鞋. Ra ...

  9. Linux环境下Swap配置方法

    Linux环境下Swap配置方法 场景: 今天下午安装一个CentOS6.5操作系统,忘记配置swap分区.看看如何安装系统之后,增加和删除swap分区.方法如下:1.内存占用情况[root@josh ...

随机推荐

  1. A Bug's Life(削弱版食物链)

    Description Background  Professor Hopper is researching the sexual behavior of a rare species of bug ...

  2. MongDB之各种删除操作

    接口IMongDaoDelete: package com.net.test.mongdb.dao; public interface IMongDaoDelete { public void del ...

  3. V4L2学习(二)结构介绍

    v4l2_device v4l2_device在v4l2框架中充当所有v4l2_subdev的父设备,管理着注册在其下的子设备.以下是v4l2_device结构体原型(去掉了无关的成员): struc ...

  4. 在MAC下使用Robotframework+Selenium2【第一枪】robotframework安装步骤

    最近使用苹果的MAC Pro本本,感受着苹果系统的新鲜,确实让我手忙脚乱一阵,毕竟使用windows系统太长时间了,刚开始用MAC Pro确实感觉别扭,用了一段,发现MAC系统还不错,好了,转入正题. ...

  5. 数据预处理之独热编码(One-Hot Encoding)

    问题的由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑以下三个特征: ["male","female"] ["from ...

  6. 相当牛X的java版星际游戏

    分享一款牛人用java写的经典游戏,目录结构如下: 虽然只能算一个Demo,但是用到了很多Java基础技术和算法: Java2D,双缓冲,A星寻路,粒子系统,动画效果,处理图片,Swing ui ,U ...

  7. CSU-2031 Barareh on Fire

    CSU-2031 Barareh on Fire Description The Barareh village is on fire due to the attack of the virtual ...

  8. Linux下c++使用pthread库

    pthread 库是纯c库,没有类指针的概念,当想phread_create中传递类成员函数时,就会报错,这里针对这种情况,对线程创建做了必要封装,较为简单,继承类,实现run接口,然后使用start ...

  9. linux文件备份到windows方法

    目录 背景 方案 过程记录 在windows上创建共享目录 将windows上共享的目录绑定到/mnt目录下 问题处理 背景 需编写部门wiki备份数据脚本.但wiki部署在linux上,而需将备份数 ...

  10. 【转】一个java页游服务器框架

    源地址:http://www.cnblogs.com/metoy/p/4305326.html?utm_source=tuicool&utm_medium=referral 一.前言 此游戏服 ...