deleteLineArea method

void deleteLineArea(
  1. int y,
  2. int n,
  3. Cell? cell,
  4. Rectangle area,
)

Deletes n lines at y within area (ansi DL semantics).

Upstream: third_party/ultraviolet/buffer.go (DeleteLineArea).

Implementation

void deleteLineArea(int y, int n, Cell? cell, Rectangle area) {
  if (n <= 0 || y < area.minY || y >= area.maxY || y >= height()) return;
  if (n > area.maxY - y) n = area.maxY - y;

  for (var dst = y; dst < area.maxY - n; dst++) {
    final src = dst + n;
    for (var x = area.minX; x < area.maxX; x++) {
      lines[dst].cells[x] = lines[src].cells[x].clone();
    }
    touchLine(area.minX, dst, area.maxX - area.minX);
    touchLine(area.minX, src, area.maxX - area.minX);
  }

  for (var i = area.maxY - n; i < area.maxY; i++) {
    for (var x = area.minX; x < area.maxX; x++) {
      setCell(x, i, cell);
    }
  }
}