從 Windows 8 開始,DirectWrite 提供一些功能,可讓您控制基本的印刷樣式、版面配置和間距功能,例如字元間距、配對字距和對齊。
字元間距
字元間距,也稱為「追蹤」,是文本中字元之間的間距。
以下是追蹤的範例。 第一行不會對文字套用任何追蹤。 第二行會增加字元間距,而第三行會減少字元間距。
從 Windows 8 開始,DirectWrite 在這裡新增這些方法來控制文字中的字元間距。
如果您使用 DirectWrite 版面配置,您可以使用 IDWriteTextLayout1::GetCharacterSpacing 方法和 IDWriteTextLayout1::SetCharacterSpacing 方法。
使用 GetCharacterSpacing 方法來判斷目前的字元間距,並傳回目前字元的間距、字元前後的間距、最小進階寬度,以及包含剩餘文字開始位置和長度資訊的 DWRITE_TEXT_RANGE 結構。
在 DWriteTextLayout1 介面上使用 SetCharacterSpacing,將您自己的字元間距套用至版面配置中的文字。 SetCharacterSpacing 方法會接受字元前後所需的空間量、允許的最小進位,以及定義要套用間距範圍的 DWRITE_TEXT_RANGE。
如果您使用自定義版面配置,DirectWrite 支援使用 IDWriteTextAnalyzer1::ApplyCharacterSpacing設定字符間距。 如果您需要自定義文字版面配置,才能進階控制您的版面配置,請使用此方法。 這個方法可讓您提供 ApplyCharacterSpacing 與前導和尾隨間距、最小前進寬度、簇地圖的長度、字形數量、字元範圍到字形的對應,以及使用自定義版面配置時,每個字形的前進寬度。 方法會傳回修改過的字形進展,並傳回包含每個字形原點新位移的 DWRITE_GLYPH_OFFSET 列舉。
字距調整
字距調整是指在字母對或字母組之間進行的內容間距調整。 字元集之間的特定間距可以增加可讀性,讓文字看起來更好。 字距(kerning)和字符間距之間的重要差異在於,字符間距對其所分隔的文字不加區分,而字距是在字型中定義的特定字元組合之間使用的。
她的圖像是一個刻字形的範例。 上面的AVATAR一詞已經過字距調整,使單字看起來更自然。 如您在字元周圍的紅色方塊中所看到的,前四個字母之間套用的間距比較大,而結尾上的 R 在前面還有更多的空間。 不含字距的原始文字位於第二行。 此範例中的字距調整讓文字更易於閱讀且更加自然。
字元在字型的字偶之間推進,這些字偶的字元間距儲存在 kern 資料表中,DirectWrite 解析該資料表,並透過 kerning API 將資訊傳回給您。
如果您想要知道字型是否支援配對字距調整,您可以使用 IDWriteFontFace1::HasKerningPairs 方法。 如果字型支援 kerning 配對,這個方法會傳回 bool 值 1。
IDWriteFontFace1 也有一種方法,可讓您存取字元索引的 kerning 配對調整。 GetKerningPairAdjustments 可讓您輸入字形索引的陣列,DirectWrite 傳回字形前進調整的陣列。 如果字型不支援 kern 表格,此方法會傳回字元前移調整的零。
如果您使用 DirectWrite 版面配置,則在 IDWriteTextLayout1 介面上,有兩種方法可以讓您設定字偶距調整(配對 kerning),並進一步瞭解版面配置中的字偶距調整。 SetPairKerning 方法會採用布林值,表示是否要啟用成對字距調整,以及定義要套用的文字範圍的 DWRITE_TEXT_RANGE。 如果您想要瞭解是否在文字範圍上啟用配對 Kerning,您可以使用 GetPairKerning 方法,此方法會採用目前的位置,並傳回對應至是否啟用配對 Kerning 的 bool,以及 Kerning 設定所套用的文字範圍。
理由
齊行是一個對齊文字的過程,藉由增加字元或字形叢集之間的間距,或加入齊行字元,以填滿欄內的所有空間。 一般而言,這可藉由判斷空間需要新增至文字行的位置,以及在這些中斷的機會中插入間距字元來完成。 在拉丁字母系統中,這些間距元素可能不同,其透過增加元素之間的進階寬度來對齊文字;而在阿拉伯文中,文字是使用卡什達(kashida)來對齊的。 以下是阿拉伯字母和拉丁字母的範例,它們都有對齊和未對齊的樣式。
從 Windows 8 開始,DirectWrite 有一些方法可讓您為應用程式中的文字辯護。
DWRITE_TEXT_ALIGNMENT 列舉中有新增的值。 您可以使用 SetTextAlignment 方法,並傳入 DWRITE_TEXT_ALIGNMENT_JUSTIFIED 常數,然後 DirectWrite 將文字對齊,並插入適當的對齊符號以適應腳本。
如果您正在使用自定義版面配置,您可以使用多種方法來充分利用對齊功能。 DirectWrite 在 IDWriteTextAnalyzer1 介面上有三種方法,可用來將理由新增至自定義版面配置。
第一種方法是 GetJustificationOpportunities,它會接受您想要填齊的文字,並傳回一個 DWRITE_JUSTIFICATION_OPPORTUNITY 結構,概述可以新增填齊字元以填齊文字的位置。
第二個函式是 JustifyGlyphAdvances,這可讓字形進位的陣列,使其符合行寬。 這個方法會採用 GetJustificationOpportunities 產生的 DWRITE_JUSTIFICATION_OPPORTUNITY 結構、字形進度和字形偏移。 然後,它會產生對齊圖像前進,以及包含對齊圖像位移的 DWRITE_GLYPH_OFFSET 列舉。
第三個函式是 GetJustifiedGlyphs,它會填入複雜腳本的新圖像,其中理由增加了字元的進步。 GetJustifiedGlyphs 只有在腳本具有由 getScriptProperties 傳回的特定理由字元時,才需要呼叫 。 這個方法會接收字型、文字長度、字形的em大小、文字腳本、字形數量、叢集映射、原始字形推進/偏移、對齊後的字形推進/偏移和字形屬性的相關信息。 方法會傳回實際的字元計數、更新的叢集對應、已更新的字元索引,以及插入的理由字元、更新的字元位移,以及更新的字元前移。