render method

  1. @override
void render(
  1. Rect area,
  2. Buffer buffer,
  3. RenderContext ctx
)
override

Implementation

@override
void render(Rect area, Buffer buffer, RenderContext ctx) {
  if (area.isEmpty || values.isEmpty) return;
  final style = lineStyle ?? Style(fg: ctx.theme.colors.primary);

  num lo = min ?? values.first;
  num hi = max ?? values.first;
  if (min == null || max == null) {
    for (final v in values) {
      if (v < lo) lo = v;
      if (v > hi) hi = v;
    }
  }
  final span = hi - lo;

  // If values.length > area.width, downsample by averaging buckets.
  final n = area.width;
  final samples = <num>[];
  if (values.length <= n) {
    samples.addAll(values);
  } else {
    for (var i = 0; i < n; i++) {
      final start = (i * values.length / n).floor();
      final end = ((i + 1) * values.length / n).ceil();
      var sum = 0.0;
      var count = 0;
      for (var j = start; j < end && j < values.length; j++) {
        sum += values[j];
        count++;
      }
      samples.add(count == 0 ? 0 : sum / count);
    }
  }

  for (var i = 0; i < samples.length && i < n; i++) {
    final v = samples[i];
    final level = span == 0
        ? _blocks.length ~/ 2
        : ((v - lo) / span * (_blocks.length - 1))
            .round()
            .clamp(0, _blocks.length - 1);
    buffer.setChar(area.x + i, area.y, _blocks[level], style: style);
  }
}