ICSharpCode.AvalonEdit.Rendering.BackgroundGeometryBuilder.GetRectsForSegmentImpl C# (CSharp) Method

GetRectsForSegmentImpl() static private method

static private GetRectsForSegmentImpl ( TextView textView, ISegment segment ) : IEnumerable
textView TextView
segment ISegment
return IEnumerable
        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);
                    }
                }
            }
        }