What are the default typography settings used by IDWriteTextLayout?
我想禁用连字,至少在我使用的字体(即Calibri)中,默认情况下似乎已启用连字。看来,执行此操作的方法是使用
经过一些试验,结果证明我可以仅通过设置一个空的
很遗憾,我找不到任何地方可以检索默认设置。如果未设置
无法从IDWriteTextLayout或IDWriteTextAnalyzer中获取默认功能集来更精确,而且不,它不是特定于字体的,而是特定于脚本的。
如果您对它的总体运行方式感兴趣,则可以使用HarfBuzz之类的开源实现,可以找到在整形过程中应用的特定于脚本的功能的数组。
OpenType文档(阿拉伯语示例)中记录了Microsoft的方法-https://www.microsoft.com/typography/OpenTypeDev/arabic/intro.htm。
It appears that the way to do this is to use IDWriteTextLayout::SetTypography
早在2015年9月13日(提出这个问题的日期),您就可以禁用连字,特别是对于Calibri字体,而无需弄乱IDWriteTypography对象及其默认设置。
您可能无法以自己喜欢的方式禁用"全局"连字,但是当您在代码中实际提取一段文字的字形时,您始终可以选择禁用连字。 IDWriteTextAnalyzer :: GetGlyph(...)方法的第9个,第10个和第11个(\\'features \\',\\'featureLengths \\'和\\'featureCount \\')参数对您有帮助。
例如,要禁用连字,请编写代码(我从Windows7 SDK CustomLayout示例的FLowLayout :: ShapeGlyphRun方法中借用了这段代码,并添加了一些功能参数初始化;最初,第9到第11个参数值为NULL ,NULL,0):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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开始,并进一步),您可以重新使用已初始化的特征值,以便继续禁用连字;但是,如果返回到GetGlyph的第9到第11个功能参数的NULL,NULL,0值,则启用后一个文本范围的连字,而无需使用GetGlyph中的显式功能设置。
请参阅参考资料:https://msdn.microsoft.com/zh-cn/library/windows/desktop/dd316625(v=vs.85).aspx。
到目前为止,新的DirectWrite文本引擎可能会提供更便捷的方式来控制印刷/字体功能的使用-我不能肯定地告诉您,但是以上信息可能对那些编写与Windows 7兼容的代码的人有所帮助。