Pergunta

Eu estou tentando atrair a fonte do sistema atualmente selecionado usando a API ATSU em um aplicativo de carbono. E as fontes estão saindo mais ousado do que todos os outros aplicativos nativos. Aqui está uma imagem de exemplo do que estou falando:


(fonte: memecode.com )

A linha superior é XCode, a do meio é o meu aplicativo usando uma fonte não-negrito e no fundo é meu aplicativo usando uma fonte em negrito. Eu usei o mesmo texto para torná-lo fácil de ver a diferença de peso entre eles. O código que estou usando para criar os estilos que eu desenhar com é:

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;
        }
    }
}

Onde "de rosto ()" retorna uma string C contendo o nome da fonte, "PointSize ()" retorna um inteiro que contém o tamanho ponto que eu quero etc etc. Eu estou retreiving estes valores com este código:

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;
}

E ele retorna procurando informações face / pointsize válida, e de fato os olhares fonte correta além de ele olhar mais ousado do que outros aplicativos. Pode não parecer uma grande diferença, mas quando o seu aplicativo inteiro está cheio de texto chega a ser óbvio. E o meu principal produto é um cliente de e-mail ... portanto, muito texto.

O código de desenho que cria os layouts e, eventualmente, chama ATSUDrawText é bastante longo, e eu não tenho certeza que está causando o problema .. Eu acho que é mais estilo relacionado ... mas se necessidade, eu vou postar um link para essa fonte mais tarde.

alguém pode ajudar começar minhas fontes olhando menos ousada?

Foi útil?

Solução

Eu converti o cacau ATSU exemplo de código ao carbono e correu que, juntamente com o meu próprio código. Parecia correto então eu refinado que o código e trabalhou para fora o que eu estava fazendo de forma diferente. Acontece que ele está nessa fase inicial de transformar um nome de face de fonte em um ATSUFontID. Obviamente, eu estou usando ATSUFindFontFromName que parece ser totalmente razoável, no entanto, parece diferente do resto do sistema operacional. A queda correto no código de substituição é a seguinte:

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

Então, agora meus apps são de grande procura:)

Outras dicas

Na verdade, isso é o negrito da fonte que você está vendo na linha superior em seu aplicativo. Aqui está fotográfico evidência , com Lucida Grande Negrito 11 em TextEdit à direita. A linha inferior em seu aplicativo é que, com falso negrito acrescentado.

E você sabe carbono está obsoleta, certo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top