跳转至

轮廓、字体子集与可携数据

字形几何

glyph = layout.lines[0].runs[0].glyphs[0]
outline = library.outline(glyph)
print(outline.units_per_em, outline.bounds, outline.commands[:3])

FontLibrary.outline(glyph) → GlyphOutline
glyphPositionedGlyph

排版结果中的一个字形。依它的字体面与字形编号取得轮廓。

返回已定位字形的精确轮廓。轮廓使用字体单位,所以要乘上该字形组的 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
layoutTextLayout

子集必须涵盖其字形的排版结果。

embedding_useEmbeddingUse

子集的嵌入用途,权限检查依此决定。

containerFontContainer默认值: FontContainer.SFNT

字体容器:SFNT 或 WOFF2。

allow_unknownbool默认值: False

接受权限不明的字体,并记录这个决定。

创建涵盖某个排版结果的字体子集,并返回字节与中继数据。它不会写出标记或文件。

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

验证有版本的数据,并在设置的限制内重建公开值。

评论