对于 web 应用程序,如果我的 web 字体不包含字符,我需要一种方法来防止浏览器回退到另一种字体。似乎这样做的唯一方法是向字体堆栈添加另一种字体,其中包括“所有”可能的字符1。
已经存在备用 字体,但它们更多的是调试助手,因为它们将代码点显示为数字,因此它们非常重(> 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
。
如果我使用 Feature 文件中注释掉的 AZ,它就可以工作,所以这种方法似乎并不完全错误。
如果我以 CID 表示法指定范围,为什么 fonttools 找不到字形?是否有另一种方法可以为包含所有字形的 OpenType 功能文件创建一个类?