paint method

  1. @override
void paint(
  1. Buffer buffer,
  2. Rect area,
  3. Style baseStyle
)
override

Performs direct rendering modifications to the relative buffer.

Implementation

@override
void paint(Buffer buffer, Rect area, Style baseStyle) {
  final trigger = triggerPoint;
  if (trigger == null || !isVisible) return;

  final p = progress;
  final W = area.width;
  final H = area.height;
  if (W <= 0 || H <= 0) return;

  // Compensate for 2:1 character cell aspect ratio when computing boundaries
  final corners = [
    const Point<double>(0, 0),
    Point<double>(W - 1.0, 0),
    Point<double>(0, H - 1.0),
    Point<double>(W - 1.0, H - 1.0),
  ];

  double maxDistance = 1.0;
  for (final corner in corners) {
    final dx = corner.x - trigger.x;
    final dy = (corner.y - trigger.y) * 2.0;
    final dist = sqrt(dx * dx + dy * dy);
    if (dist > maxDistance) {
      maxDistance = dist;
    }
  }

  final waveRadius = p * maxDistance;

  for (var y = 0; y < H; y++) {
    for (var x = 0; x < W; x++) {
      final cell = buffer.getCell(x, y);
      if (cell == null) continue;

      final dx = x - trigger.x;
      final dy = (y - trigger.y) * 2.0; // Aspect ratio adjustment
      final d = sqrt(dx * dx + dy * dy);

      if (d <= waveRadius) {
        final radialFactor = (1.0 - (d / (maxDistance * 1.2))).clamp(
          0.0,
          1.0,
        );
        final fadeFactor = radialFactor * (1.0 - p) + p;
        final originalBg =
            cell.style.background ?? baseStyle.background ?? Colors.black;

        final blendedBg = interpolateColor(
          originalBg,
          rippleColor,
          fadeFactor,
        );
        cell.style = cell.style.merge(Style(background: blendedBg));
      }
    }
  }
}