Fonts IDWriteTextLayout使用的默认排版设置是什么?
我想禁用连字,这似乎是默认启用的,至少在我使用的字体(即Calibri)。这样做的方法似乎是使用Fonts IDWriteTextLayout使用的默认排版设置是什么?,fonts,directwrite,Fonts,Directwrite,我想禁用连字,这似乎是默认启用的,至少在我使用的字体(即Calibri)。这样做的方法似乎是使用IDWriteTextLayout::SetTypography将IDWriteTypography对象设置为布局,该布局包含各种与连字相关的字体功能,其值为零以禁用这些功能。这可以禁用连字,但也会影响(禁用)我不想弄乱的其他排版设置,例如字距 经过一些实验,我发现我可以通过设置一个空的IDWriteTypography对象来禁用连字(一个由IDWriteFactory创建的对象,然后应用于布局而不进
IDWriteTextLayout::SetTypography
将IDWriteTypography
对象设置为布局,该布局包含各种与连字相关的字体功能,其值为零以禁用这些功能。这可以禁用连字,但也会影响(禁用)我不想弄乱的其他排版设置,例如字距
经过一些实验,我发现我可以通过设置一个空的IDWriteTypography
对象来禁用连字(一个由IDWriteFactory
创建的对象,然后应用于布局而不进行更改)。空的排版似乎具有将所有可能的字体功能设置为零/禁用的效果。所以我实际上想做的是检索默认的排版设置,覆盖与连字相关的设置,然后将其设置为布局
不幸的是,我找不到任何地方检索默认设置。使用
IDWriteTextLayout::GetTyphography
仅在未设置任何内容时返回null,但在这种情况下,它显然启用了各种排版设置,如连字。在IDWriteFactory
(或其任何较新版本)或任何与字体相关的接口上,我也找不到任何其他方法来创建idwriteypography
实例。当未设置任何IDWriteTypography
时,idwriteextlayout
如何决定使用哪些排版设置?默认设置是否特定于字体?我是否可以以某种方式检索这些设置,以便调整其中一些设置并继承其余设置的默认值?无法从IDWriteTextLayout或IDWriteTextAnalyzer中获得更精确的默认功能集,而且不,它不是特定于字体的,而是特定于脚本的
如果您对它的总体工作方式感兴趣,可以使用诸如HarfBuzz之类的开源实现,您可以找到在成形过程中应用的特定于脚本的特性数组
微软的方法在OpenType文档中有记录,例如阿拉伯语-
这样做的方法似乎是使用IDWriteTextLayout::SetTypography
早在2015年9月13日(您提出此问题的日期),您就能够禁用连字,尤其是Calibri字体,而不会影响IDWriteTypography对象及其默认设置
您可能无法以自己喜欢的方式“全局”禁用连字,但在实际提取代码中某段文本的图示符时,您始终可以选择禁用连字。IDWriteTextAnalyzer::GetGlyph(…)方法的第9、第10和第11个('features'、'FeatureLength'和'featureCount')参数对您有帮助
例如,要禁用连字,可以在代码中编写(我从Windows7 SDK CustomLayout示例的FLowLayout::ShapeGlyprun方法中借用了这一部分,并添加了一些功能参数初始化;最初,第9到第11个参数值为NULL,NULL,0):
fontFeature初始值设定项中的第二个参数(0)禁止在文本范围{textStart,textStart+textLength}中使用连字,无论您在该文本范围中使用什么连字启用字体。非零参数值将启用此功能,但您知道,默认情况下会启用此功能
对于下一段文本(从textStart+textLength开始,然后继续),您可以重新使用初始化的特征值,以继续禁用连字;但是,如果返回GetGlyph第9到第11个功能参数的NULL、NULL、0值,则后一个文本范围的连字将启用,而不使用GetGlyph中的显式功能设置
请参阅参考资料:
到目前为止,一个新的DirectWrite文本引擎可能会提供更方便的方式来控制排版/字体功能的使用——我不能肯定地告诉你,但是上面的信息可能对那些编写与Windows 7兼容的代码的人有所帮助。哦,很好,谢谢你的回答;我正要写一篇关于同一件事的超长论文问题=P,那么如果我想在默认设置的基础上添加排版功能,我是否必须完全放弃在代码中使用IDWriteTextLayout?或者有没有一种方法可以劫持IDWriteTextLayout使用的文本分析器,在给定的文本运行到达IDWriteTextRenderer之前(此时为时已晚)找出它正在使用的脚本?如果我能做到这一点,我肯定可以复制Harfbuzz使用的列表,因为它会给我脚本(续)(但什么列表是字体文件中的“书写系统脚本的零基索引表示法”?),除非这太复杂而无法直接应用,因为IDWriteTextAnalyzer似乎没有告诉您是否是强制连字的时候了?我是否必须放弃DirectWrite,自己编写一个布局引擎?如果我们不能的话,XAML如何能够额外地组合功能呢?(在我看来,XAML似乎使用了D2D+DWrite,但却完成了这两个版本中缺少的所有功能…)我开始不确定明确指定OpenType功能的意义何在。*XAML
下的
,如Oh所示,我还应该提到我需要知道这一点,因为我使用的所有其他布局引擎都会将用户指定的功能列表添加到默认列表中,而不是完全替换默认列表,而且如果不明确关闭每个功能(而且Harfbuzz仍然具有强制覆盖),我无法切换到DirectWrite行为。谢谢谢谢你的回答,这是一个有用的补充。不幸的是,它在我的特殊情况下没有帮助,因为我没有直接使用IDWriteTextAnalyzer
。这是我正在做的较低层次的工作
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;