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');
}