为了实现一个Web应用程序,我需要一种方式来防止浏览器在我的网络字体不包含某个字符时回退到另一个字体。似乎唯一的方法是将另一个字体添加到字体堆栈中,该字体包含“所有”可能的字符1。
已经存在备用字体,但这些更多是调试辅助工具,因为它们以数字形式显示代码点,因此它们过于笨重(>2MB)。
我的用例所需的备用字体应只显示类似于方框的东西,以表示缺少的字符。
我的想法是生成一个只有一个字形的简单字体,并应用一个功能文件,该文件将替换所有字形为该字形。
我的fontforge脚本:
但是以上的结果会导致一个问题。
已经存在备用字体,但这些更多是调试辅助工具,因为它们以数字形式显示代码点,因此它们过于笨重(>2MB)。
我的用例所需的备用字体应只显示类似于方框的东西,以表示缺少的字符。
我的想法是生成一个只有一个字形的简单字体,并应用一个功能文件,该文件将替换所有字形为该字形。
我的fontforge脚本:
import fontforge
import fontTools.feaLib.builder as feaLibBuilder
from fontTools.ttLib import TTFont
font_name = 'maeh.ttf'
font = fontforge.font()
glyph = font.createChar(33, "theone")
pen = glyph.glyphPen()
pen.moveTo((100,100))
pen.lineTo((100,500))
pen.lineTo((500,500))
pen.lineTo((500,100))
pen.closePath()
for i in range(34, 99):
glyph = font.createChar(i)
glyph.width=10
font.cidConvertTo('Adobe', 'Identity', 0) # doesn't make a difference
font.generate(font_name)
font = TTFont(font_name)
feaLibBuilder.addOpenTypeFeatures(font, 'fallback.fea')
font.save("fea_"+font_name)
我的特性文件:
languagesystem DFLT dflt;
@all=[\00035-\00039];
#@all=[A-Z] this works
feature liga {
sub @all by theone;
} liga;
但是以上的结果会导致一个问题。
KeyError: ('cid00037', 'SingleSubst[0]', 'Lookup[0]', 'LookupList')
更改cid00037
的数字。
如果我使用特性文件中注释掉的A-Z,它可以正常工作,因此这种方法似乎并不完全错误。
为什么fonttools无法找到指定CID符号范围内的字形? 是否有另一种方法来创建包含所有字形的OpenType特性文件类?