From 8b6d4dbf905221fcaa07478ac23fbf87fd8ccd4c Mon Sep 17 00:00:00 2001 From: klemek Date: Sat, 20 Dec 2025 21:03:27 +0100 Subject: [PATCH] fix: async draw --- Makefile | 1 + src/App.vue | 43 +++++++++++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 16c949e..d6fa6bd 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ dev: node_modules ## run dev version of static site lint: node_modules ## lint code @$(BUN) run lint + @$(BUN) run type-check fix: node_modules ## fix and reformat code @$(BUN) run format diff --git a/src/App.vue b/src/App.vue index 78441d9..c36b6a6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -75,12 +75,12 @@ function randomElement(items: T[]): T { function randomize() { centerX.value = Math.random(); centerY.value = Math.random(); - zoom.value = 1 + Math.random() * 3; + zoom.value = 1 + Math.random() * 2; filter.value = randomElement(Object.values(Filter)); paPos.value = randomElement(Object.values(PAPosition)); paScale.value = 0.1 + Math.random() * 0.2; paMargin.value = Math.random() * 0.1; - draw(); + asyncDraw(); } function reset() { @@ -91,7 +91,7 @@ function reset() { paPos.value = PAPosition.BR; paScale.value = 0.2; paMargin.value = 0.05; - draw(); + asyncDraw(); } function newImage() { @@ -128,6 +128,13 @@ function applyFilter( return [r, g, b]; } +const drawTimeout = ref(undefined); + +function asyncDraw() { + clearTimeout(drawTimeout.value); + drawTimeout.value = setTimeout(draw); +} + function draw() { if (!canvas.value) { return; @@ -155,9 +162,9 @@ function draw() { // @ts-expect-error: safer to cast const pixelData = imageData.data as number[]; for (let i = 0; i < pixelData.length; i += 4) { - const r1 = pixelData[i]; - const g1 = pixelData[i + 1]; - const b1 = pixelData[i + 2]; + const r1 = pixelData[i]!; + const g1 = pixelData[i + 1]!; + const b1 = pixelData[i + 2]!; const [r2, g2, b2] = applyFilter(filter.value, r1, g1, b1); @@ -265,7 +272,7 @@ onMounted(() => { min="0" max="1" step="0.01" - @input="draw" + @input="asyncDraw" /> {{ (centerX * 100).toFixed(0) }}% @@ -280,7 +287,7 @@ onMounted(() => { min="0" max="1" step="0.01" - @input="draw" + @input="asyncDraw" /> {{ (centerY * 100).toFixed(0) }}% @@ -293,9 +300,9 @@ onMounted(() => { v-model="zoom" type="range" min="1" - max="4" + max="3" step="0.01" - @input="draw" + @input="asyncDraw" /> {{ (zoom * 100).toFixed(0) }}% @@ -303,7 +310,11 @@ onMounted(() => { -