1. 程式人生 > >Freetype-On Slight Hinting, Proper Text Rendering, Stem Darkening and LCD Filters

Freetype-On Slight Hinting, Proper Text Rendering, Stem Darkening and LCD Filters

On Slight Hinting, Proper Text Rendering, Stem Darkening and LCD Filters

本文最初是為FreeType的2.6.2版本編寫的,並解釋了幾個功能的技術背景。 這些資訊被認為足夠有用,可以新增到文件中,因此已經重新命名。

FreeType 2.6.2為渲染庫的使用者和開發人員提供了三個有趣的細節,用於處理文字。

  • (S)light hinting invokes the native hinter if possible
  • Experimental:Stem darkening for the auto-hinter
    • Background
    • Back to stem darkening
  • Disabled stem darkening for the autohinter and Adobe’s CFF (.otf) engine
  • The default LCD filter for subpixel rendering has been changed

(S)light hinting invokes the native hinter if possible

在過去,通過FontConfig或配置GUI設定“slight”提示意味著忽略了字型中的原生提示; FreeType的自動隱藏功能可以動態分析字型並自動完成字型設計師至少需要半手動完成的操作。從技術上講,設定為(s)光的自動hinter僅將字形垂直捕捉到畫素網格,就像Adobe的專有字型引擎一樣,並且在某種程度上也是Microsoft的ClearType / DirectWrite。結果是設計保真度和清晰度之間的折衷,保留了字形間距,這對於水平文字非常重要,例如您現在正在閱讀的內容。通過“亞畫素渲染”(Windows上的ClearType),利用現代但低解析度LCD面板的物理特性,通常可以提高清晰度。

到目前為止,這很好用,Ubuntu多年來一直使用這種設定為每種字型。 Werner Lemberg正在增加對越來越多指令碼的支援,並將程式碼分解為ttfautohint,以幫助字型設計師減輕手動提示的痛苦。

這也意味著字型驅動程式的原生提示機器未被使用。從歷史上看,這個決定是合理的,因為Postscript(.pfa,.pfb),TrueType(.ttf)和OpenType / CFF(.otf)的原生提示機制是最長時間的低位。 PostScript hinter仍然存在,但是Adobe的高質量OpenType / CFF引擎為FreeType和TrueType驅動程式的最新進展做出了貢獻,使其完全支援ClearType,事情發生了變化。

設定’slight’提示通常會導致FT_LOAD_TARGET_LIGHT。此模式隱含了之前的自動隱藏,現在已更改為“如果驅動程式和字型支援它,則使用原生垂直網格捕捉,否則使用垂直網格自動隱藏”。目前,僅支援OpenType / CFF驅動程式。在未來,一旦完全支援ClearType到來,這將有望包括TrueType引擎。從技術上講,ClearType字型可以並將根據幾個細節捕捉垂直和水平網格,但最終結果是我們想要的方向。

這個決定是出於個人的心血來潮;如果字型驅動程式和字型支援它,我想要原生垂直網格擬合,否則我想要自動隱藏。我假設原生提示更加謹慎,並且(自動提示)猜測工作已經完成。而不是在FontConfig中引入每格式配置並且僅支援僅支援單個全域性提示設定的GTK / GNOME,發現在FreeType中更改淡出提示的定義更有意義。

我也希望這一改變能讓非Windows和Apple生態系統更容易切換到預設的輕微提示。預設情況下,當前的完整/中等本機提示往往會帶來許多很多字型中最糟糕的情況,例如,許多字型沒有看到與螢幕顯示相同的瘋狂奉獻和暗示許多流行的Microsoft字型。由於ClearType仍未得到完全支援,因此您的預設體驗通常很差。正如Ubuntu多年來已經證明的那樣,輕微的暗示提供了更好的暗示。

Experimental: Stem darkening for the auto-hinter

這裡寫圖片描述

莖變暗使較小尺寸的字形更加壯觀,使其在普通的低DPI螢幕上更具可讀性。如果你覺得這聽起來很熟悉,那是因為Adobe的CFF引擎自2013年貢獻以來一直在這樣做。您可能已經注意到,像GNOME 3的預設UI字型Cantarell的OpenType / CFF字型(通常為字尾.otf)看起來更大膽,更模糊。其他字型,至少在此版本之前。自動hinter現在可以做同樣的事情,它預設只是禁用。

