我正在尝试使用 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 的绘图代码很长,我不确定它是否会导致问题..我认为它与样式更相关......但如果需要,我稍后会发布指向该来源的链接.
任何人都可以帮助我的字体看起来不那么粗体吗?