如何讓 Windows 下所有 DirectWrite 渲染的文字忽略 hinting?

這是 DirectWrite 渲染的網頁截圖(IE11 on Windows 7 x64)

這是去掉 hinting 信息後的效果(把頁面字體從微軟雅黑換成了去掉 hinting 信息的微軟雅黑)

對比兩張圖,可以得出結論:微軟雅黑的 hinting 簡直就是個杯具啊!草字頭變一橫,「字」「宇」分不清,「憂鬱」兩個字擠在一起看得我真是不得不憂鬱……

雖然在我的截圖裡文字顯得有些模糊,但目前就算是 Windows 平台也有高像素密度屏幕的筆記本出現了。顯然,ClearType 這種靠扭曲字形換取清晰銳利的技術是要被時代淘汰的。而微軟就算用 DirectWrite 可以做到雙向反鋸齒(圖2)卻因為那慘無人道的 hinting 導致顯示效果比起 GDI ClearType 沒有獲得任何提升(圖1)

那麼問題來了,能否做到讓 DirectWrite 渲染的文字忽略字體的 hinting 信息?

PS:我試過喪心病狂的乾脆用幹掉了 hinting 信息的微軟雅黑換掉了原字體,但發現系統里很多界面還在用古老的 GDI ClearType,由於沒有縱向反鋸齒,去掉 hinting 信息之後筆畫殘破缺失無法直視……


如果你真要改可以寫個程序做到,我之前試過可以做到「在 directwrite 中讓 gridfit 失效,其他環境中有效」。基本思路是:

  1. 給 cvt 加一條表項,填 0
  2. 寫 GASP,ttfautohint 生成的就可以
  3. 在 prep 中寫一段指令來判斷 rasterizer 所處的環境,主要是利用 GETINFO 指令。這方面 ttfautohint 的代碼是這麼寫的(fontforge 格式):

    PUSHB_2
    3
    0
    WCVTP # 置 cvt #3 為 0。可以用其他的編號
    PUSHB_2
    36
    1
    GETINFO # 讀取 raster 版本信息,選擇子 1,查詢版本
    LTEQ # 如果版本大於等於 36(XP 或更高)
    IF
    PUSHB_1
    64
    GETINFO # 讀取各向異性信息,使用選擇子 64
    IF # 如果有各向異性反鋸齒……
    PUSHB_2
    3
    100
    WCVTP # 置 cvt #3 為 100
    PUSHB_2
    38
    1
    GETINFO
    LTEQ # 再次判斷版本,在版本 38 以上的時候……
    IF
    PUSHW_3
    2176
    1
    1088
    GETINFO # 使用選擇子 1088,這會同時查詢 bit 10 和 bit 6,
    MUL # 返回結果如果是 2176 就表明在 Directwrite 環境
    EQ # 詳細可參閱 http://t.cn/RA6KfAM 230 行
    IF
    PUSHB_2 # 如果返回值相等即將 cvt #3 寫回 0
    3
    0
    WCVTP
    EIF
    EIF
    EIF
    EIF

  4. 給每個字的指令這麼圍一下:

    PUSHB_1
    3
    RCVT
    IF
    &<原來的指令&>
    EIF

完成


DirectWrite開啟縱向抗鋸齒也有一定字型大小限制吧?應該是要大於比如24px才會有抗鋸齒。

對比發現IE11 和 支持DirectWrite的Chrome在渲染微軟雅黑字體時,Chrome是小字型大小也開啟縱向抗鋸齒的,IE11就沒有。

像「禾、斤,壬..."這樣那種非常扁的撇區別就非常明顯。

但是我把所有字體都強制替換成,比如方正等線,之後,任意字型大小下兩個瀏覽器都支持縱向抗鋸齒了。而且目測都沒有Hinting信息。但是兩者的渲染風格還是略有不同,體現在筆畫粗細、輕重等等上面。


使用交流 Windows 10 純 DirectWrite 渲染效果(附字體修改方法)

↑我用這個修改了字體的gasp,DW下任何字型大小都有Y軸抗鋸齒,非DW無影響,效果非常好


我正在做一個模仿 GDI++ 但是支持 DirectWrite 的項目。目前還在消化原來的文(zhu)檔(shi)…大概 2 到 4 周可以出個 demo。


推薦閱讀:

有沒有值得推薦的 ClearType 宋體?
早期 TeX 的字體是否與現在 LaTeX 的不同?
怎樣更換 LaTeX 中的數學字體?
有關英文字體的所謂「支架襯線」和「非支架襯線」該如何理解?
為什麼10號宋體比12號清晰,網頁字體有臨界值?

TAG:字體 | MicrosoftWindows | 字體渲染 | ClearType |