in libs/game/background.ts [95:140]
render(offsetX: number, offsetY: number) {
const w = screen.width;
const h = screen.height;
const pw = this.img.width;
const ph = this.img.height;
if (!pw || !ph) return; // empty image.
// left, top aligned
let rx = -offsetX;
let ry = -offsetY;
switch (this.alignX) {
case BackgroundAlignment.Right: rx -= (w + pw); break;
case BackgroundAlignment.Center: rx -= (w + pw) >> 1; break;
}
switch (this.alignY) {
case BackgroundAlignment.Bottom: ry -= (h + ph); break;
case BackgroundAlignment.Center: ry -= (h + ph) >> 1; break;
}
rx %= w; if (rx < 0) rx += w;
ry %= h; if (ry < 0) ry += h;
// avoid subpixel aliasing
rx = Math.floor(rx);
ry = Math.floor(ry);
let y = 0;
let py = 0;
while (y < h) {
py = y % ph;
let dh = Math.min(ph - py, h - ry);
let x = 0;
let rxl = rx;
while (x < w) {
let px = x % pw;
let dw = Math.min(pw - px, w - rxl);
screen.drawImage(this.img, rxl, ry);
rxl = (rxl + dw) % w;
x += this.repeatX ? dw : w;
}
ry = (ry + dh) % h;
y += this.repeatY ? dh : h;
}
}