performPaint method

  1. @override
void performPaint(
  1. Buffer buffer,
  2. Offset offset
)
override

Hook for subclasses to implement actual painting.

Implementation

@override
void performPaint(Buffer buffer, Offset offset) {
  final w = widget as BufferWidget;
  final src = w.buffer;
  if (src.width <= 0 || src.height <= 0) return;

  final ox = offset.dx;
  final oy = offset.dy;

  final clip = buffer.activeClip;
  final minX = max(0, clip.left - ox);
  final maxX = min(src.width, clip.right - ox);
  final minY = max(0, clip.top - oy);
  final maxY = min(src.height, clip.bottom - oy);

  if (minX >= maxX || minY >= maxY) return;

  final srcChars = src.characters;
  final srcAttrs = src.attributes;
  final dstChars = buffer.characters;
  final dstAttrs = buffer.attributes;
  final srcWidth = src.width;
  final dstWidth = buffer.width;

  for (int y = minY; y < maxY; y++) {
    final srcRowOffset = y * srcWidth;
    final dstRowOffset = (oy + y) * dstWidth;

    final srcStart = srcRowOffset + minX;
    final srcEnd = srcRowOffset + maxX;
    final dstStart = dstRowOffset + ox + minX;
    final count = maxX - minX;

    dstChars.setRange(dstStart, dstStart + count, srcChars, srcStart);

    final srcAttrStart = srcStart * 3;
    final srcAttrEnd = srcEnd * 3;
    final dstAttrStart = dstStart * 3;
    final attrCount = (srcAttrEnd - srcAttrStart);

    dstAttrs.setRange(
      dstAttrStart,
      dstAttrStart + attrCount,
      srcAttrs,
      srcAttrStart,
    );
  }
}