关于字体:IDWriteTextLayout使用的默认字体设置是什么?

What are the default typography settings used by IDWriteTextLayout?

我想禁用连字,至少在我使用的字体(即Calibri)中,默认情况下似乎已启用连字。看来,执行此操作的方法是使用IDWriteTextLayout::SetTypographyIDWriteTypography对象设置为包含各种与连字相关的字体特征(值为零)的布局,以禁用它们。这样可以禁用连字,但也会影响(禁用)我不想弄乱的其他排版设置,例如字距调整。

经过一些试验,结果证明我可以仅通过设置一个空的IDWriteTypography对象(一个由IDWriteFactory简单创建然后直接应用于布局而无需更改的对象)来禁用连字。空字体似乎具有将所有可能的字体功能设置为零/禁用的效果。所以我实际上想要做的是获取默认的版式设置,覆盖与连字相关的设置,然后将其设置为布局。

很遗憾,我找不到任何地方可以检索默认设置。如果未设置IDWriteTextLayout::GetTypography,则使用IDWriteTextLayout::GetTypography只会返回null,但显然可以在这种情况下启用各种印刷设置,例如连字。我也找不到IDWriteFactory(或其任何较新版本)上的任何其他方法,也没有在创建IDWriteTypography实例的字体相关的接口上找到任何其他方法。 IDWriteTextLayout如何在未设置IDWriteTypography的情况下决定使用哪种版式设置?默认设置是否特定于字体?我可以以某种方式检索这些设置,以便调整其中一些设置并继承其余设置的默认值吗?


无法从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兼容的代码的人有所帮助。