sfdhanautohint 如何使用?

be5invis/sfdhanautohint · GitHub

從極限到知乎,一直想找到Belleve的sfdhanautohint的正確使用方法,但就是找不到。

請原諒我完全不懂運行什麼腳本啊什麼的。

但是,直觀上的感受還是看得出來的。以思源黑體為例,原版的OTF格式字體,用在Windows電腦上,在沒有其他渲染工具的情況下,實在難看。

利用FontCreator或者FontLab Studio轉換成TTF,依舊難看。

後來看到Belleve利用sfdhanautohint調整過後的字體,幾乎可以媲美眾多其他windows自帶中文字體了。

可是,就是不知道該如何正確使用sfdhanautohint,瞎折騰了半天,連門都沒進去。

——————————————

第1個試驗成品:沒有修改任何參數,做了信黑,效果可喜。

不考慮字體本身設計問題,這顯示效果比微軟自帶雅黑一點都不差。

(電腦解析度:1366*768)

第2個試驗品:參數自己簡單調試了下,但是弄參數太複雜了,基本是照著默認設置來搞的。

這一版測試蘋方字體,中英文分開hint。效果也是相當滿意。

有部分字元不理想,渴求尋找手動完善hint方法


先告訴我你家電腦有多少 CPU

———————————————————————————————————————————

簡單步驟是三步:

extract-features hans.sfd -o features.hgf &<這裡寫參數&>
hgfhint features.hgf -o hints.hgi &<這裡寫參數&>
applyhgi hints.hgi hans.sfd -o hans-out.sfd &<這裡還是寫參數&>

輸入的 hans.sfd 要求是:

  1. 必須包含完整且正確的頂點索引數據。可以通過導出 ttf 再直接另存 sfd 的方法獲得。
  2. 在曲線的頂部和底部必須有 on-curve point。
  3. 只包含漢字
  4. maxp 表的 Max Stack Depth 要大於等於 256

因此推薦的做法是:打開一個帶西文的 ttf 文件(跑過 ttfautohint,處理完西文的),刪掉所有非漢字的字元,然後刪掉全部的 hint 數據,保存 hans.sfd。西文部分則可以單獨存成一個 ttf 文件,之後拼接。

「參數」是最重要的,以手上一個配置文件為例

--UPM=2048 --MIN_STEM_WIDTH=41 --MAX_STEM_WIDTH=185 --MOST_COMMON_STEM_WIDTH=144 --STEM_SIDE_MIN_RISE=82 --STEM_SIDE_MIN_DESCENT=120 --BLUEZONE_WIDTH=31 --BLUEZONE_TOP_CENTER=1685 --BLUEZONE_TOP_LIMIT=1650 --BLUEZONE_TOP_BAR=1610 --BLUEZONE_TOP_DOTBAR=1525 --BLUEZONE_BOTTOM_DOTBAR=-235 --BLUEZONE_BOTTOM_CENTER=-255 --BLUEZONE_BOTTOM_LIMIT=-185 --BLUEZONE_BOTTOM_BAR=-225 --SLOPE_FUZZ=0.06 --Y_FUZZ=15 --gears="[[0,1,1],[20,2,1],[22,2,2]]" --CVT_PADDING=373

