paint method

  1. @override
void paint(
  1. PaintingContext context,
  2. Offset offset
)
override

Default paint implementation.

RenderBox paints no self-content; it forwards painting to its RenderBox children. Subclasses override to draw their own content.

Implementation

@override
void paint(PaintingContext context, Offset offset) {
  if (size.width <= 0 || size.height <= 0) return;

  final layout = _layout;
  if (layout == null) return;

  final absoluteX = offset.dx + x;
  final absoluteY = offset.dy + y;
  final availableWidth = size.width;
  final textWidth = layout.maxLineWidth;
  final maxLinesLimit = _maxLinesLimit(layout);
  final linesToRender = math.min(size.height, maxLinesLimit);
  if (linesToRender <= 0) {
    return;
  }

  final paintedLines = math.min(linesToRender, layout.lines.length);
  for (var lineIndex = 0; lineIndex < paintedLines; lineIndex++) {
    final lineWidth = layout.lines[lineIndex].width;
    final shift = _lineShift(lineWidth, availableWidth);
    final textX = math.max(0, shift);
    final sourceLeft = math.max(0, -shift);
    final sourceWidth = math.min(
      lineWidth - sourceLeft,
      availableWidth - textX,
    );
    if (sourceWidth <= 0) {
      continue;
    }
    context.canvas.drawTextLayout(
      layout,
      Offset(absoluteX + textX, absoluteY + lineIndex),
      sourceRect: Rect.fromLTWH(sourceLeft, lineIndex, sourceWidth, 1),
      selection: _selection,
    );
  }

  final needsWidthClip = textWidth > availableWidth;
  final needsHeightClip = layout.lineCount > linesToRender;

  if (_overflow == TextOverflow.ellipsis &&
      (needsWidthClip || needsHeightClip)) {
    final ellipsis = _ellipsisForWidth(availableWidth);
    if (ellipsis.isNotEmpty) {
      final ellipsisLineY = absoluteY + linesToRender - 1;
      final ellipsisX =
          absoluteX + availableWidth - terminalStringWidth(ellipsis);
      _paintEllipsis(context, ellipsisX, ellipsisLineY, ellipsis);
    }
  }
}