2

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

そして、有効な外観/ポイントサイズ情報を返します。実際、フォントは他のアプリよりも太く見えることを除けば、正しく見えます。大きな違いのようには見えないかもしれませんが、アプリ全体がテキストでいっぱいになると、それは明らかです。そして、私の主力製品はメール クライアントです。

レイアウトを作成し、最終的に ATSDrawText を呼び出す描画コードは非常に長く、それが問題の原因であるかどうかはわかりません.スタイルに関連していると思います...しかし、必要に応じて後でそのソースへのリンクを投稿します.

フォントの太さを減らすのを手伝ってくれる人はいますか?

4

2 に答える 2

1

cocoa ATSU のサンプル コードをカーボンに変換し、それを自分のコードと一緒に実行しました。それは正しいように見えたので、そのコードを改良し、私が違うことをしていたことを解決しました。これは、フォント フェース名を ATSUFontID に変換する最初の段階であることがわかります。明らかに、私は完全に合理的に見える ATSUFindFontFromName を使用していますが、オペレーティング システムの他の部分とは異なって見えます。置換コードの正しいドロップは次のとおりです。

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

だから今、私のアプリは素晴らしく見えます:)

于 2009-10-15T21:17:08.373 に答える