{ "version": 3, "sources": ["../src/index.js"], "sourcesContent": ["'use strict'\n\nconst DPR = window.devicePixelRatio\n\nconst controlPanel = document.getElementById('control-panel')\n\nconst playBtn = document.getElementById('play-btn')\nconst resetBtn = document.getElementById('reset-btn')\nconst stepInput = document.getElementById('step-input')\nconst startFnsBtn = document.getElementById('start-fns-btn')\nconst changeFnsBtn = document.getElementById('change-fns-btn')\nconst startImageInput = document.getElementById('start-image-input')\n\nconst infoCanvas = document.getElementById('info-canvas')\nconst sceneCanvas = document.getElementById('scene-canvas')\nconst surfaceCanvas = document.getElementById('surface-canvas')\n\nconst startFnsModal = document.getElementById('start-fns-modal')\nconst changeFnsModal = document.getElementById('change-fns-modal')\nconst closeStartFnsModalBtn = startFnsModal.querySelector('.close-btn')\nconst closeChangeFnsModalBtn = changeFnsModal.querySelector('.close-btn')\n\nconst rStartFnInput = document.getElementById('rstartfn')\nconst gStartFnInput = document.getElementById('gstartfn')\nconst bStartFnInput = document.getElementById('bstartfn')\n\nconst rChangeFnInput = document.getElementById('rchangefn')\nconst gChangeFnInput = document.getElementById('gchangefn')\nconst bChangeFnInput = document.getElementById('bchangefn')\n\nlet imageData\nlet file\nlet left\nlet playing = false\nlet sceneCtx\nlet showingModal = false\nlet step = 1\nlet surfaceCtx\nlet top\n\nconst infoCtx = infoCanvas.getContext('2d')\ninfoCtx.font = '1em Cousine, monospace'\n\nconst setCanvasDimensions = () => {\n const rect = sceneCanvas.getBoundingClientRect()\n\n left = Math.round(rect.left)\n top = Math.round(rect.top)\n\n sceneCanvas.width = rect.width * DPR\n sceneCanvas.height = rect.height * DPR\n\n surfaceCanvas.width = rect.width * DPR\n surfaceCanvas.height = rect.height * DPR\n\n sceneCtx = sceneCanvas.getContext('2d')\n surfaceCtx = surfaceCanvas.getContext('2d')\n imageData = sceneCtx.createImageData(sceneCanvas.width, sceneCanvas.height)\n}\n\nstartImageInput.oninput = () => {\n file = startImageInput.files[0]\n init()\n}\n\nwindow.onresize = event => {\n setCanvasDimensions()\n init()\n}\n\nsetCanvasDimensions()\n\nconst mod = (fn, ...args) => {\n let x = fn(...args)\n\n if (x < 0) {\n x -= Math.floor(x / 256) * 256\n }\n\n return Math.round(x % 256)\n}\n\nconst defaultStartFn = (x, y) => x + y\n\nlet rStartFn = defaultStartFn\nlet gStartFn = defaultStartFn\nlet bStartFn = defaultStartFn\n\nconst defaultRChangeFn = (r, g, b, s, x, y) => r + s\nconst defaultGChangeFn = (r, g, b, s, x, y) => g + s\nconst defaultBChangeFn = (r, g, b, s, x, y) => b + s\n\nlet rChangeFn = defaultRChangeFn\nlet gChangeFn = defaultGChangeFn\nlet bChangeFn = defaultBChangeFn\n\nlet x = 0\nlet y = 0\n\nconst createStartFn = rhs => {\n // eslint-disable-next-line no-new-func\n return new Function('x', 'y', 'return ' + rhs.replace(/\\s/g, ''))\n}\n\nconst createChangeFn = rhs => {\n // eslint-disable-next-line no-new-func\n return new Function('r', 'g', 'b', 's', 'x', 'y', 'return ' + rhs.replace(/\\s/g, ''))\n}\n\nconst init = async () => {\n if (file) {\n const bitmap = await window.createImageBitmap(file)\n sceneCtx.drawImage(bitmap, 0, 0)\n imageData = sceneCtx.getImageData(0, 0, sceneCanvas.width, sceneCanvas.height)\n sceneCtx.putImageData(imageData, 0, 0)\n return\n }\n\n const coords = [0, 0]\n\n for (let i = 0; i < imageData.data.length; i += 4) {\n if (++coords[0] === sceneCanvas.width) {\n coords[0] = 0\n ++coords[1]\n }\n\n imageData.data[i] = mod(rStartFn, ...coords)\n imageData.data[i + 1] = mod(gStartFn, ...coords)\n imageData.data[i + 2] = mod(bStartFn, ...coords)\n imageData.data[i + 3] = 255\n }\n\n sceneCtx.putImageData(imageData, 0, 0)\n}\n\nconst drawInfo = () => {\n let xcoord = 'x: '\n let ycoord = 'y: '\n let rvalue = 'r: '\n let gvalue = 'g: '\n let bvalue = 'b: '\n let rgb\n\n if (x || y) {\n const index = x * 4 + y * imageData.width * 4\n const [r, g, b] = imageData.data.slice(index)\n\n xcoord += String(x).padStart(3, '0')\n ycoord += String(y).padStart(3, '0')\n rvalue += String(r).padStart(3, '0')\n gvalue += String(g).padStart(3, '0')\n bvalue += String(b).padStart(3, '0')\n rgb = `rgb(${r}, ${g}, ${b})`\n } else {\n xcoord = 'x: 000'\n ycoord = 'y: 000'\n rvalue = 'r: 000'\n gvalue = 'g: 000'\n bvalue = 'b: 000'\n rgb = 'white'\n }\n\n infoCtx.clearRect(0, 0, infoCanvas.width, infoCanvas.height)\n\n let nextX = Math.max(\n infoCtx.measureText(xcoord).width,\n infoCtx.measureText(ycoord).width\n ) + 20\n\n infoCtx.fillStyle = 'black'\n\n infoCtx.fillText(xcoord, 0, 20)\n infoCtx.fillText(ycoord, 0, 40)\n infoCtx.fillText(rvalue, nextX, 20)\n infoCtx.fillText(gvalue, nextX, 40)\n infoCtx.fillText(bvalue, nextX, 60)\n\n nextX += Math.max(\n infoCtx.measureText(rvalue).width,\n infoCtx.measureText(gvalue).width,\n infoCtx.measureText(bvalue).width\n ) + 20\n\n infoCtx.fillStyle = rgb\n infoCtx.fillRect(nextX, 0, nextX + 20, 60)\n}\n\nconst drawCircle = () => {\n surfaceCtx.clearRect(0, 0, surfaceCanvas.width, surfaceCanvas.height)\n\n if (!x && !y) return\n\n surfaceCtx.beginPath()\n surfaceCtx.ellipse(x, y, 3, 3, 0, 0, 2 * Math.PI)\n surfaceCtx.closePath()\n surfaceCtx.stroke()\n}\n\nconst moveCircle = (newX, newY) => {\n const inBounds = (\n newX >= 0 && newX <= sceneCanvas.width &&\n newY >= 0 && newY <= sceneCanvas.height\n )\n\n if (!inBounds) return\n\n (x || y) && sceneCtx.putImageData(imageData, 0, 0)\n\n x = newX\n y = newY\n\n window.requestAnimationFrame(drawCircle)\n}\n\nsurfaceCanvas.onmousedown = event => {\n const newX = (event.clientX - left) * DPR\n const newY = (event.clientY - top) * DPR\n\n moveCircle(newX, newY)\n window.requestAnimationFrame(drawInfo)\n}\n\ndocument.body.onkeydown = event => {\n switch (event.key) {\n case 'ArrowUp':\n moveCircle(x, y - 1)\n break\n\n case 'ArrowDown':\n moveCircle(x, y + 1)\n break\n\n case 'ArrowLeft':\n moveCircle(x - 1, y)\n break\n\n case 'ArrowRight':\n moveCircle(x + 1, y)\n break\n }\n}\n\ncontrolPanel.onclick = () => {\n x = 0\n y = 0\n\n window.requestAnimationFrame(drawCircle)\n window.requestAnimationFrame(drawInfo)\n}\n\nconst change = () => {\n playing && window.requestAnimationFrame(change)\n\n const coords = [0, 0]\n\n let r, g, b\n\n for (let i = 0; i < imageData.data.length; i += 4) {\n if (++coords[0] === sceneCanvas.width) {\n coords[0] = 0\n ++coords[1]\n }\n\n r = imageData.data[i]\n g = imageData.data[i + 1]\n b = imageData.data[i + 2]\n\n imageData.data[i] = mod(rChangeFn, r, g, b, step, ...coords)\n imageData.data[i + 1] = mod(gChangeFn, r, g, b, step, ...coords)\n imageData.data[i + 2] = mod(bChangeFn, r, g, b, step, ...coords)\n }\n\n sceneCtx.putImageData(imageData, 0, 0)\n if (x || y) window.requestAnimationFrame(drawInfo)\n}\n\ninit()\n\nconst showModal = modal => {\n if (showingModal) return\n\n showingModal = true\n modal.style.display = 'block'\n}\n\nconst hideModal = modal => {\n modal.style.display = 'none'\n showingModal = false\n}\n\nstepInput.oninput = event => {\n step = +event.target.value\n}\n\nstartFnsBtn.onclick = event => {\n event.stopPropagation()\n showModal(startFnsModal)\n}\n\nchangeFnsBtn.onclick = event => {\n event.stopPropagation()\n showModal(changeFnsModal)\n}\n\ncloseStartFnsModalBtn.onclick = () => {\n try {\n rStartFn = rStartFnInput.value\n ? createStartFn(rStartFnInput.value)\n : defaultStartFn\n\n gStartFn = gStartFnInput.value\n ? createStartFn(gStartFnInput.value)\n : defaultStartFn\n\n bStartFn = bStartFnInput.value\n ? createStartFn(bStartFnInput.value)\n : defaultStartFn\n\n rStartFn(0, 0)\n bStartFn(0, 0)\n gStartFn(0, 0)\n\n hideModal(startFnsModal)\n } catch (err) {\n console.error(err)\n window.alert('Invalid start function:' + err.message)\n }\n}\n\ncloseChangeFnsModalBtn.onclick = () => {\n try {\n rChangeFn = rChangeFnInput.value\n ? createChangeFn(rChangeFnInput.value)\n : defaultRChangeFn\n\n gChangeFn = gChangeFnInput.value\n ? createChangeFn(gChangeFnInput.value)\n : defaultGChangeFn\n\n bChangeFn = bChangeFnInput.value\n ? createChangeFn(bChangeFnInput.value)\n : defaultBChangeFn\n\n rChangeFn(0, 0, 0, 0, 0, 0)\n bChangeFn(0, 0, 0, 0, 0, 0)\n gChangeFn(0, 0, 0, 0, 0, 0)\n\n hideModal(changeFnsModal)\n } catch (err) {\n console.error(err)\n window.alert('Invalid change function:' + err.message)\n }\n}\n\nconst play = () => {\n playing = true\n\n window.requestAnimationFrame(change)\n}\n\nconst stop = () => {\n playing = false\n}\n\nplayBtn.onclick = event => {\n event.stopPropagation()\n\n if (playing) {\n stop()\n playBtn.innerHTML = '▶'\n } else {\n play()\n playBtn.innerHTML = '■'\n }\n}\n\nresetBtn.onclick = event => {\n event.stopPropagation()\n init()\n}\n\nconst warningModal = document.getElementById('warning-modal')\nconst closeWarningModalBtn = warningModal.querySelector('.close-btn')\n\nshowModal(warningModal)\n\ncloseWarningModalBtn.onclick = () => {\n hideModal(warningModal)\n}\n\ndrawInfo()\n"], "mappings": "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", "names": [] }