render method

void render()

Renders the entire buffer content to the terminal.

Applies ANSI escape codes to set colors and styles per cell, optimizes by grouping cells with identical styles, and manages cursor visibility.

Implementation

void render() {
  hideCursor();
  final buffer = StringBuffer();

  final baseLine = isFullscreen ? 1 : cursorOriginalLine;
  final baseColumn = isFullscreen ? 1 : cursorOriginalColumn;

  int? lastColumnPos, lastLinePos;

  for (int line = 0; line < _screenBuffer.length; line++) {
    BufferCell? lastCell;
    for (int column = 0; column < _screenBuffer[line].length; column++) {
      final curr = _screenBuffer[line][column];
      final prev = _previousFrame[line][column];

      if (_cellEquals(curr, prev)) continue;

      final cursorLine = baseLine + line;
      final cursorColumn = baseColumn + column;
      final shouldCursorMove =
          (cursorLine != lastLinePos) ||
          (cursorColumn != (lastColumnPos ?? -1));
      if (shouldCursorMove) {
        buffer.write('\x1B[$cursorLine;${cursorColumn}H');
        lastLinePos = cursorLine;
        lastColumnPos = cursorColumn;
      }

      if (lastCell == null || !_sameStyle(curr, lastCell)) {
        buffer.write('\x1B[0');
        buffer.write(_ansiCode(curr));
        lastCell = curr;
      }
      buffer.write(curr.char);

      _previousFrame[line][column] = curr.copy();
      lastColumnPos = (lastColumnPos ?? 1) + 1;
    }
  }

  buffer.write('\x1B[0m');
  stdout.write(buffer.toString());
  Logger.trace(_tag, 'RENDERED');
}