2013-07-01 12 views
7

我的問題是關於ligatureGlyphs。有這個例子中msdn如何在字形中實現字符連字?

<!-- "Open file" with "fi" ligature --> 
<Glyphs 
FontUri    = "C:\WINDOWS\Fonts\TIMES.TTF" 
FontRenderingEmSize = "36" 
StyleSimulations = "BoldSimulation" 
UnicodeString  = "Open file" 
Indices    = ";;;;;(2:1)191" 
Fill    = "SlateGray" 
OriginX    = "400" 
OriginY    = "150" 
/> 

我找不到解釋發生了什麼事情在指數財產的任何詳細的文檔。當我嘗試用波斯語字符創建字形,可以說「من」,我得到

م‌ن 

而不是

من 

所以,問題是:如何實現字形字結紮?
順便說一句,我知道我可以使用FormattedTextTextFormatter.FormatLine(...)方法,但我想知道是否有任何方式字形GlyphRun做到這一點。

回答

9

Indices屬性的語法在MSDN的Glyphs.Indices文檔的備註部分進行了說明。

每個字形規範具有以下形式。

[GlyphIndex][,[Advance][,[uOffset][,[vOffset][,[Flags]]]]]

圍繞每個字段中的[]意味着是是可選的。因此,所有字段都是可選的,這意味着字形索引規範可能完全是空的。

該示例中的值";;;;;(2:1)191"由六個這樣的規格組成,它們之間用分號隔開,其中前五個是空的。如果字形索引規範爲空,則WPF將從GlyphTypeface.CharacterToGlyphMap屬性中檢索實際字形索引。

的文檔還說

集羣中的第一個字形的規格是由多少字形和多少碼點組合以 形式羣集一個 規範之前。

這就是前綴(2:1)的含義。它指定源字符串中的兩個字符被一個字形替換。當然,該字形的索引號爲191

字形索引本身就是所選字體中特定字形的索引。在示例中,字體Times.ttf中索引位置191處的fi連字字形(單個字形)。

在你的波斯語字符的例子中,這一切都取決於你使用的字體。您必須對其進行調查才能找到適合這兩個字符的替換字形。將第二個字形替換爲其他字形也許就足夠了,在這種情況下,您可以省略(2:1)規範並只寫出適當的字形索引。


UPDATE:一個非常簡單的工具來檢查所有的字形的字體文件可以這樣寫:

<ListBox ItemsSource="{Binding GlyphItems}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="50"/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 
       <Glyphs FontUri="{Binding FontUri}" Indices="{Binding Indices}" 
         FontRenderingEmSize="36" OriginX="10" OriginY="36" 
         Fill="Black"/> 
       <TextBlock Grid.Column="1" VerticalAlignment="Center" 
          Text="{Binding Indices, StringFormat=Index {0}}"/> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

代碼:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     GlyphItems = new List<object>(); 

     var font = @"C:\WINDOWS\Fonts\TIMES.TTF"; 

     for (int i = 0; i < new GlyphTypeface(new Uri(font)).GlyphCount; i++) 
     { 
      GlyphItems.Add(new { FontUri = font, Indices = i.ToString() }); 
     } 

     DataContext = this; 
    } 

    public List<object> GlyphItems { get; set; } 
} 
+0

感謝您的解釋。其實我的問題是關於如何調查字體來獲取索引。我找不到任何文件。我知道它與一些表格有關,但沒有更多。如果你也解釋了這部分,我將不勝感激(對不起,如果我的問題不是很清楚)。 – Ramin

+0

這似乎是困難的一部分。微軟有一個名爲[VOLT](http://www.microsoft.com/typography/volt.mspx)的工具,但我無法使它加載我的Window 8系統上的字體,儘管它們在那裏。 – Clemens

相關問題