90 lines
2 KiB
JavaScript
90 lines
2 KiB
JavaScript
const original_title = document.title;
|
|
const text_decoder = new TextDecoder();
|
|
const text_encoder = new TextEncoder();
|
|
let log_buf = "";
|
|
|
|
const mach = {
|
|
canvases: [],
|
|
wasm: undefined,
|
|
events: [],
|
|
|
|
init(wasm) {
|
|
this.wasm = wasm;
|
|
},
|
|
|
|
getString(str, len) {
|
|
const memory = mach.wasm.exports.memory.buffer;
|
|
return text_decoder.decode(new Uint8Array(memory, str, len));
|
|
},
|
|
|
|
setString(str, buf) {
|
|
const memory = this.wasm.exports.memory.buffer;
|
|
const strbuf = text_encoder.encode(str);
|
|
const outbuf = new Uint8Array(memory, buf, strbuf.length);
|
|
for (let i = 0; i < strbuf.length; i += 1) {
|
|
outbuf[i] = strbuf[i];
|
|
}
|
|
},
|
|
|
|
machLogWrite(str, len) {
|
|
log_buf += mach.getString(str, len);
|
|
},
|
|
|
|
machLogFlush() {
|
|
console.log(log_buf);
|
|
log_buf = "";
|
|
},
|
|
|
|
machPanic(str, len) {
|
|
throw Error(mach.getString(str, len));
|
|
},
|
|
|
|
machCanvasInit(width, height, id) {
|
|
let canvas = document.createElement("canvas");
|
|
canvas.id = "#mach-canvas-" + mach.canvases.length;
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.tabIndex = 1;
|
|
|
|
mach.setString(canvas.id, id);
|
|
|
|
canvas.addEventListener("contextmenu", (ev) => ev.preventDefault());
|
|
|
|
document.body.appendChild(canvas);
|
|
return mach.canvases.push({ canvas: canvas, title: undefined }) - 1;
|
|
},
|
|
|
|
machCanvasDeinit(canvas) {
|
|
if (mach.canvases[canvas] != undefined) {
|
|
mach.canvases.splice(canvas, 1);
|
|
}
|
|
},
|
|
|
|
machCanvasSetTitle(canvas, title, len) {
|
|
const str = len > 0 ?
|
|
mach.getString(title, len) :
|
|
original_title;
|
|
|
|
mach.canvases[canvas].title = str;
|
|
},
|
|
|
|
machCanvasSetSize(canvas, width, height) {
|
|
const cv = mach.canvases[canvas];
|
|
if (width > 0 && height > 0) {
|
|
cv.canvas.width = width;
|
|
cv.canvas.height = height;
|
|
}
|
|
},
|
|
|
|
machCanvasGetWidth(canvas) {
|
|
const cv = mach.canvases[canvas];
|
|
return cv.canvas.width;
|
|
},
|
|
|
|
machCanvasGetHeight(canvas) {
|
|
const cv = mach.canvases[canvas];
|
|
return cv.canvas.height;
|
|
},
|
|
};
|
|
|
|
export { mach };
|