在現代生活裏,咱們幾乎天天都會和屏幕上的文字打交道——文字看起來是如此平凡,以致於很多與 UI 相關的專業人士都對其下的複雜性知之甚少。這個系列旨在以開發者的角度,介紹一些從文字的二進制數據到像素之間流程的科普知識,但願對感興趣的同窗能有一些啓發。html
喜歡折騰系統的同窗,對於常見的字體格式確定不會陌生:Windows 系統長久以來,在 C:\Windows\Fonts
裏面就放着一大堆 TTF 格式的字體文件。相應地,在 macOS 的 /Library/Fonts
目錄裏,也有一堆字體:不過這裏除了 TTF 以外,還有後綴名爲 TTC 和 OTF 的格式。它們又有什麼關係呢?前端
有個有趣的問題,那就是爲何 TTF 格式字體在 macOS 和 Windows 上都能通用呢?這裏其實藏着一段微軟與蘋果的 py 交易史:在 80 年代,Adobe 開發出了基於矢量的私有字體格式 Type 1,以及打印語言 PostScript(在 PDF 格式裏就能看到)。矢量字體比起當時的點陣字體,那妥妥的就是步兵和騎兵的區別啊:git
Adobe 雖然活好,但因爲一些非技術因素(錢)的問題,蘋果和微軟決定另起爐竈。蘋果開發出了矢量字體標準 TrueType,而微軟則開發出了 PostScript 的替代品 TrueImage。這兩項技術雖然在 Mac 和 Windows 之間互相受權,但真正落地成爲事實標準的只有蘋果搞的 TrueType,這對應的就是 TTF 字體格式了。github
知道了 TTF 表明着 TrueType Font 以後,其它的格式均可以觸類旁通地推出來:編程
固然了,光知道後綴名,跟精通 Java/C++ 的拼寫沒啥區別。咱們不妨來看看,字體文件的裏面都藏着些什麼呢?數據結構
不少字體格式的規範文檔中,都會強調字體文件是由表構成的。喵喵喵?這裏說的表是 Excel 那樣的表格嗎?打開一個 TTF 格式的字體文件,你的第一印象恐怕和表格很難沾上邊:app
說好的幾行幾列呢?不過,表格暗示着一種相對規整的數據結構。眼尖的同窗也許已經注意到了,上面的數據最右一列都是一組四個字母的合集。這並不是偶然,依據的是 TTF 格式的規範。工具
在繼續介紹它們的具體含義以前,咱們不妨考慮這樣的一個問題:怎麼樣爲設計一種符合下面這些需求的數據格式呢?字體
如今應用層開發中流行的 JSON 格式,光是在體積儘可能小這一項上就會被首先幹掉。而 TTF 規範則給出了一種在設計數據格式規範時,可供參考的工程實踐:設計
讓咱們來看看這種設計是如何解決上面的這些需求的吧:
舉個簡單的例子就能說明二進制數據結構的緊湊性。例如,在表達字體是否爲粗體、斜體、等寬等元數據的時候,JSON 格式對每一個狀態,都須要約定好一個形如 xxx: true
的字段,這至少須要五個字節。而基於位運算的約定,在一個字節的 8 位中就能夠保存 8 個這樣 true|false
的布爾類型變量,每每還留有冗餘。在須要區分存儲不一樣精度數據的時候,它也有着得天獨厚的優點。因此說,在須要構建專有的數據結構的時候,TTF 這種表驅動的設計仍是有必定的參考價值的。另外,在解析這樣的二進制格式的時候,傳統命令式編程的控制流也會至關趁手:別被社區裏浮躁的聲音淹沒了,學好真正適用於不一樣場景的技術吧。
回到最初的話題,字體裏面存儲着哪些表達不一樣內容的表呢?這裏推薦 Typr.js 這個很是簡單的 Web 工具,能夠點開即用,大概是這樣:
看到了解析出的各個表內容了嗎?它們之中就存儲着從二進制比特到屏幕像素的關鍵信息。暫時到此爲止,咱們介紹了字體文件的格式與解析它的基本方式。但怎樣基於字形數據來渲染出文字呢?讓咱們下一篇見吧(若是有的話)
P.S.1 若是但願對字體的數據結構有更進一步的瞭解,這篇科普性的文章是遠遠不夠的,不妨從這篇正式的 TrueType Reference Manual 文檔開始吧。注意,這篇蘋果的文檔一開頭就甩出了個到微軟官網的連接,這在其餘場合恐怕很難看到了……
P.S.2 咱們的前端團隊很是歡迎有志於對「渲染」這件事追根究底的同窗,感興趣請郵件 xuebi at gaoding.com 哈