您尚未登录。

#1 2014-06-30 19:41:33

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,223
个人网站

再谈 fontconfig 的 “Having multiple values in <test>” 的 warning ……

嗯,先来记录一下。这个 thread 大概说了为毛有这个 warning:
http://lists.freedesktop.org/archives/f … 04308.html
英语不好,看得不太明白。个人理解是:如果 edit 中要修改 test 条件的位置,就会出现bug。开发者太懒,就弄了个warning不管了。

其实我的 config 里的用法都是不会触发 bug 的,但是开发者实·在·是·太·懒·了。

------ 分割线 ------
除了修改源码,有没有别的办法干掉这个warning 呢?

我的针对 Firefox 写的简繁日区分字体的 fontconfig,抽出来其中一段,如下:

    <match target="pattern">
        <test name="family">
            <string>dHei</string>
        </test>
        <test qual="any" name="lang">
            <string>zh-tw</string>
            <string>zh-hk</string>
            <string>zh-hant</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Microsoft JhengHei UI</string>
            <string>WenQuanYi Zen Hei</string>
        </edit>
    </match>

大概意思是,如果字体 family 是 dHei(这是之前的conf添加的虚字体名,代表黑体),且字体的语言属性设置为“zh-tw”、“zh-hk”、“zh-hant”之一,就在字体族前添加上繁体字体(Microsoft JhengHei UI,文泉驿是备份字体)。

匹配效果是这样的(好黑好黑体会被其他规则视为 dHei):

cuihao-tp430-arch $ fc-match 好黑好黑体-9:lang=zh-tw 2> /dev/null
msjh.ttc: "Microsoft JhengHei UI" "Normal"

导致 Warning 的是第二个对 lang 属性的 test:“Having multiple values in <test> isn't supported and may not work as expected”。
当然,想要消除这个 waning,我可以这么写:

    <match target="pattern">
        <test name="family">
            <string>dHei</string>
        </test>
        <test qual="any" name="lang">
            <string>zh-tw</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Microsoft JhengHei UI</string>
            <string>WenQuanYi Zen Hei</string>
        </edit>
    </match>

    <match target="pattern">
        <test name="family">
            <string>dHei</string>
        </test>
        <test qual="any" name="lang">
            <string>zh-hk</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Microsoft JhengHei UI</string>
            <string>WenQuanYi Zen Hei</string>
        </edit>
    </match>

    <match target="pattern">
        <test name="family">
            <string>dHei</string>
        </test>
        <test qual="any" name="lang">
            <string>zh-hant</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Microsoft JhengHei UI</string>
            <string>WenQuanYi Zen Hei</string>
        </edit>
    </match>

每种语言都来一遍,这很蛋疼不·是·吗?我的字体分类部分有一个 test 中十几条的那种,全拆开岂不折腾死。

网上有人说改成这样就行了:

    <match target="pattern">
        <test qual="any" name="lang">
            <string>zh-tw</string>
        </test>
        <test qual="any" name="lang">
            <string>zh-hk</string>
        </test>
        <test qual="any" name="lang">
            <string>zh-hant</string>
        </test>
        <test name="family" compare="eq">
            <string>dHei</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Microsoft JhengHei UI</string>
            <string>WenQuanYi Zen Hei</string>
        </edit>
    </match>

但事实证明根本不行啊:

cuihao-tp430-arch $ fc-match 好黑好黑体-9:lang=zh-tw 2> /dev/null
wqy-microhei.ttc: "文泉驿微米黑" "Regular"

呼,太长了,2L继续写。


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#2 2014-06-30 19:51:26

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,223
个人网站

Re: 再谈 fontconfig 的 “Having multiple values in <test>” 的 warning ……

开 fontconfig 的 debug 信息(FC_DEBUG=4 是输出匹配和 edit 信息),看一看匹配的过程:

FC_DEBUG=4 fc-match 好黑好黑体-9:lang=zh-tw

==== 正确的是这个样子 =====
添加规则:

Add Subst match
[test]
        pattern any family Equal "dHei"
        pattern any lang Equal "zh-tw" Comma "zh-hk" Comma "zh-mo" Comma "zh-hant"
[edit]
        Edit family Prepend "Microsoft JhengHei UI" Comma "WenQuanYi Zen Hei";

应用规则:

