generate method

Future<Image> generate()

Generates the identicon as a UI Image

Implementation

Future<ui.Image> generate() async {
  final bytes = utf8.encode(seed);
  final digest = md5.convert(bytes);
  final hashHex = digest.toString();

  final Color useColor =
      (color != null)
          ? color!
          : Color(0xFF000000 | int.parse(hashHex.substring(0, 6), radix: 16));

  const gridSize = 5;
  final cellSize = (size / gridSize).floor();
  final canvasSize = cellSize * gridSize;

  final recorder = ui.PictureRecorder();
  final canvas = ui.Canvas(
    recorder,
    ui.Rect.fromLTWH(0, 0, canvasSize.toDouble(), canvasSize.toDouble()),
  );

  final bgPaint = ui.Paint()..color = const ui.Color(0xFFFFFFFF);
  canvas.drawRect(
    ui.Rect.fromLTWH(0, 0, canvasSize.toDouble(), canvasSize.toDouble()),
    bgPaint,
  );

  final binStr = BigInt.parse('0x${hashHex.substring(6)}').toRadixString(2);
  final hashBinary = binStr.padLeft(15, '0').substring(0, 15);

  if (showGrid) {
    final gridPaint =
        ui.Paint()
          ..color = const ui.Color(0xFFE0E0E0)
          ..strokeWidth = 0.5
          ..style = ui.PaintingStyle.stroke;

    for (int i = 1; i < gridSize; i++) {
      canvas.drawLine(
        ui.Offset(i * cellSize.toDouble(), 0),
        ui.Offset(i * cellSize.toDouble(), canvasSize.toDouble()),
        gridPaint,
      );
      canvas.drawLine(
        ui.Offset(0, i * cellSize.toDouble()),
        ui.Offset(canvasSize.toDouble(), i * cellSize.toDouble()),
        gridPaint,
      );
    }
  }

  final paint = ui.Paint()..color = useColor;

  for (int y = 0; y < gridSize; y++) {
    for (int x = 0; x < (gridSize / 2).ceil(); x++) {
      final idx = y * 3 + x;
      if (idx < 15 && hashBinary[idx] == '1') {
        _drawCell(canvas, x, y, cellSize, paint);

        if (x < 2) {
          final mirrorX = gridSize - 1 - x;
          _drawCell(canvas, mirrorX, y, cellSize, paint);
        }
      }
    }
  }

  final picture = recorder.endRecording();
  return await picture.toImage(canvasSize, canvasSize);
}