座標、字型度量與範圍
字型單位與排版縮放
字型以字型單位儲存輪廓。若每 em 有 \(U\) 單位、指定字級為 \(s\),縮放率就是 \(\lambda = s / U\)。字型座標 \(p = (x, y)\) 加上字形處理器給的原點與偏移後,會成為
字型的基準線、寬度與高度度量 所標示的上伸線、基線、下伸線與字幅,皆先以字型單位讀取,再依 \(\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 等值取聯集。