gpt4 book ai didi

c# - 我如何在 Glyphs 中实现字符连字?

转载 作者:太空狗 更新时间:2023-10-29 20:13:48 37 4
gpt4 key购买 nike

我的问题是关于 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"
/>

我找不到任何详细的文档来解释 Indices 属性中发生的事情。当我尝试用波斯字符创建一个字形时,让我们说“من”,我得到

م‌ن

代替

من

所以问题是:如何在 Glyphs 中实现字符连字?
顺便说一句,我知道我可以使用 FormattedTextTextFormatter.FormatLine(...) 方法,但我想知道是否有任何方法可以在GlyphsGlyphRun

最佳答案

Indices 属性的语法在 Glyphs.Indices 的备注部分进行了解释MSDN 中的文档。

Each glyph specification has the following form.

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

每个字段周围的 [] 表示它是可选的。因此所有字段都是可选的,这意味着字形索引规范可能完全是空的。

示例中的值 ";;;;;(2:1)191" 由六个这样的规范组成,用分号分隔,其中前五个为空。如果字形索引规范为空,WPF 会从 GlyphTypeface.CharacterToGlyphMap 属性中检索实际的字形索引。

文档还说

The specification of the first glyph in the cluster is preceded by a specification of how many glyphs and how many code points combine to form the cluster.

这就是前缀 (2:1) 的意思。它指定将源字符串中的两个字符替换为一个字形。当然,该字形的索引为 191

字形索引本身就是所选字体中特定字形的索引。在示例中,它是字体 Times.ttf 中索引位置 191 处的 fi 连字字形(单个字形)。

在您的波斯字符示例中,这完全取决于您使用的字体。您必须调查它以便为这两个字符找到合适的替换字形。将第二个字形替换为其他字形也可能就足够了,在这种情况下,您可以省略 (2:1) 规范并只编写适当的字形索引。


更新:检查字体文件中所有字形的一个非常简单的工具可以这样写:

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

关于c# - 我如何在 Glyphs 中实现字符连字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17398151/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com