【问题标题】:Why does Core Text return Myriad Pro Semibold when requesting a bold version of Myriad Pro为什么 Core Text 在请求 Myriad Pro 的粗体版本时返回 Myriad Pro Semibold
【发布时间】:2011-10-13 11:02:42
【问题描述】:

我安装了常用的 Adob​​e Myriad Pro 字体。其中包括 Myriad Pro Regular、Myriad Pro Bold 和 Myriad Pro Semibold。假设我有一个指向 Myriad Pro Regular 的 CTFontRef baseFont,并且我想要的字体大小是 size。我运行以下代码:

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

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

除了请求命名样式“Bold”之外,有没有办法强制它返回 Myriad Pro Bold?我想保持这段代码完全通用,没有硬连线样式名称。

我已经尝试过各种排列方式,包括在我最初创建字体时将粗体特征作为属性字典的一部分传递,避免了此处描述的两步过程,但它仍然返回半粗体字体而不是正常字体大胆的。我也对字体本身进行了一些探索。全粗体字体在其<OS/2> 表中的权重为700,半粗体字体的权重为600。PANOSE 权重与此相对应。但是,半粗体和粗体字体的<head> 表中的macStyle 字段都设置了粗体标志,所以大概这就是Core Text 使用的。但是有没有什么办法让它更有辨别力呢?

【问题讨论】:

    标签: macos fonts core-text opentype ctfont


    【解决方案1】:

    基于对文档的阅读,并得到一些一般字体处理知识的支持,但不是专门针对 Core Text,我认为这可能是可能的,但并不简单。

    CTFontCreateCopyWithSymbolicTraits() documentation 指定symTraitValuesymTraitMask 参数的类型为CTFontSymbolicTraitsCTFontDescriptor() documentation 定义了您用作

    的“粗体”值
    kCTFontBoldTrait = (1 << 1)
    

    所以这显然是一个布尔特征。但是,正如您所见,字体粗细是一个范围,而不是布尔特征,尽管几十年来文字处理器 UI 中的“粗体”按钮已将其呈现为布尔特征。 CTFontCreateCopyWithSymbolicTraits() 没有你需要的表达能力。

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

    因此,您可以将 CTFontDescriptorRef 传递给 Myriad Pro Regular,也可以传递 CFSetRef 表示您想要粗体,然后查看返回数组中的每个字体描述符以找到最重的字体。

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

    【讨论】:

      【解决方案2】:

      对于CTFontDescriptor,您可以指定属性kCTFontTraitsAttribute,它应该是CFDictionaryRef,您可以在其中指定kCTFontWeightTrait,它采用代表-1和1之间的浮点数的CFNumberRef,给您一个权重范围,1 是最粗的变体,0 是常规/中等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        相关资源
        最近更新 更多