我正在尝试使用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的绘图代码很长,我不确定是否会导致问题..我认为它更符合样式...但如果需要,我会发布链接到那来源。
任何人都可以帮助让我的字体看起来不那么大胆吗?
答案 0 :(得分:1)
我已将可可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);
所以现在我的应用程序看起来很棒:)
答案 1 :(得分:0)
实际上,这是您在应用中的上方显示的粗体字体。这是photographic evidence,右边是TextEdit中的Lucida Grande Bold 11。您的应用中较低的一行是添加了人造粗体。
你知道Carbon被弃用了,对吧?