1

でグリフを描きたいのですCGContextShowGlyphsAtPositionsが、使用CTRunGetPositionsするとグリフの位置が左から始まります。CTRunGetStatus戻りますが、kCTRunStatusRightToLeft結果は左から右です。テキストを右から左に描画するにはどうすればよいですか?

この言語は左から右ですが、私はアラビア文字を使用しており、アラビア語は右から左の言語であるため、英語の文字は左から右で問題ありません。

4

2 に答える 2

2

グリフは「x」が増加する方向であるため、通常は左から右に描画されるため、位置は左から右になります。を描画するときCGGlyphには、言語はもう重要ではありません。كتبを描画する場合、システムは最初にبを描画するため、その位置が配列の最初になります。

の結果はCTRunGetGlyphsと同じ順序CTRunGetPositionsです。kCTRunStatusRightToLeftグリフの順序は文字列インデックスの順序と厳密に逆であることがわかります。

アラビア語を右から左に描くのに問題はありませんCGContextShowGlyphsAtPositions。どんな問題がありますか?

CFIndex glyphCount = CTRunGetGlyphCount(run);
CGPoint *positions = calloc(glyphCount, sizeof(CGPoint));
CTRunGetPositions(run, CFRangeMake(0, 0), positions);
CGGlyph *glyphs = calloc(glyphCount, sizeof(CGGlyph));
CTRunGetGlyphs(run, CFRangeMake(0, 0), glyphs);
CGContextShowGlyphsAtPositions(context, glyphs, positions, glyphCount);
free(positions);
free(glyphs);
于 2012-08-02T01:16:56.130 に答える
0

tanx Rob これは最後の行についてです。複数行を作成する場合、1 行目または 2 行目は問題ありませんが、最後の行は左に溺れますが、アラビア語では最後の行は右に沈む必要があります。

私のコードは:

while (isLine) {

    CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, self.frame.size.width);
    if (count <= 0) {
        isLine = NO;
        break;
    }
    currentline ++;
    CTLineRef justifyline = CTTypesetterCreateLine(typesetter, CFRangeMake(start, count));
    if (start + count >= lettercount) {

        justifyline = CTTypesetterCreateLine(typesetter, CFRangeMake(start, count)); 
    }
    else {
        CTLineRef line = CTTypesetterCreateLine(typesetter, CFRangeMake(start, count));        
        justifyline = CTLineCreateJustifiedLine(line, 0, self.frame.size.width);
        CFRelease(line);

    }

    CTLineGetTypographicBounds(justifyline, &ascent, &descent, &leading);
    float lineheight = ascent + descent + leading;
    CFArrayRef runArray = CTLineGetGlyphRuns(justifyline);
    for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++)
    {
        // Get FONT for this run
        CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, runIndex);
        CTFontRef runFont = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName);
        //NSLog(@"GlyphCount= %d",(int)CTRunGetGlyphCount(run));
        // for each GLYPH in run
        for (CFIndex runGlyphIndex = 0 ; runGlyphIndex < CTRunGetGlyphCount(run) ; runGlyphIndex++) 
        {
            // get Glyph & Glyph-data


            CFRange thisGlyphRange = CFRangeMake(runGlyphIndex, 1);
            CGGlyph glyph;
            CGPoint position;
            CTRunGetGlyphs(run, thisGlyphRange, &glyph);
            CTRunStatus state = CTRunGetStatus(run);
            if (state == kCTRunStatusRightToLeft) {
                NSLog(@"rtl");
            }
            CTRunGetPositions(run, thisGlyphRange, &position);



            position = CGPointMake(position.x, self.frame.size.height + position.y - (100 * currentline));
            NSLog(@"x %f y %f",position.x,position.y);
            // Render it
            {
                CGFontRef cgFont = CTFontCopyGraphicsFont(runFont, NULL);

                CGAffineTransform textMatrix = CTRunGetTextMatrix(run);
                CGContextSetTextMatrix(context, textMatrix);
                CGContextSetFont(context, cgFont);
                CGContextSetFontSize(context, CTFontGetSize(runFont));
                switch (runGlyphIndex) {
                    case 4:
                        CGContextSetRGBFillColor(context, 1, 0.0, 0.0, 1);
                        break;

                    default:
                        CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1);
                        break;
                }               


                CGContextShowGlyphsAtPositions(context, &glyph, &position, 1);

                CFRelease(cgFont);
            }
        }
        CFRelease(runFont);
    }




    start+=count;


}

グリフをグリフごとに処理したいのですが、グリフが最後の行に表示されると、ページの左側に表示されます。

于 2012-08-02T13:36:38.730 に答える