我想禁用连接,这似乎是默认启用,至少在我正在使用的字体(即卡利)。这样做的方法似乎是使用IDWriteTextLayout::SetTypography将IDWriteTypography对象设置为布局,该布局包含各种与绑定相关的字体功能,其值为零以禁用它们。这可以禁用连接,但它也会影响(禁用)我不想破坏的其他排版设置,比如kerning。
经过一些实验,我可以通过设置一个空的IDWriteTypography对象(一个由IDWriteFactory创建,然后应用到布局中而不作任何更改)来禁用连接。空排版的效果似乎是将所有可能的字体功能设置为零/禁用。所以我真正想做的是检索默认的排版设置,覆盖与连接相关的设置,然后将其设置为布局。
不幸的是,我找不到任何地方来检索默认设置。使用IDWriteTextLayout::GetTypography只返回null,如果没有设置,但是它显然有各种排版设置,比如在这种情况下启用了连接。我也无法在IDWriteFactory (或它的任何更新版本)上找到任何其他方法,也找不到用于创建IDWriteTypography实例的任何与字体相关的接口。当没有设置IDWriteTextLayout时,IDWriteTypography如何决定使用哪些排版设置?默认设置是字体特定的吗?我是否可以以某种方式检索这些设置,以便可以调整其中的几个设置,并为其余的设置继承默认值?
发布于 2016-01-07 17:06:12
没有办法从IDWriteTextLayout中获得默认的特性集,或者更精确地从IDWriteTextAnalyzer获得,而且不,它不是特定于字体的,而是特定于脚本的。
如果您对它的一般工作方式感兴趣,您可以使用开源实现(如HarfBuzz ),您可以找到在成形过程中应用的脚本特定特性数组。
微软的方法在OpenType文档中有记录,这是阿拉伯语- https://www.microsoft.com/typography/OpenTypeDev/arabic/intro.htm的一个例子.
发布于 2018-02-15 06:11:43
这样做的方法似乎是使用IDWriteTextLayout::SetTypography
早在2015年9月13日(您提出这个问题的日期),您就可以禁用连接,特别是对于杯状字体,而不影响IDWriteTypography对象及其默认设置。
您可能无法以您喜欢的方式“全局”禁用连接,但当您实际为代码中的一段文本提取符号时,您始终可以选择禁用连接。IDWriteTextAnalyzer::GetGlyph(.)方法是对你的帮助。
例如,要禁用连接,可以在代码中编写(我从Windows7 SDK CustomLayout示例的FLowLayout::ShapeGlyphRun方法中借用了这段代码,并添加了一些特性参数初始化;最初,第9到第11个参数值为NULL、NULL、0):
DWRITE_FONT_FEATURE fontFeature = { DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES, 0 };
const DWRITE_TYPOGRAPHIC_FEATURES* typoFeatures =
new DWRITE_TYPOGRAPHIC_FEATURES{ { &fontFeature } };
UINT32 featureLengths[1];
featureLengths[0] = textLength;
hr = textAnalyzer->GetGlyphs(
&text_[textStart],
textLength,
fontFace_,
run.isSideways, // isSideways,
(run.bidiLevel & 1), // isRightToLeft
&run.script,
localeName_,
(run.isNumberSubstituted) ? numberSubstitution_ : NULL,
&typoFeatures, // features
featureLengths, // featureLengths
1, // featureCount
maxGlyphCount, // maxGlyphCount
&glyphClusters_[textStart],
&textProps[0],
&glyphIndices_[glyphStart],
&glyphProps[0],
&actualGlyphCount
);
delete typoFeatures;fontFeature初始化器中的第二个参数(0)禁止对文本范围{ textStart,textStart+ textLength}使用连接线,这是在此文本范围内使用的任何启用连接的字体。非零参数值将启用此功能,但正如您所知,默认情况下该功能是启用的。
对于下一段文本(从textStart + textLength开始,继续使用已初始化的功能值,以便继续禁用连接);但是,如果返回为NULL、NULL,则GetGlyph的第9到第11个功能参数的0值将在不使用GetGlyph中的显式功能设置的情况下启用。
参见参考资料:https://msdn.microsoft.com/en-us/library/windows/desktop/dd316625(v=vs.85).aspx。
到目前为止,一个新的DirectWrite文本引擎可能会提供更方便的方法来控制字体/字体功能的使用--我不能肯定地告诉您,但是上面的信息可能对那些编写与Windows 7兼容的代码的人很有帮助。
https://stackoverflow.com/questions/32545675
复制相似问题