From 5452614b39e8efa1c36610c92b976e50578c868f Mon Sep 17 00:00:00 2001 From: root Date: Thu, 24 Mar 2022 20:26:33 +0000 Subject: [PATCH] added mouse events to canvas --- static/src/canvas.js | 30 ++++++++++++++++++++++++++++++ static/src/index.js | 2 +- static/src/worker.js | 19 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/static/src/canvas.js b/static/src/canvas.js index 58c74b1..1ecc747 100644 --- a/static/src/canvas.js +++ b/static/src/canvas.js @@ -2,6 +2,35 @@ let canvas_element = ""; 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(); @@ -39,6 +68,7 @@ function canvas_process(instr) { canvas_element = document.getElementById("render-target"); ctx = canvas_element.getContext('2d'); update_canvas_data(); + canvas_register_handlers(); break; } diff --git a/static/src/index.js b/static/src/index.js index 6c7e87e..a02789d 100644 --- a/static/src/index.js +++ b/static/src/index.js @@ -4,7 +4,7 @@ let editor_theme = "chrome"; 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'); diff --git a/static/src/worker.js b/static/src/worker.js index 1090777..6902923 100644 --- a/static/src/worker.js +++ b/static/src/worker.js @@ -157,6 +157,25 @@ let import_obj = { 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); + } } }; -- 2.25.1