static IEnumerable<Rect> GetRectsForSegmentImpl(TextView textView, ISegment segment)
{
Vector scrollOffset = textView.ScrollOffset;
int segmentStart = segment.Offset;
int segmentEnd = segment.Offset + segment.Length;
if (textView.VisualLinesValid)
{
foreach (VisualLine vl in textView.VisualLines)
{
int vlStartOffset = vl.FirstDocumentLine.Offset;
if (vlStartOffset > segmentEnd)
break;
int vlEndOffset = vl.LastDocumentLine.Offset + vl.LastDocumentLine.Length;
if (vlEndOffset < segmentStart)
continue;
int segmentStartVC;
if (segmentStart < vlStartOffset)
segmentStartVC = 0;
else
segmentStartVC = vl.GetVisualColumn(segmentStart - vlStartOffset);
int segmentEndVC;
if (segmentEnd > vlEndOffset)
segmentEndVC = vl.VisualLength;
else
segmentEndVC = vl.GetVisualColumn(segmentEnd - vlStartOffset);
TextLine lastTextLine = vl.TextLines.Last();
foreach (TextLine line in vl.TextLines)
{
double y = vl.GetTextLineVisualYPosition(line, VisualYPosition.LineTop);
int visualStartCol = vl.GetTextLineVisualStartColumn(line);
int visualEndCol = visualStartCol + line.Length;
if (line != lastTextLine)
visualEndCol -= line.TrailingWhitespaceLength;
if (segmentEndVC < visualStartCol)
break;
if (segmentStartVC > visualEndCol)
continue;
double left = line.GetDistanceFromCharacterHit(new CharacterHit(Math.Max(segmentStartVC, visualStartCol), 0));
double right = line.GetDistanceFromCharacterHit(new CharacterHit(Math.Min(segmentEndVC, visualEndCol), 0));
y -= scrollOffset.Y;
left -= scrollOffset.X;
right -= scrollOffset.X;
yield return new Rect(left, y, right - left, line.Height);
}
}
}
}