IDWriteTextLayout使用的默认排版设置是什么?

时间:2015-09-13 02:16:05

标签: fonts directwrite

我想禁用似乎默认启用的连字,至少在我正在使用的字体(即Calibri)中。似乎这样做的方法是使用IDWriteTextLayout::SetTypographyIDWriteTypography对象设置为包含各种与连字相关的字体功能的布局,其值为零以禁用它们。这可以禁用连字,但它也会影响(禁用)我不想搞砸的其他排版设置,例如字距调整。

经过一些实验,我发现我可以通过设置一个空的IDWriteTypography对象(一个简单地由IDWriteFactory创建的对象,然后应用于布局而不进行更改)来禁用连字。空排版似乎具有将所有可能的字体功能设置为零/禁用的效果。所以我真正想做的是检索默认的排版设置,覆盖与连字相关的设置,然后将其设置为布局。

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

2 个答案:

答案 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兼容的代码有帮助