Die Syntax der Indices
-Eigenschaft wird im Abschnitt "Hinweise" der Dokumentation Glyphs.Indices in MSDN erläutert.
Jede Glyphenspezifikation hat die folgende Form.
[GlyphIndex][,[Advance][,[uOffset][,[vOffset][,[Flags]]]]]
Die []
um jedes Feld bedeutet, dass ist optional. Daher sind alle Felder optional, was bedeutet, dass eine Glyphenindexspezifikation vollständig leer sein kann.
Der Wert ";;;;;(2:1)191"
im Beispiel besteht aus sechs solchen Spezifikationen, die durch Semikolons getrennt sind, wobei die ersten fünf leer sind. Wenn eine Glyphenindexspezifikation leer ist, ruft WPF den tatsächlichen Glyphenindex aus der Eigenschaft GlyphTypeface.CharacterToGlyphMap
ab.
Die Dokumentation sagt auch
Die Spezifikation der ersten Glyphe in dem Cluster durch eine Angabe, wie viele Glyphen und wie viele Codepunkte zu kombinieren, um Form der Cluster vorangestellt ist.
Dies ist, was das Präfix (2:1)
bedeutet. Es gibt an, dass zwei Zeichen aus der Quellzeichenfolge durch ein Zeichen ersetzt werden. Und natürlich hat diese Glyphe den Index 191
.
Der Glyphenindex selbst ist nur der Index dieses bestimmten Glyphs in der gewählten Schriftart. In dem Beispiel ist es das fi
Ligaturglyph (ein einzelnes Glyph) an der Indexposition 191 in der Schriftart Times.ttf
.
In Ihrem persischen Zeichenbeispiel hängt alles von der Schriftart ab, die Sie verwenden. Sie müssen es untersuchen, um das passende Ersatzzeichen für diese zwei Zeichen zu finden. Es kann auch ausreichend sein, das zweite Glyph einfach durch ein anderes zu ersetzen. In diesem Fall können Sie die (2:1)
Spezifikation weglassen und einfach den entsprechenden Glyph-Index schreiben.
UPDATE: Ein sehr einfaches Werkzeug, um alle Glyphen in einer Font-Datei zu inspizieren kann wie folgt geschrieben werden:
<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>
Code:
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; }
}
Danke für die Erklärung. Meine Frage ist eigentlich, wie ich die Fonts untersuchen kann, um die Indizes zu erhalten. Ich konnte dazu keine Dokumentation finden. Ich weiß, dass es mit einigen Tabellen verwandt ist, aber nicht mehr. Ich wäre Ihnen dankbar, wenn Sie diesen Teil auch erklären würden (Entschuldigung, wenn meine Frage nicht klar ist). – Ramin
Das scheint der schwierige Teil zu sein. Microsoft hat ein Tool namens [VOLT] (http://www.microsoft.com/typography/volt.mspx), aber ich konnte nicht die Schriften auf meinem Windows 8-System laden, obwohl sie da sind. – Clemens