跳轉到

輪廓、字型子集與可攜資料

字形幾何

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

驗證有版本的資料,並在設定的限制內重建公開值。

留言