function tilePermutations(tile) {
const {height, width, at} = tile;
const size = Math.max(height, width), s = size - 1;
const perms = [ ];
for(const flip of [
([i,j]) => [i,j],
([i,j]) => [j,i]
]) {
for(const rotate of [
([i,j]) => [i,j],
([i,j]) => [j,s-i],
([i,j]) => [s-i,s-j],
([i,j]) => [s-j,i]
]) {
let values = new Uint8Array(size * size);
for(let i=0; i < height; ++i) {
for(let j=0; j < width; ++j) {
if(tile.at(i,j)) {
const [i2,j2] = flip(rotate([i,j]));
values[i2*size + j2] = 1;
}
}
}
const perm = new PixelData(size, size, values.slice()).squeezed();
let isNew = true;
for(const old of perms) if(perm.isEqualTo(old)) {
isNew = false;
break;
}
if(isNew) perms.push(perm);
}
}
return perms;
}