let ctx = null;
let canvas_op_buffer = [];
+let canvas_handlers_registered = false;
+function canvas_register_handlers() {
+ if (canvas_handlers_registered) return;
+
+ canvas_element.addEventListener("mousemove", (e) => {
+ let canvas_data = new Int32Array(canvas_shared_buffer);
+ let box = canvas_element.getBoundingClientRect();
+ let mx = (e.clientX - box.left) * box.width / canvas_element.width;
+ let my = (e.clientY - box.top) * box.height / canvas_element.height;
+
+ Atomics.store(canvas_data, 3, mx);
+ Atomics.store(canvas_data, 4, my);
+ });
+
+ canvas_element.addEventListener("click", (e) => {
+ let canvas_data = new Int32Array(canvas_shared_buffer);
+ let box = canvas_element.getBoundingClientRect();
+ let mx = (e.clientX - box.left) * box.width / canvas_element.width;
+ let my = (e.clientY - box.top) * box.height / canvas_element.height;
+
+ Atomics.store(canvas_data, 3, mx);
+ Atomics.store(canvas_data, 4, my);
+ Atomics.store(canvas_data, 5, 1);
+ Atomics.notify(canvas_data, 5);
+ });
+
+ canvas_handlers_registered = true;
+}
+
function update_canvas_data() {
let canvas_data = new Int32Array(canvas_shared_buffer);
let box = canvas_element.getBoundingClientRect();
canvas_element = document.getElementById("render-target");
ctx = canvas_element.getContext('2d');
update_canvas_data();
+ canvas_register_handlers();
break;
}
let ui_theme = "dark";
let input_shared_buffer = new SharedArrayBuffer(1024 * Uint8Array.BYTES_PER_ELEMENT);
-let canvas_shared_buffer = new SharedArrayBuffer(3 * Int32Array.BYTES_PER_ELEMENT);
+let canvas_shared_buffer = new SharedArrayBuffer(6 * Int32Array.BYTES_PER_ELEMENT);
async function clear_output() {
let elem = document.getElementById('code-result');
stroke_text(textptr, textlen, x, y, max_width) { self.postMessage({ type: 'canvas', data: [ canvas_order_id++, 'stroke_text', S(textptr, textlen), x, y, max_width > 0 ? max_width : null ] }); },
transform(a, b, c, d, e, f) { self.postMessage({ type: 'canvas', data: [ canvas_order_id++, 'transform', a, b, c, d, e, f ] }); },
translate(x, y) { self.postMessage({ type: 'canvas', data: [ canvas_order_id++, 'translate', x, y ] }); },
+
+ mouse_position(outx, outy) {
+ let data = new DataView(wasm_memory.buffer);
+ let canvas_data = new Int32Array(canvas_data_buffer);
+
+ data.setFloat32(outx, Atomics.load(canvas_data, 3), true);
+ data.setFloat32(outy, Atomics.load(canvas_data, 4), true);
+ },
+
+ mouse_get_click(outx, outy) {
+ let data = new DataView(wasm_memory.buffer);
+ let canvas_data = new Int32Array(canvas_data_buffer);
+
+ Atomics.wait(canvas_data, 5, 0);
+ Atomics.store(canvas_data, 5, 0);
+
+ data.setFloat32(outx, Atomics.load(canvas_data, 3), true);
+ data.setFloat32(outy, Atomics.load(canvas_data, 4), true);
+ }
}
};