我想禁用似乎默认启用的连字,至少在我正在使用的字体(即Calibri)中。似乎这样做的方法是使用IDWriteTextLayout::SetTypography
将IDWriteTypography
对象设置为包含各种与连字相关的字体功能的布局,其值为零以禁用它们。这可以禁用连字,但它也会影响(禁用)我不想搞砸的其他排版设置,例如字距调整。
经过一些实验,我发现我可以通过设置一个空的IDWriteTypography
对象(一个简单地由IDWriteFactory
创建的对象,然后应用于布局而不进行更改)来禁用连字。空排版似乎具有将所有可能的字体功能设置为零/禁用的效果。所以我真正想做的是检索默认的排版设置,覆盖与连字相关的设置,然后将其设置为布局。
不幸的是我找不到任何地方来检索默认设置。使用IDWriteTextLayout::GetTypography
只返回null,如果没有设置,但它显然有各种排版设置,例如在这种情况下启用了连字。我也找不到IDWriteFactory
(或其任何新版本)或任何与字体相关的接口来创建IDWriteTypography
实例的任何其他方法。如果没有设置IDWriteTextLayout
,IDWriteTypography
如何决定使用哪种排版设置?默认设置是否特定于字体?我可以以某种方式检索这些设置,以便我可以调整其中的一些并继承其余的默认值吗?
答案 0 :(得分:3)
无法从IDWriteTextLayout或IDWriteTextAnalyzer中获取默认的功能集更精确,不,它不是特定于字体的,而是特定于脚本的。
如果您对它的工作原理感兴趣,可以使用像HarfBuzz这样的开源实现,您可以找到在整形过程中应用的脚本特定功能的数组。
Microsoft的方法记录在OpenType文档中,这是阿拉伯语的一个示例 - https://www.microsoft.com/typography/OpenTypeDev/arabic/intro.htm。
答案 1 :(得分:1)
看来,这样做的方法是使用IDWriteTextLayout :: SetTypography
早在2015年9月13日(您提出此问题的日期),您就可以禁用连字,尤其是Calibri字体,而不会弄乱IDWriteTypography对象及其默认设置。
您可能无法在全球范围内禁用连字和#34;以您喜欢的方式,但是当您实际为代码中的一段文本提取字形时,您总是可以选择禁用连字。 IDWriteTextAnalyzer :: GetGlyph(...)方法的第9个,第10个和第11个(' feature',' featureLengths'和' featureCount')参数是给你的帮助
例如,要禁用连字,请在代码中写入(我从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开始,再继续),您可以重新使用初始化的特征值,以便继续禁用连字;但是,如果返回到GetGlyph的第9到第11个特征参数的NULL,NULL,0值,则在不使用GetGlyph中的显式特征设置的情况下启用后一文本范围的连字。
参见参考:https://msdn.microsoft.com/en-us/library/windows/desktop/dd316625(v=vs.85).aspx。
截至目前,新的DirectWrite文本引擎可能会提供更方便的方法来控制印刷/字体功能的使用 - 我无法确切地告诉您,但上述信息可能对编写与Windows 7兼容的代码有帮助