絕大多數參數和文字的特徵有關,你值得關心的參數是:

  • 度量相關參數
    • --UPM=2048:曲線頂點坐標的解析度,直接從 sfd 里抄,一般是 1000 或者 2048。
    • --BLUEZONE_WIDTH=31:用於一些高度比較的模糊度,一般為 UPM 的 1/100。
    • --BLUEZONE_TOP_CENTER=1685:垂直筆畫頂部的最大高度,決定文字頂線的位置。
    • --BLUEZONE_BOTTOM_CENTER=-255:垂直筆畫底部最大深度,決定文字底線的位置。
    • --BLUEZONE_TOP_LIMIT=1650:頂部吸附區的下邊緣。縱坐標在這個數值以上的非水平筆畫的頂端將會吸附到文字的頂線。
    • --BLUEZONE_BOTTOM_LIMIT=-185:底部吸附區的上邊緣。縱坐標在這個數值以下的非水平筆畫的底端將會吸附到文字的底線。
    • --BLUEZONE_TOP_BAR=1610:文字中直接出現在「頂部」、上方無其他筆畫的橫的一般高度
    • --BLUEZONE_BOTTOM_BAR=-225:文字中直接出現在「底部」、下方無其他筆畫的橫的一般高度
    • --BLUEZONE_TOP_DOTBAR=1525:文字中出現在「頂部」但上方有其他筆畫的橫(如章)的一般高度
    • --BLUEZONE_BOTTOM_DOTBAR=-235:文字中出現在「底部」但下方有其他筆畫的橫的一般高度
    • --gears="[[0,1,1],[20,2,1],[22,2,2]]":劃寬分配策略。這個數組的每一項是三元組,分別是字型大小、常規劃寬和最小劃寬。如其中 [20,2,1] 表示字型大小從 20 到 21 像素(由表中下一項決定)時,筆畫寬度通常為 2 像素,細的可以降為 1 像素,即使兩側空間足夠。

  • 識別相關參數
    • --MIN_STEM_WIDTH=41:識別筆畫時的最小寬度。
    • --MAX_STEM_WIDTH=185:識別筆畫時的最大寬度。
    • --MOST_COMMON_STEM_WIDTH=144:最常見的筆畫寬度。
    • --STEM_SIDE_MIN_RISE=82:橫向筆畫上邊緣兩側裝飾性形狀的最大高度。這個數值將影響判斷某個橫是否在文字頂部的過程。
    • --STEM_SIDE_MIN_DESCENT=120:橫向筆畫下邊緣兩側裝飾性形狀的最大深度。這個數值將影響判斷某個橫是否在文字底部的過程。
    • --SLOPE_FUZZ=0.06:將傾斜筆畫視作水平的容差
    • --Y_FUZZ=15:將兩段傾斜筆畫視作共線的容差

上面這堆參數請一定要反覆調,尤其是度量各相關參數裡面的那些,對於最終的效果至關重要。當然調十幾個參數是能搞死人的,所以我做了互動式調參工具 paramadj

從命令行啟動後 paramadj:

paramadj hans.sfd -w "示例文字" &<初始參數&>

然後瀏覽器打開 localhost:9527,就可以調整了。頁面最底部會顯示用於各個命令的參數組

(其實圖裡面出現,上面沒提到的那一堆是你不用管的……)處理西文的時候還有一個參數:

  • --CVT_PADDING=373:如果你要做複合字體的話,西文、日文以及其它部分的 cvt 表長度要通過這個參數告訴 sfdhanautohint 的各個組件,避免 cvt 表衝突。對於複合字體,漢字部分和非漢字部分都要使用 applyhgi 處理,保證 cvt 表的內容正確。處理過的 sfd 可以用 fontforge 拼接起來:

    applyhgi hints.hgi hans.sfd -o hans-out.sfd &<參數&>
    applyhgi hints.hgi nonhan.sfd -o nonhan-out.sfd &<參數&>

然後因為 hgfhint 非常耗時(單線程的話處理一個 GBK 字體要三個小時),所以,沒錯,想要並發,玩 mapreduce 是嗎?hgfhint 有兩個額外的參數 -d 和 -m,用來只處理部分條目,生成的 hgi 用 mergehgi 合併

hgfhint features.hgf -o hints0.hgi -d 4 -m 0 &<參數&>
hgfhint features.hgf -o hints1.hgi -d 4 -m 1 &<參數&>
hgfhint features.hgf -o hints2.hgi -d 4 -m 2 &<參數&>
hgfhint features.hgf -o hints3.hgi -d 4 -m 3 &<參數&>
mergehgi -o hints.hgi hints0.hgi hints1.hgi hints2.hgi hints3.hgi

大概就是這樣了。我建議你寫 makefile,用它的 -j 做,Inziu Iosevka 的 makefile 有兩千多行,每次從頭構建是用 -j 54 跑半個小時。

後續版本會更換前端,繞開 sfd,直接讀寫 ttf,簡化工作流。


試試直接讀寫ttx來,不過這東西都是上百M的,很考驗硬體的,知乎可能比較少字體設計師,這方面要涉及書法知識也比較多,例如字框最闊距離,最大字面率、分中設定、字體空間、勾畫、棱形字型、粗度……


推薦閱讀:

推薦搭配宋體的較細襯線西文字體?
Windows 7 中的 SimSun-ExtB 是什麼字體,為何與中易宋體 SimSun 顯示出來不一樣?
哪些字體和設計方案最適合用在名片上?
怎樣提高網頁圖片中的字體渲染質量?
知乎 Logo 的字體是什麼?是否經過變換處理?

TAG:字體 | 字體設計 | 思源黑體 |