2013-07-01 18 views
7

Moje pytanie dotyczy ligature w Glyphs. Jest to przykład w msdn:Jak mogę zaimplementować ligaturę znaków w Glifach?

<!-- "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" 
/> 

nie mogłem znaleźć żadnych szczegółowych dokument wyjaśniający, co się dzieje w nieruchomości indeksów. Kiedy próbuję utworzyć glify z postaciami perskich, powiedzmy, „Od”, otrzymuję

م‌ن 

Zamiast

من 

Więc pytanie brzmi: Jak mogę wdrożyć ligatury znaków w glify?
Nawiasem mówiąc, wiem, że mogę używać FormattedText lub TextFormatter.FormatLine (...) metodę, ale chciałbym wiedzieć, czy istnieje jakiś sposób, aby to zrobić w Glify lub GlyphRun.

Odpowiedz

9

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; } 
} 
+0

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

+0

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

Powiązane problemy