2021-05-12 14:32:11
Fedora 24 Linux 環境下實現 Infinality 字型渲染增強及 Java 字型渲染改善的方法
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 字型包含了完整的字型、語言及區域資訊,不過要注意,因為是存取谷歌官方網址,因此可能需要FQ才行。下載後解壓縮這些字型包,將會發現這些字型都是按照不同文種和不同字型單獨以 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.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 來進行當前使用版本的切換操作,很方便。
在安裝完 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 微調指令起到了很好的作用。
相關文章