使用IDWriteTextLayout中的HitTestTextPosition样式API,我无法正确处理像Calibri这样的字体中“ti”、“ffi”或其他连字内部的文本位置。它总是返回在连字之后或之前的位置,而不是内部位置,比如t|i或f|f|i。
使用DirectWrite API在连字内进行插入符移动的推荐方法是什么?
使用IDWriteTextLayout中的HitTestTextPosition样式API,我无法正确处理像Calibri这样的字体中“ti”、“ffi”或其他连字内部的文本位置。它总是返回在连字之后或之前的位置,而不是内部位置,比如t|i或f|f|i。
使用DirectWrite API在连字内进行插入符移动的推荐方法是什么?
IDWriteTextLayout
的最具挑战性的方面在于,访问该运行中对应的 IDWriteFontFace
需要相当的间接性,因为使用的特定 IDWriteFontFace
(在解析字体族名称+WWS+变量字体轴后)存储在布局中,但不可通过任何“getter”API公开访问。你唯一可以提取它们的方式是通过将字形运行绘制到用户定义的 IDWriteTextRenderer
接口中记录所有 DWRITE_GLYPH_RUN::fontFace
,然后可以在代码点上调用 IDWriteFontFace::GetDesignGlyphAdvances
或 IDWriteFontFace::TryGetFontTable
读取 OpenType GDEF table(这很难读取)。这是很多工作,这是因为...
“IDWriteTextLayout”旨在用于显示文本而非编辑。它具有一些用于命中测试的功能,如果您想在段落中显示下划线链接并测试其是否被点击(在这种情况下,连字将在单词内完整),或者如果您想在某些文本周围绘制一些装饰,则这些功能很有用。但它实际上并不是为全面的编辑体验而设计的,这包括插入符导航。实际的文本编辑引擎(例如Word、PowerPoint、OpenOffice等)总是调用较低级别的API,这是它的预期用途。官方的 PadWrite 示例也有同样的问题
A + E
,并且字体具有将其转换为 Ӕ
的连字替换,则启用连字后,在该代码序列中真正存在两个光标位置:|Ӕ
和 Ӕ|
。您无法将光标放置在“中间”,因为没有“中间”;它是一个单一的、原子的、不可分割的元素。ff
、fi
、fl
、ffi
、ffl
或 ſt
这样的 f.
连字,启用 GSUB 后它们就是单个字形。这实际上是应该发生的事情:启用 GSUB 连字意味着您明确地希望文本被呈现为具有原子字形的多对一替换,例如将完整短语“صلى الله عليه وعلى آله وسلم”以及其变体转换为单个字形 ﷺ。f + f + i
,它就不会被转换为 ffi
),则需要禁用具有 liga
OpenType 特性的字体。:)
自动显示为 `` 的情况,这种情况下它也是无用的。 - Jongware