@@ -706,26 +706,34 @@ - (void)drawRect:(NSRect)rect
706
706
707
707
__block NSMutableString *lineString = nil ;
708
708
__block CGFloat lineStringStart = 0 ;
709
+ __block CFRange lineStringRange;
709
710
__block GridCell lastStringCell;
710
711
void (^flushLineString)() = ^{
711
712
if (!lineString.length )
712
713
return ;
713
- CTLineRef line = [self lineForCharacterString: lineString textFlags: lastStringCell.textFlags];
714
- CGFloat width = cellSize.width * (lastStringCell.textFlags & DRAW_WIDE ? 2 : 1 );
714
+ CGPoint positionsByIndex[lineString.length];
715
+ for (size_t i = 0 , stringIndex = 0 ; i < lineStringRange.length ; i++) {
716
+ GridCell cell = *grid_cell (&grid, r, lineStringRange.location + i);
717
+ size_t cell_length = cell.string .length ;
718
+ for (size_t j = 0 ; j < cell_length; j++)
719
+ positionsByIndex[stringIndex++] = CGPointMake (i * cellSize.width , 0 );
720
+ if (cell.textFlags & DRAW_WIDE)
721
+ i++;
722
+ }
715
723
CGContextSetFillColor (ctx, COMPONENTS (lastStringCell.fg ));
716
724
CGContextSetTextPosition (ctx, lineStringStart, rowRect.origin .y + fontDescent);
717
725
CGContextSetBlendMode (ctx, kCGBlendModeNormal );
726
+ CTLineRef line = [self lineForCharacterString: lineString textFlags: lastStringCell.textFlags];
718
727
for (id obj in (NSArray *)CTLineGetGlyphRuns (line)) {
719
728
CTRunRef run = (CTRunRef)obj;
720
729
CFIndex glyphCount = CTRunGetGlyphCount (run);
721
730
CFIndex indices[glyphCount];
722
731
CGPoint positions[glyphCount];
723
732
CGGlyph glyphs[glyphCount];
724
733
CTRunGetStringIndices (run, CFRangeMake (0 , 0 ), indices);
725
- CTRunGetPositions (run, CFRangeMake (0 , 0 ), positions);
726
734
CTRunGetGlyphs (run, CFRangeMake (0 , 0 ), glyphs);
727
735
for (CFIndex i = 0 ; i < glyphCount; i++)
728
- positions[i]. x = indices[i] * width ;
736
+ positions[i] = positionsByIndex[ indices[i]] ;
729
737
CTFontRef font = CFDictionaryGetValue (CTRunGetAttributes (run), kCTFontAttributeName );
730
738
CTFontDrawGlyphs (font, glyphs, positions, glyphCount, ctx);
731
739
}
@@ -735,10 +743,8 @@ - (void)drawRect:(NSRect)rect
735
743
for (size_t c = 0 ; c < grid.cols ; c++) {
736
744
GridCell cell = *grid_cell (&grid, r, c);
737
745
CGRect cellRect = {{rowRect.origin .x + cellSize.width * c, rowRect.origin .y }, cellSize};
738
- if (cell.textFlags & DRAW_WIDE) {
746
+ if (cell.textFlags & DRAW_WIDE)
739
747
cellRect.size .width *= 2 ;
740
- c++;
741
- }
742
748
if (cell.inverted ) {
743
749
cell.bg ^= 0xFFFFFF ;
744
750
cell.fg ^= 0xFFFFFF ;
@@ -793,13 +799,18 @@ - (void)drawRect:(NSRect)rect
793
799
flushLineString ();
794
800
if (!lineString)
795
801
lineString = [[NSMutableString alloc ] init ];
796
- if (!lineString.length )
802
+ if (!lineString.length ) {
797
803
lineStringStart = cellRect.origin .x ;
804
+ lineStringRange = CFRangeMake (c, 1 );
805
+ }
798
806
[lineString appendString: cell.string];
807
+ lineStringRange.length = c - lineStringRange.location + 1 ;
799
808
lastStringCell = cell;
800
809
} else {
801
810
flushLineString ();
802
811
}
812
+ if (cell.textFlags & DRAW_WIDE)
813
+ c++;
803
814
}
804
815
flushLineString ();
805
816
[lineString release ];
0 commit comments