2009-06-19 3 views
2

J'essaie de dessiner dans la police système actuellement sélectionnée en utilisant l'API ATSU dans une application Carbon. Et les polices sortent plus audacieuses que toutes les autres applications natives. Voici un exemple d'écran de ce que je parle:Les polices carbone/cacao sont différentes

http://memecode.com/images/blog/carbon-fonts.png

La ligne supérieure est XCode, et le milieu est mon application avec une police non-gras et le fond est mon application avec une police en gras . J'ai utilisé le même texte pour qu'il soit facile de voir la différence de poids entre eux. Le code que je utilise pour créer les styles que je dessine avec est:

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

Où « Face() » retourne une chaîne C contenant le nom de la police, « PointSize() » retourne un entier contenant la taille point I veulent etc etc. Je suis retreiving ces valeurs avec ce code:

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

et elle retourne valide regardant le visage/informations pointsize, et en fait la police semble correcte à part, il recherche plus audacieux que d'autres applications. Cela peut ne pas sembler une grande différence, mais quand votre application est pleine de texte, cela devient évident. Et mon produit phare est un client de messagerie ... donc beaucoup de texte. Le code de dessin qui crée les mises en page et appelle éventuellement ATSUDrawText est assez long, et je ne suis pas sûr que cela provoque le problème .. Je pense que c'est plus lié au style ... mais si besoin par je posterai un lien à cette source plus tard.

Est-ce que quelqu'un peut aider à rendre mes polices moins audacieuses?

Répondre

1

J'ai converti le code d'exemple de l'ATSU de cacao en carbone et l'ai exécuté avec mon propre code. Il semblait correct alors j'ai affiné ce code et j'ai travaillé différemment. Il s'avère que c'est l'étape initiale de transformer un nom de police dans un ATSUFontID. Évidemment, j'utilise ATSUFindFontFromName qui semble être tout à fait raisonnable, mais il semble différent du reste du système d'exploitation. La chute correcte dans le code de remplacement est:

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

Alors maintenant, mes applications sont à la recherche great :)

0

En fait, c'est la police en gras que vous voyez dans la ligne supérieure de votre application. Voici photographic evidence, avec Lucida Grande Bold 11 dans TextEdit sur la droite. La ligne inférieure de votre application est celle avec faux gras ajouté.

Et vous savez que le carbone est déprécié, non?

+0

Mais je passe en faux que la valeur de la balise kATSUQDBoldfaceTag. Carbone déconseillé? Eh bien, c'est bien ... mais je n'ai pas le temps de réécrire mes applications en ce moment. – fret

Questions connexes