但是,如果小字形已經相當可讀,為什麼要這樣做呢?事實證明,Linux生態系統中的字型呈現是錯誤的,因為可擴充套件字型被引入其中。必須使用線性Alpha混合和伽馬校正來渲染文字,即使Qt5和Skia(由谷歌瀏覽器和其他瀏覽器使用)可以執行此操作,預設情況下X11上也沒有工具包或渲染庫。

background

首先,要了解為什麼需要它們,您必須知道當FreeType輸出灰度字形影象時,它確實輸出了覆蓋點陣圖。如果畫素被填充的輪廓完全覆蓋,則畫素被製成100%黑色(0%亮度,其為黑色)。如果畫素僅覆蓋50%,則畫素為50%黑色(50%亮度或中間灰度),0%覆蓋表示0%黑色(100%亮度或白色)。在智慧手機和平板電腦等高DPI螢幕上,畫素非常小,完全覆蓋的可能性非常大,因此非常好。在低DPI螢幕上,我們大多數人都很遺憾,情況有所不同。畫素對於字形的大多數細節來說太大而灰度陰影是常態而不是例外。

這是相關的,因為我們所有的螢幕都有第二個問題:它們不是線性的。 1 + 1不是2.兩倍的值不會導致亮度的兩倍。當一個畫素僅覆蓋50%時,覆蓋圖表示50%黑色,當您使用每通道8位(0-255)時,這會轉換為128的畫素值。但是,對於我們的sRGB和gamma 2.2螢幕上的畫素,這並沒有轉化為50%的亮度。由於它們的非線性,它們在黑暗中停留的時間更長,只有約186的畫素值導致50%的亮度 - 在明亮和黑暗的背景下,128最終都會變暗。最終的結果是,深色文字在明亮的背景上顯得粗糙,畫素和斑點,在深色背景上明亮的文字太脆弱,彩色背景上的彩色文字(例如,綠色上的紅色)似乎有黑暗的光暈或“汙垢”周圍。對於像對數字’w’這樣的對角線幹,情況尤其難看,其中FreeType的抗鋸齒質量取決於正確的灰色顯示。在高DPI螢幕上,較小的全黑畫素佔據了至高無上的地位,這無關緊要,但在具有所有灰色陰影的低DPI螢幕上,確實如此。 0%和100%的亮度線上性和非線性空間中是相同的,只是中間的所有陰影都不是。

在表面上渲染字形影象的正確方法是將其線上性空間中將其混合到表面上,然後應用伽馬校正將線性覆蓋圖轉換為對我們的螢幕正確的內容.1 Linux生態系統中沒有工具包可用預設情況下,即使Qt5和Skia可以並且將在其他平臺上執行此操作。 Windows和Mac OS X本機完成。如果字形應該是亞畫素渲染(ClearType和Mac OS X),並且顏色條紋儘可能少,則此過程尤其重要。

Back to stem darkening

假設我們正確地渲染字型。 伽瑪校正基本上使字型變亮,因為灰度陰影被移動到更高的畫素值(對應於更高的亮度)以使初始意圖與我們的螢幕的真實性相匹配。 副作用是渲染錯誤但相當可讀的字形突然變薄。 正確呈現但難以閱讀的文字並不能幫助任何人。 因此,Mac OS X和Adobe專有的字型引擎實現了一種對策:在灰色陰影占主導地位的較小尺寸上變暗。 通過相對於其畫素大小稍微增加字形,單個畫素獲得更高的填充輪廓覆蓋範圍,因此更黑。 這會增加對比度並防止字形變薄。 文字在較小的尺寸下仍然可讀。

這裡寫圖片描述

“Gamma 1.0”顯示當您從FreeType中獲取灰度覆蓋點陣圖並將其混合到線性空間中的表面時會發生什麼。 黑白色比白色黑色重,而綠色紅色則有黑色光暈或周圍的汙垢。 請注意,在X11上沒有渲染系統進行線性alpha混合的意義上,這張圖片是不現實的,所以想象一下更糟糕的事情。 “Gamma 1.8”是線性alpha混合和伽馬校正的結果。 它好多了,但是文字變得更糟,使得閱讀更難。 新增幹變黑使我們進入“Gamma 1.8,變暗”。 請注意它是如何最乾淨的渲染。 “Gamma 1.0,變暗”,意味著線性alpha混合沒有伽馬校正,但幹變暗,誇大了“Gamma 1.0”的效果。 只有在進行伽馬校正時才能啟用幹變暗,因此理想情況下應始終進行。

