輪廓、字型子集與可攜資料
字形幾何
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
驗證有版本的資料,並在設定的限制內重建公開值。