轮廓、字体子集与可携数据
字形几何
glyph = layout.lines[0].runs[0].glyphs[0]
outline = library.outline(glyph)
print(outline.units_per_em, outline.bounds, outline.commands[:3])
返回已定位字形的精确轮廓。轮廓使用字体单位,所以要乘上该字形组的 size / outline.units_per_em,再加上字形的位置。
GlyphOutline(glyph_id, commands, bounds, units_per_em, variation_coordinates=())
精确的字形轮廓:依序排列的路径命令、范围与每 em 的单位数。
MoveTo(point)
在字体空间的指定点开始一条新的轮廓线。
LineTo(point)
从目前的点画一条直线到终点。
QuadraticTo(control, point)
加入一段二次 Bézier 曲线,有一个控制点与一个终点。
CubicTo(control1, control2, point)
加入一段三次 Bézier 曲线,有两个控制点与一个终点。
把目前的轮廓线连回起点并封闭。
flatten(outline, *, tolerance) → tuple[Polyline, ...]
依你选的容许误差(字体单位),把曲线命令近似成线段。
Polyline(points, closed)
曲线展平后返回的一串开放或封闭的点。
一个字形的精确轮廓。方块是曲线上的点,圆圈是控制点,虚线是控制多边形。
会检查权限的字体子集
FontLibrary.subset(layout, *, embedding_use, container=..., allow_unknown=False) → FontSubsetBundle
子集必须涵盖其字形的排版结果。
子集的嵌入用途,权限检查依此决定。
字体容器:SFNT 或 WOFF2。
接受权限不明的字体,并记录这个决定。
创建涵盖某个排版结果的字体子集,并返回字节与中继数据。它不会写出标记或文件。
EmbeddingUse(*values)
声明子集要用在哪里,字体的权限才能针对那个用途来检查。
FontContainer(*values)
选择返回字体的容器:SFNT(OpenType)或 WOFF2。
FontSubsetBundle(fonts, diagnostics=())
完整的子集化结果:可携式字体、诊断消息与中继数据。
PortableFont(
face_id,
family,
subset_tag,
glyph_ids,
permission,
container,
mime_type,
data,
variation_coordinates=(),
)
一份通过权限检查的字体数据,含字族、子集标签、字形编号、权限与字节。
from glyphkit.embedding import EmbeddingUse, FontContainer
bundle = library.subset(layout, embedding_use=EmbeddingUse.WEB, container=FontContainer.WOFF2)
WOFF2 需要 portable 额外安装项。权限规则见可重现性与字体安全。
串行化
to_data(value) → dict[str, JSONValue]
把支持的不可变公开值转成有版本的纯数据,可直接存成类 JSON 的格式。
from_data(kind, data) → object
验证有版本的数据,并在设置的限制内重建公开值。