canvas1 = {
const height = 600;
const context = DOM.context2d(width, height, 1);
context.canvas.style.imageRendering = "pixelated";
context.globalCompositeOperation = "copy";
let row1 = context.getImageData(0, 0, width, 1);
for (let i = 0; i < width; ++i) {
const rgba = [(i << 2) + 0, (i << 2) + 1, (i << 2) + 2, (i << 2) + 3];
const dice = Math.floor(Math.random()*3);
row1.data[rgba[3]] = 255;
row1.data[rgba[dice]] = (Math.random() < density) ? 255 : 0;
}
context.putImageData(row1, 0, 0);
let row2 = context.createImageData(width, 1);
for (let j = 1; true; ++j) {
for (let i = 0; i < width; ++i) {
const rgba = [(i << 2) + 0,
(i << 2) + 1,
(i << 2) + 2,
(i << 2) + 3];
row2.data[rgba[0]] = row2.data[rgba[1]] = row2.data[rgba[2]] = 0;
row2.data[rgba[3]] = 255;
const L = BigInt(row1.data[((i > 0 ? i - 1 : width - 1) << 2) + 2]) ? 0b010000n
: BigInt(row1.data[((i > 0 ? i - 1 : width - 1) << 2) + 0]) ? 0b100000n
: BigInt(row1.data[((i > 0 ? i - 1 : width - 1) << 2) + 1]) ? 0b110000n : 0n;
const E = BigInt(row1.data[(i << 2) + 2]) ? 0b000100n
: BigInt(row1.data[(i << 2) + 0]) ? 0b001000n
: BigInt(row1.data[(i << 2) + 1]) ? 0b001100n : 0n;
const R = BigInt(row1.data[((i < width - 1 ? i + 1 : 0) << 2) + 2]) ? 0b000001n
: BigInt(row1.data[((i < width - 1 ? i + 1 : 0) << 2) + 0]) ? 0b000010n
: BigInt(row1.data[((i < width - 1 ? i + 1 : 0) << 2) + 1]) ? 0b000011n : 0n;
const v = matchRule(rules, (L | E | R));
if (v >= 0) row2.data[rgba[valToRGBindex(v)]] = 255;
}
[row1, row2] = [row2, row1];
if (j < height) {
context.putImageData(row2, 0, j);
continue;
}
context.drawImage(context.canvas, 0, -1);
context.putImageData(row2, 0, height - 1);
yield context.canvas;
}
}