最近工作中,需要在suse操作系统中添加一种新的中文字体,然后在chromium中传入font family名称,通过skia,再通过fontConfig访问该字库。
添加字库的步骤大致有:
(1)将需要增加的字库文件拷贝到~/.fonts/目录下。(注:对~/.fonts/目录的扫描,需要预先在/usr/loca/etc/font/font.conf里面配置)
(2)/usr/loca/etc/font/font.conf配置的30s会扫描一次字库文件,这个一般是默认配置。
(3)使用
fc-list命令查看fontConfig当前检测到的字库,一般打印如下:
NSimSun,新宋体:style=Regular
FZHeiTi,方正黑体:style=Regular
FZFangSong,方正仿宋:style=Regular
MicroHei,文泉驿微米黑(完整版)_by_zxl1103:style=Regular
SimSun,宋体:style=Regular
AR PL SungtiL GB,文鼎PL简报宋:style=Regular
FZKaiTi,方正楷体:style=Regular
AR PL ZenKai Uni,文鼎PL中楷Uni:style=Medium
FZSongTi,方正宋体:style=Regular
AR PL ShanHeiSun Uni,文鼎PL細上海宋Uni,文鼎PL细上海宋Uni:style=Regular
AR PL KaitiM GB,文鼎PL简中楷:style=Regular
其中MicroHei是我们需要添加的字库,看来是fontConfig扫描到了。
(4)使用
fc-match -v MicroHei 命令可查看MicroHei的详细信息。比较有用的数据有:
Pattern has 30 elts (size 32)
family: "MicroHei"(s)
familylang: "en"(s)
style: "Regular"(s)
stylelang: "en"(s)
fullname: "Droid Sans"(s)
fullnamelang: "en"(s)
slant: 0(i)(s)
weight: 80(i)(s)
width: 100(i)(s)
size: 12(f)(s)
pixelsize: 12.5(f)(s)
foundry: "unknown"(s)
antialias: FcTrue(s)
hintstyle: 3(i)(s)
hinting: FcTrue(s)
verticallayout: FcFalse(s)
autohint: FcFalse(w)
globaladvance: FcTrue(s)
file: "/usr/local/app/.fonts/MicroHei.ttf"(s)
index: 0(i)(s)
outline: FcTrue(s)
scalable: FcTrue(s)
dpi: 75(f)(s)
scale: 1(f)(s)
其中file和family可以确定该字库是不是你添加的字库。
(5)修改
/usr/local/etc/fonts/suse-post-user.conf文件,
对应的alias/family/prefer配置,serif,sans-serif及monospace三个family建议都修改。
由于suse中默认的中文使用FZSongTi,可以将MicroHei添加到FZSongTi的配置之前。prefer数组配置的主要意义是确认fontConfig以family name搜索字库时的先后顺序。
如果prefer数组中没有添加MicroHei字段,fontConfig就不会搜索MicroHei字库了。
(6)使用
fc-cache -f 命令强制更新fontConfig服务。使之前加入的配置立即生效。
(7)使用模拟器访问页面,触发服务器上的Chrome服务加载新字库。使用
lsof | grep "XXXX" 查看进程资源引用情况。其中XXXX是你的Chrome进程端口号,如果有以下信息:
Chrome 14169 mqq mem REG 8,3 9152 1920703 /usr/local/app/.fontconfig/8f60ca31bea1e8f374144819c091a766-x86-64.cache-2
Chrome 14169 mqq mem REG 8,3 33448 1920700 /usr/local/app/.fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-x86-64.cache-2
Chrome 14169 mqq mem REG 8,3 6193796 1430046 /usr/local/app/.fonts/MicroHei.ttf
说明字库已经被Chrome服务成功加载了。
注:如果需要在Chrome服务中指定font family,需要修改服务的配置文件,添加
以下字段(默认不配置时,FontFamily值为"simsun"):
#font_family
FontFamily="MicroHei"
(8)新的MicroHei字库与系统默认的FZSongTi对英文的显示有明显区别,MicroHei是非等宽字符集,FZSongTi是等宽字符集。可通过模拟器,显示英文字符网页或查看下发的文件中字符串的宽度对比,确认最终字库更换是否生效。