generate method
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);
}