Fonts 碳/可可字体看起来不同

Fonts 碳/可可字体看起来不同,fonts,macos-carbon,Fonts,Macos Carbon,我正在尝试在碳应用程序中使用ATSU api绘制当前选择的系统字体。而且字体比其他所有本地应用程序都要粗体。下面是我所说内容的一个屏幕截图示例: (来源:) 顶行是XCode,中间是使用非粗体字体的我的应用程序,底部是使用粗体字体的我的应用程序。我使用了相同的文本,以便很容易看到它们之间的重量差异。我用于创建使用的样式的代码是: if (Face() AND !(e = ATSUCreateStyle(&d->hFont))) { // Lookup ID ATS

我正在尝试在碳应用程序中使用ATSU api绘制当前选择的系统字体。而且字体比其他所有本地应用程序都要粗体。下面是我所说内容的一个屏幕截图示例:


(来源:)

顶行是XCode,中间是使用非粗体字体的我的应用程序,底部是使用粗体字体的我的应用程序。我使用了相同的文本,以便很容易看到它们之间的重量差异。我用于创建使用的样式的代码是:

if (Face() AND !(e = ATSUCreateStyle(&d->hFont)))
{
    // Lookup ID
    ATSUFontID atsuFont = 0;
    e = ATSUFindFontFromName(Face(),
                            strlen(Face()),
                            kFontFamilyName,
                            (FontPlatformCode)kFontNoPlatform,
                            (FontScriptCode)kFontNoScript,
                            (FontLanguageCode)kFontNoLanguage,
                            &atsuFont);
    if (!e)
    {
        Fixed Size;
        Size = PointSize() << 16;
        Boolean IsBold = Bold();
        Boolean IsItalic = Italic();
        Boolean IsUnder = Underline();
        
        // Set style attr
        ATSUAttributeTag Tags[]         = {kATSUFontTag,     kATSUSizeTag, kATSUQDItalicTag, kATSUQDUnderlineTag, kATSUQDBoldfaceTag};
        ATSUAttributeValuePtr Values[]  = {&atsuFont,        &Size,        &IsItalic,        &IsUnder,            &IsBold};
        ByteCount Lengths[]             = {sizeof(atsuFont), sizeof(Size), sizeof(IsItalic), sizeof(IsUnder),     sizeof(IsBold)};
        if (!(e = ATSUSetAttributes(d->hFont,
                                    CountOf(Tags),
                                    Tags,
                                    Lengths,
                                    Values)))
        {
            GDisplayString ds(this, "A");
            d->Height = ds.Y();
            return true;
        }
    }
}
它会返回有效的外观面/点大小信息,事实上,该字体看起来正确,而且比其他应用程序更粗体。这看起来可能没什么大区别,但当你的整个应用程序都充满了文本时,它就变得显而易见了。我的旗舰产品是电子邮件客户端。。。因此有很多文本

创建布局并最终调用ATSUDrawText的绘图代码相当长,我不确定这是否是问题的根源。。我认为它更符合风格。。。但如果需要的话,我会在稍后发布一个链接到该来源


有人能帮我让我的字体看起来不那么粗体吗?

事实上,这就是你在应用程序的上一行看到的粗体字体。这是,右边是文本编辑中的Lucida Grande Bold 11。应用程序中较低的行是添加了faux bold的行


你知道Carbon不受欢迎,对吧?

事实上,这是你在应用程序的上一行看到的粗体字体。这是,右边是文本编辑中的Lucida Grande Bold 11。应用程序中较低的行是添加了faux bold的行


你知道Carbon已经被弃用了,对吧?

我已经将cocoa ATSU示例代码转换为Carbon,并与我自己的代码一起运行。它看起来是正确的,所以我改进了代码,并找出了我所做的不同之处。事实证明,这是将字体名称转换为ATSUFontID的初始阶段。很明显,我使用的是ATSUFindFontFromName,这看起来完全合理,但是它看起来与操作系统的其他部分不同。正确的插入式更换代码为:

CFStringRef fontName = CFStringCreateWithBytes( kCFAllocatorDefault,
                                                (UInt8*)Face(),
                                                strlen(Face()),
                                                kCFStringEncodingUTF8,
                                                false);
ATSFontRef atsFont = ATSFontFindFromName(fontName, kATSOptionFlagsDefault);
CFRelease(fontName);
ATSUFontID font = FMGetFontFromATSFontRef(atsFont);

所以现在我的应用看起来很棒:)

我已经将cocoa ATSU示例代码转换为carbon,并与我自己的代码一起运行。它看起来是正确的,所以我改进了代码,并找出了我所做的不同之处。事实证明,这是将字体名称转换为ATSUFontID的初始阶段。很明显,我使用的是ATSUFindFontFromName,这看起来完全合理,但是它看起来与操作系统的其他部分不同。正确的插入式更换代码为:

CFStringRef fontName = CFStringCreateWithBytes( kCFAllocatorDefault,
                                                (UInt8*)Face(),
                                                strlen(Face()),
                                                kCFStringEncodingUTF8,
                                                false);
ATSFontRef atsFont = ATSFontFindFromName(fontName, kATSOptionFlagsDefault);
CFRelease(fontName);
ATSUFontID font = FMGetFontFromATSFontRef(atsFont);

所以现在我的应用看起来很棒:)

但我将false作为kATSUQDBoldfaceTag标记的值传递。不赞成使用碳?好吧,那很好。。。但是我现在没有时间重写我的应用程序。但是我正在传递false作为kATSUQDBoldfaceTag标记的值。不赞成使用碳?好吧,那很好。。。但我现在没有时间重写我的应用程序。