2020-07-26 16:06:09 +00:00
|
|
|
const { videoModeBufferView } = require("./video");
|
2021-07-28 03:32:18 +00:00
|
|
|
const BITS = 4;
|
|
|
|
const SCREEN_BUFFER_SIZE = 800 * 600 * BITS; // 32bpp;
|
2020-07-14 19:45:04 +00:00
|
|
|
|
|
|
|
const screenBuffer = new SharedArrayBuffer(SCREEN_BUFFER_SIZE);
|
|
|
|
const screenBufferView = new Uint8Array(screenBuffer);
|
|
|
|
|
2023-03-13 23:06:00 +00:00
|
|
|
let screenWidth = 800;
|
|
|
|
let screenHeight = 600;
|
|
|
|
|
|
|
|
canvas.width = screenWidth;
|
|
|
|
canvas.height = screenHeight;
|
2020-07-14 19:45:04 +00:00
|
|
|
|
2020-07-26 16:06:09 +00:00
|
|
|
const canvasCtx = canvas.getContext("2d");
|
2023-03-13 23:06:00 +00:00
|
|
|
let imageData = canvasCtx.createImageData(screenWidth, screenHeight);
|
2021-07-28 03:32:18 +00:00
|
|
|
|
2023-03-13 23:06:00 +00:00
|
|
|
window.addEventListener("resize", () => {
|
|
|
|
screenHeight = window.innerHeight - 35;
|
|
|
|
screenWidth = Math.floor(screenHeight * (4 / 3));
|
|
|
|
if (window.innerWidth < screenWidth) {
|
|
|
|
screenWidth = window.innerWidth;
|
|
|
|
screenHeight = Math.floor(screenWidth * 0.75);
|
2021-07-28 03:32:18 +00:00
|
|
|
}
|
2023-03-13 23:06:00 +00:00
|
|
|
canvas.width = screenWidth;
|
|
|
|
canvas.height = screenHeight;
|
|
|
|
imageData = canvasCtx.createImageData(screenWidth, screenHeight);
|
2021-07-28 03:32:18 +00:00
|
|
|
});
|
2020-07-14 19:45:04 +00:00
|
|
|
|
2020-07-27 02:01:57 +00:00
|
|
|
let stopDrawing = false;
|
|
|
|
|
2020-07-14 19:45:04 +00:00
|
|
|
function drawScreen() {
|
2020-07-27 02:01:57 +00:00
|
|
|
if (stopDrawing) return;
|
2020-07-14 19:45:04 +00:00
|
|
|
const pixelsRGBA = imageData.data;
|
2023-03-13 23:06:00 +00:00
|
|
|
const numPixels = screenWidth * screenHeight;
|
2020-07-14 19:45:04 +00:00
|
|
|
const expandedFromPalettedMode = videoModeBufferView[3];
|
|
|
|
|
|
|
|
if (expandedFromPalettedMode) {
|
2023-03-13 23:06:00 +00:00
|
|
|
for (let i = 0; i < numPixels; i++) {
|
2020-07-14 19:45:04 +00:00
|
|
|
// palette
|
2021-07-28 03:32:18 +00:00
|
|
|
pixelsRGBA[i * BITS + 0] = screenBufferView[i * BITS + 0];
|
|
|
|
pixelsRGBA[i * BITS + 1] = screenBufferView[i * BITS + 1];
|
|
|
|
pixelsRGBA[i * BITS + 2] = screenBufferView[i * BITS + 2];
|
|
|
|
pixelsRGBA[i * BITS + 3] = 255; // full opacity
|
2020-07-14 19:45:04 +00:00
|
|
|
}
|
|
|
|
} else {
|
2023-03-13 23:06:00 +00:00
|
|
|
for (let i = 0; i < screenHeight; i++) {
|
|
|
|
for (let j = 0; j < screenWidth; j++) {
|
2021-07-28 03:32:18 +00:00
|
|
|
// ARGB
|
2023-03-13 23:06:00 +00:00
|
|
|
const xRatio = 800 / screenWidth;
|
|
|
|
const yRatio = 600 / screenHeight;
|
2021-07-28 03:32:18 +00:00
|
|
|
const px = Math.floor(j * xRatio);
|
|
|
|
const py = Math.floor(i * yRatio);
|
2023-03-13 23:06:00 +00:00
|
|
|
pixelsRGBA[(i * screenWidth + j) * 4 + 0] =
|
|
|
|
screenBufferView[(py * 800 + px) * 4 + 1]; //- lineMult];
|
|
|
|
pixelsRGBA[(i * screenWidth + j) * 4 + 1] =
|
|
|
|
screenBufferView[(py * 800 + px) * 4 + 2]; //- lineMult];
|
|
|
|
pixelsRGBA[(i * screenWidth + j) * 4 + 2] =
|
|
|
|
screenBufferView[(py * 800 + px) * 4 + 3]; //- lineMult];
|
|
|
|
pixelsRGBA[(i * screenWidth + j) * 4 + 3] = 255; // full opacity
|
2021-07-28 03:32:18 +00:00
|
|
|
}
|
2020-07-14 19:45:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
canvasCtx.putImageData(imageData, 0, 0);
|
|
|
|
}
|
|
|
|
|
2020-07-27 02:01:57 +00:00
|
|
|
function setCanvasBlank() {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
stopDrawing = true;
|
|
|
|
const canvas = document.getElementById("canvas");
|
|
|
|
const ctx = canvas.getContext("2d");
|
|
|
|
const bg = new Image();
|
|
|
|
|
|
|
|
// Clear
|
|
|
|
ctx.canvas.width = ctx.canvas.width;
|
|
|
|
|
|
|
|
bg.onload = () => {
|
|
|
|
const pattern = ctx.createPattern(bg, "repeat");
|
|
|
|
ctx.fillStyle = pattern;
|
|
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
|
|
resolve();
|
|
|
|
};
|
|
|
|
bg.src = "images/off_bg.png";
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-07-14 19:45:04 +00:00
|
|
|
module.exports = {
|
|
|
|
screenBuffer,
|
|
|
|
screenBufferView,
|
|
|
|
SCREEN_BUFFER_SIZE,
|
|
|
|
drawScreen,
|
2023-03-13 23:06:00 +00:00
|
|
|
SCREEN_WIDTH: screenWidth,
|
|
|
|
SCREEN_HEIGHT: screenHeight,
|
2020-07-27 02:01:57 +00:00
|
|
|
setCanvasBlank,
|
2020-07-26 16:06:09 +00:00
|
|
|
};
|