這裡寫圖片描述

autohinter有一個新的可切換的幹變黑屬性,就像Adobe的CFF引擎中的幹暗調器一樣。請注意它如何使文字稍微大膽地使用預設引數,直到小畫素大小。 Gamma校正可用於演示文字的細化,尤其是在具有大量灰色畫素的較小畫素大小的情況下。

這就是這個功能背後的故事。 對於autohinter和Adobe的CFF(.otf)引擎,禁用幹變暗

沒有庫支援X11上開箱即用的線性alpha混合和伽馬校正。開啟幹變暗導致重型和模糊的字形,如上面的“Gamma 1.0,變暗”,所以最好禁用它。

Qt5實際上在短時間內啟用了伽馬校正,直到有人抱怨文字太輕並且與其他工具包中的渲染不同,因此維護人員為XCB後端禁用了它。 Skia(Chrome)可以進行伽馬校正,但X11會將其關閉。

我認為autohinter幹變暗作為技術預覽,直到我們在FreeType中獲得幹暗化通用。計劃是為所有字型驅動程式提供它,並使其與FT_Library_SetLcdFilter一樣可以按FT_Library進行切換。支援線性alpha混合和gamma校正的庫只需翻轉開關並獲得適當的字形,無論字型如何。

預設情況下禁用所有幹變暗的顯著副作用是本機暗示的.otf字型將呈現與自動隱藏非常相似並且不再沉重和模糊。輕微提示將導致一致的字型渲染。

The default LCD filter for subpixel rendering has been changed

這裡寫圖片描述

當您檢視亞畫素渲染文字時,無論是在某種Unix,Windows還是Mac OS X上,您都可能會注意到它略帶顏色。在LCD面板上使用子畫素渲染是一種權衡;你在畫素子條紋(通常是水平RGB)的方向上獲得三倍高的解析度,以換取顏色偽影,也稱為彩色條紋。出於這個原因,有必要過濾子畫素渲染的字形以減少這些顏色條紋,然後將其放在螢幕上的某個位置。濾鏡將子畫素的值分配給其鄰居,犧牲一些較高的解析度並使得到的字形影象變得模糊,但定位改進仍然存在!適合您的理想濾鏡取決於您的螢幕(伽馬曲線),渲染系統的功能(線性Alpha混合和伽馬校正),您的視覺和您的品味,可能依次為您。

濾波器應該具有兩個屬性:它應該被歸一化,這意味著濾波器中使用的值應該總和為比喻1(這裡:0x100或256)並且它應該是顏色平衡的,這意味著一個子畫素的值是均勻分佈的對畫素的所有其他子畫素犧牲一些較高解析度以大幅減少彩色條紋。

以前,FreeType的預設LCD濾鏡既沒有標準化也沒有色彩平衡。這是一個慎重的選擇,因為在類Unix作業系統上仍然沒有渲染系統預設情況下進行線性alpha混合和伽馬校正以正確渲染字形。超過1的濾波器總和稍微增加了對比度,代價是輕微的扭曲和增加的彩色邊緣,因此這可以被視為黑客。您可能已經注意到,計算機上顯示文字的各個位置的縮圖可能非常豐富多彩。現在你知道為什麼了。

新的預設過濾器都是標準化和顏色平衡的。它確實比以前的預設設定稍微模糊一些,但也缺乏其粗糙度,並且不那麼喜歡顏色。模糊性還意味著對非理想螢幕伽瑪(視角)和渲染系統的更高容忍度,而沒有線性α混合。請注意,當渲染系統執行文字的線性Alpha混合時,只能真正最小化顏色條紋。

長時間伴隨預設值的’light’過濾器保持不變:它已經標準化並且顏色平衡。它比預設螢幕更清晰,但對沒有線性alpha混合的未校準螢幕和渲染系統的容忍度較低,產生更多的彩色條紋。