跳轉到

座標、字型度量與範圍

字型單位與排版縮放

字型以字型單位儲存輪廓。若每 em 有 \(U\) 單位、指定字級為 \(s\),縮放率就是 \(\lambda = s / U\)。字型座標 \(p = (x, y)\) 加上字形處理器給的原點與偏移後,會成為

\[ p' = (x_g + \delta_x, y_g + \delta_y) + \lambda p. \]

字型的基準線、寬度與高度度量 所標示的上伸線、基線、下伸線與字幅,皆先以字型單位讀取,再依 \(\lambda\) 映射到排版空間;字形的寬度與深度也在同一座標系統中量測。排版結果的 y 軸向上,第一條基線在 \(y = 0\)。

字幅不等於實際墨跡寬度

排字游標在第 \(i\) 個字形之後的位置為 \(x_{i+1} = x_i + a_i\),其中 \(a_i\) 是該字形的字幅(advance)。輪廓可能伸到原點左側,也可能超過字幅,因此 GlyphKit 同時回傳邏輯範圍 \(L\) 與墨跡範圍 \(I\)。

定義 · 邊界聯集

對非空軸對齊矩形 \(B_j\),聯集的四條邊分別取所有 \(x_{\min},y_{\min}\) 的最小值與 \(x_{\max},y_{\max}\) 的最大值。

如何選擇範圍

對齊、換行與預留空間應使用邏輯範圍;裁切、碰撞與緊密輸出使用墨跡範圍。基線是獨立資料,不該由任一矩形反推。

輸出時才需要換算 DPI

GlyphKit 不決定像素。輸出端以 \(d\) DPI 匯出時,會把 \(q\) 排版點換算成 \(q d / 72\) 像素。這個換算放在排版引擎之外,因此同一份 TextLayout 可供 SVG、PDF、點陣圖與動畫共用。

1.0.0b4 的已知問題

LineLayout 與 TextLayout 的 ink_bounds,是用相對於各字形原點的字形範圍組出來的,所以涵蓋不到由多個字形組成的一行,換行後的行也是錯的。修正之前,請使用邏輯範圍;沒有換行的文字,則自己對 glyph.x + glyph.ink_bounds.x_max 等值取聯集。

留言