FcConfigSubstitute test pattern any family Equal "dHei"
FcConfigSubstitute test pattern any lang Equal "zh-tw" Comma "zh-hk" Comma "zh-hant"
Substitute Edit family Prepend "Microsoft JhengHei UI" Comma "WenQuanYi Zen Hei"

Prepend list before  "好黑好黑体"(s) [marker] "dHei"(s) "sans"(s) "Ubuntu"(s) "dHei"(s) "WenQuanYi Zen Hei"(s)
Prepend list after  "好黑好黑体"(s) "Microsoft JhengHei UI"(s) "WenQuanYi Zen Hei"(s) "dHei"(s) "sans"(s) "Ubuntu"(s) "dHei"(s) "WenQuanYi Zen Hei"(s)

嗯,"Microsoft JhengHei UI"、"WenQuanYi Zen Hei" 被 prepend 上了。

==== 错误的是这个样子 =====

Add Subst match
[test]
        pattern any family Equal "dHei"
        pattern any lang Contains "zh-hk"
        pattern any lang Contains "zh-hant"
        pattern any lang Contains "zh-tw"
[edit]
        Edit family Prepend "Microsoft JhengHei UI" Comma "WenQuanYi Zen Hei";
FcConfigSubstitute test pattern any family Equal "dHei"
FcConfigSubstitute test pattern any lang Equal "zh-tw"
FcConfigSubstitute test pattern any lang Equal "zh-hk"
No match

虽然好像hant莫名被吃了,不过反正啥都没匹配上。

==== 分析 ====
正确的匹配规则是 “pattern any lang Equal "zh-tw" Comma "zh-hk" Comma "zh-mo" Comma "zh-hant"”。
怎么用不会导致 warning 的font conf 搞出这个呢?我天真地尝试了把 Comma 换成逗号填进配置文件,不过失败了。


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#3 2014-06-30 20:00:25

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,223
个人网站

Re: 再谈 fontconfig 的 “Having multiple values in <test>” 的 warning ……

后来我发现啊,文泉驿安装了这么个配置文件:

    <match target="pattern">
        <test qual="any" compare="eq" name="lang">
                <string>en</string>
        </test> 
        <test qual="any" compare="eq" name="lang">
                <string>en-us</string>
        </test> 
        <test qual="any" compare="eq" name="lang">
                <string>zh-cn</string>
        </test> 
        <test qual="any" compare="eq" name="lang">
                <string>zh-tw</string>
        </test> 
        <test qual="any" compare="eq" name="lang">
                <string>zh-hk</string>
        </test> 
        <test qual="any" compare="eq" name="lang">
                <string>zh-sg</string>
        </test>
        <test compare="more_eq" name="size">
                <double>8</double>
        </test>
        <test compare="less_eq" name="size">
                <double>12</double>
        </test>
        <test compare="not_eq" name="family">
                <string>monospace</string>
        </test>
        <edit name="family" mode="prepend_first">
                <string>WenQuanYi Bitmap Song</string>
        </edit>
   </match>

嗯,官方写的应该是正确的吧。一看就知道它想干啥:
如果lang是en、en-us、zh-xx... 且字体大小大于等于8小于等于12,且字体 family 不是 monospace,就在字体family最前加上 WenQuanYi Bitmap Song。

试一试:

fc-match 呵呵-10:lang=en -s 2> /dev/nul

列表太长不贴,”WenQuanYi Bitmap Song“在倒数第五,看似根本没有用。

还是用 FCDEBUG 看看:

[test]
        pattern any lang Equal "en"
        pattern any lang Equal "en-us"
        pattern any lang Equal "zh-cn"
        pattern any lang Equal "zh-tw"
        pattern any lang Equal "zh-hk"
        pattern any lang Equal "zh-sg"
        pattern any size MoreEqual 8
        pattern any size LessEqual 12
        pattern any family NotEqual "monospace"
[edit]
        Edit family PrependFirst "WenQuanYi Bitmap Song";

规则看来是添加进来了。

但是…… 没有下文了。下面的匹配中根·本·没·有这条规则任何事。

字体原始属性:

FcConfigSubstitute Pattern has 4 elts (size 16)
        family: "呵呵"(s)
        size: 10(f)(s)
        lang: en(s) "zh-CN"(w)
        prgname: "fc-match"(s)

应该确实是符合规则的条件吧……


完全搞不懂 fontconfig 的逻辑。


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

页脚