首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDWriteTextLayout使用的默认排版设置是什么?

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

Stack Overflow用户
提问于 2015-09-13 02:16:05
回答 2查看 473关注 0票数 2

我想禁用连接,这似乎是默认启用,至少在我正在使用的字体(即卡利)。这样做的方法似乎是使用IDWriteTextLayout::SetTypographyIDWriteTypography对象设置为布局,该布局包含各种与绑定相关的字体功能,其值为零以禁用它们。这可以禁用连接,但它也会影响(禁用)我不想破坏的其他排版设置,比如kerning。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-07 17:06:12

没有办法从IDWriteTextLayout中获得默认的特性集,或者更精确地从IDWriteTextAnalyzer获得,而且不,它不是特定于字体的,而是特定于脚本的。

如果您对它的一般工作方式感兴趣,您可以使用开源实现(如HarfBuzz ),您可以找到在成形过程中应用的脚本特定特性数组。

微软的方法在OpenType文档中有记录,这是阿拉伯语- https://www.microsoft.com/typography/OpenTypeDev/arabic/intro.htm的一个例子.

票数 3
EN

Stack Overflow用户

发布于 2018-02-15 06:11:43

这样做的方法似乎是使用IDWriteTextLayout::SetTypography

早在2015年9月13日(您提出这个问题的日期),您就可以禁用连接,特别是对于杯状字体,而不影响IDWriteTypography对象及其默认设置。

您可能无法以您喜欢的方式“全局”禁用连接,但当您实际为代码中的一段文本提取符号时,您始终可以选择禁用连接。IDWriteTextAnalyzer::GetGlyph(.)方法是对你的帮助。

例如,要禁用连接,可以在代码中编写(我从Windows7 SDK CustomLayout示例的FLowLayout::ShapeGlyphRun方法中借用了这段代码,并添加了一些特性参数初始化;最初,第9到第11个参数值为NULL、NULL、0):

代码语言:javascript
复制
    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兼容的代码的人很有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32545675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档