import 'dart:math' as math; import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/services.dart'; class Bitmap { // This idiosyncratic usage of "bitmap" comes from some other technology. // What I'm saying is "don't blame me" final math.Rectangle rect; final List data; Bitmap(this.rect, this.data) { assert(this.data.length == this.rect.width * this.rect.height); } static Future> load(String name, T Function(int) cb) async { final assetImageByteData = await rootBundle.load(name); final codec = await ui.instantiateImageCodec(assetImageByteData.buffer.asUint8List()); final image = (await codec.getNextFrame()).image; final bytedata = (await image.toByteData(format: ui.ImageByteFormat.rawStraightRgba))!; final sx = image.width; final sy = image.height; final List data = []; for (var i = 0; i < sx * sy; i++) { var pixel = bytedata.getUint32(i * 4, Endian.big); data.add(cb(pixel)); } return Bitmap(math.Rectangle(0, 0, sx, sy), data); } T? get(int x, int y) { var realX = x - rect.top; var realY = y - rect.left; if (realX < 0 || realY < 0 || realX > rect.width || realY > rect.height) { return null; } return data[realY * rect.width + realX]; } }