【问题标题】:How can I implement character ligature in Glyphs?如何在 Glyphs 中实现字符连字?
【发布时间】:2013-07-01 05:51:42
【问题描述】:

我的问题是关于Glyphs 中的ligaturemsdn中有这个例子:

<!-- "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(...) 方法,但我想知道是否有任何方法可以做到这一点字形字形运行

【问题讨论】:

    标签: c# wpf xaml ligature glyphrun


    【解决方案1】:

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

    每个字形规范都有以下形式。

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

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

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

    文档还说

    集群中第一个字形的规范前面有一个 规范多少字形和多少代码点组合到 形成集群。

    这就是前缀(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; }
    }
    

    【讨论】:

    • 感谢您的解释。实际上我的问题是关于如何调查字体以获取索引。我找不到任何关于此的文档。我知道它与某些表有关,但仅此而已。如果您也解释这部分,我将不胜感激(对不起,如果我的问题不是很清楚)。
    • 这似乎是困难的部分。 Microsoft 有一个名为 VOLT 的工具,但我无法让它在我的 Window 8 系统上加载字体,尽管它们在那里。
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 2018-03-12
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多