Składnię właściwości Indices
wyjaśniono w sekcji Uwagi w dokumentacji MSDN w dokumentacji Glyphs.Indices.
Każda specyfikacja glifu ma następujący kształt.
[GlyphIndex][,[Advance][,[uOffset][,[vOffset][,[Flags]]]]]
[]
wokół każdego pola, oznacza, że jest to opcjonalne. Dlatego wszystkie pola są opcjonalne, co oznacza, że specyfikacja indeksu glifów może być całkowicie pusta.
W tym przykładzie wartość ";;;;;(2:1)191"
składa się z sześciu takich specyfikacji oddzielonych średnikami, przy czym pierwsza piątka z nich jest pusta. W przypadku, gdy specyfikacja indeksu glifów jest pusta, WPF pobiera rzeczywisty indeks glifu z właściwości GlyphTypeface.CharacterToGlyphMap
.
Dokumentacja mówi również
Specyfikacja pierwszej glifów w klastrze jest poprzedzony specyfikacji ile glify i ile punktów kod łączą się formie klastra.
To właśnie oznacza prefiks (2:1)
. Określa, że dwa znaki z łańcucha źródłowego są zastępowane przez jeden glif. I oczywiście ten glif ma indeks 191
.
Sam indeks glifu jest tylko indeksem danego glifu w wybranej czcionce. W tym przykładzie jest to glif z ligatury fi
(pojedynczy glif) w pozycji indeksu 191 w kodzie Times.ttf
.
W twoim perskim przykładzie wszystko zależy od używanej czcionki. Musisz go zbadać, aby znaleźć odpowiedni glif zastępczy dla tych dwóch postaci. Może też wystarczyć zastąpienie drugiego glifu innym, w takim przypadku możesz pominąć specyfikację (2:1)
i napisać odpowiedni indeks glifu.
UPDATE: To bardzo proste narzędzie do wglądu wszystkie glify w pliku czcionki mogą być napisane tak:
<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>
Kod:
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; }
}
Dzięki za wyjaśnienie. Właściwie to moje pytanie dotyczy tego, jak mogę zbadać czcionki, aby uzyskać indeksy. Nie mogłem znaleźć żadnej dokumentacji na ten temat. Wiem, że jest to związane z niektórymi tabelami, ale nic więcej. Będę wdzięczny za wyjaśnienie tej części (przepraszam, jeśli moje pytanie nie jest zbyt jasne). – Ramin
To wydaje się być trudną częścią. Microsoft ma narzędzie o nazwie [VOLT] (http://www.microsoft.com/typography/volt.mspx), ale nie mogę go załadować czcionek w moim systemie Windows 8, chociaż są tam. – Clemens