使用fontforge和fonttools创建轻量级后备字体

时间:2016-12-09 17:40:12

标签: python opentype fontforge ttx-fonttools

对于webapp,如果我的网络字体不包含字符,我需要一种方法来防止浏览器回退到另一种字体。似乎唯一的方法是在fontstack中添加另一种字体,其中包括" all"可能的字符1

已经存在fallback fonts,但这些是更多的调试助手,因为它们将代码点显示为数字,因此它们非常重(> 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文件中的out注释A-Z,那么这种方法似乎完全没错。

如果我用CID表示法指定范围,为什么字体工具不能找到字形? 是否有其他方法可以为包含所有字形的OpenType要素文件创建一个类?

1 个答案:

答案 0 :(得分:0)

在处理上述问题时,有人向我暗示了Adobe NotDef字体,这正是我所寻求的。出于某种原因,我无法使用fontforge将Adobe NotDef的.otf转换为woff或woff2。此外,所有用于创建诸如fontsquirrel等Web字体文件的在线工具都失败了。为了创建woff文件,我使用了woff-tools包中的sfnt2woff。对于woff2文件,我使用了https://github.com/google/woff2