为什么Core Text会在请求Myriad Pro的大胆版本时返回Myriad Pro Semibold

时间:2011-07-26 14:03:53

标签: macos fonts core-text opentype ctfont

我安装了常见的Adobe Myriad Pro字体。其中包括Myriad Pro Regular,Myriad Pro Bold和Myriad Pro Semibold。假设我有CTFontRef baseFont指向Myriad Pro Regular,我想要的字体大小是size。我运行以下代码:

CTFontRef boldFont = CTFontCreateCopyWithSymbolicTraits(baseFont, size, NULL, kCTFontBoldTrait, kCTFontBoldTrait);

返回的字体是Myriad Pro Semibold,而不是Myriad Pro Bold。

除了要求命名风格'Bold'之外,有没有办法强迫它返回Myriad Pro Bold?我希望在没有硬连线样式名称的情况下保持此代码完全通用。

我已经尝试了各种排列,包括在我最初创建字体时将粗体特征作为属性字典的一部分传递,避免了这里描述的两步过程,但它仍然优先于正常情况返回半字体字体胆大。我还略微调整了字体本身。完整粗体字体在<OS/2>表中的权重为700,而半粗体字体的权重为600. PANOSE权重与此对应。但是,半框架的macStyle表格中的<head>字段和粗体字体都设置了粗体标记,因此可能是Core Text正在使用的。但有没有办法让它更具辨别力?

2 个答案:

答案 0 :(得分:0)

基于对文档的阅读,通过一般字体处理的一些知识而不是核心文本的专门支持,我会说这可能是可能的,但这并不简单。

CTFontCreateCopyWithSymbolicTraits() documentation指定symTraitValuesymTraitMask参数的类型为CTFontSymbolicTraitsCTFontDescriptor() documentation定义您正在使用的“粗体”值

kCTFontBoldTrait = (1 << 1)

所以这显然是一个布尔特征。但是,正如您所见,字体权重是一种频谱,而不是布尔特征,即使字处理器UI中数十年的“粗体”按钮已将其表示为布尔特征。 CTFontCreateCopyWithSymbolicTraits()没有你需要的表现力。

可能有效的另一种方法是尝试调用CTFontDescriptorCreateMatchingFontDescriptors()。您将此函数CTFontDescriptorRef传递给初始字体,并将CFSetRef传递给必须存在的属性。此函数返回一个字体描述符数组,所有这些都与您请求的属性相匹配。

所以,你可以为Myriad Pro Regular传递一个CTFontDescriptorRef,也许是CFSetRef说你想要加粗,然后查看返回数组中的每个字体描述符以查找带有最重的。

我没有写过这段代码,而我对Core Text的无知意味着我可能会遗漏一些东西,但这似乎是一种似是而非的方法。

答案 1 :(得分:0)

对于CTFontDescriptor,您可以指定属性kCTFontTraitsAttribute,该属性应为CFDictionaryRef,您可以在其中指定kCTFontWeightTrait,其中CFNumberRef代表浮动介于-1和1之间,为您提供一系列权重,1为最大胆的变体,0为常规/中等。