-2

このコードはほとんど動作しているようです。実行ごとに出力でき、実行は有効であるように見えますが、グリフを出力するとガベージになります。また、位置はすべて (0,0) にあり、境界が正しく見えません。誰かが私を助けてくれますか?私はこれらのことを正しく行っていないかもしれません.ちなみにこれは単なるサンプルプログラムなので、実行内の実際のデータを見ることができます.

-(void) printRuns:(CTFrameRef)ctframe {
    CFArrayRef lines;
    lines = CTFrameGetLines(ctframe);

    CGPoint origins[CFArrayGetCount(lines)];//the origins of each line at the baseline
    CTFrameGetLineOrigins(ctframe, CFRangeMake(0, 0), origins);

    NSUInteger lineIndex = 0;

    for(int i = 0; i < CFArrayGetCount(lines); i++)
    //for(id lineObj in lines)
    {
        CTLineRef line = CFArrayGetValueAtIndex(lines, i);

        NSLog(@"LineOrigin:%@", NSStringFromCGPoint(origins[i]));

        CFArrayRef runs = CTLineGetGlyphRuns(line);

        for(int j = 0; j < CFArrayGetCount(runs); j++)
        //for(id runObj in (__bridge NSArray*)CTLineGetGlyphRuns(line))
        {
            CTRunRef run = CFArrayGetValueAtIndex(runs, j);
            CFRange runRange = CTRunGetStringRange(run);


            CGRect runBounds;

            CGFloat ascent;//height above the baseline
            CGFloat descent;//height below the baseline
            runBounds.size.width = CTRunGetTypographicBounds(run, runRange, &ascent, &descent, NULL);
            runBounds.size.height = ascent + descent;

            CGFloat xOffset = CTLineGetOffsetForStringIndex(line, CTRunGetStringRange(run).location, NULL);
            runBounds.origin.x = origins[lineIndex].x + 0 + xOffset;
            runBounds.origin.y = origins[lineIndex].y + 0;
            runBounds.origin.y -= descent;

            CGGlyph glyphBuffer[runRange.length];

            CTRunGetGlyphs(run, runRange, glyphBuffer);

            //const CGGlyph *glyphs = CTRunGetGlyphsPtr(run);
            //NSLog(@"Glyph:%c", glyph);

            for(int i = 0; i < runRange.length; i++)
            {
                NSLog(@"Glyph:%c", glyphBuffer[i]);

                if(i % 10 == 0)
                {
                    NSString *test = @"";
                }
            }

            CFIndex glyphCount = CTRunGetGlyphCount(run);
            CGPoint *positions = calloc(glyphCount, sizeof(CGPoint));
            CTRunGetPositions(run, runRange, positions);

            for(int i = 0; i < glyphCount; i++)
            {
                CGPoint *position = &positions[i];
                NSLog(@"Position:%@", NSStringFromCGPoint(*position));
            }


            NSLog(@"%@", NSStringFromCGRect(runBounds));
        }
        lineIndex++;
    }
}
4

1 に答える 1

3

最も可能性の高い問題は、グリフを取得しているフォントと表示しようとしているフォントが異なることです。あるフォントのグリフは別のフォントの同じグリフとは異なる文字を表すことができるため、これは「ガベージ」グリフを説明します (CGGlyph は、フォントの個々のグリフのテーブルへの単なるインデックスであり、異なるフォントはそれらの文字セットをレイアウトできます)。グリフは異なります)。これは、境界ボックスの不一致も説明します。

配置に関しては、代わりに CTFontGetAdvancesForGlyphs を使用してみましたか? 位置データは、現在のグリフの境界ボックスの位置を、実行の開始点ではなく、「カーソル」の現在の配置を基準にして表しているだけだと思います。

最後に、上記のサンプル コードは、1 つの文字が 1 つのグリフにマップされることを前提としています。これは一般的には当てはまりません。英語は合字 (2 つ以上の文字が 1 つのグリフで表される) でタイプセットされることがありますが、多くの言語では至る所に合字があります。CTRunGetGlyphCount() を使用する必要があります。

于 2012-09-14T17:40:14.853 に答える