使用FontForge和FontTools创建一个轻量级的备用字体

3
为了实现一个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的数字。

如果我使用特性文件中注释掉的A-Z,它可以正常工作,因此这种方法似乎并不完全错误。

为什么fonttools无法找到指定CID符号范围内的字形? 是否有另一种方法来创建包含所有字形的OpenType特性文件类?


1
在我们继续之前:为什么需要防止字体降级?因为这正是网站应该做的,那么为什么你要试图与CSS预定工作方式作对,而不是编写一个离线验证器,告诉你选择的字体是否有缺陷呢? - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans,我需要这个用于测试字体的网站。如果一个字形不是字体的一部分,那么它应该很明显地缺失。 - tobltobs
那么,为什么不利用字体回退并回退到Adobe的空白字体Adobe的notdef字体呢?这正是它们的用途(排版验证)。话虽如此,测试字形是否存在是一个你可以合理地不使用任何前端的事情:你只需通过一个整形器运行你的页面代码,并查看在某一点上它是否会“你给我输入了字符串X,而我应该使用的字体没有它的字形索引/索引”,无需在客户端执行。但如果你必须要这样做:使用一个空白字体。 - Mike 'Pomax' Kamermans
1个回答

0
在解决上述问题时,有人向我提到了Adobe NotDef字体,这几乎就是我要找的。但出于某种原因,我无法使用fontforge将Adobe NotDef的.otf转换为woff或woff2。此外,所有用于创建Web字体文件(如fontsquirrel)的在线工具都失败了。为了创建woff文件,我使用了woff-tools包中的sfnt2woff。对于woff2文件,我使用了https://github.com/google/woff2

1
哪个版本的Font Forge?Adobe blank和Adobe notdef都依赖于一个新的CMAP表,因此如果您仍在使用旧版本,则很可能它根本不理解应该如何处理该CMAP数据。 - Mike 'Pomax' Kamermans
FontForge自2010年起就支持WOFF,所以这不应该是个问题,但WOFF2的支持直到2018年6月15日才被添加进来。 - Yay295

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接