toAnsiString method

String toAnsiString()

Serializes this Buffer grid into an ANSI escape sequence string.

Implementation

String toAnsiString() {
  final sb = StringBuffer();
  final chars = characters;
  final attrs = attributes;
  final w = width;
  final h = height;

  int lastFg = -1;
  int lastBg = -1;

  for (int y = 0; y < h; y++) {
    final rowOffset = y * w;
    for (int x = 0; x < w; x++) {
      final idx = rowOffset + x;
      final char = chars[idx];
      final attrIdx = idx * 3;
      final fg = attrs[attrIdx];
      final bg = attrs[attrIdx + 1];

      if (fg != lastFg) {
        final fgR = (fg >> 16) & 0xFF;
        final fgG = (fg >> 8) & 0xFF;
        final fgB = fg & 0xFF;
        sb.write('\x1B[38;2;');
        sb.write(fgR);
        sb.write(';');
        sb.write(fgG);
        sb.write(';');
        sb.write(fgB);
        sb.write('m');
        lastFg = fg;
      }
      if (bg != lastBg) {
        final bgR = (bg >> 16) & 0xFF;
        final bgG = (bg >> 8) & 0xFF;
        final bgB = bg & 0xFF;
        sb.write('\x1B[48;2;');
        sb.write(bgR);
        sb.write(';');
        sb.write(bgG);
        sb.write(';');
        sb.write(bgB);
        sb.write('m');
        lastBg = bg;
      }
      sb.write(char);
    }
    sb.write('\x1B[0m\n');
    lastFg = -1;
    lastBg = -1;
  }
  return sb.toString();
}