2009-06-19 59 views
2

我試圖在Carbon應用程序中使用ATSU api繪製當前選定的系統字體。字體比其他所有原生應用都要大膽。以下是我在談論的一個截圖例子:碳/可可字體看起來不一樣

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

最上面一行是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; 
     } 
    } 
} 

其中,「臉()」返回包含字體名稱的C字符串「的pointsize()」返回包含點大小我的整想等等等等,我retreiving這個值與此代碼:

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

,並返回有效的臉孔/的pointsize信息,而實際上字體看起來正確的除了它看起來比其他應用更大膽。它看起來可能不是很大的差別,但是當你的整個應用程序充滿文本時,它會變得很明顯。而我的旗艦產品是一個電子郵件客戶端...因此很多文字。

創建佈局並最終調用ATSUDrawText的圖形代碼很長,我不確定它是否會導致問題..我認爲它的風格更相關...但如果需要,我會發布鏈接到後來的來源。

誰能幫助讓我的字體看起來越來越大膽?

回答

1

我已經轉換可可ATSU示例代碼碳和跑了沿着自己的代碼。它看起來是正確的,所以我細化了這些代碼,並找出了我所做的不同之處。原來,這是將字體名稱轉換爲ATSUFontID的初始階段。很明顯,我使用的是ATSUFindFontFromName,看起來完全合理,但它與其他操作系統看起來不同。在替換代碼正確的落差:

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

所以,現在我的應用程序正在尋找偉大的:)

0

其實,這是你在你的應用程序上線看到粗體字。這裏是photographic evidence,右邊是TextEdit中的Lucida Grande Bold 11。您的應用中較低的一行是添加了仿粗體。

而且你知道碳被棄用,對不對?

+0

但我傳遞假作爲kATSUQDBoldfaceTag標籤值。 碳棄用?那好吧......但我沒有時間現在重寫我的應用程序。 – fret 2009-06-19 09:56:01

相關問題