首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在字形中实现字符连接?

如何在字形中实现字符连接?
EN

Stack Overflow用户
提问于 2013-07-01 05:51:42
回答 1查看 1.8K关注 0票数 8

我的问题是关于ligature in Glyphs的。在msdn中有这样的例子:

代码语言:javascript
复制
<!-- "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属性中发生了什么。当我试图创建一个波斯字符的符号时,让我说"من",我得到

代码语言:javascript
复制
م‌ن

而不是

代码语言:javascript
复制
من

因此,问题是:我如何在字形中实现字符结扎?

顺便说一句,我知道我可以使用FormattedText或TextFormatter.FormatLine(.)方法,但我想知道是否有任何方法可以在象形文字或GlyphRun中做到这一点。

EN

回答 1

Stack Overflow用户

发布于 2013-08-02 13:22:17

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

每个字形规范都有以下形式。 [GlyphIndex][,[Advance][,[uOffset][,[vOffset][,[Flags]]]]]

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

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

文件上还说

在集群中的第一个字形规范之前有一个规范,说明了有多少个象形文字和多少个代码点组合在一起形成了集群。

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

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

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

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

代码语言:javascript
复制
<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>

代码:

代码语言:javascript
复制
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; }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17398151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档