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 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 bgArgb = buffer.getBackground(x, y);
        final originalBg = bgArgb == 0
            ? (baseStyle.background ?? Colors.black)
            : Color.argb(bgArgb);

        final blendedBg = interpolateColor(
          originalBg,
          rippleColor,
          fadeFactor,
        );
        buffer.setAttributes(x, y, bg: blendedBg.argb);
      }
    }
  }
}