2

我正在尝试使用 Carbon 应用程序中的 ATSU api 绘制当前选择的系统字体。并且字体比所有其他本地应用程序都更大胆。这是我正在谈论的屏幕截图示例:


(来源:memecode.com

最上面一行是 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;
        }
    }
}

其中“Face()”返回一个包含字体名称的 C 字符串,“PointSize()”返回一个包含我想要的点大小等的整数。我正在使用以下代码检索这些值:

Str255 Name;
SInt16 Size;
Style St;
OSStatus e = GetThemeFont(  kThemeSmallSystemFont,
                            smSystemScript,
                            Name,
                            &Size,
                            &St);
if (e) printf("%s:%i - GetThemeFont failed with %i\n", __FILE__, __LINE__, e);
else
{
    Info.Face(p2c(Name));
    Info.PointSize(Size);
    Status = true;
}

它返回有效的外观/点大小信息,实际上字体看起来是正确的,只是它看起来比其他应用程序更粗。它可能看起来没什么大区别,但是当您的整个应用程序充满文本时,它就会变得很明显。我的旗舰产品是一个电子邮件客户端......因此有很多文字。

创建布局并最终调用 ATSUDrawText 的绘图代码很长,我不确定它是否会导致问题..我认为它与样式更相关......但如果需要,我稍后会发布指向该来源的链接.

任何人都可以帮助我的字体看起来不那么粗体吗?

4

2 回答 2

1

我已将 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);

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

于 2009-10-15T21:17:08.373 回答
-1

实际上,这就是您在应用程序的上一行看到的粗体字。这是照片证据,右边是 TextEdit 中的 Lucida Grande Bold 11。您的应用程序中的下一行是添加了人造粗体的行。

而且您知道 Carbon 已被弃用,对吗?

于 2009-06-19T09:45:41.790 回答