Шрифты Carbon/Cocoa выглядят иначе

Я пытаюсь нарисовать текущий выбранный системный шрифт, используя API ATSU в приложении Carbon. И шрифты получаются жирнее, чем во всех других нативных приложениях. Вот пример скриншота того, о чем я говорю:


(источник: 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, довольно длинный, и я не уверен, что это вызывает проблему.. Я думаю, что это больше связано со стилем... но если нужно, я опубликую ссылку на этот источник позже .

Может ли кто-нибудь помочь сделать мои шрифты менее жирными?


person fret    schedule 19.06.2009    source источник


Ответы (2)


Я преобразовал код примера ATSU какао в углерод и запустил его вместе с моим собственным кодом. Это выглядело правильно, поэтому я усовершенствовал этот код и решил, что я делаю по-другому. Оказывается, это начальный этап преобразования названия шрифта в ATSUFontID. Очевидно, я использую ATSUFindFontFromName, что кажется вполне разумным, однако оно выглядит иначе, чем остальная часть операционной системы. Правильный код замены:

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

Так что теперь мои приложения выглядят отлично :)

person fret    schedule 15.10.2009

На самом деле, это жирный шрифт, который вы видите в верхней строке вашего приложения. Вот фотографические доказательства, справа шрифт Lucida Grande Bold 11 в TextEdit. Нижняя строка в вашем приложении — это строка с искусственным полужирным шрифтом.

И вы знаете, что Carbon устарел, верно?

person Peter Hosey    schedule 19.06.2009
comment
Но я передаю false в качестве значения тега kATSUQDBoldfaceTag. Углерод устарел? Ну, это нормально... но у меня сейчас нет времени переписывать свои приложения. - person fret; 19.06.2009