image-to-pixel 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +2 -2
  3. package/dist/editor.css +1 -1
  4. package/dist/editor.css.map +2 -2
  5. package/dist/editor.esm.js +60 -60
  6. package/dist/editor.esm.js.map +4 -4
  7. package/dist/fonts/README.md +6 -6
  8. package/dist/fonts/geist-LICENSE.txt +93 -93
  9. package/dist/image-to-pixel.bundle.esm.js +16 -16
  10. package/dist/image-to-pixel.bundle.esm.js.map +3 -3
  11. package/dist/image-to-pixel.cjs +2 -2
  12. package/dist/image-to-pixel.cjs.map +2 -2
  13. package/dist/image-to-pixel.esm.js +2 -2
  14. package/dist/image-to-pixel.esm.js.map +2 -2
  15. package/dist/image-to-pixel.js +2 -2
  16. package/dist/image-to-pixel.js.map +2 -2
  17. package/dist/image-to-pixel.min.js +11 -11
  18. package/dist/image-to-pixel.min.js.map +3 -3
  19. package/dist/video.esm.js +2 -2
  20. package/dist/video.esm.js.map +4 -4
  21. package/lib/core/color.js +69 -69
  22. package/lib/core/cpu/pipeline.js +21 -21
  23. package/lib/core/cpu/stages.js +227 -227
  24. package/lib/core/dither/bluenoise-data.js +3 -3
  25. package/lib/core/dither/kernels.js +27 -27
  26. package/lib/core/dither/matrices.js +95 -95
  27. package/lib/core/engine.js +158 -158
  28. package/lib/core/export/canvas.js +22 -22
  29. package/lib/core/export/crc32.js +15 -15
  30. package/lib/core/export/gif.js +153 -153
  31. package/lib/core/export/png.js +94 -94
  32. package/lib/core/export/scale.js +103 -103
  33. package/lib/core/export/sheet.js +95 -95
  34. package/lib/core/export/zip.js +55 -55
  35. package/lib/core/gpu/backend.js +159 -159
  36. package/lib/core/gpu/shaders.js +258 -258
  37. package/lib/core/palette/builtin.js +36 -36
  38. package/lib/core/palette/extract.js +69 -69
  39. package/lib/core/palette/lospec.js +24 -24
  40. package/lib/core/palette/parse.js +112 -112
  41. package/lib/core/plan.js +58 -58
  42. package/lib/core/presets.js +42 -42
  43. package/lib/core/settings.js +274 -274
  44. package/lib/core/source.js +89 -89
  45. package/lib/core/video/audio.js +159 -0
  46. package/lib/core/video/frames.js +38 -0
  47. package/lib/core/video/mux-mp4.js +213 -24
  48. package/lib/core/video/mux-webm.js +63 -22
  49. package/lib/editor/controls.js +139 -139
  50. package/lib/editor/dom.js +65 -65
  51. package/lib/editor/exporter.js +43 -3
  52. package/lib/editor/icons.js +4 -0
  53. package/lib/editor/index.js +218 -9
  54. package/lib/editor/inspector.js +19 -4
  55. package/lib/editor/library.js +8 -2
  56. package/lib/editor/persist.js +18 -18
  57. package/lib/editor/samples.js +90 -90
  58. package/lib/editor/stage.js +239 -239
  59. package/lib/editor/store.js +80 -80
  60. package/lib/editor/styles/editor.css +34 -1
  61. package/lib/editor/styles/fonts/README.md +6 -6
  62. package/lib/editor/styles/fonts/geist-LICENSE.txt +93 -93
  63. package/lib/editor/styles/tokens.css +89 -89
  64. package/lib/editor/ui.js +97 -97
  65. package/lib/editor/workspace.js +62 -0
  66. package/lib/index.js +31 -29
  67. package/lib/video.js +37 -7
  68. package/package.json +1 -1
  69. package/types/editor.d.ts +34 -34
  70. package/types/index.d.ts +196 -196
  71. package/types/video.d.ts +61 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../lib/core/color.js", "../lib/core/palette/parse.js", "../lib/core/palette/lospec.js", "../lib/core/palette/builtin.js", "../lib/core/settings.js", "../lib/core/plan.js", "../lib/core/dither/bluenoise-data.js", "../lib/core/dither/matrices.js", "../lib/core/dither/kernels.js", "../lib/core/palette/extract.js", "../lib/core/cpu/stages.js", "../lib/core/cpu/pipeline.js", "../node_modules/shadermate/src/constants.js", "../node_modules/shadermate/src/utils/util.js", "../node_modules/shadermate/src/core/RefPool.js", "../node_modules/shadermate/src/core/events.js", "../node_modules/shadermate/src/core/tween.js", "../node_modules/shadermate/src/core/passes.js", "../node_modules/shadermate/src/gl/context.js", "../node_modules/shadermate/src/gl/quad.js", "../node_modules/shadermate/src/gl/shader.js", "../node_modules/shadermate/src/glsl/templates.js", "../node_modules/shadermate/src/gl/blit.js", "../node_modules/shadermate/src/gl/params.js", "../node_modules/shadermate/src/gl/targets.js", "../node_modules/shadermate/src/glsl/builtins.js", "../node_modules/shadermate/src/glsl/preprocess.js", "../node_modules/shadermate/src/loaders/image.js", "../node_modules/shadermate/src/loaders/cubemap.js", "../node_modules/shadermate/src/loaders/video.js", "../node_modules/shadermate/src/loaders/audio.js", "../node_modules/shadermate/src/loaders/element.js", "../node_modules/shadermate/src/loaders/keyboard.js", "../node_modules/shadermate/src/loaders/index.js", "../node_modules/shadermate/src/glsl/fragcoord.js", "../node_modules/shadermate/src/core/samplers.js", "../node_modules/shadermate/src/input/camera.js", "../node_modules/shadermate/src/uniforms/types.js", "../node_modules/shadermate/src/uniforms/apply.js", "../node_modules/shadermate/src/input/pointer.js", "../node_modules/shadermate/src/view/sizing.js", "../node_modules/shadermate/src/view/visibility.js", "../node_modules/shadermate/src/ui/theme.js", "../node_modules/shadermate/src/ui/stats.js", "../node_modules/shadermate/src/ui/errorOverlay.js", "../node_modules/shadermate/src/capture/capture.js", "../node_modules/shadermate/src/core/create.js", "../lib/core/gpu/shaders.js", "../lib/core/gpu/backend.js", "../lib/core/source.js", "../lib/core/export/scale.js", "../lib/core/export/canvas.js", "../lib/core/export/crc32.js", "../lib/core/export/png.js", "../lib/core/engine.js", "../lib/index.js", "../lib/core/presets.js", "../lib/core/export/gif.js", "../lib/core/export/zip.js", "../lib/core/export/sheet.js", "../lib/core/video/frames.js"],
4
- "sourcesContent": ["// Colour helpers shared by the CPU path, the GPU uniforms and the editor.\n// All channel values are sRGB in 0..1 unless a name says otherwise.\n\n/** Parse '#rgb', '#rrggbb', '#rrggbbaa', 'rrggbb' or [r,g,b] (0..255) into [r, g, b] bytes. */\nexport function parseColor(c) {\n if (Array.isArray(c)) return [c[0] | 0, c[1] | 0, c[2] | 0];\n let s = String(c).trim().replace(/^#|^0x/i, '');\n if (s.length === 3 || s.length === 4) s = s.slice(0, 3).split('').map(ch => ch + ch).join('');\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(s)) throw new Error(`Invalid colour \"${c}\"`);\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\n}\n\n/** True when `c` parses as a colour. */\nexport function isColor(c) {\n try { parseColor(c); return true; } catch { return false; }\n}\n\n/** [r, g, b] bytes \u2192 '#rrggbb'. */\nexport function toHex(rgb) {\n return '#' + rgb.slice(0, 3).map(v => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join('');\n}\n\n/** Normalise any colour to '#rrggbb' (lower case). */\nexport const normHex = c => toHex(parseColor(c));\n\nconst lin = c => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\n\n/** sRGB (0..1) \u2192 OKLab [L, a, b]. Same maths as the GLSL `oklab()` in gpu/shaders.js. */\nexport function oklab(r, g, b) {\n r = lin(r); g = lin(g); b = lin(b);\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s,\n ];\n}\n\n/** Relative luminance-ish weight used by saturation (Rec. 709). */\nexport const LUMA = [0.2126, 0.7152, 0.0722];\n\n/** Perceived lightness 0..1 of a hex colour; handy for picking text colours on swatches. */\nexport function lightness(hex) {\n const [r, g, b] = parseColor(hex);\n return oklab(r / 255, g / 255, b / 255)[0];\n}\n\n/**\n * Average distance (sRGB 0..1) from each palette colour to its nearest neighbour.\n * Ordered dithering scales its threshold by this so `strength` means the same thing\n * for a 2-colour and a 64-colour palette.\n */\nexport function paletteSpread(rgbs) {\n if (rgbs.length < 2) return 1;\n let sum = 0;\n for (let i = 0; i < rgbs.length; i++) {\n let best = Infinity;\n for (let j = 0; j < rgbs.length; j++) {\n if (i === j) continue;\n const dr = rgbs[i][0] - rgbs[j][0], dg = rgbs[i][1] - rgbs[j][1], db = rgbs[i][2] - rgbs[j][2];\n const d = Math.sqrt(dr * dr + dg * dg + db * db);\n if (d < best) best = d;\n }\n sum += best;\n }\n return Math.max(0.04, Math.min(1, sum / rgbs.length / 255));\n}\n", "// Palette file formats. Every parser returns { name, colors: ['#rrggbb', \u2026] }.\n//\n// .gpl GIMP / Aseprite / Krita palette\n// .hex one hex colour per line (Lospec \"HEX file\")\n// .txt Paint.NET palette (AARRGGBB per line, ';' comments)\n// .pal JASC-PAL (Paint Shop Pro, Aseprite export)\n// .json Lospec JSON ({ name, colors: ['rrggbb'] }), this tool's own export, or a plain array\n// anything else: every #hex / 6-digit token found in the text\n\nimport { normHex } from '../color.js';\n\nconst dedupe = list => [...new Set(list)];\n\nexport function parseGPL(text) {\n const lines = text.split(/\\r?\\n/);\n if (!/^GIMP Palette/i.test(lines[0] || '')) throw new Error('Not a GIMP palette (missing \"GIMP Palette\" header)');\n let name = '';\n const colors = [];\n for (const raw of lines.slice(1)) {\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n const nm = /^Name:\\s*(.*)$/i.exec(line);\n if (nm) { name = nm[1].trim(); continue; }\n if (/^Columns:/i.test(line)) continue;\n const m = /^(\\d{1,3})\\s+(\\d{1,3})\\s+(\\d{1,3})/.exec(line);\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\n }\n return { name, colors };\n}\n\nexport function parseHexList(text) {\n const colors = [];\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith(';') || line.startsWith('//')) continue;\n const m = /^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\\b/i.exec(line);\n if (!m) continue;\n // 8 digits in a .txt palette are AARRGGBB (Paint.NET); in a .hex file they are rare, treat the same\n const h = m[1].length === 8 ? m[1].slice(2) : m[1];\n colors.push(normHex(h));\n }\n return { name: '', colors };\n}\n\nexport function parseJASC(text) {\n const lines = text.split(/\\r?\\n/).map(l => l.trim());\n if (lines[0] !== 'JASC-PAL') throw new Error('Not a JASC palette');\n const n = parseInt(lines[2], 10) || 0;\n const colors = [];\n for (let i = 3; i < 3 + n && i < lines.length; i++) {\n const m = /^(\\d+)\\s+(\\d+)\\s+(\\d+)/.exec(lines[i]);\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\n }\n return { name: '', colors };\n}\n\nexport function parseJSON(text) {\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\n const list = Array.isArray(obj) ? obj : (obj.colors || obj.palette || []);\n const colors = list.map(c => (typeof c === 'object' && c ? (c.hex || c.color) : c)).filter(Boolean).map(normHex);\n return { name: (!Array.isArray(obj) && obj.name) || '', colors };\n}\n\n/** Pull every hex-looking token out of free text (pasted CSS, a tweet, a Lospec page). */\nexport function parseLoose(text) {\n const colors = [];\n const re = /#?\\b([0-9a-f]{6})\\b/gi;\n let m;\n while ((m = re.exec(text))) colors.push(normHex(m[1]));\n return { name: '', colors };\n}\n\n/**\n * Parse palette text by file name / content sniffing.\n * @param {string} text\n * @param {string} [filename]\n * @returns {{ name: string, colors: string[] }}\n */\nexport function parsePalette(text, filename = '') {\n const ext = (/\\.([a-z0-9]+)$/i.exec(filename) || [])[1]?.toLowerCase() || '';\n const t = String(text).replace(/^\uFEFF/, '');\n const trimmed = t.trim();\n let out;\n if (ext === 'gpl' || /^GIMP Palette/i.test(trimmed)) out = parseGPL(trimmed);\n else if (ext === 'pal' || trimmed.startsWith('JASC-PAL')) out = parseJASC(trimmed);\n else if (ext === 'json' || trimmed.startsWith('{') || trimmed.startsWith('[')) out = parseJSON(trimmed);\n else if (ext === 'hex' || ext === 'txt') out = parseHexList(trimmed);\n else {\n out = parseHexList(trimmed);\n if (!out.colors.length) out = parseLoose(trimmed);\n }\n out.colors = dedupe(out.colors).slice(0, 256);\n if (!out.name && filename) out.name = filename.replace(/\\.[^.]+$/, '').replace(/[-_]+/g, ' ');\n if (!out.colors.length) throw new Error('No colours found in that palette');\n return out;\n}\n\n/** Palette \u2192 .gpl text. */\nexport function toGPL(name, colors) {\n const rows = colors.map(c => {\n const h = normHex(c);\n const r = parseInt(h.slice(1, 3), 16), g = parseInt(h.slice(3, 5), 16), b = parseInt(h.slice(5, 7), 16);\n return `${String(r).padStart(3)} ${String(g).padStart(3)} ${String(b).padStart(3)}\\t${h.slice(1)}`;\n });\n return `GIMP Palette\\nName: ${name || 'Palette'}\\nColumns: 8\\n#\\n${rows.join('\\n')}\\n`;\n}\n\n/** Palette \u2192 .hex text. */\nexport const toHexFile = colors => colors.map(c => normHex(c).slice(1)).join('\\n') + '\\n';\n\n/** Palette \u2192 JSON text (Lospec-compatible shape). */\nexport const toPaletteJSON = (name, colors) => JSON.stringify({ name: name || 'Palette', colors: colors.map(c => normHex(c).slice(1)) }, null, 2);\n", "// Lospec palette lookup by slug, e.g. 'rgbg-36' from https://lospec.com/palette-list/rgbg-36\n\nimport { parseJSON } from './parse.js';\n\n/** Turn a slug or a full Lospec URL into a slug. */\nexport function lospecSlug(input) {\n const s = String(input || '').trim();\n const m = /palette-list\\/([a-z0-9-]+)/i.exec(s);\n return (m ? m[1] : s).toLowerCase().replace(/\\.(json|hex|gpl)$/, '');\n}\n\n/**\n * Fetch a palette from Lospec. Needs network access; the editor caches results.\n * @returns {Promise<{ name: string, colors: string[], author?: string, slug: string }>}\n */\nexport async function fetchLospec(slugOrUrl, { fetch: f = globalThis.fetch } = {}) {\n const slug = lospecSlug(slugOrUrl);\n if (!/^[a-z0-9-]+$/.test(slug)) throw new Error('That does not look like a Lospec palette slug');\n const res = await f(`https://lospec.com/palette-list/${slug}.json`);\n if (!res.ok) throw new Error(`Lospec returned ${res.status} for \"${slug}\"`);\n const json = await res.json();\n const p = parseJSON(json);\n return { name: json.name || slug, author: json.author || '', colors: p.colors, slug };\n}\n", "// Built-in palettes. Most come from Lospec (https://lospec.com/palette-list); credit to their authors.\n// The list matches the classic editor plus a few staples.\n\n/** @type {{ id: string, name: string, author: string, colors: string[] }[]} */\nexport const PALETTES = [\n { id: \"1-bit-monitor\", name: \"1-Bit Monitor\", author: \"\", colors: [\"222323\",\"f0f6f0\"] },\n { id: \"apollo\", name: \"Apollo\", author: \"AdamCYounis\", colors: [\"172038\",\"253a5e\",\"3c5e8b\",\"4f8fba\",\"73bed3\",\"a4dddb\",\"19332d\",\"25562e\",\"468232\",\"75a743\",\"a8ca58\",\"d0da91\",\"4d2b32\",\"7a4841\",\"ad7757\",\"c09473\",\"d7b594\",\"e7d5b3\",\"341c27\",\"602c2c\",\"884b2b\",\"be772b\",\"de9e41\",\"e8c170\",\"241527\",\"411d31\",\"752438\",\"a53030\",\"cf573c\",\"da863e\",\"1e1d39\",\"402751\",\"7a367b\",\"a23e8c\",\"c65197\",\"df84a5\",\"090a14\",\"10141f\",\"151d28\",\"202e37\",\"394a50\",\"577277\",\"819796\",\"a8b5b2\",\"c7cfcc\",\"ebede9\"] },\n { id: \"batpalette\", name: \"Batpalette\", author: \"el Rojaz\", colors: [\"000000\",\"7f7f7f\",\"ffffff\",\"681e99\",\"3f48cc\",\"88ff82\",\"bfa621\",\"cc3d18\"] },\n { id: \"beached-boogaloo\", name: \"Beached Boogaloo\", author: \".tomais\", colors: [\"ff0b20\",\"8f0434\",\"500037\",\"a0ff00\",\"57e71e\",\"0ea717\",\"057833\",\"2cdeef\",\"2483e7\",\"153ab7\",\"0d0a87\",\"ff0b88\",\"a60fff\",\"6409cf\",\"eaef30\",\"ff880b\",\"b75308\",\"802202\",\"000000\",\"231940\",\"514378\",\"ffffff\",\"73a3a7\",\"366770\",\"f7b771\",\"c77650\",\"974c38\",\"873939\",\"601e2c\",\"300c1f\"] },\n { id: \"cc-29\", name: \"CC-29\", author: \"Alpha6\", colors: [\"f2f0e5\",\"b8b5b9\",\"868188\",\"646365\",\"45444f\",\"3a3858\",\"212123\",\"352b42\",\"43436a\",\"4b80ca\",\"68c2d3\",\"a2dcc7\",\"ede19e\",\"d3a068\",\"b45252\",\"6a536e\",\"4b4158\",\"80493a\",\"a77b5b\",\"e5ceb4\",\"c2d368\",\"8ab060\",\"567b79\",\"4e584a\",\"7b7243\",\"b2b47e\",\"edc8c4\",\"cf8acb\",\"5f556a\"] },\n { id: \"cga-16\", name: \"CGA 16\", author: \"\", colors: [\"000000\",\"0000aa\",\"00aa00\",\"00aaaa\",\"aa0000\",\"aa00aa\",\"aa5500\",\"aaaaaa\",\"555555\",\"5555ff\",\"55ff55\",\"55ffff\",\"ff5555\",\"ff55ff\",\"ffff55\",\"ffffff\"] },\n { id: \"chaotic-neutral\", name: \"Chaotic neutral\", author: \"Dodecahedron \u2DFD\", colors: [\"e1d4cb\",\"c19f90\",\"a56457\",\"6d504d\",\"484044\",\"392b29\",\"31312f\",\"d8eef0\",\"97999f\",\"81a4c0\",\"6a7f92\",\"415973\",\"43425a\",\"45334b\",\"4b1f40\",\"671087\",\"955ab9\"] },\n { id: \"endesga-32\", name: \"Endesga 32\", author: \"ENDESGA\", colors: [\"be4a2f\",\"d77643\",\"ead4aa\",\"e4a672\",\"b86f50\",\"733e39\",\"3e2731\",\"a22633\",\"e43b44\",\"f77622\",\"feae34\",\"fee761\",\"63c74d\",\"3e8948\",\"265c42\",\"193c3e\",\"124e89\",\"0099db\",\"2ce8f5\",\"ffffff\",\"c0cbdc\",\"8b9bb4\",\"5a6988\",\"3a4466\",\"262b44\",\"181425\",\"ff0044\",\"68386c\",\"b55088\",\"f6757a\",\"e8b796\",\"c28569\"] },\n { id: \"fantasy-24\", name: \"Fantasy 24\", author: \"\", colors: [\"1f240a\",\"39571c\",\"a58c27\",\"efac28\",\"efd8a1\",\"ab5c1c\",\"183f39\",\"ef692f\",\"efb775\",\"a56243\",\"773421\",\"724113\",\"2a1d0d\",\"392a1c\",\"684c3c\",\"927e6a\",\"276468\",\"ef3a0c\",\"45230d\",\"3c9f9c\",\"9b1a0a\",\"36170c\",\"550f0a\",\"300f0a\"] },\n { id: \"game-boy-dmg\", name: \"Game Boy (DMG)\", author: \"\", colors: [\"0f380f\",\"306230\",\"8bac0f\",\"9bbc0f\"] },\n { id: \"grayscale-4\", name: \"Grayscale 4\", author: \"\", colors: [\"000000\",\"555555\",\"aaaaaa\",\"ffffff\"] },\n { id: \"hidden-library\", name: \"Hidden Library\", author: \"Pixel Hoo\", colors: [\"100b2a\",\"2a213a\",\"314743\",\"65856d\",\"adca9a\",\"ecfeca\",\"582d27\",\"974133\",\"d67654\",\"5d3441\",\"a3685b\",\"ffb379\",\"ffe6a9\",\"ffffff\"] },\n { id: \"intacto14\", name: \"Intacto14\", author: \"Anubi\", colors: [\"221529\",\"4b5561\",\"879ba3\",\"cbf5ef\",\"62b4de\",\"5660d6\",\"5b29a6\",\"d64562\",\"f2735c\",\"edbb8e\",\"ab6375\",\"522152\",\"37ada2\",\"8cde8c\"] },\n { id: \"journey\", name: \"Journey\", author: \"\uD83C\uDF4DPineappleOnPizza\uD83C\uDF4D\", colors: [\"050914\",\"110524\",\"3b063a\",\"691749\",\"9c3247\",\"d46453\",\"f5a15d\",\"ffcf8e\",\"ff7a7d\",\"ff417d\",\"d61a88\",\"94007a\",\"42004e\",\"220029\",\"100726\",\"25082c\",\"3d1132\",\"73263d\",\"bd4035\",\"ed7b39\",\"ffb84a\",\"fff540\",\"c6d831\",\"77b02a\",\"429058\",\"2c645e\",\"153c4a\",\"052137\",\"0e0421\",\"0c0b42\",\"032769\",\"144491\",\"488bd4\",\"78d7ff\",\"b0fff1\",\"faffff\",\"c7d4e1\",\"928fb8\",\"5b537d\",\"392946\",\"24142c\",\"0e0f2c\",\"132243\",\"1a466b\",\"10908e\",\"28c074\",\"3dff6e\",\"f8ffb8\",\"f0c297\",\"cf968c\",\"8f5765\",\"52294b\",\"0f022e\",\"35003b\",\"64004c\",\"9b0e3e\",\"d41e3c\",\"ed4c40\",\"ff9757\",\"d4662f\",\"9c341a\",\"691b22\",\"450c28\",\"2d002e\"] },\n { id: \"lospec500\", name: \"Lospec500\", author: \"\", colors: [\"10121c\",\"2c1e31\",\"6b2643\",\"ac2847\",\"ec273f\",\"94493a\",\"de5d3a\",\"e98537\",\"f3a833\",\"4d3533\",\"6e4c30\",\"a26d3f\",\"ce9248\",\"dab163\",\"e8d282\",\"f7f3b7\",\"1e4044\",\"006554\",\"26854c\",\"5ab552\",\"9de64e\",\"008b8b\",\"62a477\",\"a6cb96\",\"d3eed3\",\"3e3b65\",\"3859b3\",\"3388de\",\"36c5f4\",\"6dead6\",\"5e5b8c\",\"8c78a5\",\"b0a7b8\",\"deceed\",\"9a4d76\",\"c878af\",\"cc99ff\",\"fa6e79\",\"ffa2ac\",\"ffd1d5\",\"f6e8e0\",\"ffffff\"] },\n { id: \"nyx8\", name: \"Nyx8\", author: \"Javier Guerrero\", colors: [\"08141e\",\"0f2a3f\",\"20394f\",\"4e495f\",\"816271\",\"997577\",\"c3a38a\",\"f6d6bd\"] },\n { id: \"oil-6\", name: \"Oil 6\", author: \"\", colors: [\"fbf5ef\",\"f2d3ab\",\"c69fa5\",\"8b6d9c\",\"494d7e\",\"272744\"] },\n { id: \"pico-8\", name: \"PICO-8\", author: \"\", colors: [\"000000\",\"1d2b53\",\"7e2553\",\"008751\",\"ab5236\",\"5f574f\",\"c2c3c7\",\"fff1e8\",\"ff004d\",\"ffa300\",\"ffec27\",\"00e436\",\"29adff\",\"83769c\",\"ff77a8\",\"ffccaa\"] },\n { id: \"resurrect-64\", name: \"Resurrect 64\", author: \"Kerrie Lake\", colors: [\"2e222f\",\"3e3546\",\"625565\",\"966c6c\",\"ab947a\",\"694f62\",\"7f708a\",\"9babb2\",\"c7dcd0\",\"ffffff\",\"6e2727\",\"b33831\",\"ea4f36\",\"f57d4a\",\"ae2334\",\"e83b3b\",\"fb6b1d\",\"f79617\",\"f9c22b\",\"7a3045\",\"9e4539\",\"cd683d\",\"e6904e\",\"fbb954\",\"4c3e24\",\"676633\",\"a2a947\",\"d5e04b\",\"fbff86\",\"165a4c\",\"239063\",\"1ebc73\",\"91db69\",\"cddf6c\",\"313638\",\"374e4a\",\"547e64\",\"92a984\",\"b2ba90\",\"0b5e65\",\"0b8a8f\",\"0eaf9b\",\"30e1b9\",\"8ff8e2\",\"323353\",\"484a77\",\"4d65b4\",\"4d9be6\",\"8fd3ff\",\"45293f\",\"6b3e75\",\"905ea9\",\"a884f3\",\"eaaded\",\"753c54\",\"a24b6f\",\"cf657f\",\"ed8099\",\"831c5d\",\"c32454\",\"f04f78\",\"f68181\",\"fca790\",\"fdcbb0\"] },\n { id: \"slso8\", name: \"SLSO8\", author: \"Luis Miguel Maldonado\", colors: [\"0d2b45\",\"203c56\",\"544e68\",\"8d697a\",\"d08159\",\"ffaa5e\",\"ffd4a3\",\"ffecd6\"] },\n { id: \"sweet-canyon-extended-64\", name: \"Sweet Canyon Extended 64\", author: \"Mr Slime\", colors: [\"0f0e11\",\"2d2c33\",\"40404a\",\"51545c\",\"6b7179\",\"7c8389\",\"a8b2b6\",\"d5d5d5\",\"eeebe0\",\"f1dbb1\",\"eec99f\",\"e1a17e\",\"cc9562\",\"ab7b49\",\"9a643a\",\"86482f\",\"783a29\",\"6a3328\",\"541d29\",\"42192c\",\"512240\",\"782349\",\"8b2e5d\",\"a93e89\",\"d062c8\",\"ec94ea\",\"f2bdfc\",\"eaebff\",\"a2fafa\",\"64e7e7\",\"54cfd8\",\"2fb6c3\",\"2c89af\",\"25739d\",\"2a5684\",\"214574\",\"1f2966\",\"101445\",\"3c0d3b\",\"66164c\",\"901f3d\",\"bb3030\",\"dc473c\",\"ec6a45\",\"fb9b41\",\"f0c04c\",\"f4d66e\",\"fffb76\",\"ccf17a\",\"97d948\",\"6fba3b\",\"229443\",\"1d7e45\",\"116548\",\"0c4f3f\",\"0a3639\",\"251746\",\"48246d\",\"69189c\",\"9f20c0\",\"e527d2\",\"ff51cf\",\"ff7ada\",\"ff9edb\"] },\n { id: \"sweetie-16\", name: \"Sweetie 16\", author: \"\", colors: [\"1a1c2c\",\"5d275d\",\"b13e53\",\"ef7d57\",\"ffcd75\",\"a7f070\",\"38b764\",\"257179\",\"29366f\",\"3b5dc9\",\"41a6f6\",\"73eff7\",\"f4f4f4\",\"94b0c2\",\"566c86\",\"333c57\"] },\n { id: \"toxic-haze\", name: \"Toxic Haze\", author: \"sillyTheJester\", colors: [\"e5ff00\",\"b8d14a\",\"9ab06e\",\"708763\",\"4c5c52\",\"393e40\",\"242424\"] },\n { id: \"vinik24\", name: \"Vinik24\", author: \"Vinik\", colors: [\"000000\",\"6f6776\",\"9a9a97\",\"c5ccb8\",\"8b5580\",\"c38890\",\"a593a5\",\"666092\",\"9a4f50\",\"c28d75\",\"7ca1c0\",\"416aa3\",\"8d6268\",\"be955c\",\"68aca9\",\"387080\",\"6e6962\",\"93a167\",\"6eaa78\",\"557064\",\"9d9f7f\",\"7e9e99\",\"5d6872\",\"433455\"] },\n];\n\n/** Look a built-in palette up by id or name (case-insensitive). */\nexport function getPalette(idOrName) {\n const k = String(idOrName || \"\").toLowerCase();\n return PALETTES.find(p => p.id === k || p.name.toLowerCase() === k) || null;\n}\n", "// The settings object is the one contract between the engine, the editor, presets,\n// share links and saved JSON. Everything goes through normalizeSettings().\n\nimport { getPalette } from './palette/builtin.js';\nimport { normHex, isColor } from './color.js';\n\nexport const SETTINGS_VERSION = 1;\nexport const MAX_SIZE = 2048;\n\n/** Dither methods. `kind` decides which pipeline runs them. */\nexport const DITHER_METHODS = [\n { id: 'none', label: 'None', kind: 'none' },\n { id: 'bayer2', label: 'Bayer 2\u00D72', kind: 'ordered' },\n { id: 'bayer4', label: 'Bayer 4\u00D74', kind: 'ordered' },\n { id: 'bayer8', label: 'Bayer 8\u00D78', kind: 'ordered' },\n { id: 'bayer16', label: 'Bayer 16\u00D716', kind: 'ordered' },\n { id: 'cluster4', label: 'Clustered dot 4\u00D74', kind: 'ordered' },\n { id: 'cluster8', label: 'Clustered dot 8\u00D78', kind: 'ordered' },\n { id: 'lines', label: 'Horizontal lines', kind: 'ordered' },\n { id: 'bluenoise', label: 'Blue noise', kind: 'ordered' },\n { id: 'custom', label: 'Custom matrix', kind: 'ordered' },\n { id: 'floyd-steinberg', label: 'Floyd\u2013Steinberg', kind: 'diffusion' },\n { id: 'atkinson', label: 'Atkinson', kind: 'diffusion' },\n { id: 'sierra-lite', label: 'Sierra Lite', kind: 'diffusion' },\n { id: 'sierra', label: 'Sierra', kind: 'diffusion' },\n { id: 'burkes', label: 'Burkes', kind: 'diffusion' },\n { id: 'jarvis', label: 'Jarvis\u2013Judice\u2013Ninke', kind: 'diffusion' },\n { id: 'stucki', label: 'Stucki', kind: 'diffusion' },\n];\nexport const ditherKind = id => (DITHER_METHODS.find(m => m.id === id) || { kind: 'none' }).kind;\n\n/** Names the classic image-to-pixel.js used, mapped to the new ids. */\nexport const LEGACY_DITHER = {\n 'none': 'none', 'floyd-steinberg': 'floyd-steinberg', 'atkinson': 'atkinson',\n 'ordered': 'bayer8', '2x2 bayer': 'bayer2', '4x4 bayer': 'bayer4', 'clustered 4x4': 'cluster4',\n};\n\nexport const DEFAULTS = Object.freeze({\n version: SETTINGS_VERSION,\n size: { mode: 'width', width: 96, height: 0, block: 8, resample: 'box' },\n adjust: { brightness: 0, contrast: 0, saturation: 0, hue: 0, gamma: 1 },\n frame: { aspect: 'original', zoom: 1, x: 0.5, y: 0.5 },\n palette: { source: 'builtin', id: 'endesga-32', name: 'Endesga 32', colors: [], count: 16, distance: 'oklab' },\n dither: { method: 'bayer4', strength: 0.6, matrix: null },\n alpha: { threshold: 0.5 },\n cleanup: { orphans: false, smooth: false },\n outline: { mode: 'none', color: '#000000', corners: false },\n export: { size: 'scale', scale: 4, indexed: true, grid: false, gridColor: '#000000' },\n});\n\nconst clamp = (v, lo, hi, d) => {\n const n = Number(v);\n return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : d;\n};\nconst oneOf = (v, list, d) => (list.includes(v) ? v : d);\nconst bool = (v, d) => (typeof v === 'boolean' ? v : d);\n\n/** Deep copy of the defaults (palette colours resolved). */\nexport function defaultSettings() {\n return normalizeSettings({});\n}\n\n/**\n * Fill in defaults, clamp ranges, resolve built-in palette colours and drop unknown keys.\n * Never throws on bad values; it falls back to the default for that field.\n * @param {object} input partial settings\n */\nexport function normalizeSettings(input = {}) {\n const d = DEFAULTS;\n const i = input || {};\n const s = {}; const size = i.size || {}; const adj = i.adjust || {}; const pal = i.palette || {};\n const dit = i.dither || {}; const al = i.alpha || {}; const cl = i.cleanup || {}; const ol = i.outline || {};\n const ex = i.export || {};\n\n s.version = SETTINGS_VERSION;\n s.size = {\n mode: oneOf(size.mode, ['width', 'block'], d.size.mode),\n width: Math.round(clamp(size.width, 1, MAX_SIZE, d.size.width)),\n height: Math.round(clamp(size.height, 0, MAX_SIZE, d.size.height)),\n block: clamp(size.block, 1, 256, d.size.block),\n resample: oneOf(size.resample, ['box', 'nearest'], d.size.resample),\n };\n s.adjust = {\n brightness: clamp(adj.brightness, -1, 1, 0),\n contrast: clamp(adj.contrast, -1, 1, 0),\n saturation: clamp(adj.saturation, -1, 1, 0),\n hue: clamp(adj.hue, -180, 180, 0),\n gamma: clamp(adj.gamma, 0.2, 5, 1),\n };\n const fr = i.frame || {};\n s.frame = {\n aspect: oneOf(fr.aspect, ASPECTS.map(a => a.id), 'original'),\n zoom: clamp(fr.zoom, 1, 8, 1),\n x: clamp(fr.x, 0, 1, 0.5),\n y: clamp(fr.y, 0, 1, 0.5),\n };\n\n const source = oneOf(pal.source, ['builtin', 'custom', 'extract', 'none'], d.palette.source);\n s.palette = {\n source,\n id: typeof pal.id === 'string' ? pal.id : (source === 'builtin' ? d.palette.id : ''),\n name: typeof pal.name === 'string' ? pal.name : '',\n colors: [],\n count: Math.round(clamp(pal.count, 2, 256, d.palette.count)),\n distance: oneOf(pal.distance, ['oklab', 'rgb'], d.palette.distance),\n };\n if (source === 'builtin') {\n const p = getPalette(s.palette.id) || getPalette(d.palette.id);\n s.palette.id = p.id; s.palette.name = p.name; s.palette.colors = p.colors.map(c => '#' + c);\n } else if (source === 'custom') {\n s.palette.colors = (Array.isArray(pal.colors) ? pal.colors : []).filter(isColor).map(normHex).slice(0, 256);\n if (!s.palette.colors.length) s.palette.colors = ['#000000', '#ffffff'];\n s.palette.name = s.palette.name || 'Custom';\n } else if (source === 'extract') {\n s.palette.name = `Extracted (${s.palette.count})`;\n } else {\n s.palette.name = 'None';\n }\n\n const method = DITHER_METHODS.some(m => m.id === dit.method) ? dit.method : d.dither.method;\n s.dither = {\n method,\n strength: clamp(dit.strength, 0, 1, d.dither.strength),\n matrix: normalizeMatrix(dit.matrix),\n };\n s.alpha = { threshold: clamp(al.threshold, 0, 1, d.alpha.threshold) };\n s.cleanup = { orphans: bool(cl.orphans, false), smooth: bool(cl.smooth, false) };\n s.outline = {\n mode: oneOf(ol.mode, ['none', 'outer', 'inner'], 'none'),\n color: isColor(ol.color) ? normHex(ol.color) : d.outline.color,\n corners: bool(ol.corners, false),\n };\n s.export = {\n size: oneOf(ex.size, ['scale', 'source'], 'scale'),\n scale: Math.round(clamp(ex.scale, 1, 64, d.export.scale)),\n indexed: bool(ex.indexed, d.export.indexed),\n grid: bool(ex.grid, false),\n gridColor: isColor(ex.gridColor) ? normHex(ex.gridColor) : d.export.gridColor,\n };\n return s;\n}\n\n/** A custom threshold matrix: 2D array of numbers. Ranks are derived from the order of the values. */\nexport function normalizeMatrix(m) {\n if (!Array.isArray(m) || !m.length || !Array.isArray(m[0])) return null;\n const h = Math.min(16, m.length), w = Math.min(16, m[0].length);\n const out = [];\n for (let y = 0; y < h; y++) {\n const row = [];\n for (let x = 0; x < w; x++) { const v = Number((m[y] || [])[x]); row.push(Number.isFinite(v) ? v : 0); }\n out.push(row);\n }\n return out;\n}\n\n/** Frame aspect ratios. `ratio` is width / height; null keeps the source's. */\nexport const ASPECTS = [\n { id: 'original', label: 'Original', ratio: null },\n { id: '1:1', label: '1:1', ratio: 1 },\n { id: '4:3', label: '4:3', ratio: 4 / 3 },\n { id: '3:4', label: '3:4', ratio: 3 / 4 },\n { id: '3:2', label: '3:2', ratio: 3 / 2 },\n { id: '2:3', label: '2:3', ratio: 2 / 3 },\n { id: '16:9', label: '16:9', ratio: 16 / 9 },\n { id: '9:16', label: '9:16', ratio: 9 / 16 },\n];\n\n/**\n * The part of a srcW \u00D7 srcH source that `frame` keeps, in whole source pixels.\n * The largest rectangle of the chosen aspect that fits, divided by zoom, placed by x/y (0 = left/top, 1 = right/bottom).\n */\nexport function cropRect(srcW, srcH, frame = {}) {\n const a = (ASPECTS.find(x => x.id === frame.aspect) || ASPECTS[0]).ratio || srcW / srcH;\n let w = srcW, h = srcW / a;\n if (h > srcH) { h = srcH; w = srcH * a; }\n const zoom = Math.max(1, frame.zoom || 1);\n w = Math.max(1, Math.min(srcW, Math.round(w / zoom)));\n h = Math.max(1, Math.min(srcH, Math.round(h / zoom)));\n const fx = frame.x ?? 0.5, fy = frame.y ?? 0.5;\n return { x: Math.round((srcW - w) * fx), y: Math.round((srcH - h) * fy), w, h };\n}\n\n/** Output size in pixels for a source of srcW \u00D7 srcH. */\nexport function resolveSize(srcW, srcH, size) {\n let w, h;\n if (size.mode === 'block') {\n w = Math.max(1, Math.round(srcW / size.block));\n h = Math.max(1, Math.round(srcH / size.block));\n } else {\n w = size.width;\n h = size.height || Math.max(1, Math.round(w * srcH / srcW));\n }\n return { width: Math.min(MAX_SIZE, w), height: Math.min(MAX_SIZE, h) };\n}\n\n// ---- sharing ---------------------------------------------------------------\n\nfunction diff(a, b) {\n // keys of `a` whose value differs from `b` (one level deep per group)\n const out = {};\n for (const k of Object.keys(a)) {\n if (k === 'version') continue;\n const va = a[k], vb = b[k];\n if (va && typeof va === 'object' && !Array.isArray(va)) {\n const g = {};\n for (const kk of Object.keys(va)) if (JSON.stringify(va[kk]) !== JSON.stringify(vb && vb[kk])) g[kk] = va[kk];\n if (Object.keys(g).length) out[k] = g;\n } else if (JSON.stringify(va) !== JSON.stringify(vb)) out[k] = va;\n }\n return out;\n}\n\nconst b64url = {\n enc(str) {\n const bytes = new TextEncoder().encode(str);\n let bin = ''; for (const b of bytes) bin += String.fromCharCode(b);\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n },\n dec(s) {\n const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));\n return new TextDecoder().decode(Uint8Array.from(bin, c => c.charCodeAt(0)));\n },\n};\n\n/** Settings \u2192 the smallest JSON that rebuilds them (only what differs from the defaults). */\nexport function compactSettings(settings) {\n const s = normalizeSettings(settings);\n const out = diff(s, defaultSettings());\n if (out.palette) {\n if (s.palette.source !== 'custom') { delete out.palette.colors; delete out.palette.name; } // a built-in id is enough\n if (s.palette.source !== 'builtin') delete out.palette.id;\n if (s.palette.source !== 'extract') delete out.palette.count;\n }\n if (out.palette && !Object.keys(out.palette).length) delete out.palette;\n return out;\n}\n\n/** Settings \u2192 URL-safe string for `#s=\u2026`. */\nexport function encodeSettings(settings) {\n return b64url.enc(JSON.stringify({ v: SETTINGS_VERSION, ...compactSettings(settings) }));\n}\n\n/** `#s=\u2026` string (or a whole URL / hash) \u2192 settings. Throws on garbage. */\nexport function decodeSettings(str) {\n let s = String(str);\n const m = /[#&?]s=([A-Za-z0-9_-]+)/.exec(s);\n if (m) s = m[1];\n const obj = JSON.parse(b64url.dec(s));\n delete obj.v;\n return normalizeSettings(obj);\n}\n\n/** Settings \u2192 pretty JSON for saving to a file. */\nexport function settingsToJSON(settings) {\n return JSON.stringify({ $schema: 'image-to-pixel/settings', version: SETTINGS_VERSION, ...compactSettings(settings) }, null, 2);\n}\n\n/** JSON text \u2192 settings. Accepts a full or partial settings object. */\nexport function settingsFromJSON(text) {\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\n delete obj.$schema;\n return normalizeSettings(obj);\n}\n\n/** Apply a partial patch on top of settings (one level deep per group). */\nexport function mergeSettings(base, patch) {\n const out = JSON.parse(JSON.stringify(base));\n for (const k of Object.keys(patch || {})) {\n if (patch[k] && typeof patch[k] === 'object' && !Array.isArray(patch[k]) && out[k] && typeof out[k] === 'object') {\n Object.assign(out[k], patch[k]);\n } else out[k] = patch[k];\n }\n return normalizeSettings(out);\n}\n", "// A \"plan\" is everything both backends need, resolved once from settings + source size:\n// output size, palette bytes, threshold map, kernel, and the numbers derived from them.\n// Building it in one place keeps the CPU and GPU paths in lock-step.\n\nimport { normalizeSettings, resolveSize, ditherKind, cropRect } from './settings.js';\nimport { parseColor, paletteSpread } from './color.js';\nimport { thresholdMap } from './dither/matrices.js';\nimport { KERNELS, kernelSkew, waveCount } from './dither/kernels.js';\nimport { extractPalette } from './palette/extract.js';\nimport { resample, adjust } from './cpu/stages.js';\n\n/**\n * @param {object} settings\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA source (only read for palette extraction)\n */\nexport function makePlan(settings, src) {\n const s = normalizeSettings(settings);\n const crop = cropRect(src.width, src.height, s.frame);\n const { width, height } = resolveSize(crop.w, crop.h, s.size);\n\n let colors = s.palette.colors;\n if (s.palette.source === 'extract') colors = extractFrom(src, s, width, height, crop);\n const quantize = s.palette.source !== 'none' && colors.length > 0;\n const palette = quantize ? colors.map(parseColor) : [];\n\n let kind = quantize ? ditherKind(s.dither.method) : 'none';\n if (s.dither.strength <= 0) kind = 'none';\n\n const map = kind === 'ordered' ? thresholdMap(s.dither.method, s.dither.matrix) : null;\n const kernel = kind === 'diffusion' ? KERNELS[s.dither.method] : null;\n const skew = kernel ? kernelSkew(kernel) : 1;\n\n return {\n settings: s,\n srcWidth: src.width, srcHeight: src.height,\n crop, // source pixels kept by the frame settings\n width, height,\n quantize, kind,\n palette, // [[r, g, b] bytes]\n paletteHex: quantize ? colors.slice() : null,\n distance: s.palette.distance === 'rgb' ? 1 : 0,\n spread: quantize ? paletteSpread(palette) : 0,\n map, kernel, skew,\n waves: kernel ? waveCount(width, height, skew) : 0,\n outline: { mode: s.outline.mode, color: parseColor(s.outline.color), corners: s.outline.corners },\n };\n}\n\nfunction extractFrom(src, s, width, height, crop) {\n // extract from what will actually be quantised: the resized + adjusted image (capped for speed)\n const k = Math.min(1, 160 / Math.max(width, height));\n const w = Math.max(1, Math.round(width * k)), h = Math.max(1, Math.round(height * k));\n const prep = resample(src, w, h, 'box', crop);\n adjust(prep, s.adjust);\n const bytes = new Uint8ClampedArray(prep.length);\n for (let i = 0; i < prep.length; i++) bytes[i] = Math.round(prep[i] * 255);\n return extractPalette({ data: bytes, width: w, height: h }, s.palette.count, { alphaThreshold: Math.max(0.01, s.alpha.threshold) });\n}\n", "// Generated by scripts/gen-bluenoise.mjs: 64\u00D764 void-and-cluster blue noise, one byte per cell (0..255).\nexport const BLUE_NOISE_SIZE = 64;\nexport const BLUE_NOISE_B64 = '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';\n", "// Threshold maps for ordered dithering.\n// A map is { w, h, levels, values: Uint8Array } and the threshold of a cell is (value + 0.5) / levels.\n// The GPU reads the same bytes from a texture, so CPU and GPU agree exactly.\n\nimport { BLUE_NOISE_B64, BLUE_NOISE_SIZE } from './bluenoise-data.js';\n\nfunction fromB64(b64) {\n if (typeof atob === 'function') return Uint8Array.from(atob(b64), c => c.charCodeAt(0));\n return new Uint8Array(Buffer.from(b64, 'base64'));\n}\n\n/** Bayer index matrix of size n (power of two). */\nexport function bayer(n) {\n let m = [[0]];\n for (let s = 1; s < n; s *= 2) {\n const next = [];\n for (let y = 0; y < s * 2; y++) next.push(new Array(s * 2));\n for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) {\n const v = 4 * m[y][x];\n next[y][x] = v; next[y][x + s] = v + 2; next[y + s][x] = v + 3; next[y + s][x + s] = v + 1;\n }\n m = next;\n }\n return m;\n}\n\n/** Turn arbitrary numbers into ranks 0..n-1 (ties keep reading order). */\nexport function toRanks(rows) {\n const h = rows.length, w = rows[0].length;\n const cells = [];\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) cells.push({ i: y * w + x, v: rows[y][x] });\n cells.sort((a, b) => a.v - b.v || a.i - b.i);\n const out = new Uint8Array(w * h);\n cells.forEach((c, r) => { out[c.i] = r; });\n return out;\n}\n\n/** Clustered-dot screen: cells ranked by a dot function, two dots per tile at 45\u00B0. */\nfunction clustered(n) {\n const rows = [];\n for (let y = 0; y < n; y++) {\n const row = [];\n for (let x = 0; x < n; x++) {\n const u = (x + 0.5) / n * 2 * Math.PI, v = (y + 0.5) / n * 2 * Math.PI;\n row.push(-(Math.cos(u) + Math.cos(v)) + (x * n + y) * 1e-9);\n }\n rows.push(row);\n }\n return rows;\n}\n\nconst CLUSTER4 = [[7, 13, 11, 4], [12, 16, 14, 8], [10, 15, 6, 2], [5, 9, 3, 1]]; // classic editor's matrix\nconst cache = new Map();\n\n/**\n * Threshold map for an ordered method id ('bayer4', 'bluenoise', 'custom' \u2026).\n * @param {string} method\n * @param {number[][]|null} [custom] matrix for 'custom'\n */\nexport function thresholdMap(method, custom = null) {\n if (method === 'custom') {\n const m = custom && custom.length ? custom : bayer(4);\n return { w: m[0].length, h: m.length, levels: m.length * m[0].length, values: toRanks(m) };\n }\n if (cache.has(method)) return cache.get(method);\n let map;\n const sq = rows => ({ w: rows[0].length, h: rows.length, levels: rows.length * rows[0].length, values: toRanks(rows) });\n switch (method) {\n case 'bayer2': map = sq(bayer(2)); break;\n case 'bayer4': map = sq(bayer(4)); break;\n case 'bayer8': map = sq(bayer(8)); break;\n case 'bayer16': map = sq(bayer(16)); break;\n case 'cluster4': map = sq(CLUSTER4); break;\n case 'cluster8': map = sq(clustered(8)); break;\n case 'lines': map = sq([[0], [2], [1], [3]]); break;\n case 'bluenoise': map = { w: BLUE_NOISE_SIZE, h: BLUE_NOISE_SIZE, levels: 256, values: fromB64(BLUE_NOISE_B64) }; break;\n default: map = sq(bayer(4));\n }\n cache.set(method, map);\n return map;\n}\n\n/**\n * Parse a custom matrix typed by a person: rows on lines, numbers separated by spaces or commas.\n * Accepts an optional \"/ 16\" style divisor line, which is ignored (only the order matters).\n */\nexport function parseMatrix(text) {\n const rows = String(text).split(/\\r?\\n|;/).map(l => l.trim()).filter(l => l && !/^\\//.test(l))\n .map(l => l.replace(/[[\\]]/g, '').split(/[\\s,]+/).filter(Boolean).map(Number));\n if (!rows.length) throw new Error('Matrix is empty');\n const w = rows[0].length;\n if (rows.some(r => r.length !== w || r.some(v => !Number.isFinite(v)))) throw new Error('Every row needs the same number of values');\n if (w > 16 || rows.length > 16) throw new Error('Matrices are limited to 16\u00D716');\n return rows;\n}\n", "// Error-diffusion kernels as push offsets [dx, dy, weight] (weights already divided).\n// `skew` is the wavefront slope the GPU needs: pixels with x + skew*y = k only depend on\n// earlier waves, so each wave is one draw (see docs/how-it-works.md).\n\nconst k = (div, list) => list.map(([dx, dy, w]) => [dx, dy, w / div]);\n\nexport const KERNELS = {\n 'floyd-steinberg': k(16, [[1, 0, 7], [-1, 1, 3], [0, 1, 5], [1, 1, 1]]),\n 'atkinson': k(8, [[1, 0, 1], [2, 0, 1], [-1, 1, 1], [0, 1, 1], [1, 1, 1], [0, 2, 1]]),\n 'sierra-lite': k(4, [[1, 0, 2], [-1, 1, 1], [0, 1, 1]]),\n 'sierra': k(32, [[1, 0, 5], [2, 0, 3], [-2, 1, 2], [-1, 1, 4], [0, 1, 5], [1, 1, 4], [2, 1, 2], [-1, 2, 2], [0, 2, 3], [1, 2, 2]]),\n 'burkes': k(32, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2]]),\n 'jarvis': k(48, [[1, 0, 7], [2, 0, 5], [-2, 1, 3], [-1, 1, 5], [0, 1, 7], [1, 1, 5], [2, 1, 3], [-2, 2, 1], [-1, 2, 3], [0, 2, 5], [1, 2, 3], [2, 2, 1]]),\n 'stucki': k(42, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2], [-2, 2, 1], [-1, 2, 2], [0, 2, 4], [1, 2, 2], [2, 2, 1]]),\n};\n\nexport const MAX_KERNEL = 12;\n\n/** Smallest integer s so that every push offset lands on a later wave x + s*y. */\nexport function kernelSkew(kernel) {\n let s = 1;\n for (const [dx, dy] of kernel) if (dy > 0) s = Math.max(s, Math.floor(-dx / dy) + 1);\n return s;\n}\n\n/** Number of waves (GPU draws) for an image of w \u00D7 h. */\nexport const waveCount = (w, h, skew) => (w - 1) + skew * (h - 1) + 1;\n", "// Palette extraction: median cut on the image's colours, refined by a few k-means passes.\n// Deterministic (no randomness), so the same image always gives the same palette.\n\nimport { toHex } from '../color.js';\n\n/**\n * @param {{ data: ArrayLike<number>, width: number, height: number }} img RGBA bytes\n * @param {number} count number of colours (2..256)\n * @param {{ maxSamples?: number, alphaThreshold?: number }} [opts]\n * @returns {string[]} '#rrggbb' colours sorted dark \u2192 light\n */\nexport function extractPalette(img, count = 16, opts = {}) {\n const { maxSamples = 40000, alphaThreshold = 0.5 } = opts;\n const n = img.width * img.height;\n const step = Math.max(1, Math.floor(n / maxSamples));\n const pts = [];\n for (let i = 0; i < n; i += step) {\n const o = i * 4;\n if (img.data[o + 3] < alphaThreshold * 255) continue;\n pts.push([img.data[o], img.data[o + 1], img.data[o + 2]]);\n }\n if (!pts.length) return ['#000000', '#ffffff'].slice(0, Math.max(1, count));\n\n // ---- median cut\n let boxes = [pts];\n while (boxes.length < count) {\n let bi = -1, bestRange = -1, bestAxis = 0;\n boxes.forEach((b, i) => {\n if (b.length < 2) return;\n for (let a = 0; a < 3; a++) {\n let lo = 255, hi = 0;\n for (const p of b) { if (p[a] < lo) lo = p[a]; if (p[a] > hi) hi = p[a]; }\n // weight by population so big flat areas get split before tiny noisy ones\n const r = (hi - lo) * Math.sqrt(b.length);\n if (r > bestRange) { bestRange = r; bi = i; bestAxis = a; }\n }\n });\n if (bi < 0 || bestRange <= 0) break;\n const b = boxes[bi].slice().sort((p, q) => p[bestAxis] - q[bestAxis]);\n const mid = b.length >> 1;\n boxes.splice(bi, 1, b.slice(0, mid), b.slice(mid));\n }\n let centers = boxes.map(b => mean(b));\n\n // ---- k-means refinement\n for (let iter = 0; iter < 6; iter++) {\n const sums = centers.map(() => [0, 0, 0, 0]);\n for (const p of pts) {\n let best = 0, bd = Infinity;\n for (let c = 0; c < centers.length; c++) {\n const dr = p[0] - centers[c][0], dg = p[1] - centers[c][1], db = p[2] - centers[c][2];\n const d = dr * dr + dg * dg + db * db;\n if (d < bd) { bd = d; best = c; }\n }\n const s = sums[best]; s[0] += p[0]; s[1] += p[1]; s[2] += p[2]; s[3]++;\n }\n centers = centers.map((c, i) => (sums[i][3] ? [sums[i][0] / sums[i][3], sums[i][1] / sums[i][3], sums[i][2] / sums[i][3]] : c));\n }\n\n const hexes = [...new Set(centers.map(c => toHex(c)))];\n const lum = h => { const v = parseInt(h.slice(1), 16); return 0.2126 * (v >> 16) + 0.7152 * ((v >> 8) & 255) + 0.0722 * (v & 255); };\n return hexes.sort((a, b) => lum(a) - lum(b));\n}\n\nfunction mean(list) {\n let r = 0, g = 0, b = 0;\n for (const p of list) { r += p[0]; g += p[1]; b += p[2]; }\n return [r / list.length, g / list.length, b / list.length];\n}\n", "// CPU reference implementation of every pipeline stage.\n// The GLSL in gpu/shaders.js mirrors these functions line for line; tests compare the two.\n// Working buffers are Float32Array RGBA, rows top-down, values 0..1.\n\nimport { oklab, LUMA } from '../color.js';\n\n/**\n * Resample to w \u00D7 h. 'box' averages up to 16\u00D716 evenly spaced source texels per output pixel\n * (alpha-weighted); 'nearest' takes the centre texel. Integer maths, identical on the GPU.\n */\nexport function resample(src, w, h, mode = 'box', crop = null) {\n const ox = crop ? crop.x : 0, oy = crop ? crop.y : 0;\n const sw = crop ? crop.w : src.width, sh = crop ? crop.h : src.height, d = src.data, stride = src.width;\n const out = new Float32Array(w * h * 4);\n const nx = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sw / w)));\n const ny = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sh / h)));\n const xs = new Int32Array(w * nx), ys = new Int32Array(h * ny);\n for (let x = 0; x < w; x++) for (let i = 0; i < nx; i++) xs[x * nx + i] = ox + Math.min(sw - 1, Math.floor(((2 * (x * nx + i) + 1) * sw) / (2 * w * nx)));\n for (let y = 0; y < h; y++) for (let j = 0; j < ny; j++) ys[y * ny + j] = oy + Math.min(sh - 1, Math.floor(((2 * (y * ny + j) + 1) * sh) / (2 * h * ny)));\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n let r = 0, g = 0, b = 0, a = 0;\n for (let j = 0; j < ny; j++) {\n const row = ys[y * ny + j] * stride;\n for (let i = 0; i < nx; i++) {\n const o = (row + xs[x * nx + i]) * 4;\n const al = d[o + 3] / 255;\n r += d[o] / 255 * al; g += d[o + 1] / 255 * al; b += d[o + 2] / 255 * al; a += al;\n }\n }\n const o = (y * w + x) * 4;\n if (a > 0) { out[o] = r / a; out[o + 1] = g / a; out[o + 2] = b / a; }\n out[o + 3] = a / (nx * ny);\n }\n }\n return out;\n}\n\n/** Brightness, contrast, saturation, hue, gamma \u2014 in that order, in place. */\nexport function adjust(buf, { brightness = 0, contrast = 0, saturation = 0, hue = 0, gamma = 1 }) {\n if (!brightness && !contrast && !saturation && !hue && gamma === 1) return buf;\n const f = contrast >= 0 ? 1 / (1 - 0.99 * contrast) : 1 + contrast;\n const ig = 1 / gamma;\n // luminance-preserving hue rotation: the CSS hue-rotate() matrix (rows sum to 1, so greys stay grey)\n const hk = Math.cos(hue * Math.PI / 180), hq = Math.sin(hue * Math.PI / 180);\n const M = [\n 0.213 + 0.787 * hk - 0.213 * hq, 0.715 - 0.715 * hk - 0.715 * hq, 0.072 - 0.072 * hk + 0.928 * hq,\n 0.213 - 0.213 * hk + 0.143 * hq, 0.715 + 0.285 * hk + 0.140 * hq, 0.072 - 0.072 * hk - 0.283 * hq,\n 0.213 - 0.213 * hk - 0.787 * hq, 0.715 - 0.715 * hk + 0.715 * hq, 0.072 + 0.928 * hk + 0.072 * hq,\n ];\n for (let o = 0; o < buf.length; o += 4) {\n let r = buf[o] + brightness, g = buf[o + 1] + brightness, b = buf[o + 2] + brightness;\n r = (r - 0.5) * f + 0.5; g = (g - 0.5) * f + 0.5; b = (b - 0.5) * f + 0.5;\n const l = r * LUMA[0] + g * LUMA[1] + b * LUMA[2];\n const k = 1 + saturation;\n r = l + (r - l) * k; g = l + (g - l) * k; b = l + (b - l) * k;\n if (hue) {\n const r2 = M[0] * r + M[1] * g + M[2] * b, g2 = M[3] * r + M[4] * g + M[5] * b, b2 = M[6] * r + M[7] * g + M[8] * b;\n r = r2; g = g2; b = b2;\n }\n buf[o] = Math.pow(clamp01(r), ig); buf[o + 1] = Math.pow(clamp01(g), ig); buf[o + 2] = Math.pow(clamp01(b), ig);\n }\n return buf;\n}\n\n/** Binary alpha: below the threshold becomes fully transparent, the rest fully opaque. */\nexport function alphaCut(buf, threshold) {\n for (let o = 3; o < buf.length; o += 4) buf[o] = buf[o] >= threshold && buf[o] > 0 ? 1 : 0;\n return buf;\n}\n\nexport const clamp01 = v => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Precompute what nearest() needs for a palette. */\nexport function paletteSpace(palette, distance) {\n const n = palette.length;\n const coords = new Float64Array(n * 3);\n const rgb = new Float64Array(n * 3);\n palette.forEach((c, i) => {\n rgb.set([c[0] / 255, c[1] / 255, c[2] / 255], i * 3);\n coords.set(distance === 1 ? [c[0] / 255, c[1] / 255, c[2] / 255] : oklab(c[0] / 255, c[1] / 255, c[2] / 255), i * 3);\n });\n return { n, coords, rgb, distance };\n}\n\nconst W_RGB = [0.299, 0.587, 0.114];\n\n/** Index of the nearest palette colour (ties: lowest index). */\nexport function nearest(sp, r, g, b) {\n let p0, p1, p2, w0 = 1, w1 = 1, w2 = 1;\n if (sp.distance === 1) { p0 = r; p1 = g; p2 = b; w0 = W_RGB[0]; w1 = W_RGB[1]; w2 = W_RGB[2]; }\n else [p0, p1, p2] = oklab(r, g, b);\n let best = 0, bd = Infinity;\n const c = sp.coords;\n for (let i = 0; i < sp.n; i++) {\n const d0 = p0 - c[i * 3], d1 = p1 - c[i * 3 + 1], d2 = p2 - c[i * 3 + 2];\n const dist = w0 * d0 * d0 + w1 * d1 * d1 + w2 * d2 * d2;\n if (dist < bd) { bd = dist; best = i; }\n }\n return best;\n}\n\n/** No dithering / ordered dithering \u2192 RGBA bytes. */\nexport function quantizeOrdered(buf, w, h, plan) {\n const out = new Uint8ClampedArray(w * h * 4);\n const sp = plan.quantize ? paletteSpace(plan.palette, plan.distance) : null;\n const map = plan.kind === 'ordered' ? plan.map : null;\n const amt = map ? plan.spread * plan.settings.dither.strength : 0;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const o = (y * w + x) * 4;\n if (buf[o + 3] < 0.5) continue; // transparent stays 0,0,0,0\n let r = buf[o], g = buf[o + 1], b = buf[o + 2];\n if (sp) {\n if (map) {\n const t = (map.values[(y % map.h) * map.w + (x % map.w)] + 0.5) / map.levels - 0.5;\n r = clamp01(r + t * amt); g = clamp01(g + t * amt); b = clamp01(b + t * amt);\n }\n const i = nearest(sp, r, g, b);\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2];\n } else {\n out[o] = Math.round(r * 255); out[o + 1] = Math.round(g * 255); out[o + 2] = Math.round(b * 255);\n }\n out[o + 3] = 255;\n }\n }\n return out;\n}\n\n/** Error diffusion (left \u2192 right, top \u2192 bottom) \u2192 RGBA bytes. */\nexport function quantizeDiffusion(buf, w, h, plan) {\n const out = new Uint8ClampedArray(w * h * 4);\n const sp = paletteSpace(plan.palette, plan.distance);\n const acc = new Float32Array(w * h * 3);\n const strength = plan.settings.dither.strength;\n const kernel = plan.kernel;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const p = y * w + x, o = p * 4;\n if (buf[o + 3] < 0.5) continue;\n const r = clamp01(buf[o] + acc[p * 3] * strength);\n const g = clamp01(buf[o + 1] + acc[p * 3 + 1] * strength);\n const b = clamp01(buf[o + 2] + acc[p * 3 + 2] * strength);\n const i = nearest(sp, r, g, b);\n const er = r - sp.rgb[i * 3], eg = g - sp.rgb[i * 3 + 1], eb = b - sp.rgb[i * 3 + 2];\n for (const [dx, dy, wt] of kernel) {\n const xx = x + dx, yy = y + dy;\n if (xx < 0 || xx >= w || yy >= h) continue;\n const q = (yy * w + xx) * 3;\n acc[q] += er * wt; acc[q + 1] += eg * wt; acc[q + 2] += eb * wt;\n }\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2]; out[o + 3] = 255;\n }\n }\n return out;\n}\n\nconst key = (d, o) => (d[o + 3] === 0 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\nconst N4 = [[0, -1], [1, 0], [0, 1], [-1, 0]];\n\n/** Replace pixels that share no colour with any 4-neighbour by their most common neighbour. */\nexport function removeOrphans(px, w, h) {\n const src = px.slice();\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const o = (y * w + x) * 4, c = key(src, o);\n const ks = [], os = [];\n for (const [dx, dy] of N4) {\n const xx = x + dx, yy = y + dy;\n if (xx < 0 || yy < 0 || xx >= w || yy >= h) continue;\n const oo = (yy * w + xx) * 4;\n ks.push(key(src, oo)); os.push(oo);\n }\n if (ks.length < 2 || ks.includes(c)) continue;\n let best = 0, bc = 0;\n for (let i = 0; i < ks.length; i++) {\n let n = 0; for (let j = 0; j < ks.length; j++) if (ks[j] === ks[i]) n++;\n if (n > bc) { bc = n; best = i; }\n }\n px.set(src.subarray(os[best], os[best] + 4), o);\n }\n }\n return px;\n}\n\n/** 3\u00D73 majority: a colour that fills at least 5 of the 9 cells wins. */\nexport function smoothMajority(px, w, h) {\n const src = px.slice();\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const o = (y * w + x) * 4, c = key(src, o);\n const ks = [], os = [];\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\n const xx = Math.min(w - 1, Math.max(0, x + dx)), yy = Math.min(h - 1, Math.max(0, y + dy));\n const oo = (yy * w + xx) * 4; ks.push(key(src, oo)); os.push(oo);\n }\n for (let i = 0; i < 9; i++) {\n if (ks[i] === c) continue;\n let n = 0; for (let j = 0; j < 9; j++) if (ks[j] === ks[i]) n++;\n if (n >= 5) { px.set(src.subarray(os[i], os[i] + 4), o); break; }\n }\n }\n }\n return px;\n}\n\n/** Outline around (outer) or inside (inner) the opaque shape. */\nexport function outline(px, w, h, { mode, color, corners }) {\n if (mode === 'none') return px;\n const src = px.slice();\n const opaque = (x, y) => x >= 0 && y >= 0 && x < w && y < h && src[(y * w + x) * 4 + 3] > 0;\n const inside = (x, y) => x >= 0 && y >= 0 && x < w && y < h;\n const nb = corners ? [[0, -1], [1, 0], [0, 1], [-1, 0], [-1, -1], [1, -1], [1, 1], [-1, 1]] : N4;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const me = opaque(x, y);\n let hit = false;\n for (const [dx, dy] of nb) {\n const xx = x + dx, yy = y + dy;\n if (!inside(xx, yy)) continue;\n if (mode === 'outer' ? (!me && opaque(xx, yy)) : (me && !opaque(xx, yy))) { hit = true; break; }\n }\n if (hit) { const o = (y * w + x) * 4; px[o] = color[0]; px[o + 1] = color[1]; px[o + 2] = color[2]; px[o + 3] = 255; }\n }\n }\n return px;\n}\n", "// The whole pipeline on the CPU. Used when WebGL 2 is unavailable, in Node, and as the\n// reference the GPU output is tested against.\n\nimport { resample, adjust, alphaCut, quantizeOrdered, quantizeDiffusion, removeOrphans, smoothMajority, outline } from './stages.js';\n\n/**\n * @param {ReturnType<import('../plan.js').makePlan>} plan\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA bytes, rows top-down\n * @returns {Uint8ClampedArray} RGBA bytes, plan.width \u00D7 plan.height\n */\nexport function runCPU(plan, src) {\n const { width: w, height: h, settings: s } = plan;\n const buf = resample(src, w, h, s.size.resample, plan.crop);\n adjust(buf, s.adjust);\n alphaCut(buf, s.alpha.threshold);\n const px = plan.kind === 'diffusion' ? quantizeDiffusion(buf, w, h, plan) : quantizeOrdered(buf, w, h, plan);\n if (s.cleanup.orphans) removeOrphans(px, w, h);\n if (s.cleanup.smooth) smoothMajority(px, w, h);\n outline(px, w, h, plan.outline);\n return px;\n}\n", "/* global __VERSION__ */\n// __VERSION__ is injected by esbuild (see esbuild.config.mjs); falls back when running src/ directly.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '2.0.0-dev';\nexport const MAX_CHANNELS = 4;\nexport const DEFAULT_CANVAS_ID = 'glcanvas';\n", "export class ShaderMateError extends Error {\n constructor(message, details) {\n super(message);\n this.name = 'ShaderMateError';\n if (details) Object.assign(this, details);\n }\n}\n\nconst warned = new Set();\n/** console.warn once per key. */\nexport function warnOnce(key, ...args) {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn('[ShaderMate]', ...args);\n}\n\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nexport const isArrayLike = v => Array.isArray(v) || (ArrayBuffer.isView(v) && !(v instanceof DataView));\nexport const toArray = v => (v == null ? [] : Array.isArray(v) ? v : [v]);\nexport const isPow2 = n => n > 0 && (n & (n - 1)) === 0;\nexport const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));\n\n/** `glsl` tagged template: no-op, but lets editors syntax-highlight inline shaders. */\nexport const glsl = (strings, ...values) => String.raw({ raw: strings }, ...values);\n\n/** Parse a CSS color ('#f80', 'rgb(\u2026)', 'red') or [r,g,b,a] into [r,g,b,a] 0..1. */\nexport function parseColor(c) {\n if (c == null) return null;\n if (Array.isArray(c)) return [c[0] ?? 0, c[1] ?? 0, c[2] ?? 0, c[3] ?? 1];\n if (typeof c === 'string' && isBrowser) {\n const cv = document.createElement('canvas');\n cv.width = cv.height = 1;\n const x = cv.getContext('2d');\n x.fillStyle = c;\n x.fillRect(0, 0, 1, 1);\n const d = x.getImageData(0, 0, 1, 1).data;\n return [d[0] / 255, d[1] / 255, d[2] / 255, d[3] / 255];\n }\n return null;\n}\n\n/** True when running on localhost / file: \u2014 used for dev-only defaults. */\nexport function isDevHost() {\n if (!isBrowser) return false;\n const h = location.hostname;\n return location.protocol === 'file:' || h === 'localhost' || h === '127.0.0.1' || h === '' || h.endsWith('.local');\n}\n", "/** Reference-counted store for GL objects so shared resources are freed exactly once. */\nexport class RefPool {\n constructor(gl) {\n this.gl = gl;\n this._items = new Map(); // id -> { obj, count, type }\n this._nextId = 1;\n }\n\n add(obj, type) {\n const id = this._nextId++;\n this._items.set(id, { obj, count: 1, type });\n return id;\n }\n\n ref(id) {\n const it = this._items.get(id);\n if (it) it.count++;\n return id;\n }\n\n /** Returns the raw GL object for an id (or null). */\n get(id) {\n const it = this._items.get(id);\n return it ? it.obj : null;\n }\n\n unref(id) {\n const it = this._items.get(id);\n if (!it) return;\n it.count--;\n if (it.count <= 0) this._destroy(id, it);\n }\n\n _destroy(id, it) {\n const { obj, type } = it;\n const gl = this.gl;\n switch (type) {\n case 'texture2D':\n case 'textureCube': gl.deleteTexture(obj); break;\n case 'fbo': gl.deleteFramebuffer(obj); break;\n case 'buffer': gl.deleteBuffer(obj); break;\n case 'program': gl.deleteProgram(obj); break;\n }\n this._items.delete(id);\n }\n\n /** Destroy everything regardless of refcount. */\n dispose() {\n for (const [id, it] of [...this._items]) this._destroy(id, it);\n }\n}\n", "/**\n * Tiny event emitter. `forward(ev, data)` (optional) receives every emitted event,\n * which is how instances feed the global ShaderMate.on() bus.\n */\nexport function createEmitter(forward) {\n const map = new Map();\n\n function on(ev, fn) {\n if (!map.has(ev)) map.set(ev, new Set());\n map.get(ev).add(fn);\n return () => off(ev, fn);\n }\n function off(ev, fn) {\n const s = map.get(ev);\n if (s) s.delete(fn);\n }\n function once(ev, fn) {\n const wrapped = data => { off(ev, wrapped); fn(data); };\n return on(ev, wrapped);\n }\n function emit(ev, data) {\n const s = map.get(ev);\n if (s) {\n for (const fn of [...s]) {\n try { fn(data); } catch (e) { console.error(`[ShaderMate] error in \"${ev}\" listener`, e); }\n }\n }\n if (forward) forward(ev, data);\n }\n function clear() { map.clear(); }\n\n return { on, off, once, emit, clear };\n}\n", "// Tiny tween engine for uniforms: sm.tween('u_hover', 1, { duration: 400, ease: 'outCubic' })\n\nexport const EASES = {\n linear: t => t,\n inQuad: t => t * t,\n outQuad: t => t * (2 - t),\n inOutQuad: t => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n inCubic: t => t * t * t,\n outCubic: t => 1 - Math.pow(1 - t, 3),\n inOutCubic: t => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2),\n outExpo: t => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n outBack: t => 1 + 2.70158 * Math.pow(t - 1, 3) + 1.70158 * Math.pow(t - 1, 2),\n outElastic: t => (t === 0 || t === 1 ? t : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * Math.PI) / 3) + 1),\n};\n\nexport function createTweens() {\n const active = new Map(); // key -> tween\n\n /**\n * getter/setter work on the live uniform value. Resolves when finished (false if interrupted).\n */\n function tween(key, get, set, to, opts = {}) {\n const { duration = 500, delay = 0 } = opts;\n const ease = typeof opts.ease === 'function' ? opts.ease : (EASES[opts.ease] || EASES.outCubic);\n const prev = active.get(key);\n if (prev) prev.resolve(false);\n\n const from = get();\n const isArr = Array.isArray(to) || ArrayBuffer.isView(to);\n const f = isArr ? Array.from(from ?? to) : Number(from ?? 0);\n const t = isArr ? Array.from(to) : Number(to);\n\n return new Promise(resolve => {\n const tw = {\n start: performance.now() + delay,\n resolve: v => { active.delete(key); resolve(v); },\n update(now) {\n const p = duration > 0 ? clamp01((now - this.start) / duration) : 1;\n if (p < 0) return;\n const e = ease(p);\n set(isArr ? f.map((a, i) => a + (t[i] - a) * e) : f + (t - f) * e);\n if (p >= 1) this.resolve(true);\n }\n };\n active.set(key, tw);\n });\n }\n\n function update(now) {\n for (const tw of [...active.values()]) tw.update(now);\n }\n\n function cancel(key) {\n if (key === undefined) { for (const tw of [...active.values()]) tw.resolve(false); return; }\n const tw = active.get(key);\n if (tw) tw.resolve(false);\n }\n\n return { tween, update, cancel, get size() { return active.size; } };\n}\n\nconst clamp01 = v => (v < 0 ? v : v > 1 ? 1 : v);\n", "import { MAX_CHANNELS } from '../constants.js';\nimport { ShaderMateError } from '../utils/util.js';\n\n/**\n * Normalize everything the user may pass as \"the shaders\" into an array of pass configs.\n *\n * 'frag.glsl' | '...glsl source...' -> one screen pass\n * { shader|src, ... } -> one pass\n * [ 'a.glsl', { name, shader, ... }, ... ] -> multipass (last one hits the screen unless `screen` is set)\n *\n * Caller objects are shallow-cloned; `uniforms` is kept by reference so live mutation works.\n */\nexport function normalizePasses(input) {\n let list;\n if (typeof input === 'string') list = [{ src: input }];\n else if (Array.isArray(input)) list = input.map(p => (typeof p === 'string' ? { src: p } : { ...p }));\n else if (input && typeof input === 'object') list = [{ ...input }];\n else throw new ShaderMateError('ShaderMate: expected a shader (string), a pass object, or an array of passes');\n if (!list.length) throw new ShaderMateError('ShaderMate: no passes given');\n\n list.forEach((p, i) => {\n if (p.src == null) p.src = p.shader ?? p.frag ?? p.fragment ?? p.glsl ?? p.url;\n if (p.src == null) throw new ShaderMateError(`Pass ${p.name ?? i} has no shader source (use \"shader\")`);\n if (p.name == null) p.name = list.length === 1 ? 'main' : 'pass' + i;\n if (p.uniforms == null) p.uniforms = {};\n });\n\n if (!list.some(p => p.screen)) list[list.length - 1].screen = true;\n if (list.filter(p => p.screen).length > 1) console.warn('[ShaderMate] Multiple screen:true passes; last drawn wins.');\n\n const names = list.map(p => p.name);\n const dupes = names.filter((n, i) => names.indexOf(n) !== i);\n if (dupes.length) throw new ShaderMateError('Duplicate pass names: ' + [...new Set(dupes)].join(', '));\n\n for (const p of list) {\n const chans = Array.isArray(p.channels) ? p.channels : (p.channels ? [p.channels] : []);\n p.channels = chans.slice(0, MAX_CHANNELS).map(c => normalizeChannel(c, names, p.name));\n while (p.channels.length < MAX_CHANNELS) p.channels.push(null);\n }\n return list;\n}\n\nconst isEl = v => typeof HTMLElement !== 'undefined' && v instanceof HTMLElement;\nconst isBitmap = v => typeof ImageBitmap !== 'undefined' && v instanceof ImageBitmap;\nconst isTex = v => typeof WebGLTexture !== 'undefined' && v instanceof WebGLTexture;\n\n/**\n * Channel shorthand:\n * 'BufferA' -> that pass's output (if a pass has that name), else an image URL\n * { pass:'A' } / { id:'A' } -> pass output (buffer: 'prev' | 'current' for ping-pong passes)\n * { url|image }, { video }, { audio|audioFFT }, { mic:true }, { camera:true }, { cubemap:[6 urls] }\n * { element } or a raw <canvas>/<video>/<img>/ImageBitmap\n * { texture: WebGLTexture, width, height, cube? }\n * common params: wrap, filter, flipY, mipmap\n */\nexport function normalizeChannel(ch, passNames = [], ownerName = '') {\n if (ch == null || ch === false) return null;\n if (typeof ch === 'string') return passNames.includes(ch) ? { pass: ch } : { url: ch };\n if (isEl(ch) || isBitmap(ch)) return { element: ch };\n if (isTex(ch)) return { texture: ch };\n const out = { ...ch };\n if (out.pass == null && out.id != null) out.pass = out.id;\n if (out.url == null && out.image != null) out.url = out.image;\n if (out.element == null && out.canvas != null) out.element = out.canvas;\n if (out.pass == null && out.src != null && out.url == null && out.video == null) out.url = out.src;\n if (out.pass != null && !passNames.includes(out.pass)) {\n console.warn(`[ShaderMate] Pass \"${ownerName}\": channel references unknown pass \"${out.pass}\"`);\n }\n return out;\n}\n\n/** True if `src` is GLSL text rather than a URL/path. */\nexport function isInlineSource(src) {\n return /[\\r\\n]/.test(src) || /^\\s*(void|#|precision|uniform|in |out |\\/\\/|\\/\\*)/.test(src) || /[{};]/.test(src);\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\nexport const isWebGL2 = gl =>\n typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n\n/**\n * options.webgl: 'auto' (default) | 2 | 1\n * options.alpha / premultipliedAlpha / preserveDrawingBuffer / antialias, plus options.contextAttributes.\n */\nexport function createContext(canvas, options = {}) {\n const attrs = Object.assign({\n alpha: options.alpha !== false,\n premultipliedAlpha: options.premultipliedAlpha !== false,\n preserveDrawingBuffer: !!options.preserveDrawingBuffer,\n antialias: !!options.antialias,\n powerPreference: options.powerPreference || 'default',\n }, options.contextAttributes);\n\n const want = options.webgl === undefined ? 'auto' : String(options.webgl);\n let gl = null;\n if (want === 'auto' || want === '2') gl = canvas.getContext('webgl2', attrs);\n if (!gl && (want === 'auto' || want === '1')) {\n gl = canvas.getContext('webgl', attrs) || canvas.getContext('experimental-webgl', attrs);\n }\n if (!gl) throw new ShaderMateError('WebGL not supported');\n return gl;\n}\n\nexport function getExtensions(gl, isGL2) {\n const ext = {};\n if (!isGL2) {\n ext.OES_texture_float = gl.getExtension('OES_texture_float');\n ext.OES_texture_half_float = gl.getExtension('OES_texture_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n ext.OES_texture_half_float_linear = gl.getExtension('OES_texture_half_float_linear');\n ext.OES_standard_derivatives = gl.getExtension('OES_standard_derivatives');\n ext.WEBGL_color_buffer_float = gl.getExtension('WEBGL_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.WEBGL_depth_texture = gl.getExtension('WEBGL_depth_texture');\n ext.EXT_shader_texture_lod = gl.getExtension('EXT_shader_texture_lod');\n } else {\n ext.EXT_color_buffer_float = gl.getExtension('EXT_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n }\n return ext;\n}\n", "/** Full-screen two-triangle quad. One per instance (GL buffers can't be shared across contexts). */\nexport function createQuad(gl) {\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n -1, -1, 1, -1, -1, 1,\n -1, 1, 1, -1, 1, 1\n ]), gl.STATIC_DRAW);\n\n return {\n /** Bind the quad to `program`'s a_position attribute (call right before drawing). */\n bind(program) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n const loc = gl.getAttribLocation(program, 'a_position');\n if (loc !== -1) {\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);\n }\n },\n draw() { gl.drawArrays(gl.TRIANGLES, 0, 6); },\n dispose() { gl.deleteBuffer(buf); }\n };\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\n/**\n * Parse a driver info log into [{ line, message }], with `line` relative to the user's\n * source (the injected `#line 1`), so errors point at the file the author wrote.\n */\nexport function parseShaderLog(log, src) {\n const lines = src.split('\\n');\n const userStart = lines.findIndex(l => /^\\s*#line\\s+1\\b/.test(l)) + 1;\n const errors = [];\n for (const row of log.split('\\n')) {\n const m = /ERROR:\\s*\\d+:(\\d+):\\s*(.*)/.exec(row);\n if (!m) continue;\n const logical = parseInt(m[1], 10);\n const physical = userStart > 0 ? userStart + logical - 1 : logical - 1; // 0-based index into `lines`\n errors.push({ line: logical, message: m[2].trim(), source: lines[physical] ?? '', physical });\n }\n return errors;\n}\n\n/**\n * Compile one shader. Returns { shader } or { error: ShaderMateError }.\n */\nexport function compileShader(gl, type, src, { label = '', showExpandedOnError = true } = {}) {\n const sh = gl.createShader(type);\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (gl.getShaderParameter(sh, gl.COMPILE_STATUS)) return { shader: sh };\n\n const log = gl.getShaderInfoLog(sh) || '';\n gl.deleteShader(sh);\n const errors = parseShaderLog(log, src);\n const stage = type === gl.VERTEX_SHADER ? 'Vertex' : 'Fragment';\n const summary = errors.length\n ? errors.map(e => `line ${e.line}: ${e.message}`).join('\\n')\n : log.trim();\n const err = new ShaderMateError(`${stage} shader compile error${label ? ` in pass \"${label}\"` : ''}:\\n${summary}`,\n { pass: label, stage, log, errors, source: src });\n\n if (showExpandedOnError) {\n const marks = new Set(errors.map(e => e.physical));\n const numbered = src.split('\\n').map((line, i) =>\n `${marks.has(i) ? '>>>' : ' '} ${String(i + 1).padStart(4, ' ')} | ${line}`).join('\\n');\n console.error('[ShaderMate] ' + err.message, { COMPILED: '\\n' + numbered });\n } else {\n console.error('[ShaderMate] ' + err.message);\n }\n return { error: err };\n}\n\n/** Link a program. Returns { program } or { error }. */\nexport function createProgram(gl, vsrc, fsrc, opts) {\n const v = compileShader(gl, gl.VERTEX_SHADER, vsrc, opts);\n if (v.error) return v;\n const f = compileShader(gl, gl.FRAGMENT_SHADER, fsrc, opts);\n if (f.error) { gl.deleteShader(v.shader); return f; }\n\n const p = gl.createProgram();\n gl.attachShader(p, v.shader);\n gl.attachShader(p, f.shader);\n gl.linkProgram(p);\n gl.deleteShader(v.shader);\n gl.deleteShader(f.shader);\n\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(p) || '';\n gl.deleteProgram(p);\n const err = new ShaderMateError(`Program link error${opts && opts.label ? ` in pass \"${opts.label}\"` : ''}: ${log}`, { pass: opts && opts.label, log });\n console.error('[ShaderMate] ' + err.message);\n return { error: err };\n }\n return { program: p };\n}\n\n/** name -> { loc, type, size } for every active uniform (array names have `[0]` stripped). */\nexport function getUniformInfo(gl, program) {\n const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n const out = {};\n for (let i = 0; i < n; i++) {\n const info = gl.getActiveUniform(program, i);\n if (!info) continue;\n out[info.name.replace(/\\[0\\]$/, '')] = {\n loc: gl.getUniformLocation(program, info.name),\n type: info.type,\n size: info.size\n };\n }\n return out;\n}\n", "export const VERT_GL2 = `#version 300 es\nlayout(location=0) in vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\nexport const VERT_GL1 = `attribute vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\n/** Texture-sampling compatibility macros so the same source compiles as GLSL ES 1.00 and 3.00. */\nexport const BUILTIN_MACROS_GL2 = `#define texture2D(s,u) texture(s,u)\n#define textureCube(s,u) texture(s,u)\n#define TEX(s,u) texture(s,u)\n#define TEX_LOD(s,u,l) textureLod(s,u,l)\n`;\n\nexport const BUILTIN_MACROS_GL1 = `#define texture(s,u) texture2D(s,u)\n#define TEX(s,u) texture2D(s,u)\n#define TEX_LOD(s,u,l) texture2D(s,u)\n`;\n\nexport const MAIN_WRAP_GL2 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n outColor = c;\n}`;\n\nexport const MAIN_WRAP_GL1 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n gl_FragColor = c;\n}`;\n", "import { createProgram } from './shader.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\n\nconst FRAG_GL2 = `#version 300 es\nprecision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size; out vec4 o;\nvoid main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`;\nconst FRAG_GL1 = `precision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size;\nvoid main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;\n\n/** Copies a texture to the default framebuffer (used when the screen pass also needs a readable backbuffer). */\nexport function createBlit(gl, isGL2, quad) {\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, isGL2 ? FRAG_GL2 : FRAG_GL1, { label: 'blit' });\n if (r.error) throw r.error;\n const program = r.program;\n const uTex = gl.getUniformLocation(program, 'u_tex');\n const uSize = gl.getUniformLocation(program, 'u_size');\n return {\n draw(tex, w, h) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, w, h);\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.uniform1i(uTex, 0);\n gl.uniform2f(uSize, w, h);\n quad.bind(program);\n quad.draw();\n },\n dispose() { gl.deleteProgram(program); }\n };\n}\n", "/** 'clamp' (default) | 'repeat' | 'mirror' */\nexport function wrapMode(gl, wrap) {\n if (wrap === 'repeat') return gl.REPEAT;\n if (wrap === 'mirror' || wrap === 'mirrored') return gl.MIRRORED_REPEAT;\n return gl.CLAMP_TO_EDGE;\n}\n\n/** 'linear' (default) | 'nearest' */\nexport function filterMode(gl, filter) {\n return filter === 'nearest' ? gl.NEAREST : gl.LINEAR;\n}\n", "import { wrapMode, filterMode } from './params.js';\nimport { warnOnce } from '../utils/util.js';\n\nfunction chooseFormat(gl, isGL2, ext, opts) {\n let ifmt = isGL2 ? gl.RGBA8 : gl.RGBA;\n const fmt = gl.RGBA;\n let type = gl.UNSIGNED_BYTE;\n\n if (opts.float === 'full' || opts.float === 32) {\n if (isGL2) { ifmt = gl.RGBA32F; type = gl.FLOAT; }\n else if (ext.OES_texture_float) type = gl.FLOAT;\n } else if (opts.float) {\n if (isGL2) { ifmt = gl.RGBA16F; type = gl.HALF_FLOAT; }\n else if (ext.OES_texture_half_float) type = ext.OES_texture_half_float.HALF_FLOAT_OES;\n else if (ext.OES_texture_float) type = gl.FLOAT;\n }\n return { ifmt, fmt, type };\n}\n\nfunction isRenderable(gl, ifmt, fmt, type) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, ifmt, 4, 4, 0, fmt, type, null);\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n const ok = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(fbo);\n gl.deleteTexture(tex);\n return ok;\n}\n\n/** Create a colour (+ optional depth) render target. Falls back to 8-bit if float isn't renderable. */\nexport function createTarget(gl, pool, w, h, opts, isGL2, ext) {\n const wanted = chooseFormat(gl, isGL2, ext, opts);\n let chosen = wanted;\n if (!isRenderable(gl, wanted.ifmt, wanted.fmt, wanted.type)) {\n warnOnce('fmt-fallback', 'Requested float format not renderable on this device; falling back to 8-bit.');\n chosen = { ifmt: isGL2 ? gl.RGBA8 : gl.RGBA, fmt: gl.RGBA, type: gl.UNSIGNED_BYTE };\n }\n // Linear filtering of float textures needs an extension; silently use nearest when unavailable.\n let filterOpt = opts.filter;\n if (chosen.type !== gl.UNSIGNED_BYTE && filterOpt !== 'nearest') {\n const linearOK = isGL2\n ? (chosen.type === gl.HALF_FLOAT || ext.OES_texture_float_linear)\n : (chosen.type === gl.FLOAT ? ext.OES_texture_float_linear : ext.OES_texture_half_float_linear);\n if (!linearOK) filterOpt = 'nearest';\n }\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n const wrap = wrapMode(gl, opts.wrap);\n const filter = filterMode(gl, filterOpt);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n gl.texImage2D(gl.TEXTURE_2D, 0, chosen.ifmt, w, h, 0, chosen.fmt, chosen.type, null);\n\n let depthTex = null;\n if (opts.depth) {\n if (!isGL2 && !ext.WEBGL_depth_texture) {\n warnOnce('depth-tex', 'depth: true needs WebGL2 or WEBGL_depth_texture; ignoring.');\n } else {\n depthTex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, depthTex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, isGL2 ? gl.DEPTH_COMPONENT16 : gl.DEPTH_COMPONENT,\n w, h, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null);\n }\n }\n\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n if (depthTex) gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTex, 0);\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n if (status !== gl.FRAMEBUFFER_COMPLETE) console.warn('[ShaderMate] Framebuffer incomplete:', status);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n depthId: depthTex ? pool.add(depthTex, 'texture2D') : null,\n fboId: pool.add(fbo, 'fbo'),\n width: w,\n height: h,\n fmt: chosen\n };\n}\n\nexport function deleteTarget(pool, t) {\n if (!t) return;\n pool.unref(t.texId);\n if (t.depthId) pool.unref(t.depthId);\n pool.unref(t.fboId);\n}\n\n/** Resolve a pass `size` option against the canvas size. */\nexport function resolvePassSize(size, cw, ch) {\n const c = n => Math.max(1, Math.round(n));\n if (size == null || size === 'screen' || size === 'canvas') return [cw, ch];\n if (size === 'half') return [c(cw / 2), c(ch / 2)];\n if (size === 'quarter') return [c(cw / 4), c(ch / 4)];\n if (typeof size === 'number') return [c(cw * size), c(ch * size)]; // scale factor\n if (Array.isArray(size)) return [c(size[0]), c(size[1])];\n if (typeof size === 'object' && size.width && size.height) return [c(size.width), c(size.height)];\n return [cw, ch];\n}\n", "// Built-in uniforms. They are declared automatically when a shader uses them\n// (and not already declared), and uploaded every frame when present in the program.\n//\n// ShaderToy names short names\n// vec3 iResolution vec2 u_resolution\n// float iTime float u_time\n// float iTimeDelta float u_delta\n// int iFrame int u_frame\n// float iFrameRate float u_fps\n// vec4 iMouse (x,y, click.x,click.y) vec2 u_mouse pixels, bottom-left origin\n// vec2 u_mouseUV 0..1\n// float u_mouseDown 0/1\n// vec4 iDate vec4 u_date\n// vec2 iScroll vec2 u_scroll page scroll in px\n// float u_pixelRatio\n// float u_aspect width / height\n// float iChannelTime[4]\n// vec3 iChannelResolution[4]\n// samplerX iChannel0..3\n\nexport const BUILTIN_UNIFORMS = {\n iResolution: 'vec3', iTime: 'float', iTimeDelta: 'float', iFrame: 'int', iFrameRate: 'float',\n iMouse: 'vec4', iDate: 'vec4', iScroll: 'vec2', iSampleRate: 'float',\n iChannelTime: 'float[4]', iChannelResolution: 'vec3[4]',\n u_resolution: 'vec2', u_time: 'float', u_delta: 'float', u_frame: 'int', u_fps: 'float',\n u_mouse: 'vec2', u_mouseUV: 'vec2', u_mouseDown: 'float', u_date: 'vec4', u_scroll: 'vec2',\n u_pixelRatio: 'float', u_aspect: 'float',\n // FragCoord.xyz-style names (declare `uniform vec4 u_mouse;` / `uniform float u_scroll;` yourself to get those shapes)\n u_time_delta: 'float', u_refresh_rate: 'float', u_drag: 'vec2', u_wheel: 'float',\n};\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/** ShaderToy legacy aliases. */\nexport const BUILTIN_DEFINES = '#define iGlobalTime iTime\\n';\n\n/** `out vec4 fragColor` (FragCoord.xyz / GLSL 3 style) when a shader writes to fragColor from its own main(). */\nexport function declareFragColor(src, isGL2) {\n const code = stripComments(src);\n if (!/\\bfragColor\\b/.test(code) || !/\\bvoid\\s+main\\s*\\(/.test(code)) return '';\n if (/\\bout\\s+vec4\\s+fragColor\\b/.test(code) || /#define\\s+fragColor\\b/.test(code)) return '';\n return isGL2 ? 'out vec4 fragColor;\\n' : '#define fragColor gl_FragColor\\n';\n}\n\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n */\n/** FragCoord.xyz-only built-ins (declared when used in a FragCoord-style shader or when dialect: 'fragcoord'). */\nexport const FRAGCOORD_UNIFORMS = {\n u_camera_pos: 'vec3', u_camera_dir: 'vec3', u_camera_view: 'mat4',\n u_recursion: 'int', u_max_recursion: 'int', u_color_gamut: 'int',\n};\n/** Sampler built-ins bound by name (see core/samplers.js). */\nexport const SAMPLER_BUILTINS = ['u_audio', 'u_keyboard', 'u_webcam', 'u_main'];\n\n/**\n * Heuristic: a FragCoord.xyz sketch writes `fragColor` from its own `main()` and never uses mainImage.\n */\nexport function looksLikeFragCoord(src) {\n const code = stripComments(src);\n return /\\bfragColor\\b/.test(code) && /\\bvoid\\s+main\\s*\\(/.test(code) && !/\\bmainImage\\s*\\(/.test(code);\n}\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n * opts.mouseVec4 / opts.scrollFloat switch u_mouse / u_scroll to the FragCoord.xyz shapes.\n * opts.samplerNames: extra sampler2D names to declare when used (pass samplers like u_pass1, u_blur).\n * opts.passCount: size for `u_passes[N]`.\n */\nexport function declareBuiltins(src, channelTypes = [], opts = {}) {\n const code = stripComments(src);\n let out = '';\n const declared = name => new RegExp('uniform\\\\s+(?:\\\\w+\\\\s+)*' + name + '\\\\b').test(code);\n const used = name => new RegExp('\\\\b' + name + '\\\\b').test(code);\n const types = Object.assign({}, BUILTIN_UNIFORMS, opts.fragcoord ? FRAGCOORD_UNIFORMS : null);\n if (opts.mouseVec4) types.u_mouse = 'vec4';\n if (opts.scrollFloat) types.u_scroll = 'float';\n\n for (const name in types) {\n if (!used(name) || declared(name)) continue;\n const t = types[name];\n const m = /^(\\w+)\\[(\\d+)\\]$/.exec(t);\n out += m ? `uniform ${m[1]} ${name}[${m[2]}];\\n` : `uniform ${t} ${name};\\n`;\n }\n for (let i = 0; i < 4; i++) {\n const name = 'iChannel' + i;\n if (!used(name) || declared(name)) continue;\n out += `uniform ${channelTypes[i] === 'cube' ? 'samplerCube' : 'sampler2D'} ${name};\\n`;\n }\n for (const name of new Set([...SAMPLER_BUILTINS, ...(opts.samplerNames || [])])) {\n if (used(name) && !declared(name)) out += `uniform sampler2D ${name};\\n`;\n }\n if (opts.passCount > 0 && /\\bu_passes\\b/.test(code) && !declared('u_passes')) out += `uniform sampler2D u_passes[${opts.passCount}];\\n`;\n return out;\n}\n", "import { BUILTIN_MACROS_GL1, BUILTIN_MACROS_GL2, MAIN_WRAP_GL1, MAIN_WRAP_GL2 } from './templates.js';\nimport { BUILTIN_DEFINES, declareBuiltins, declareFragColor } from './builtins.js';\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Expand `#include \"path\"` / `#include <path>` recursively.\n * Each file is included once (acts like an include guard); real cycles are reported.\n * `loader(path)` returns (a promise of) the file text.\n */\nexport async function resolveIncludes(src, { loader, throwOnError = false, warn = console.warn } = {}) {\n const done = new Set();\n const stack = [];\n\n async function expand(code) {\n const re = /^[ \\t]*#include\\s+[\"<]([^\">]+)[\">]/gm;\n let out = '';\n let last = 0;\n let m;\n while ((m = re.exec(code))) {\n const path = m[1];\n out += code.slice(last, m.index);\n last = re.lastIndex;\n\n if (stack.includes(path)) {\n warn('[ShaderMate] Circular include:', path);\n out += `\\n// skipped include \"${path}\" (circular)\\n`;\n } else if (done.has(path)) {\n out += `\\n// skipped include \"${path}\" (already included)\\n`;\n } else {\n done.add(path);\n stack.push(path);\n try {\n const raw = await loader(path);\n const expanded = await expand(raw);\n out += `\\n// begin include \"${path}\"\\n${expanded}\\n// end include \"${path}\"\\n`;\n } catch (e) {\n warn(`[ShaderMate] Failed to load include \"${path}\"`, e);\n if (throwOnError) throw e;\n out += `\\n// failed include \"${path}\"\\n`;\n } finally {\n stack.pop();\n }\n }\n }\n return out + code.slice(last);\n }\n return expand(src);\n}\n\n/** Turn defines (strings / {KEY: value} objects) into `#define` lines. */\nexport function defineLines(defines) {\n let out = '';\n for (const d of defines) {\n if (typeof d === 'string') out += `#define ${d}\\n`;\n else if (d && typeof d === 'object') {\n for (const k in d) {\n const v = d[k];\n out += (v === true || v === undefined) ? `#define ${k}\\n` : `#define ${k} ${v}\\n`;\n }\n }\n }\n return out;\n}\n\nexport const DEFAULT_INJECT = { header: true, builtins: true, uniforms: true, defines: true, mainWrap: true };\nexport const NO_INJECT = { header: false, builtins: false, uniforms: false, defines: false, mainWrap: false };\n\n/**\n * Wrap user GLSL into a complete fragment shader.\n * inject.header #version (GL2) + precision\n * inject.builtins texture compatibility macros, `out vec4 outColor` (GL2), iGlobalTime alias\n * inject.uniforms auto-declare built-in uniforms the shader uses (iTime, iResolution, iChannel0 \u2026)\n * inject.defines user #defines\n * inject.mainWrap wrap `mainImage(out vec4, in vec2)` in a main()\n */\nexport function assembleFragment(src, { isGL2, defines = [], enableDerivatives = false, inject = DEFAULT_INJECT, channelTypes = [], builtinOpts = {} } = {}) {\n if (!inject || !Object.values(inject).some(Boolean)) return src;\n\n // A user-supplied #version must stay on line 1: hoist it.\n let versionLine = '';\n let body = src;\n const vm = /^[ \\t]*#version[^\\n]*/m.exec(body);\n if (vm) {\n versionLine = vm[0].trim() + '\\n';\n body = body.slice(0, vm.index) + body.slice(vm.index + vm[0].length);\n }\n\n let head = '';\n if (versionLine) head += versionLine;\n else if (inject.header && isGL2) head += '#version 300 es\\n';\n // #extension must precede any non-preprocessor token (incl. precision statements).\n if (inject.builtins && !isGL2 && enableDerivatives) head += '#extension GL_OES_standard_derivatives : enable\\n';\n if (inject.header) head += 'precision highp float;\\nprecision highp int;\\n';\n if (inject.builtins) {\n head += isGL2 ? BUILTIN_MACROS_GL2 : BUILTIN_MACROS_GL1;\n head += BUILTIN_DEFINES;\n // Exactly one fragment output: the user's own `out vec4 \u2026`, a `fragColor` they write to from\n // main() (FragCoord.xyz / GLSL 3 style), or our `outColor` for the mainImage wrapper.\n const fragDecl = declareFragColor(body, isGL2);\n const userOut = /\\bout\\s+(?:\\w+\\s+)*vec4\\s+\\w+\\s*;/.test(stripComments(body)); // a declaration, not a `mainImage(out vec4 c, \u2026)` parameter\n if (fragDecl) head += fragDecl;\n else if (isGL2 && !userOut) head += 'out vec4 outColor;\\n';\n }\n if (inject.uniforms) head += declareBuiltins(body, channelTypes, builtinOpts);\n if (inject.defines) head += defineLines(defines);\n\n const clean = stripComments(body);\n const needWrap = inject.mainWrap && /\\bmainImage\\s*\\(/.test(clean) && !/\\bvoid\\s+main\\s*\\(/.test(clean);\n\n let out = head + '#line 1\\n' + body;\n if (needWrap) out += isGL2 ? MAIN_WRAP_GL2 : MAIN_WRAP_GL1;\n return out;\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\nimport { isPow2, warnOnce } from '../utils/util.js';\n\n/**\n * Upload an image/video/canvas/ImageBitmap to a new 2D texture.\n * Returns a channel wrapper: { texId, width, height, update(), dispose? }.\n */\nexport function makeTexture2D(gl, pool, source, w, h, params = {}, env = {}, { dynamic = false, flipDefault = false } = {}) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n\n const flip = params.flipY === undefined ? flipDefault : !!params.flipY;\n // WebGL1 only supports clamp + no mipmaps on non-power-of-two textures\n const npotLimited = !env.isGL2 && !(isPow2(w) && isPow2(h));\n if (npotLimited && params.wrap && params.wrap !== 'clamp') {\n warnOnce('npot-wrap', 'Non-power-of-two texture in WebGL1: forcing wrap to clamp.');\n }\n const wrap = npotLimited ? gl.CLAMP_TO_EDGE : wrapMode(gl, params.wrap);\n const mip = !!params.mipmap && !dynamic && !npotLimited;\n const filter = filterMode(gl, params.filter);\n const minFilter = mip\n ? (params.filter === 'nearest' ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_LINEAR)\n : filter;\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n\n const upload = () => {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flip);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !!params.premultiplyAlpha);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n };\n upload();\n if (mip) gl.generateMipmap(gl.TEXTURE_2D);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n width: w,\n height: h,\n source,\n update: dynamic\n ? () => {\n if (source.readyState !== undefined && source.readyState < 2) return; // media not ready\n gl.bindTexture(gl.TEXTURE_2D, tex);\n upload();\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n : () => { }\n };\n}\n\nexport function loadImage(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const img = new Image();\n img.crossOrigin = params.crossOrigin === undefined ? 'anonymous' : params.crossOrigin;\n img.onload = () => res(makeTexture2D(gl, pool, img, img.naturalWidth, img.naturalHeight, params, env));\n img.onerror = () => rej(new Error(`Failed to load image \"${url}\"`));\n img.src = url;\n });\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\n\nconst FACE_NAMES = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n\n/** urls: [posx, negx, posy, negy, posz, negz] */\nexport function loadCubeMap(gl, pool, urls, params = {}) {\n return new Promise((res, rej) => {\n if (!Array.isArray(urls) || urls.length !== 6) return rej(new Error('cubemap needs an array of 6 URLs'));\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n const wrap = wrapMode(gl, params.wrap);\n const filter = filterMode(gl, params.filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, wrap);\n\n const faces = [\n gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Z, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n ];\n let loaded = 0, w = 0, h = 0, failed = false;\n\n urls.forEach((u, i) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n if (failed) return;\n if (!w) { w = img.width; h = img.height; }\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.texImage2D(faces[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n if (++loaded === 6) {\n if (params.mipmap) gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n res({ texId: pool.add(tex, 'textureCube'), width: w, height: h, cubemap: true, update() { } });\n }\n };\n img.onerror = () => {\n if (failed) return;\n failed = true;\n gl.deleteTexture(tex);\n rej(new Error(`Failed to load cubemap face ${FACE_NAMES[i]}: \"${u}\"`));\n };\n img.src = u;\n });\n });\n}\n", "import { makeTexture2D } from './image.js';\n\n/** Retry media playback on the first user gesture when autoplay is blocked. */\nexport function playOnGesture(media) {\n const p = media.play && media.play();\n if (p && p.catch) {\n p.catch(() => {\n const go = () => { media.play().catch(() => { }); };\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n });\n }\n}\n\n/** Video file -> live texture. `{ video: 'clip.mp4', muted, loop }` */\nexport function loadVideo(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const video = document.createElement('video');\n Object.assign(video, {\n src: url, crossOrigin: 'anonymous',\n loop: params.loop !== false, muted: params.muted !== false, playsInline: true, autoplay: true\n });\n video.addEventListener('error', () => rej(new Error(`Failed to load video \"${url}\"`)), { once: true });\n video.addEventListener('canplay', () => {\n playOnGesture(video);\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.getTime = () => video.currentTime;\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); video.removeAttribute('src'); video.load(); };\n res(wrapper);\n }, { once: true });\n video.load();\n });\n}\n\n/** Webcam -> live texture. `{ camera: true }` or `{ camera: { facingMode: 'user' } }` */\nexport function loadCamera(gl, pool, params = {}, env = {}) {\n const constraints = typeof params.camera === 'object' ? params.camera : { facingMode: 'user' };\n return navigator.mediaDevices.getUserMedia({ video: constraints, audio: false }).then(stream => new Promise(res => {\n const video = document.createElement('video');\n Object.assign(video, { srcObject: stream, muted: true, playsInline: true, autoplay: true });\n video.addEventListener('loadedmetadata', () => {\n video.play().catch(() => { });\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); stream.getTracks().forEach(t => t.stop()); };\n res(wrapper);\n }, { once: true });\n }));\n}\n", "/**\n * Audio -> spectrum texture (width = fftSize/2, 8-bit, read `.r`).\n * Row 0 = frequency spectrum, row 1 = waveform (ShaderToy layout). Height is 2.\n * { audio: 'song.mp3', fftSize: 1024 } file (loops, starts on first user gesture)\n * { mic: true } microphone input\n * { audio: audioElement } an <audio> element you control yourself\n */\nexport function loadAudio(gl, pool, ch, { mic = false } = {}) {\n const spectro = ch.layout === 'spectrogram'; // FragCoord.xyz u_audio: 512x512, scrolling history\n const fftSize = ch.fftSize || (spectro ? 1024 : 512);\n const AC = window.AudioContext || window.webkitAudioContext;\n\n return new Promise((res, rej) => {\n const ctx = new AC();\n const analyser = ctx.createAnalyser();\n analyser.fftSize = fftSize;\n analyser.smoothingTimeConstant = ch.smoothing ?? 0.8;\n\n const bins = analyser.frequencyBinCount;\n const wave = new Uint8Array(fftSize);\n // ShaderToy layout: bins x 2 (row 0 spectrum, row 1 waveform), LUMINANCE.\n // Spectrogram layout: bins x bins RGB, row 0 = newest (R weighted FFT, G waveform, B raw FFT), older rows above.\n const H = spectro ? bins : 2;\n const chans = spectro ? 3 : 1;\n const data = new Uint8Array(bins * H * chans);\n const rawFFT = spectro ? new Uint8Array(bins) : null;\n let rawAnalyser = null;\n if (spectro) { rawAnalyser = ctx.createAnalyser(); rawAnalyser.fftSize = fftSize; rawAnalyser.smoothingTimeConstant = 0; }\n\n const tex = gl.createTexture();\n const fmt = spectro ? gl.RGB : gl.LUMINANCE;\n const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, fmt, bins, H, 0, fmt, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n upload();\n\n let getTime = () => ctx.currentTime;\n let cleanup = () => { };\n\n const finish = () => {\n const resume = () => { if (ctx.state === 'suspended') ctx.resume(); };\n resume();\n window.addEventListener('pointerdown', resume, { once: true });\n window.addEventListener('keydown', resume, { once: true });\n res({\n texId: pool.add(tex, 'texture2D'),\n width: bins, height: H,\n analyser, context: ctx,\n getTime,\n update() {\n if (spectro) {\n const row = bins * 3;\n data.copyWithin(row, 0, data.length - row); // scroll history up one row\n analyser.getByteFrequencyData(rawFFT); // smoothed (\"weighted\") spectrum\n analyser.getByteTimeDomainData(wave);\n for (let i = 0; i < bins; i++) { data[i * 3] = rawFFT[i]; data[i * 3 + 1] = wave[i * 2]; }\n rawAnalyser.getByteFrequencyData(rawFFT); // unsmoothed\n for (let i = 0; i < bins; i++) data[i * 3 + 2] = rawFFT[i];\n } else {\n analyser.getByteFrequencyData(data.subarray(0, bins));\n analyser.getByteTimeDomainData(wave);\n data.set(wave.subarray(0, bins), bins);\n }\n upload();\n },\n dispose() { cleanup(); ctx.close && ctx.close(); }\n });\n };\n\n if (mic) {\n navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(stream => {\n const src = ctx.createMediaStreamSource(stream);\n src.connect(analyser); // not connected to destination: no feedback loop\n if (rawAnalyser) src.connect(rawAnalyser);\n cleanup = () => stream.getTracks().forEach(t => t.stop());\n finish();\n }).catch(rej);\n return;\n }\n\n const url = ch.audio || ch.audioFFT;\n const audio = url instanceof HTMLMediaElement ? url : new Audio();\n const owned = audio !== url;\n if (owned) Object.assign(audio, { src: url, crossOrigin: 'anonymous', loop: ch.loop !== false, autoplay: true });\n getTime = () => audio.currentTime;\n\n const connect = () => {\n const src = ctx.createMediaElementSource(audio);\n src.connect(analyser);\n if (rawAnalyser) src.connect(rawAnalyser);\n analyser.connect(ctx.destination);\n if (owned) {\n const go = () => { if (ctx.state === 'suspended') ctx.resume(); audio.play().catch(() => { }); };\n go();\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n cleanup = () => { audio.pause(); audio.removeAttribute('src'); audio.load(); };\n }\n finish();\n };\n if (audio.readyState >= 3) connect();\n else {\n audio.addEventListener('canplay', connect, { once: true });\n audio.addEventListener('error', () => rej(new Error(`Failed to load audio \"${url}\"`)), { once: true });\n if (owned) audio.load();\n }\n });\n}\n", "import { makeTexture2D } from './image.js';\n\nconst isCanvas = el => typeof HTMLCanvasElement !== 'undefined' && el instanceof HTMLCanvasElement;\nconst isVideo = el => typeof HTMLVideoElement !== 'undefined' && el instanceof HTMLVideoElement;\n\n/**\n * Use an existing element as a texture: <canvas>, <video>, <img>, ImageBitmap.\n * Canvases and videos are re-uploaded every frame (set `dynamic: false` to upload once).\n * Great for feeding a p5 / three.js / 2D canvas into a shader: channels: [myCanvas]\n */\nexport function loadElement(gl, pool, el, params = {}, env = {}) {\n const w = el.videoWidth || el.naturalWidth || el.width || 1;\n const h = el.videoHeight || el.naturalHeight || el.height || 1;\n const live = isCanvas(el) || isVideo(el);\n const dynamic = params.dynamic === undefined ? live : !!params.dynamic;\n const wrapper = makeTexture2D(gl, pool, el, w, h, params, env, { dynamic, flipDefault: live });\n if (isVideo(el)) wrapper.getTime = () => el.currentTime;\n // keep the reported size in sync with a canvas that is resized later\n if (dynamic) {\n const base = wrapper.update;\n wrapper.update = () => {\n wrapper.width = el.videoWidth || el.naturalWidth || el.width || 1;\n wrapper.height = el.videoHeight || el.naturalHeight || el.height || 1;\n base();\n };\n }\n return Promise.resolve(wrapper);\n}\n\n/** Wrap a WebGLTexture the user created elsewhere (same GL context). */\nexport function wrapTexture(gl, pool, ch) {\n const id = pool.add(ch.texture, ch.cube ? 'textureCube' : 'texture2D');\n pool.ref(id); // never deleted by us: the user owns it\n return Promise.resolve({ texId: id, width: ch.width || 1, height: ch.height || 1, cubemap: !!ch.cube, update() { } });\n}\n", "/**\n * Keyboard state texture, ShaderToy layout (also what FragCoord.xyz's u_keyboard describes):\n * 256 x 3, 8-bit, one column per key code:\n * row 0 key currently held (texelFetch(k, ivec2(code, 0), 0).x)\n * row 1 key pressed this frame\n * row 2 toggle (flips on each press)\n * Key codes follow ShaderToy: JS keyCode (letters are their uppercase ASCII, 32 = space, 37..40 = arrows\u2026).\n * { keyboard: true } or { keyboard: { target: element } }\n */\nexport function loadKeyboard(gl, pool, ch = {}) {\n const W = 256, ROWS = 3;\n const data = new Uint8Array(W * ROWS);\n const held = new Uint8Array(W);\n const pressed = new Uint8Array(W);\n const toggle = new Uint8Array(W);\n const target = (ch.keyboard && typeof ch.keyboard === 'object' && ch.keyboard.target) || window;\n\n const code = e => {\n if (typeof e.keyCode === 'number' && e.keyCode) return e.keyCode & 255;\n const k = e.key || '';\n return k.length === 1 ? k.toUpperCase().charCodeAt(0) & 255 : 0;\n };\n const onDown = e => {\n const c = code(e);\n if (!held[c]) { pressed[c] = 255; toggle[c] = toggle[c] ? 0 : 255; }\n held[c] = 255;\n };\n const onUp = e => { held[code(e)] = 0; };\n const onBlur = () => held.fill(0);\n target.addEventListener('keydown', onDown);\n target.addEventListener('keyup', onUp);\n window.addEventListener('blur', onBlur);\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, W, ROWS, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n upload();\n\n return Promise.resolve({\n texId: pool.add(tex, 'texture2D'),\n width: W, height: ROWS,\n keyboard: true,\n update() {\n data.set(held, 0);\n data.set(pressed, W);\n data.set(toggle, W * 2);\n upload();\n pressed.fill(0); // \"pressed\" lasts exactly one frame\n },\n dispose() {\n target.removeEventListener('keydown', onDown);\n target.removeEventListener('keyup', onUp);\n window.removeEventListener('blur', onBlur);\n }\n });\n}\n", "import { loadImage } from './image.js';\nimport { loadCubeMap } from './cubemap.js';\nimport { loadVideo, loadCamera } from './video.js';\nimport { loadAudio } from './audio.js';\nimport { loadElement, wrapTexture } from './element.js';\nimport { loadKeyboard } from './keyboard.js';\n\n/**\n * Load one external (non-pass) channel. Resolves to a wrapper\n * { texId, width, height, update(), cubemap?, getTime?, dispose? } or rejects.\n */\nexport function loadChannel(gl, pool, ch, env) {\n if (ch.texture) return wrapTexture(gl, pool, ch);\n if (ch.element) return loadElement(gl, pool, ch.element, ch, env);\n if (ch.url) return loadImage(gl, pool, ch.url, ch, env);\n if (ch.video) return loadVideo(gl, pool, ch.video, ch, env);\n if (ch.camera) return loadCamera(gl, pool, ch, env);\n if (ch.mic) return loadAudio(gl, pool, ch, { mic: true });\n if (ch.keyboard) return loadKeyboard(gl, pool, ch);\n if (ch.audio || ch.audioFFT) return loadAudio(gl, pool, ch);\n if (ch.cubemap) return loadCubeMap(gl, pool, ch.cubemap, ch);\n return Promise.reject(new Error('Unrecognised channel: ' + JSON.stringify(ch)));\n}\n\n/** Sampler type a channel will need in GLSL. */\nexport function channelSamplerType(ch) {\n if (!ch) return null;\n return ch.cubemap || (ch.texture && ch.cube) ? 'cube' : '2D';\n}\n", "// FragCoord.xyz conventions: multi-pass paste blobs and uniform comment annotations.\n// Everything here is plain text processing; the runtime binds the results.\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Split a pasted multi-pass blob into passes. Recognised headers (each on its own line):\n * // Pass 1 // Pass 2 \u2014 Horizontal blur // Main\n * // Common // Pass: blur \u2014 Buffer type: 2D\n * // ===== Pass: Name ===== (export style)\n * Returns null when no headers are present (plain single shader).\n */\nexport function splitPassBlob(text) {\n const re = /^[ \\t]*\\/\\/[ \\t]*(?:=+[ \\t]*)?(?:Pass[ \\t]*:?[ \\t]*([^\\n=\u2014\u2013-]+?)|(Main)|(Common))[ \\t]*(?:[\u2014\u2013-]+[^\\n]*)?(?:=+)?[ \\t]*$/gim;\n const heads = [];\n let m;\n while ((m = re.exec(text))) heads.push({ index: m.index, end: m.index + m[0].length, raw: m[0], pass: m[1], main: !!m[2], common: !!m[3] });\n if (!heads.length) return null;\n\n const out = { common: text.slice(0, heads[0].index).trim(), passes: [] };\n heads.forEach((h, i) => {\n const body = text.slice(h.end, i + 1 < heads.length ? heads[i + 1].index : text.length).trim();\n if (h.common) { out.common = (out.common ? out.common + '\\n' : '') + body; return; }\n const label = h.main ? 'main' : String(h.pass).trim();\n const bufferType = /buffer\\s*type\\s*:\\s*(\\w+)/i.exec(h.raw);\n const num = /^(\\d+)$/.exec(label);\n out.passes.push({\n name: h.main ? 'main' : (num ? 'pass' + num[1] : label.replace(/[^\\w]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase()),\n label,\n main: h.main,\n src: body,\n bufferType: bufferType ? bufferType[1].toLowerCase() : '2d',\n });\n });\n\n // Loose #define lines before the first header belong to Common (FragCoord hoists them).\n if (out.common && !/[{};]/.test(stripComments(out.common))) {\n // only defines/comments: fine as common\n }\n return out;\n}\n\n/** `[linear repeat mipmap]` / `[nearest clamp]` bracket settings -> channel params */\nexport function parseBracketSettings(s) {\n const p = {};\n const m = /\\[([^\\]]*)\\]/.exec(s || '');\n if (!m) return p;\n for (const word of m[1].toLowerCase().split(/[\\s,]+/)) {\n if (word === 'nearest' || word === 'linear') p.filter = word;\n else if (word === 'clamp' || word === 'repeat' || word === 'mirror') p.wrap = word;\n else if (word === 'mipmap') p.mipmap = true;\n else if (word === 'flipy' || word === 'flip') p.flipY = true;\n }\n return p;\n}\n\n/**\n * Parse uniform annotations FragCoord users write in comments and strip the (non-GLSL) initializers.\n *\n * uniform float u_speed; //1.0, [0.0, 5.0] -> value 1.0, min 0, max 5\n * uniform float u_x = 0.5; //[0.0, 5.0] -> value 0.5 (initializer removed from source)\n * uniform vec3 u_color; //0.2, 0.55, 1.0, [0, 1] -> value [0.2,0.55,1]\n * uniform sampler2D u_tex; //https://x/y.png [linear repeat]\n * uniform sampler2D u_clip; //https://x/loop.mp4 -> video + u_clip_time\n * uniform sampler2D u_a; // ref:pass1 [nearest clamp] | ref:pass:blur | ref:main | ref:sampler u_tex\n * uniform sampler2D u_audio; // mic | https://x.mp3 | [VIDEO] | [CAM]\n *\n * Returns { source, uniforms: { name: spec }, samplers: { name: channelSpec } }.\n */\nexport function parseUniformComments(src) {\n const uniforms = {};\n const samplers = {};\n const lines = src.split('\\n');\n const re = /^\\s*uniform\\s+(?:(?:lowp|mediump|highp)\\s+)?(\\w+)\\s+(\\w+)(?:\\s*\\[\\s*\\d+\\s*\\])?\\s*(?:=\\s*([^;]+))?;\\s*(?:\\/\\/(.*))?$/;\n\n const outLines = lines.map(line => {\n const m = re.exec(line);\n if (!m) return line;\n const [, type, name, init, comment = ''] = m;\n const c = comment.trim();\n const isSampler = /^sampler/.test(type);\n\n if (isSampler) {\n const spec = parseSamplerComment(name, c, type);\n if (spec) samplers[name] = spec;\n } else {\n const spec = {};\n const nums = s => (s.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g) || []).map(Number);\n const range = /\\[([^\\]]*)\\]/.exec(c);\n const defaults = nums(c.replace(/\\[[^\\]]*\\]/, ''));\n const comps = /vec(\\d)/.test(type) ? +type.match(/vec(\\d)/)[1] : 1;\n const isBool = /^bool/.test(type);\n let value;\n if (init) {\n const v = nums(init);\n value = comps === 1 ? (isBool ? /true/.test(init) : (v[0] ?? 0)) : v.slice(0, comps);\n } else if (defaults.length) {\n value = comps === 1 ? defaults[0] : (defaults.length >= comps ? defaults.slice(0, comps) : new Array(comps).fill(defaults[0]));\n }\n if (range) {\n const r = nums(range[1]);\n if (r.length >= 2) { spec.min = r[0]; spec.max = r[1]; if (r.length >= 3) spec.step = r[2]; }\n }\n if (value !== undefined || range) {\n spec.value = value !== undefined ? value : (comps === 1 ? (spec.min ?? 0) : new Array(comps).fill(spec.min ?? 0));\n uniforms[name] = spec;\n }\n }\n // GLSL ES has no uniform initializers: `uniform float x = 0.5;` -> `uniform float x;`\n return init ? line.replace(/\\s*=\\s*[^;]+;/, ';') : line;\n });\n\n return { source: outLines.join('\\n'), uniforms, samplers };\n}\n\nfunction parseSamplerComment(name, c, type) {\n const params = parseBracketSettings(c);\n const text = c.replace(/\\[[^\\]]*\\]/g, '').trim();\n\n const ref = /^ref:\\s*(.+)$/i.exec(text);\n if (ref) {\n const r = ref[1].trim();\n let m;\n if ((m = /^pass\\s*(\\d+)(?::out(\\d+))?$/i.exec(r))) return { pass: 'pass' + m[1], ...params };\n if ((m = /^pass:\\s*(\\S+)/i.exec(r))) return { pass: m[1], ...params };\n if (/^main$/i.test(r)) return { pass: 'main', ...params };\n if ((m = /^sampler\\s+(\\w+)/i.exec(r))) return { sameAs: m[1], ...params };\n return null;\n }\n if (name === 'u_audio' || /audio/i.test(name) && /^(mic|\\[CAM\\]|\\[VIDEO\\])?$/i.test(text)) {\n if (/^https?:|^data:/i.test(text)) return { audio: text, layout: 'spectrogram' };\n return { mic: true, layout: 'spectrogram' };\n }\n if (name === 'u_webcam') return { camera: true, ...params };\n if (name === 'u_keyboard') return { keyboard: true };\n if (/^(https?:|data:)/i.test(text)) {\n const url = text.split(/\\s+/)[0];\n if (/\\.(mp4|webm|mov|ogv|m4v)(\\?|$)/i.test(url)) return { video: url, ...params };\n if (/\\.(mp3|wav|ogg|m4a|aac|flac)(\\?|$)/i.test(url)) return { audio: url, layout: 'spectrogram' };\n return type === 'samplerCube' ? null : { url, ...params };\n }\n return null;\n}\n\n/** Does the source use `u_mouse` as a vec4 (any z/w access)? */\nexport function usesMouseVec4(src) {\n return /\\bu_mouse\\s*\\.\\s*[xyzw]*[zw]/.test(stripComments(src));\n}\n\n/** Does the source reference any of the given identifiers? */\nexport function usesAny(src, names) {\n const code = stripComments(src);\n return names.filter(n => new RegExp('\\\\b' + n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b').test(code));\n}\n", "// Named sampler binding: any `uniform sampler2D u_xxx` that isn't an iChannelN gets a source\n// by name \u2014 a pass (`u_blur`, `u_pass1`, `u_main`), a comment-annotated URL/ref (FragCoord.xyz),\n// or a live input (`u_audio`, `u_keyboard`, `u_webcam`). Explicit `samplers: { name: source }`\n// on the pass or instance wins over everything.\n\nexport const GL_SAMPLER_2D = 35678;\nexport const GL_SAMPLER_CUBE = 35680;\n\n/** Aux (non-screen) passes in order: what FragCoord calls Pass 1, Pass 2\u2026 */\nexport const auxPasses = passObjs => passObjs.filter(p => !p.cfg.screen);\n\n/**\n * Decide where each named sampler of a compiled pass comes from.\n * Returns [{ name, info, spec }] where spec is a channel spec ({ pass } | loader spec) or { array: [passObj\u2026] }.\n */\nexport function resolveSamplerSpecs(po, passObjs, instanceSamplers = {}) {\n const out = [];\n const aux = auxPasses(passObjs);\n const screen = passObjs.find(p => p.cfg.screen);\n const byName = new Map(passObjs.map(p => [p.name, p]));\n const annotated = Object.assign({}, po.cfg.annotatedSamplers, po.cfg.samplers);\n\n for (const name in po.uniformInfo) {\n const info = po.uniformInfo[name];\n if (info.type !== GL_SAMPLER_2D && info.type !== GL_SAMPLER_CUBE) continue;\n if (/^iChannel\\d$/.test(name)) continue;\n\n let spec = instanceSamplers[name] || annotated[name] || null;\n let m;\n if (spec && spec.sameAs) spec = annotated[spec.sameAs] || instanceSamplers[spec.sameAs] || null;\n\n if (!spec) {\n if (name === 'u_passes' && info.size > 1) spec = { array: aux.slice(0, info.size) };\n else if (name === 'u_main') spec = screen ? { pass: screen.name } : null;\n else if ((m = /^u_pass(\\d+)$/.exec(name)) && aux[+m[1] - 1]) spec = { pass: aux[+m[1] - 1].name };\n else if (name.startsWith('u_') && byName.has(name.slice(2))) spec = { pass: name.slice(2) };\n else if (name === 'u_audio') spec = { mic: true, layout: 'spectrogram' };\n else if (name === 'u_keyboard') spec = { keyboard: true };\n else if (name === 'u_webcam') spec = { camera: true };\n }\n if (spec && spec.pass != null && !byName.has(spec.pass)) {\n // \"pass1\" style refs resolve by aux index too\n const mm = /^pass(\\d+)$/.exec(spec.pass);\n if (mm && aux[+mm[1] - 1]) spec = { ...spec, pass: aux[+mm[1] - 1].name };\n else if (spec.pass === 'main' && screen) spec = { ...spec, pass: screen.name };\n }\n if (spec) out.push({ name, info, spec });\n }\n return out;\n}\n\n/** Does any pass sample the screen pass (so it needs a readable backbuffer)? */\nexport function needsMainBackbuffer(passObjs) {\n const screen = passObjs.find(p => p.cfg.screen);\n if (!screen) return false;\n return passObjs.some(po => (po.samplers || []).some(s => s.spec.pass === screen.name) ||\n po.cfg.channels.some(c => c && c.pass === screen.name));\n}\n", "/**\n * Fly camera for `u_camera_pos` / `u_camera_dir` / `u_camera_view` (FragCoord.xyz convention).\n * WASD / arrows move, Q/E (or Space/Shift) down/up, mouse drag looks around, wheel dollies.\n * u_camera_view is the world-to-camera matrix, column-major (OpenGL convention), so\n * mat3(u_camera_view) * dir goes world->camera and transpose goes back.\n */\nexport function createCamera(canvas, { target = window, speed = 1.5, sensitivity = 0.004 } = {}) {\n const pos = [0, 0, 0];\n let yaw = -Math.PI / 2, pitch = 0; // looking down -Z\n const keys = new Set();\n let dragging = false, lastX = 0, lastY = 0;\n const dir = [0, 0, -1];\n const view = new Float32Array(16);\n\n const onKey = (e, down) => {\n const k = e.key.length === 1 ? e.key.toLowerCase() : e.key;\n if (down) keys.add(k); else keys.delete(k);\n };\n const kd = e => onKey(e, true), ku = e => onKey(e, false);\n const pd = e => { if (e.button === 0) { dragging = true; lastX = e.clientX; lastY = e.clientY; } };\n const pm = e => {\n if (!dragging) return;\n yaw += (e.clientX - lastX) * sensitivity;\n pitch -= (e.clientY - lastY) * sensitivity;\n pitch = Math.max(-1.55, Math.min(1.55, pitch));\n lastX = e.clientX; lastY = e.clientY;\n };\n const pu = () => { dragging = false; };\n const wh = e => { const f = dir; const d = -e.deltaY * 0.002 * speed; pos[0] += f[0] * d; pos[1] += f[1] * d; pos[2] += f[2] * d; };\n const blur = () => keys.clear();\n\n target.addEventListener('keydown', kd); target.addEventListener('keyup', ku);\n canvas.addEventListener('pointerdown', pd); window.addEventListener('pointermove', pm); window.addEventListener('pointerup', pu);\n canvas.addEventListener('wheel', wh, { passive: true }); window.addEventListener('blur', blur);\n\n function lookAt() {\n const f = dir;\n // right = normalize(cross(f, up)), up' = cross(right, f)\n const upW = [0, 1, 0];\n let r = [f[1] * upW[2] - f[2] * upW[1], f[2] * upW[0] - f[0] * upW[2], f[0] * upW[1] - f[1] * upW[0]];\n const rl = Math.hypot(r[0], r[1], r[2]) || 1; r = r.map(v => v / rl);\n const u = [r[1] * f[2] - r[2] * f[1], r[2] * f[0] - r[0] * f[2], r[0] * f[1] - r[1] * f[0]];\n // column-major world->camera\n view.set([\n r[0], u[0], -f[0], 0,\n r[1], u[1], -f[1], 0,\n r[2], u[2], -f[2], 0,\n -(r[0] * pos[0] + r[1] * pos[1] + r[2] * pos[2]),\n -(u[0] * pos[0] + u[1] * pos[1] + u[2] * pos[2]),\n (f[0] * pos[0] + f[1] * pos[1] + f[2] * pos[2]),\n 1,\n ]);\n return { right: r, up: u };\n }\n\n return {\n pos, dir, view,\n /** Advance by dt seconds. */\n update(dt) {\n dir[0] = Math.cos(pitch) * Math.cos(yaw); dir[1] = Math.sin(pitch); dir[2] = Math.cos(pitch) * Math.sin(yaw);\n const { right } = lookAt();\n const v = speed * dt * (keys.has('Shift') ? 3 : 1);\n const mv = (vec, s) => { pos[0] += vec[0] * s; pos[1] += vec[1] * s; pos[2] += vec[2] * s; };\n if (keys.has('w') || keys.has('ArrowUp')) mv(dir, v);\n if (keys.has('s') || keys.has('ArrowDown')) mv(dir, -v);\n if (keys.has('d') || keys.has('ArrowRight')) mv(right, v);\n if (keys.has('a') || keys.has('ArrowLeft')) mv(right, -v);\n if (keys.has('e') || keys.has(' ')) pos[1] += v;\n if (keys.has('q') || keys.has('c')) pos[1] -= v;\n lookAt();\n },\n dispose() {\n target.removeEventListener('keydown', kd); target.removeEventListener('keyup', ku);\n canvas.removeEventListener('pointerdown', pd); window.removeEventListener('pointermove', pm); window.removeEventListener('pointerup', pu);\n canvas.removeEventListener('wheel', wh); window.removeEventListener('blur', blur);\n }\n };\n}\n", "// Uniform type resolution.\n//\n// A uniform `type` may be written as the GLSL type ('float', 'vec3', 'mat4', 'int[]', ...)\n// or as the classic WebGL shorthand ('1f', '3f', 'Matrix4fv', ...). Case-insensitive.\n// If no type is given at all, it's inferred from the compiled shader (see describeGLType).\n//\n// Descriptor: { kind: 'f' | 'i' | 'u' | 'm', n } (n = components, or matrix dimension)\n\nconst ALIASES = Object.create(null);\nconst add = (desc, ...names) => names.forEach(n => { ALIASES[n.toLowerCase()] = desc; });\n\n// float family\nadd({ kind: 'f', n: 1 }, 'float', 'number', 'f', '1f', '1fv', 'float[]', 'uniform1f', 'uniform1fv');\nadd({ kind: 'f', n: 2 }, 'vec2', '2f', '2fv', 'vec2[]', 'uniform2f', 'uniform2fv');\nadd({ kind: 'f', n: 3 }, 'vec3', '3f', '3fv', 'vec3[]', 'uniform3f', 'uniform3fv');\nadd({ kind: 'f', n: 4 }, 'vec4', '4f', '4fv', 'vec4[]', 'uniform4f', 'uniform4fv');\n\n// int / bool family (bool uniforms are uploaded as ints)\nadd({ kind: 'i', n: 1 }, 'int', 'bool', 'boolean', 'i', '1i', '1iv', 'int[]', 'bool[]', 'uniform1i', 'uniform1iv');\nadd({ kind: 'i', n: 2 }, 'ivec2', 'bvec2', '2i', '2iv', 'ivec2[]', 'bvec2[]', 'uniform2i', 'uniform2iv');\nadd({ kind: 'i', n: 3 }, 'ivec3', 'bvec3', '3i', '3iv', 'ivec3[]', 'bvec3[]', 'uniform3i', 'uniform3iv');\nadd({ kind: 'i', n: 4 }, 'ivec4', 'bvec4', '4i', '4iv', 'ivec4[]', 'bvec4[]', 'uniform4i', 'uniform4iv');\n\n// unsigned int (WebGL2)\nadd({ kind: 'u', n: 1 }, 'uint', '1ui', '1uiv', 'uint[]');\nadd({ kind: 'u', n: 2 }, 'uvec2', '2ui', '2uiv', 'uvec2[]');\nadd({ kind: 'u', n: 3 }, 'uvec3', '3ui', '3uiv', 'uvec3[]');\nadd({ kind: 'u', n: 4 }, 'uvec4', '4ui', '4uiv', 'uvec4[]');\n\n// matrices\nadd({ kind: 'm', n: 2 }, 'mat2', 'matrix2fv', 'mat2fv', 'uniformmatrix2fv');\nadd({ kind: 'm', n: 3 }, 'mat3', 'matrix3fv', 'mat3fv', 'uniformmatrix3fv');\nadd({ kind: 'm', n: 4 }, 'mat4', 'matrix4fv', 'mat4fv', 'uniformmatrix4fv');\n\n/** 'vec3' | '3f' | 'Matrix4fv' | ... -> descriptor, or null if unknown. */\nexport function resolveUniformType(type) {\n if (typeof type !== 'string') return null;\n return ALIASES[type.trim().toLowerCase()] || null;\n}\n\n// GL enum -> descriptor (numeric constants are identical across contexts)\nconst GL_TYPES = {\n 5126: { kind: 'f', n: 1 }, // FLOAT\n 35664: { kind: 'f', n: 2 }, // FLOAT_VEC2\n 35665: { kind: 'f', n: 3 },\n 35666: { kind: 'f', n: 4 },\n 5124: { kind: 'i', n: 1 }, // INT\n 35667: { kind: 'i', n: 2 }, // INT_VEC2\n 35668: { kind: 'i', n: 3 },\n 35669: { kind: 'i', n: 4 },\n 35670: { kind: 'i', n: 1 }, // BOOL\n 35671: { kind: 'i', n: 2 }, // BOOL_VEC2\n 35672: { kind: 'i', n: 3 },\n 35673: { kind: 'i', n: 4 },\n 5125: { kind: 'u', n: 1 }, // UNSIGNED_INT\n 36294: { kind: 'u', n: 2 }, // UNSIGNED_INT_VEC2\n 36295: { kind: 'u', n: 3 },\n 36296: { kind: 'u', n: 4 },\n 35674: { kind: 'm', n: 2 }, // FLOAT_MAT2\n 35675: { kind: 'm', n: 3 },\n 35676: { kind: 'm', n: 4 },\n};\n\n/** Active-uniform GL type -> descriptor. Samplers etc. return undefined (managed via channels). */\nexport function describeGLType(glType) {\n return GL_TYPES[glType];\n}\n\nexport const GL_FLOAT = 5126;\nexport const GL_FLOAT_VEC2 = 35664;\nexport const GL_FLOAT_VEC4 = 35666;\n", "import { describeGLType, resolveUniformType } from './types.js';\nimport { isArrayLike, ShaderMateError, warnOnce } from '../utils/util.js';\n\n/**\n * A uniform entry is either a plain value (`0.5`, `[1,0,0]`, `true`)\n * or a spec object `{ type?, value, transpose?, ...ui hints }`.\n */\nexport function isUniformSpec(v) {\n return v != null && typeof v === 'object' && !isArrayLike(v) && 'value' in v;\n}\n\nconst num = v => (typeof v === 'boolean' ? (v ? 1 : 0) : v);\n\nfunction toList(value, n) {\n if (typeof value === 'number' || typeof value === 'boolean') return new Array(n).fill(num(value)); // broadcast\n if (ArrayBuffer.isView(value)) return value;\n if (Array.isArray(value) && value.some(x => typeof x === 'boolean')) return value.map(num);\n return value;\n}\n\n/** Upload `value` to `loc` according to a descriptor from types.js. */\nexport function uploadUniform(gl, loc, d, value, transpose) {\n const n = d.n;\n switch (d.kind) {\n case 'f':\n if (n === 1 && typeof value === 'number') return gl.uniform1f(loc, value);\n return gl['uniform' + n + 'fv'](loc, toList(value, n));\n case 'i':\n if (n === 1 && (typeof value === 'number' || typeof value === 'boolean')) return gl.uniform1i(loc, +value);\n return gl['uniform' + n + 'iv'](loc, toList(value, n));\n case 'u':\n if (n === 1 && typeof value === 'number') return gl.uniform1ui(loc, value);\n return gl['uniform' + n + 'uiv'](loc, toList(value, n));\n case 'm':\n return gl['uniformMatrix' + n + 'fv'](loc, !!transpose, value);\n }\n}\n\n/**\n * Apply a name -> entry map using the compiled program's uniform info.\n * Types are optional: when omitted they come from the shader itself.\n */\nexport function applyUniformMap(gl, info, map, { strict = false, warnMissing = false, label = '' } = {}) {\n if (!map) return;\n for (const name in map) {\n const raw = map[name];\n const spec = isUniformSpec(raw) ? raw : null;\n const value = spec ? spec.value : raw;\n if (value === undefined || value === null) continue;\n\n const inf = info[name];\n if (!inf || !inf.loc) {\n if (strict) throw new ShaderMateError('Unknown uniform: ' + name);\n if (warnMissing) warnOnce('missing-uniform:' + label + ':' + name,\n `Uniform \"${name}\" not found in ${label ? `pass \"${label}\"` : 'shader'} (misspelled, undeclared, or optimized out).`);\n continue;\n }\n\n let d;\n if (spec && spec.type != null) {\n d = resolveUniformType(spec.type);\n if (!d) {\n if (strict) throw new ShaderMateError('Unknown uniform type: ' + spec.type + ' for ' + name);\n warnOnce('bad-type:' + name, 'Unknown uniform type', spec.type, name);\n continue;\n }\n } else {\n d = describeGLType(inf.type);\n if (!d) continue; // sampler or unsupported type\n }\n uploadUniform(gl, inf.loc, d, value, spec && spec.transpose);\n }\n}\n", "/**\n * Pointer state (mouse / touch / pen). Coordinates are canvas pixels with the origin at the\n * bottom-left (ShaderToy convention), computed from the canvas's *painted* box so they stay\n * correct with CSS scaling, devicePixelRatio and object-fit letterboxing.\n *\n * options.target: 'window' (default \u2014 hero text overlaying the canvas doesn't block input)\n * | 'canvas' | any Element\n * options.smooth: 0 (off) \u2026 1 exponential smoothing applied per frame\n */\nexport function createPointer(canvas, getFit, options = {}) {\n const target = options.target === 'canvas' ? canvas\n : (options.target && typeof options.target === 'object') ? options.target\n : window;\n const smooth = +options.smooth || 0;\n\n const raw = { x: 0, y: 0, down: false, over: false, dragX: 0, dragY: 0, wheel: 0 };\n const state = { x: 0, y: 0, clickX: 0, clickY: 0, down: false, over: false, uvX: 0, uvY: 0, dragX: 0, dragY: 0, wheel: 0, clicked: false };\n let clickPending = false;\n let lastX = 0, lastY = 0;\n let moved = false;\n\n /** Painted rectangle of the bitmap inside the element box (accounts for object-fit). */\n function paintedRect() {\n const r = canvas.getBoundingClientRect();\n const fit = getFit ? getFit() : 'fill';\n if (!r.width || !r.height || (fit !== 'contain' && fit !== 'cover')) return r;\n const ba = canvas.width / canvas.height, ra = r.width / r.height;\n let w, h;\n if ((ra > ba) === (fit === 'contain')) { h = r.height; w = h * ba; } else { w = r.width; h = w / ba; }\n return { left: r.left + (r.width - w) / 2, top: r.top + (r.height - h) / 2, width: w, height: h, bottom: 0, right: 0 };\n }\n\n /** client (DOM) coords -> canvas pixel coords, bottom-left origin */\n function toShader(clientX, clientY) {\n const r = paintedRect();\n if (!r.width || !r.height) return [0, 0];\n return [\n (clientX - r.left) * (canvas.width / r.width),\n (r.top + r.height - clientY) * (canvas.height / r.height)\n ];\n }\n const toUV = (cx, cy) => { const [x, y] = toShader(cx, cy); return [x / canvas.width, y / canvas.height]; };\n\n const onMove = e => {\n const [x, y] = toShader(e.clientX, e.clientY);\n if (raw.down) { raw.dragX += x - lastX; raw.dragY += y - lastY; } // cumulative click-and-drag offset\n lastX = x; lastY = y;\n raw.x = x; raw.y = y;\n raw.over = x >= 0 && y >= 0 && x <= canvas.width && y <= canvas.height;\n if (!moved) { moved = true; state.x = x; state.y = y; }\n };\n const onDown = e => {\n if (e.button !== undefined && e.button !== 0) return;\n onMove(e);\n if (target === window && !raw.over) return; // clicks outside the canvas don't count as a press\n raw.down = true;\n state.down = true;\n clickPending = true;\n lastX = raw.x; lastY = raw.y;\n state.clickX = raw.x; state.clickY = raw.y;\n if (!smooth) { state.x = raw.x; state.y = raw.y; }\n };\n const onUp = () => { raw.down = false; state.down = false; };\n const onLeave = () => { raw.over = false; };\n const onWheel = e => { raw.wheel += -e.deltaY * 0.002; }; // mouse-wheel accumulator (exp(wheel) makes a nice zoom)\n\n if (options.touch !== false && target === canvas) canvas.style.touchAction = 'none';\n target.addEventListener('pointermove', onMove, { passive: true });\n target.addEventListener('pointerdown', onDown, { passive: true });\n window.addEventListener('pointerup', onUp, { passive: true });\n window.addEventListener('pointercancel', onUp, { passive: true });\n target.addEventListener('pointerleave', onLeave, { passive: true });\n target.addEventListener('wheel', onWheel, { passive: true });\n\n return {\n state,\n toShader,\n toUV,\n /** Call once per frame. */\n update() {\n if (smooth > 0 && smooth < 1) {\n const k = 1 - Math.pow(1 - smooth, 1); // per-frame factor\n state.x += (raw.x - state.x) * k;\n state.y += (raw.y - state.y) * k;\n } else { state.x = raw.x; state.y = raw.y; }\n state.over = raw.over;\n state.clicked = clickPending; clickPending = false; // true for exactly one frame after a press\n state.dragX = raw.dragX; state.dragY = raw.dragY; state.wheel = raw.wheel;\n state.uvX = canvas.width ? state.x / canvas.width : 0;\n state.uvY = canvas.height ? state.y / canvas.height : 0;\n },\n dispose() {\n target.removeEventListener('pointermove', onMove);\n target.removeEventListener('pointerdown', onDown);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n target.removeEventListener('pointerleave', onLeave);\n target.removeEventListener('wheel', onWheel);\n }\n };\n}\n", "// Canvas sizing.\n//\n// size: 'canvas' (default when you pass a canvas) bitmap follows the canvas's CSS box \u2014 style it\n// however you like (width:100%; height:60vh \u2026) and ShaderMate keeps up.\n// size: 'window' (default when no canvas is given) fixed full-window canvas.\n// size: [w, h] fixed internal resolution; CSS box is yours, `fit` decides how it's shown.\n//\n// pixelRatio: 'auto' (default, capped by maxPixelRatio = 2) | number\n// scale: 1 extra render-scale multiplier (0.5 = render at half res, cheap on big heroes)\n// aspect: 16/9 | '16:9' | [16, 9] lock the bitmap aspect; shown with object-fit\n// fit: 'contain' | 'cover' | 'fill' how a fixed/aspect-locked bitmap fills its CSS box\n\nfunction parseAspect(a) {\n if (!a) return 0;\n if (typeof a === 'number') return a;\n if (Array.isArray(a)) return a[0] / a[1];\n if (typeof a === 'string') {\n const m = a.split(/[:/x]/).map(Number);\n return m.length === 2 && m[1] ? m[0] / m[1] : Number(a) || 0;\n }\n return 0;\n}\n\nexport function parseSizing(options = {}, hasCanvas = true) {\n const s = options.size ?? options.sizing;\n const cfg = {\n mode: hasCanvas ? 'canvas' : 'window',\n width: 0, height: 0,\n aspect: parseAspect(options.aspect),\n fit: options.fit || 'contain',\n pixelRatio: options.pixelRatio ?? options.dpr ?? 'auto',\n maxPixelRatio: options.maxPixelRatio ?? 2,\n scale: options.scale ?? options.renderScale ?? 1,\n };\n if (Array.isArray(s)) { cfg.mode = 'fixed'; cfg.width = s[0]; cfg.height = s[1]; }\n else if (typeof s === 'string') cfg.mode = s === 'screen' || s === 'fullscreen' ? 'window' : s === 'element' ? 'canvas' : s;\n else if (s && typeof s === 'object') { cfg.mode = 'fixed'; cfg.width = s.width; cfg.height = s.height; if (s.fit) cfg.fit = s.fit; }\n if (cfg.mode === 'fixed') cfg.aspect = cfg.width / cfg.height;\n return cfg;\n}\n\nexport function createSizer(canvas, options = {}, hasCanvas = true) {\n const cfg = parseSizing(options, hasCanvas);\n const ratio = () => (cfg.pixelRatio === 'auto'\n ? Math.min(window.devicePixelRatio || 1, cfg.maxPixelRatio)\n : (Number(cfg.pixelRatio) || 1));\n let styled = false;\n\n function cssBox() {\n if (cfg.mode === 'window') return { w: window.innerWidth, h: window.innerHeight };\n return { w: canvas.clientWidth || window.innerWidth, h: canvas.clientHeight || window.innerHeight };\n }\n\n function measure() {\n if (cfg.mode === 'fixed') return { w: cfg.width, h: cfg.height };\n const box = cssBox();\n const k = ratio() * cfg.scale;\n let w = box.w, h = box.h;\n if (cfg.aspect) {\n if (w / h > cfg.aspect) w = h * cfg.aspect; else h = w / cfg.aspect;\n }\n return { w: w * k, h: h * k };\n }\n\n function applyStyle() {\n if (styled) return;\n styled = true;\n if (cfg.mode === 'window') {\n canvas.style.cssText += ';display:block;position:fixed;left:0;top:0;width:100%;height:100%;';\n }\n if (cfg.mode === 'fixed' || cfg.aspect) canvas.style.objectFit = cfg.fit;\n }\n\n return {\n cfg,\n /** 'contain' | 'cover' | 'fill' as currently applied (for pointer mapping). */\n fit: () => ((cfg.mode === 'fixed' || cfg.aspect) ? cfg.fit : 'fill'),\n setFixed(w, h) { cfg.mode = 'fixed'; cfg.width = w; cfg.height = h; cfg.aspect = w / h; styled = false; },\n /** Recompute; returns true when the bitmap size changed. */\n update() {\n applyStyle();\n const m = measure();\n const w = Math.max(1, Math.round(m.w)), h = Math.max(1, Math.round(m.h));\n if (canvas.width === w && canvas.height === h) return false;\n canvas.width = w;\n canvas.height = h;\n return true;\n },\n /** Call `fn` on window resize / canvas box changes. Returns a disposer. */\n observe(fn) {\n let pending = false;\n const schedule = () => {\n if (pending) return;\n pending = true;\n requestAnimationFrame(() => { pending = false; fn(); });\n };\n window.addEventListener('resize', schedule);\n let ro = null;\n if (cfg.mode === 'canvas' && typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(schedule);\n ro.observe(canvas);\n }\n return () => { window.removeEventListener('resize', schedule); if (ro) ro.disconnect(); };\n }\n };\n}\n", "/**\n * Tracks whether rendering is worthwhile: tab visible AND canvas in (or near) the viewport.\n * Saves battery on long pages with a hero at the top.\n */\nexport function createVisibility(canvas, { enabled = true, margin = '100px', onChange } = {}) {\n let tabVisible = typeof document === 'undefined' ? true : !document.hidden;\n let inView = true;\n const notify = () => onChange && onChange(tabVisible && inView);\n\n const onVis = () => { tabVisible = !document.hidden; notify(); };\n let io = null;\n if (enabled) {\n document.addEventListener('visibilitychange', onVis);\n if (typeof IntersectionObserver !== 'undefined') {\n io = new IntersectionObserver(entries => {\n for (const e of entries) inView = e.isIntersecting;\n notify();\n }, { rootMargin: margin });\n io.observe(canvas);\n }\n }\n return {\n get visible() { return tabVisible && inView; },\n dispose() {\n if (enabled) document.removeEventListener('visibilitychange', onVis);\n if (io) io.disconnect();\n }\n };\n}\n", "// Shared look for ShaderMate's own UI (stats overlay, error overlay, GUI addon).\n// Dark editor palette: VS Code \"Dark Modern\" tones. Override per instance with options.theme.\nexport const DEFAULT_THEME = {\n font: '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n mono: '\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n bg: '#1f1f1f',\n bgAlt: '#181818',\n raised: '#2a2d2e',\n hover: '#37373d',\n border: '#3c3c3c',\n text: '#cccccc',\n textStrong: '#ececec',\n label: '#9d9d9d',\n accent: '#4daafc',\n number: '#4daafc',\n string: '#d1977f',\n red: '#e46962',\n redSoft: '#4e3534',\n redText: '#f9dedc',\n radius: '8px',\n shadow: '0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)',\n};\n\nexport function resolveTheme(t) {\n return Object.assign({}, DEFAULT_THEME, t && typeof t === 'object' ? t : null);\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Stats overlay (FPS, frame time, CPU time, frame count, resolution).\n * Nothing is installed unless you ask: stats: true (visible) | 'key' (hidden until the key is pressed).\n */\nexport function createStats({ visible = false, key = 'F1', position = 'top-left', theme } = {}) {\n const T = resolveTheme(theme);\n const el = document.createElement('div');\n const [v, h] = position.split('-');\n el.style.cssText =\n `position:fixed;${v === 'bottom' ? 'bottom' : 'top'}:12px;${h === 'right' ? 'right' : 'left'}:12px;` +\n `z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${T.border};border-radius:${T.radius};` +\n `background:${T.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${T.shadow};` +\n `color:${T.text};font:12px/1.5 ${T.mono};pointer-events:none;display:none`;\n document.body.appendChild(el);\n\n const row = (label, value) =>\n `<div style=\"display:flex;justify-content:space-between;gap:14px\"><span style=\"color:${T.label}\">${label}</span><span style=\"color:${T.textStrong}\">${value}</span></div>`;\n\n let shown = false;\n let accDt = 0, accCpu = 0, n = 0, lastDom = 0;\n\n function show(on = true) {\n shown = !!on;\n el.style.display = shown ? 'block' : 'none';\n accDt = accCpu = n = 0;\n }\n const toggle = () => show(!shown);\n const onKey = e => { if (e.key === key) { e.preventDefault(); toggle(); } };\n if (key) window.addEventListener('keydown', onKey);\n show(visible);\n\n return {\n show, toggle,\n isVisible: () => shown,\n update(info) {\n if (!shown) return;\n accDt += info.rawDt; accCpu += info.cpuMs; n++;\n const now = performance.now();\n if (now - lastDom < 250) return;\n lastDom = now;\n const ms = (accDt / n) * 1000;\n el.innerHTML =\n `<div style=\"display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px\"><b style=\"color:${T.accent};font-size:16px;font-weight:600\">${(1000 / ms).toFixed(0)}<span style=\"font-size:11px;color:${T.label};font-weight:400\"> fps</span></b><span style=\"color:${T.label}\">${ms.toFixed(1)} ms</span></div>` +\n row('cpu', (accCpu / n).toFixed(2) + ' ms') +\n row('frame', info.frame) +\n row('time', info.time.toFixed(2) + ' s') +\n row('size', `${info.width}\u00D7${info.height}`) +\n row('passes', info.passes);\n accDt = accCpu = n = 0;\n },\n dispose() {\n if (key) window.removeEventListener('keydown', onKey);\n el.remove();\n }\n };\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Compile-error overlay drawn over the canvas (dev aid). Enabled by default on localhost\n * (errorOverlay: 'auto'); set errorOverlay: true/false to force.\n */\nexport function createErrorOverlay(canvas, theme) {\n const T = resolveTheme(theme);\n let el = null;\n\n function place() {\n if (!el) return;\n const r = canvas.getBoundingClientRect();\n Object.assign(el.style, { left: r.left + 'px', top: r.top + 'px', width: r.width + 'px', height: r.height + 'px' });\n }\n const esc = s => String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;');\n\n return {\n show(err) {\n if (!el) {\n el = document.createElement('div');\n el.style.cssText =\n 'position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;' +\n `background:${T.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${T.text};font:13px/1.55 ${T.font}`;\n document.body.appendChild(el);\n window.addEventListener('resize', place);\n }\n const errors = err.errors || [];\n const title = esc(err.message.split('\\n')[0]);\n let body = '';\n if (errors.length) {\n body = errors.map(e =>\n `<div style=\"display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};margin-bottom:8px\">` +\n `<span style=\"color:${T.red};font-family:${T.mono};font-size:12px\">line ${e.line}</span><span style=\"color:${T.textStrong}\">${esc(e.message)}</span>` +\n `<span></span><code style=\"color:${T.label};font-family:${T.mono};font-size:12px;white-space:pre-wrap\">${esc(e.source.trim())}</code></div>`).join('');\n } else if (err.log) {\n body = `<pre style=\"margin:0;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};color:${T.label};font:12px/1.5 ${T.mono};white-space:pre-wrap\">${esc(err.log)}</pre>`;\n }\n el.innerHTML =\n `<div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px\">` +\n `<span style=\"display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${T.redSoft};color:${T.redText};font-size:11.5px;font-weight:500\">Shader error</span>` +\n `<b style=\"color:${T.textStrong};font-weight:600\">${title}</b></div>` + body;\n el.style.display = 'block';\n place();\n },\n hide() { if (el) el.style.display = 'none'; },\n dispose() { if (el) { el.remove(); window.removeEventListener('resize', place); el = null; } }\n };\n}\n", "/**\n * Screenshots and video capture. `renderNow()` draws a fresh frame synchronously, so these\n * work without preserveDrawingBuffer (the pixels are read in the same task as the draw).\n */\nexport function createCapture(canvas, renderNow) {\n function screenshot(type = 'image/png', quality) {\n renderNow();\n return canvas.toDataURL(type, quality);\n }\n\n function toBlob(type = 'image/png', quality) {\n renderNow();\n return new Promise((res, rej) => canvas.toBlob(b => (b ? res(b) : rej(new Error('toBlob failed'))), type, quality));\n }\n\n async function download(filename = 'shadermate.png', type, quality) {\n if (!type) type = /\\.jpe?g$/i.test(filename) ? 'image/jpeg' : /\\.webp$/i.test(filename) ? 'image/webp' : 'image/png';\n const blob = await toBlob(type, quality);\n saveBlob(blob, filename);\n }\n\n /**\n * Record the canvas to a WebM (or whatever the browser supports).\n * const rec = sm.record({ fps: 60 }); \u2026 const blob = await rec.stop();\n * await sm.record({ duration: 5000, download: 'loop.webm' });\n */\n function record({ fps = 60, mimeType, bitsPerSecond = 8_000_000, duration = 0, download: dl } = {}) {\n if (typeof MediaRecorder === 'undefined' || !canvas.captureStream) throw new Error('MediaRecorder not supported');\n const stream = canvas.captureStream(fps);\n const type = mimeType || ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm', 'video/mp4']\n .find(t => MediaRecorder.isTypeSupported(t)) || '';\n const rec = new MediaRecorder(stream, { mimeType: type || undefined, videoBitsPerSecond: bitsPerSecond });\n const chunks = [];\n rec.ondataavailable = e => { if (e.data.size) chunks.push(e.data); };\n const done = new Promise(res => { rec.onstop = () => res(new Blob(chunks, { type: rec.mimeType })); });\n rec.start(100);\n\n const handle = {\n recorder: rec,\n stop() { if (rec.state !== 'inactive') rec.stop(); stream.getTracks().forEach(t => t.stop()); return done; },\n done\n };\n if (duration > 0) {\n const finished = new Promise(res => setTimeout(() => res(handle.stop()), duration));\n if (dl) return finished.then(blob => { saveBlob(blob, typeof dl === 'string' ? dl : 'shadermate.webm'); return blob; });\n return finished;\n }\n return handle;\n }\n\n return { screenshot, toBlob, download, record };\n}\n\nexport function saveBlob(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n", "import { MAX_CHANNELS, DEFAULT_CANVAS_ID, VERSION } from '../constants.js';\nimport { ShaderMateError, toArray, warnOnce, isBrowser, parseColor, isDevHost } from '../utils/util.js';\nimport { RefPool } from './RefPool.js';\nimport { createEmitter } from './events.js';\nimport { createTweens } from './tween.js';\nimport { normalizePasses, normalizeChannel, isInlineSource } from './passes.js';\nimport { createContext, getExtensions, isWebGL2 } from '../gl/context.js';\nimport { createQuad } from '../gl/quad.js';\nimport { createBlit } from '../gl/blit.js';\nimport { createProgram, getUniformInfo } from '../gl/shader.js';\nimport { createTarget, deleteTarget, resolvePassSize } from '../gl/targets.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\nimport { resolveIncludes, assembleFragment, DEFAULT_INJECT, NO_INJECT } from '../glsl/preprocess.js';\nimport { loadChannel, channelSamplerType } from '../loaders/index.js';\nimport { splitPassBlob, parseUniformComments, usesMouseVec4 } from '../glsl/fragcoord.js';\nimport { looksLikeFragCoord } from '../glsl/builtins.js';\nimport { resolveSamplerSpecs, needsMainBackbuffer, auxPasses } from './samplers.js';\nimport { createCamera } from '../input/camera.js';\nimport { applyUniformMap, isUniformSpec } from '../uniforms/apply.js';\nimport { GL_FLOAT, GL_FLOAT_VEC4, GL_FLOAT_VEC2 } from '../uniforms/types.js';\nimport { createPointer } from '../input/pointer.js';\nimport { createSizer } from '../view/sizing.js';\nimport { createVisibility } from '../view/visibility.js';\nimport { createStats } from '../ui/stats.js';\nimport { createErrorOverlay } from '../ui/errorOverlay.js';\nimport { createCapture } from '../capture/capture.js';\n\n/** Accepts create(options) or create(shaderOrPasses, options). */\nfunction normalizeArgs(a, b) {\n if (typeof a === 'string' || Array.isArray(a)) return { ...(b || {}), passes: a };\n if (a && typeof a === 'object' && (a.shader != null || a.passes != null || a.src != null)) {\n const o = { ...a };\n // Single-shader form: per-pass fields written at the top level belong to that one pass.\n if (o.passes == null) o.passes = { src: o.shader ?? o.src, uniforms: o.passUniforms, channels: o.channels, pingpong: o.pingpong, float: o.float };\n else if (o.channels != null) console.warn('[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead.');\n return o;\n }\n throw new ShaderMateError('createShader: pass a shader string, an array of passes, or { shader | passes, ...options }');\n}\n\nfunction resolveCanvas(c) {\n if (c && typeof c === 'object' && typeof c.getContext === 'function') return { canvas: c, given: true };\n if (typeof c === 'string') {\n let el = document.getElementById(c);\n if (!el) { try { el = document.querySelector(c); } catch { /* invalid selector */ } }\n if (!el) throw new ShaderMateError(`Canvas not found: \"${c}\"`);\n return { canvas: el, given: true };\n }\n let el = document.getElementById(DEFAULT_CANVAS_ID);\n if (el) return { canvas: el, given: true };\n el = document.createElement('canvas');\n el.id = DEFAULT_CANVAS_ID;\n (document.body || document.documentElement).appendChild(el);\n return { canvas: el, given: false };\n}\n\nfunction setUniformIn(map, name, value) {\n const cur = map[name];\n if (isUniformSpec(cur)) cur.value = value;\n else map[name] = value;\n}\nconst readUniform = (map, name) => (isUniformSpec(map[name]) ? map[name].value : map[name]);\n\n/**\n * Create a ShaderMate instance. Returns synchronously; shaders and textures load in the\n * background. `await sm.ready` to know when the first frame can render.\n */\nexport function createShader(a, b) {\n if (!isBrowser) throw new ShaderMateError('ShaderMate needs a browser environment (window/document).');\n const options = normalizeArgs(a, b);\n\n // ---- options ---------------------------------------------------------\n const autoSetup = options.autoSetup !== false;\n const inject = Object.assign({}, autoSetup ? DEFAULT_INJECT : NO_INJECT, options.inject);\n const globalDefines = toArray(options.defines);\n let commonSrc = typeof options.common === 'string' ? options.common : '';\n const dialect = options.dialect || 'auto'; // 'auto' | 'fragcoord' | 'shadertoy' | 'shadermate'\n const instanceSamplers = options.samplers || {};\n const uniforms = options.uniforms || {}; // instance-wide, live\n const includeStore = options.includes || {};\n const strictUniforms = !!options.strictUniforms;\n const warnUniforms = options.warnMissingUniforms !== false;\n const showExpanded = options.showExpandedOnError !== false;\n const useOverlay = options.errorOverlay === undefined || options.errorOverlay === 'auto' ? isDevHost() : !!options.errorOverlay;\n\n // ---- context ---------------------------------------------------------\n let canvas, givenCanvas, gl;\n if (options.gl) {\n gl = options.gl; canvas = gl.canvas; givenCanvas = true;\n } else {\n ({ canvas, given: givenCanvas } = resolveCanvas(options.canvas));\n gl = createContext(canvas, options);\n }\n const isGL2 = isWebGL2(gl);\n const ext = getExtensions(gl, isGL2);\n const env = { isGL2, ext };\n const pool = new RefPool(gl);\n const enableDerivatives = !!(isGL2 || ext.OES_standard_derivatives);\n const bg = parseColor(options.background ?? options.clearColor) || [0, 0, 0, 0];\n gl.clearColor(bg[0], bg[1], bg[2], bg[3]);\n\n const emitter = createEmitter();\n const { emit, on, off, once } = emitter;\n const quad = createQuad(gl);\n const sizer = createSizer(canvas, options, givenCanvas);\n const pointer = createPointer(canvas, sizer.fit, options.pointer === false ? { target: 'canvas', smooth: 0 } : (typeof options.pointer === 'object' ? options.pointer : {}));\n const tweens = createTweens();\n const overlay = useOverlay ? createErrorOverlay(canvas, options.theme) : null;\n let stats = null;\n if (options.stats) {\n stats = createStats({\n visible: options.stats === true || options.stats === 'visible',\n key: options.statsKey === undefined ? 'F1' : options.statsKey,\n position: options.statsPosition,\n theme: options.theme,\n });\n }\n\n // ---- state -----------------------------------------------------------\n const passObjs = [];\n const byName = new Map();\n let PASSES = [];\n let disposed = false;\n let loaded = false;\n let rafId = null;\n let removeResize = () => { };\n let last = performance.now();\n let lastRender = 0;\n let frame = 0;\n let time = options.time || 0;\n let playing = options.autoplay !== false && !options.startPaused && !options.paused;\n let timeScale = options.timeScale ?? 1;\n let fixedDelta = options.fixedDelta || 0;\n let maxFps = options.maxFps || options.fps || 0;\n let loopLen = options.loop || 0;\n const maxDelta = options.maxDelta ?? 0.1;\n let visible = true;\n let lastError = null;\n let refreshRate = 60; // estimated display refresh rate (median of recent rAF intervals)\n const rafDts = [];\n let camera = null; // fly camera, created when a pass uses u_camera_*\n let blit = null; // copies the screen pass' buffer to the canvas when u_main is sampled\n let mainBackbuffer = false;\n\n const visibility = createVisibility(canvas, {\n enabled: options.pauseWhenHidden !== false,\n onChange: v => { visible = v; if (v) last = performance.now(); emit('visibility', v); }\n });\n\n // ---- helpers ---------------------------------------------------------\n function reportError(err) {\n lastError = err;\n if (overlay) overlay.show(err);\n emit('error', err);\n if (options.onError) options.onError(err);\n }\n function clearError() {\n lastError = null;\n if (overlay) overlay.hide();\n }\n\n const loadText = async path => {\n const r = await fetch(path);\n if (!r.ok) throw new ShaderMateError(`Failed to fetch ${path}: ${r.status} ${r.statusText}`);\n return r.text();\n };\n const includeLoader = async path => (includeStore[path] != null ? includeStore[path] : loadText(path));\n\n let commonText = null;\n async function getCommon() {\n if (commonText !== null) return commonText;\n if (!commonSrc) return (commonText = '');\n const raw = isInlineSource(commonSrc) ? commonSrc : await loadText(commonSrc);\n const parsed = parseUniformComments(raw); // Common may declare annotated uniforms too\n for (const n in parsed.uniforms) if (!(n in uniforms)) uniforms[n] = parsed.uniforms[n];\n Object.assign(instanceSamplers, parsed.samplers, instanceSamplers);\n return (commonText = parsed.source);\n }\n\n /** Fetch (if needed), preprocess and compile a pass' fragment shader. */\n async function buildProgram(pass, src, allPasses = PASSES) {\n let text = isInlineSource(src) ? src : await loadText(src);\n const common = await getCommon();\n\n // FragCoord.xyz annotations: `uniform float u_x = 0.5; //[0, 1]`, `uniform sampler2D u_tex; //https://\u2026`\n const parsed = parseUniformComments(text);\n text = parsed.source;\n for (const n in parsed.uniforms) if (!(n in pass.uniforms) && !(n in uniforms)) pass.uniforms[n] = parsed.uniforms[n];\n pass.annotatedSamplers = parsed.samplers;\n\n const full = common ? common + '\\n#line 1\\n' + text : text;\n const expanded = await resolveIncludes(full, { loader: includeLoader });\n\n const fc = dialect === 'fragcoord' || (dialect === 'auto' && looksLikeFragCoord(expanded));\n const samplerNames = [];\n const aux = allPasses.filter(p => !p.screen);\n allPasses.forEach(p => samplerNames.push('u_' + p.name));\n aux.forEach((p, i) => { const n = 'u_pass' + (i + 1); if (!samplerNames.includes(n)) samplerNames.push(n); });\n\n const frag = assembleFragment(expanded, {\n isGL2,\n defines: [...globalDefines, ...toArray(pass.defines)],\n enableDerivatives,\n inject,\n channelTypes: pass.channels.map(channelSamplerType),\n builtinOpts: {\n fragcoord: fc,\n mouseVec4: fc || dialect === 'fragcoord' || usesMouseVec4(expanded),\n scrollFloat: fc || dialect === 'fragcoord',\n samplerNames,\n passCount: aux.length,\n },\n });\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, frag, { label: pass.name, showExpandedOnError: showExpanded });\n if (r.error) throw r.error;\n return { program: r.program, source: text, compiled: frag, fragcoord: fc };\n }\n\n function resizeTargets() {\n for (const po of passObjs) {\n const cfg = po.cfg;\n if (cfg.screen && !mainBackbuffer) continue;\n const [w, h] = cfg.screen ? [canvas.width, canvas.height] : resolvePassSize(cfg.size, canvas.width, canvas.height);\n if (po.target && po.target.width === w && po.target.height === h) continue;\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.target = createTarget(gl, pool, w, h, cfg, isGL2, ext);\n po.targetPrev = (cfg.pingpong || (cfg.screen && mainBackbuffer)) ? createTarget(gl, pool, w, h, cfg, isGL2, ext) : null;\n }\n }\n\n function handleResize() {\n if (disposed) return;\n if (sizer.update()) {\n gl.viewport(0, 0, canvas.width, canvas.height);\n resizeTargets();\n emit('resize', { width: canvas.width, height: canvas.height });\n if (!playing && loaded) renderNow(); // keep a paused canvas crisp\n }\n }\n\n async function loadPassChannels(po) {\n await Promise.all(po.cfg.channels.map(async (ch, i) => {\n if (!ch || ch.pass != null) return;\n try {\n po.texChannels[i] = await loadChannel(gl, pool, ch, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" channel ${i}: ${e.message}`);\n emit('error', e);\n }\n }));\n // named samplers (u_pass1, u_blur, u_main, u_audio, annotated URLs \u2026)\n po.samplers = resolveSamplerSpecs(po, passObjs, instanceSamplers);\n await Promise.all(po.samplers.map(async s => {\n if (s.spec.pass != null || s.spec.array) return;\n try {\n s.wrap = await loadChannel(gl, pool, s.spec, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" sampler ${s.name}: ${e.message}`);\n emit('error', e);\n }\n }));\n }\n\n // ---- build -----------------------------------------------------------\n /** A pasted FragCoord.xyz multi-pass blob (`// Pass 1` \u2026 `// Main`) becomes a pass list. */\n function expandPassBlob(input) {\n if (typeof input !== 'string' || !isInlineSource(input)) return input;\n const blob = splitPassBlob(input);\n if (!blob) return input;\n if (blob.common) commonSrc = commonSrc ? commonSrc + '\\n' + blob.common : blob.common;\n const unsupported = blob.passes.find(p => p.bufferType !== '2d');\n if (unsupported) throw new ShaderMateError(`Pass \"${unsupported.label}\" uses a ${unsupported.bufferType} buffer; ShaderMate supports 2D buffers only.`);\n const passes = blob.passes.map(p => p.main\n ? { name: 'main', shader: p.src, screen: true }\n : { name: p.name, shader: p.src, pingpong: true, float: true }); // aux passes keep history (feedback) like FragCoord\n if (!passes.some(p => p.screen)) passes[passes.length - 1].screen = true;\n return passes;\n }\n\n async function build() {\n PASSES = normalizePasses(expandPassBlob(options.passes));\n for (const p of PASSES) if (p.iterations > 1 && !p.screen) p.pingpong = true; // recursion reads the previous iteration\n for (let i = 0; i < PASSES.length; i++) {\n const pass = PASSES[i];\n const { program, source, compiled, fragcoord } = await buildProgram(pass, pass.src);\n if (disposed) { gl.deleteProgram(program); return; }\n const po = {\n cfg: pass, name: pass.name, index: i,\n programId: pool.add(program, 'program'),\n uniformInfo: getUniformInfo(gl, program),\n source, compiled, fragcoord,\n target: null, targetPrev: null,\n texChannels: new Array(MAX_CHANNELS).fill(null),\n samplers: [],\n };\n passObjs.push(po);\n byName.set(po.name, po);\n }\n await Promise.all(passObjs.map(loadPassChannels));\n if (disposed) return;\n mainBackbuffer = needsMainBackbuffer(passObjs);\n if (mainBackbuffer && !blit) blit = createBlit(gl, isGL2, quad);\n if (!camera && passObjs.some(po => po.uniformInfo.u_camera_pos || po.uniformInfo.u_camera_dir || po.uniformInfo.u_camera_view)) {\n camera = createCamera(canvas, typeof options.camera === 'object' ? options.camera : {});\n }\n resizeTargets();\n }\n\n // ---- frame -----------------------------------------------------------\n /** Texture of another pass as seen from `po` (previous frame when reading itself / a later pass). */\n function passTexture(po, src, buffer) {\n let t = null;\n if (src.targetPrev) {\n const prev = buffer === 'prev' || (buffer !== 'current' && src.index >= po.index);\n t = prev ? src.targetPrev : src.target;\n } else if (src === po) {\n warnOnce('self:' + po.name, `Pass \"${po.name}\" reads its own output; add pingpong: true.`);\n } else if (src.cfg.screen) {\n warnOnce('screen:' + src.name, `Pass \"${po.name}\" can't read screen pass \"${src.name}\" (it has no texture).`);\n } else t = src.target;\n return t;\n }\n\n function drawPass(po, f, iteration = 0) {\n const cfg = po.cfg;\n const program = pool.get(po.programId);\n const u = po.uniformInfo;\n const m = pointer.state;\n const set1f = (n, v) => { const i = u[n]; if (i) gl.uniform1f(i.loc, v); };\n const set1i = (n, v) => { const i = u[n]; if (i) gl.uniform1i(i.loc, v); };\n\n if (po.targetPrev) { const t = po.targetPrev; po.targetPrev = po.target; po.target = t; }\n\n let rw, rh;\n if (cfg.screen && !mainBackbuffer) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n rw = canvas.width; rh = canvas.height;\n } else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n rw = po.target.width; rh = po.target.height;\n }\n const k = cfg.screen ? 1 : rw / canvas.width; // mouse in this pass' pixel space\n const ky = cfg.screen ? 1 : rh / canvas.height;\n gl.viewport(0, 0, rw, rh);\n gl.useProgram(program);\n gl.clear(gl.COLOR_BUFFER_BIT | (po.target && po.target.depthId ? gl.DEPTH_BUFFER_BIT : 0));\n\n // built-ins\n set1f('iTime', f.time); set1f('u_time', f.time);\n set1f('iTimeDelta', f.dt); set1f('u_delta', f.dt); set1f('u_time_delta', f.dt);\n set1i('iFrame', f.frame); set1i('u_frame', f.frame);\n set1f('iFrameRate', f.fps); set1f('u_fps', f.fps); set1f('u_refresh_rate', f.refreshRate);\n set1f('iSampleRate', 44100);\n if (u.iResolution) gl.uniform3f(u.iResolution.loc, rw, rh, 1);\n if (u.u_resolution) gl.uniform2f(u.u_resolution.loc, rw, rh);\n set1f('u_aspect', rw / rh);\n set1f('u_pixelRatio', f.dpr);\n if (u.iDate) gl.uniform4fv(u.iDate.loc, f.date);\n if (u.u_date) gl.uniform4fv(u.u_date.loc, f.date);\n if (u.iScroll) gl.uniform2f(u.iScroll.loc, f.scrollX, f.scrollY);\n if (u.u_scroll) {\n // vec2 = page scroll (ShaderMate); float = mouse-wheel accumulator (FragCoord.xyz convention)\n if (u.u_scroll.type === GL_FLOAT) gl.uniform1f(u.u_scroll.loc, m.wheel); else gl.uniform2f(u.u_scroll.loc, f.scrollX, f.scrollY);\n }\n set1f('u_wheel', m.wheel);\n if (u.u_drag) gl.uniform2f(u.u_drag.loc, m.dragX * k, m.dragY * ky);\n set1i('u_recursion', iteration);\n set1i('u_max_recursion', cfg.iterations || 1);\n set1i('u_color_gamut', 0);\n if (camera) {\n if (u.u_camera_pos) gl.uniform3fv(u.u_camera_pos.loc, camera.pos);\n if (u.u_camera_dir) gl.uniform3fv(u.u_camera_dir.loc, camera.dir);\n if (u.u_camera_view) gl.uniformMatrix4fv(u.u_camera_view.loc, false, camera.view);\n }\n if (u.iMouse) {\n // ShaderToy semantics: z > 0 while the button is held, w > 0 only on the frame of the click; both carry |click pos| otherwise\n const sz = m.down ? 1 : -1, sw = m.clicked ? 1 : -1;\n gl.uniform4f(u.iMouse.loc, m.x * k, m.y * ky, m.clickX * k * sz, m.clickY * ky * sw);\n }\n if (u.u_mouse) {\n // vec2 = position; vec4 = position + click position, zw negative while the button is up (FragCoord.xyz convention)\n if (u.u_mouse.type === GL_FLOAT_VEC4) { const s = m.down ? 1 : -1; gl.uniform4f(u.u_mouse.loc, m.x * k, m.y * ky, m.clickX * k * s, m.clickY * ky * s); }\n else gl.uniform2f(u.u_mouse.loc, m.x * k, m.y * ky);\n }\n if (u.u_mouseUV) gl.uniform2f(u.u_mouseUV.loc, m.uvX, m.uvY);\n set1f('u_mouseDown', m.down ? 1 : 0);\n\n // channels\n const chTimes = [0, 0, 0, 0];\n const chRes = new Float32Array(12);\n for (let i = 0; i < MAX_CHANNELS; i++) {\n const ch = cfg.channels[i];\n if (!ch) continue;\n let texObj = null, w = 0, h = 0, isCube = false, chTime = f.time;\n\n if (ch.pass != null) {\n const src = byName.get(ch.pass);\n const t = src ? passTexture(po, src, ch.buffer) : null;\n if (t) { texObj = pool.get(t.texId); w = t.width; h = t.height; }\n } else {\n const wrap = po.texChannels[i];\n if (wrap) {\n texObj = pool.get(wrap.texId); w = wrap.width; h = wrap.height; isCube = !!wrap.cubemap;\n if (wrap.getTime) chTime = wrap.getTime();\n }\n }\n if (texObj) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, texObj);\n set1i('iChannel' + i, i);\n chTimes[i] = chTime;\n chRes[i * 3] = w; chRes[i * 3 + 1] = h; chRes[i * 3 + 2] = 1;\n }\n }\n if (u.iChannelTime) (u.iChannelTime.type === GL_FLOAT_VEC4 ? gl.uniform4fv : gl.uniform1fv).call(gl, u.iChannelTime.loc, chTimes);\n if (u.iChannelResolution) gl.uniform3fv(u.iChannelResolution.loc, chRes);\n\n // named samplers on texture units after the four iChannels\n let unit = MAX_CHANNELS;\n for (const s of po.samplers) {\n const bindTex = (tex, isCube) => { gl.activeTexture(gl.TEXTURE0 + unit); gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, tex); return unit++; };\n if (s.spec.array) {\n const units = s.spec.array.map(src => { const t = passTexture(po, src, s.spec.buffer); return t ? bindTex(pool.get(t.texId), false) : 0; });\n gl.uniform1iv(s.info.loc, units);\n } else if (s.spec.pass != null) {\n const src = byName.get(s.spec.pass);\n const t = src ? passTexture(po, src, s.spec.buffer) : null;\n if (t) gl.uniform1i(s.info.loc, bindTex(pool.get(t.texId), false));\n } else if (s.wrap) {\n gl.uniform1i(s.info.loc, bindTex(pool.get(s.wrap.texId), !!s.wrap.cubemap));\n if (s.wrap.getTime) set1f(s.name + '_time', s.wrap.getTime()); // FragCoord: companion <name>_time for video\n const res = u[s.name + '_resolution']; if (res) gl.uniform2f(res.loc, s.wrap.width, s.wrap.height);\n }\n }\n\n // user uniforms: instance-wide first, then per-pass overrides\n applyUniformMap(gl, u, uniforms, { strict: false });\n applyUniformMap(gl, u, cfg.uniforms, { strict: strictUniforms, warnMissing: warnUniforms, label: po.name });\n\n quad.bind(program);\n quad.draw();\n }\n\n /** Advance the clock (if playing/forced) and draw every pass. */\n function frameStep(now, { advance = playing, rawDt } = {}) {\n const t0 = performance.now();\n if (rawDt === undefined) rawDt = Math.max(0, (now - last) * 0.001);\n last = now;\n if (rawDt > 0.002 && rawDt < 0.1) { rafDts.push(rawDt); if (rafDts.length > 30) rafDts.shift(); if (rafDts.length >= 10) { const s = [...rafDts].sort((a, b) => a - b); refreshRate = Math.round(1 / s[s.length >> 1]); } }\n let dt = fixedDelta > 0 ? fixedDelta : Math.min(rawDt, maxDelta);\n if (advance) {\n time += dt * timeScale;\n if (loopLen > 0) time = ((time % loopLen) + loopLen) % loopLen;\n } else dt = 0;\n frame++;\n const fps = rawDt > 0 ? 1 / rawDt : 0;\n tweens.update(now);\n pointer.update();\n\n const info = { time, frame, dt, fps };\n emit('beforeFrame', info);\n if (options.onFrame) options.onFrame(info);\n\n const d = new Date();\n const f = {\n time, frame, dt, fps,\n dpr: window.devicePixelRatio || 1,\n date: [d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds() + d.getMilliseconds() / 1000],\n scrollX: window.scrollX || 0, scrollY: window.scrollY || 0,\n refreshRate,\n };\n\n if (camera) camera.update(rawDt);\n for (const po of passObjs) {\n for (const w of po.texChannels) if (w && w.update) w.update();\n for (const s of po.samplers) if (s.wrap && s.wrap.update) s.wrap.update();\n }\n for (const po of passObjs) {\n const n = Math.max(1, po.cfg.iterations | 0);\n for (let i = 0; i < n; i++) drawPass(po, f, i);\n if (po.cfg.screen && mainBackbuffer && blit) blit.draw(pool.get(po.target.texId), canvas.width, canvas.height);\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n emit('afterFrame', info);\n if (stats) stats.update({ rawDt, cpuMs: performance.now() - t0, frame, time, width: canvas.width, height: canvas.height, passes: passObjs.length });\n }\n\n function loop(now) {\n rafId = requestAnimationFrame(loop);\n if (!loaded || !visible) { last = now; return; }\n if (!playing && tweens.size === 0 && options.renderWhilePaused !== true) { last = now; return; }\n if (maxFps > 0 && now - lastRender < 1000 / maxFps - 0.5) return;\n lastRender = now;\n frameStep(now);\n }\n\n /** Draw one frame right now without advancing time (used by screenshots, resize while paused\u2026). */\n function renderNow() {\n if (!loaded || disposed) return;\n frameStep(performance.now(), { advance: false, rawDt: 0 });\n }\n\n // ---- lifecycle -------------------------------------------------------\n function startLoop() {\n if (disposed || rafId != null) return;\n last = performance.now();\n rafId = requestAnimationFrame(loop);\n }\n function stopLoop() {\n if (rafId != null) cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n function destroy() {\n if (disposed) return;\n disposed = true;\n stopLoop();\n removeResize();\n pointer.dispose();\n visibility.dispose();\n tweens.cancel();\n if (stats) stats.dispose();\n if (overlay) overlay.dispose();\n if (camera) camera.dispose();\n if (blit) blit.dispose();\n canvas.removeEventListener('webglcontextlost', onContextLost);\n canvas.removeEventListener('webglcontextrestored', onContextRestored);\n teardownPasses();\n quad.dispose();\n emit('destroy');\n emitter.clear();\n if (!givenCanvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);\n }\n\n function teardownPasses() {\n for (const po of passObjs) {\n pool.unref(po.programId);\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.texChannels.forEach(w => { if (!w) return; if (w.dispose) w.dispose(); pool.unref(w.texId); });\n (po.samplers || []).forEach(s => { if (!s.wrap) return; if (s.wrap.dispose) s.wrap.dispose(); pool.unref(s.wrap.texId); });\n }\n passObjs.length = 0;\n byName.clear();\n }\n\n function onContextLost(e) {\n e.preventDefault();\n stopLoop();\n loaded = false;\n console.warn('[ShaderMate] WebGL context lost.');\n emit('contextlost');\n }\n async function onContextRestored() {\n console.warn('[ShaderMate] WebGL context restored, rebuilding.');\n pool._items.clear();\n passObjs.length = 0; byName.clear();\n try { await build(); loaded = true; startLoop(); emit('contextrestored'); }\n catch (err) { reportError(err); }\n }\n canvas.addEventListener('webglcontextlost', onContextLost);\n canvas.addEventListener('webglcontextrestored', onContextRestored);\n\n // ---- public API ------------------------------------------------------\n const capture = createCapture(canvas, renderNow);\n\n function set(name, value, passName) {\n if (name && typeof name === 'object') { for (const k in name) set(k, name[k], value); return api; }\n tweens.cancel(name);\n let hit = false;\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) { setUniformIn(po.cfg.uniforms, name, value); hit = true; }\n }\n if (!hit) {\n if (passName) {\n const po = byName.get(passName);\n if (!po) throw new ShaderMateError(`set: unknown pass \"${passName}\"`);\n setUniformIn(po.cfg.uniforms, name, value);\n } else setUniformIn(uniforms, name, value);\n }\n if (!playing && loaded) scheduleRender();\n return api;\n }\n function get(name, passName) {\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) return readUniform(po.cfg.uniforms, name);\n }\n return readUniform(uniforms, name);\n }\n function tween(name, to, opts = {}) {\n const passName = opts.pass;\n const owner = () => {\n for (const po of passObjs) if ((!passName || po.name === passName) && name in po.cfg.uniforms) return po.cfg.uniforms;\n return uniforms;\n };\n return tweens.tween(name, () => readUniform(owner(), name), v => setUniformIn(owner(), name, v), to, opts);\n }\n\n let renderQueued = false;\n function scheduleRender() {\n if (renderQueued) return;\n renderQueued = true;\n requestAnimationFrame(() => { renderQueued = false; if (!playing) renderNow(); });\n }\n\n async function setShader(src, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setShader: unknown pass \"${passName}\"`);\n try {\n const { program, source, compiled } = await buildProgram(po.cfg, src, PASSES);\n if (disposed) { gl.deleteProgram(program); return; }\n pool.unref(po.programId);\n po.programId = pool.add(program, 'program');\n po.uniformInfo = getUniformInfo(gl, program);\n po.cfg.src = src; po.source = source; po.compiled = compiled;\n await loadPassChannels(po);\n clearError();\n emit('shader', { pass: po.name });\n if (!playing) scheduleRender();\n } catch (err) {\n reportError(err);\n throw err;\n }\n }\n\n async function setChannel(index, source, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setChannel: unknown pass \"${passName}\"`);\n const ch = normalizeChannel(source, [...byName.keys()], po.name);\n const old = po.texChannels[index];\n if (old) { if (old.dispose) old.dispose(); pool.unref(old.texId); po.texChannels[index] = null; }\n po.cfg.channels[index] = ch;\n if (ch && ch.pass == null) po.texChannels[index] = await loadChannel(gl, pool, ch, env);\n if (!playing) scheduleRender();\n }\n\n const api = {\n version: VERSION,\n canvas, gl, isWebGL2: isGL2,\n theme: options.theme,\n get camera() { return camera; },\n uniforms,\n get passes() { return passObjs; },\n get ready() { return readyPromise; },\n get loaded() { return loaded; },\n get error() { return lastError; },\n\n // playback\n play() { if (!playing) { playing = true; last = performance.now(); emit('play'); } return api; },\n pause() { if (playing) { playing = false; emit('pause'); } return api; },\n toggle() { return playing ? api.pause() : api.play(); },\n get playing() { return playing; },\n step(n = 1) { for (let i = 0; i < n; i++) frameStep(performance.now(), { advance: true, rawDt: fixedDelta || 1 / 60 }); return api; },\n render: renderNow,\n destroy, dispose: destroy,\n\n // time\n get time() { return time; }, set time(t) { time = t; if (!playing) scheduleRender(); },\n get frame() { return frame; },\n get timeScale() { return timeScale; }, set timeScale(s) { timeScale = s; },\n get maxFps() { return maxFps; }, set maxFps(v) { maxFps = v || 0; },\n get loop() { return loopLen; }, set loop(v) { loopLen = v || 0; },\n seek(t) { time = t; if (!playing) scheduleRender(); return api; },\n setFixedDelta(dt) { fixedDelta = dt || 0; return api; },\n\n // uniforms\n set, get, tween,\n setUniform: set, getUniform: get,\n\n // live editing\n setShader, setChannel,\n getPass: name => byName.get(name) || null,\n getTexture(name) {\n const po = name ? byName.get(name) : passObjs.find(p => !p.cfg.screen) || passObjs[0];\n return po && po.target ? pool.get(po.target.texId) : null;\n },\n readPixels({ pass, x = 0, y = 0, width, height, float } = {}) {\n const po = pass ? byName.get(pass) : null;\n renderNow();\n if (po && po.target) gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n else gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n const w = width ?? (po && po.target ? po.target.width : canvas.width);\n const h = height ?? (po && po.target ? po.target.height : canvas.height);\n let out = new Uint8Array(w * h * 4);\n const isFloat = po && po.target && po.target.fmt.type !== gl.UNSIGNED_BYTE;\n if (isFloat) {\n // float / half-float targets can only be read back as floats\n const f = new Float32Array(w * h * 4);\n gl.readPixels(x, y, w, h, gl.RGBA, gl.FLOAT, f);\n if (float !== false) out = f;\n else for (let i = 0; i < f.length; i++) out[i] = Math.max(0, Math.min(255, Math.round(f[i] * 255)));\n } else gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, out);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { data: out, width: w, height: h, float: out instanceof Float32Array };\n },\n\n // sizing / input\n resize: handleResize,\n setSize(w, h) { sizer.setFixed(w, h); handleResize(); return api; },\n get width() { return canvas.width; },\n get height() { return canvas.height; },\n pointer: pointer.state,\n domToShader: pointer.toShader,\n domToUV: pointer.toUV,\n\n // capture\n screenshot: capture.screenshot,\n toBlob: capture.toBlob,\n download: capture.download,\n record: capture.record,\n\n // events\n on, off, once,\n\n // dev\n stats: {\n show: (v = true) => { if (!stats) stats = createStats({ visible: false, key: options.statsKey === undefined ? 'F1' : options.statsKey, theme: options.theme }); stats.show(v); },\n toggle: () => api.stats.show(!(stats && stats.isVisible())),\n },\n };\n\n // ---- go --------------------------------------------------------------\n sizer.update();\n gl.viewport(0, 0, canvas.width, canvas.height);\n removeResize = sizer.observe(handleResize);\n\n const readyPromise = (async () => {\n await build();\n if (disposed) return api;\n loaded = true;\n clearError();\n emit('load', api);\n if (options.onReady) options.onReady(api);\n startLoop();\n if (!playing) renderNow();\n return api;\n })();\n readyPromise.catch(err => { if (!disposed) reportError(err); });\n\n return api;\n}\n", "// GLSL (WebGL 2) for the GPU pipeline. Each pass mirrors a function in cpu/stages.js.\n// ShaderMate adds the #version line, precision, fragColor and the built-in uniforms.\n//\n// prep \u2500\u25B6 quant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n// \u2514\u2500\u2500\u2500\u25B6 diffuse (N waves) \u2500\u25B6 resolve \u2500\u25B6 orphan \u2500\u25B6 smooth \u2500\u25B6 out (screen)\n//\n// Note: no trailing comments on uniform lines; ShaderMate reads trailing numbers there as default values.\n// All passes address pixels top-down (`P`, row 0 = top) so the maths matches the CPU.\n\nexport const COMMON = /* glsl */`\n// 256\u00D71, palette colours in x = 0..count-1\nuniform sampler2D u_palette;\nuniform int u_count;\n// 0 = OKLab, 1 = weighted RGB\nuniform int u_distance;\n\nivec2 topDown() { return ivec2(int(gl_FragCoord.x), int(u_resolution.y) - 1 - int(gl_FragCoord.y)); }\nvec4 at(sampler2D t, ivec2 p) { ivec2 s = textureSize(t, 0); return texelFetch(t, ivec2(p.x, s.y - 1 - p.y), 0); }\nbool inside(ivec2 p) { return p.x >= 0 && p.y >= 0 && p.x < int(u_resolution.x) && p.y < int(u_resolution.y); }\nvec3 palColor(int i) { return texelFetch(u_palette, ivec2(i, 0), 0).rgb; }\n\nfloat linear1(float c) { return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4); }\nvec3 oklab(vec3 c) {\n c = vec3(linear1(c.r), linear1(c.g), linear1(c.b));\n float l = pow(0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b, 1.0 / 3.0);\n float m = pow(0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b, 1.0 / 3.0);\n float s = pow(0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b, 1.0 / 3.0);\n return vec3(0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s);\n}\nvec3 space(vec3 c) { return u_distance == 1 ? c : oklab(c); }\nint nearestIndex(vec3 c) {\n vec3 p = space(c);\n vec3 w = u_distance == 1 ? vec3(0.299, 0.587, 0.114) : vec3(1.0);\n int best = 0; float bd = 1e20;\n for (int i = 0; i < 256; i++) {\n if (i >= u_count) break;\n vec3 d = p - space(palColor(i));\n float dist = dot(w * d, d);\n if (dist < bd) { bd = dist; best = i; }\n }\n return best;\n}\nint colorKey(vec4 c) {\n if (c.a < 0.5) return -1;\n ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));\n return b.r * 65536 + b.g * 256 + b.b;\n}\n`;\n\n/** Resample (box / nearest) + adjust + alpha cut. iChannel0 = source image. */\nexport const PREP = /* glsl */`\n// 0 box, 1 nearest\nuniform int u_resample;\n// brightness, contrast, saturation, gamma\nuniform vec4 u_adjust;\n// hue rotation in degrees\nuniform float u_hue;\nuniform float u_alphaCut;\n// source region in texels: x, y (from the top-left), width, height\nuniform ivec4 u_crop;\n\nvoid main() {\n ivec2 P = topDown();\n ivec2 R = ivec2(u_resolution);\n ivec2 O = u_crop.xy;\n ivec2 S = u_crop.zw;\n int nx = u_resample == 1 ? 1 : clamp((S.x + R.x - 1) / R.x, 1, 16);\n int ny = u_resample == 1 ? 1 : clamp((S.y + R.y - 1) / R.y, 1, 16);\n vec4 acc = vec4(0.0);\n for (int j = 0; j < 16; j++) {\n if (j >= ny) break;\n int sy = min(S.y - 1, ((2 * (P.y * ny + j) + 1) * S.y) / (2 * R.y * ny));\n for (int i = 0; i < 16; i++) {\n if (i >= nx) break;\n int sx = min(S.x - 1, ((2 * (P.x * nx + i) + 1) * S.x) / (2 * R.x * nx));\n vec4 c = at(iChannel0, O + ivec2(sx, sy));\n acc += vec4(c.rgb * c.a, c.a);\n }\n }\n vec3 c = acc.a > 0.0 ? acc.rgb / acc.a : vec3(0.0);\n float a = acc.a / float(nx * ny);\n\n float br = u_adjust.x, co = u_adjust.y, sa = u_adjust.z, ga = u_adjust.w;\n if (br != 0.0 || co != 0.0 || sa != 0.0 || ga != 1.0 || u_hue != 0.0) {\n float f = co >= 0.0 ? 1.0 / (1.0 - 0.99 * co) : 1.0 + co;\n c = (c + br - 0.5) * f + 0.5;\n float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\n c = l + (c - l) * (1.0 + sa);\n if (u_hue != 0.0) {\n float h = radians(u_hue), k = cos(h), q = sin(h);\n c = vec3(\n (0.213 + 0.787 * k - 0.213 * q) * c.r + (0.715 - 0.715 * k - 0.715 * q) * c.g + (0.072 - 0.072 * k + 0.928 * q) * c.b,\n (0.213 - 0.213 * k + 0.143 * q) * c.r + (0.715 + 0.285 * k + 0.140 * q) * c.g + (0.072 - 0.072 * k - 0.283 * q) * c.b,\n (0.213 - 0.213 * k - 0.787 * q) * c.r + (0.715 - 0.715 * k + 0.715 * q) * c.g + (0.072 + 0.928 * k + 0.072 * q) * c.b);\n }\n c = pow(clamp(c, 0.0, 1.0), vec3(1.0 / ga));\n }\n a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;\n fragColor = vec4(c * a, a);\n}\n`;\n\n/** No dither / ordered dither. iChannel0 = prep. */\nexport const QUANT = /* glsl */`\n// threshold bytes in .r\nuniform sampler2D u_matrix;\n// 0 pass-through, 1 nearest, 2 ordered\nuniform int u_mode;\nuniform float u_levels;\n// spread \u00D7 strength\nuniform float u_amount;\n\nvoid main() {\n ivec2 P = topDown();\n vec4 p = at(iChannel0, P);\n if (p.a < 0.5) { fragColor = vec4(0.0); return; }\n vec3 c = p.rgb;\n if (u_mode == 0) { fragColor = vec4(floor(c * 255.0 + 0.5) / 255.0, 1.0); return; }\n if (u_mode == 2) {\n ivec2 ms = textureSize(u_matrix, 0);\n float v = floor(at(u_matrix, ivec2(P.x % ms.x, P.y % ms.y)).r * 255.0 + 0.5);\n float t = (v + 0.5) / u_levels - 0.5;\n c = clamp(c + t * u_amount, 0.0, 1.0);\n }\n fragColor = vec4(palColor(nearestIndex(c)), 1.0);\n}\n`;\n\n/**\n * Error diffusion as a wavefront. Iteration r computes every pixel with x + skew*y == r,\n * pulling the stored error of already-computed neighbours.\n * Output: rgb = quantisation error, a = palette index (-1 not yet computed, -2 transparent).\n * iChannel0 = prep, iChannel1 = this pass (previous iteration).\n */\nexport const DIFFUSE = /* glsl */`\n// iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)\nuniform int u_recursion;\nuniform int u_on;\nuniform int u_skew;\nuniform float u_strength;\nuniform int u_kn;\n// push offsets (dx, dy) and weight\nuniform vec3 u_kernel[12];\n\nvoid main() {\n if (u_on == 0) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\n ivec2 P = topDown();\n int k = P.x + u_skew * P.y;\n int r = u_recursion;\n if (k < r) { fragColor = at(iChannel1, P); return; }\n if (k > r) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\n vec4 p = at(iChannel0, P);\n if (p.a < 0.5) { fragColor = vec4(0.0, 0.0, 0.0, -2.0); return; }\n vec3 acc = vec3(0.0);\n for (int i = 0; i < 12; i++) {\n if (i >= u_kn) break;\n ivec2 Q = P - ivec2(u_kernel[i].xy);\n if (!inside(Q)) continue;\n vec4 e = at(iChannel1, Q);\n if (e.a >= 0.0) acc += e.rgb * u_kernel[i].z;\n }\n vec3 c = clamp(p.rgb + acc * u_strength, 0.0, 1.0);\n int idx = nearestIndex(c);\n fragColor = vec4(c - palColor(idx), float(idx));\n}\n`;\n\n/** Pick the ordered result or turn diffusion indices into colours. iChannel0 = quant, iChannel1 = diffuse. */\nexport const RESOLVE = /* glsl */`\nuniform int u_on;\nvoid main() {\n ivec2 P = topDown();\n if (u_on == 0) { fragColor = at(iChannel0, P); return; }\n vec4 d = at(iChannel1, P);\n fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);\n}\n`;\n\n/** Orphan removal. iChannel0 = resolve. */\nexport const ORPHAN = /* glsl */`\nuniform int u_on;\nvoid main() {\n ivec2 P = topDown();\n vec4 me = at(iChannel0, P);\n fragColor = me;\n if (u_on == 0) return;\n int c = colorKey(me);\n ivec2 off[4] = ivec2[4](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0));\n int ks[4]; vec4 cs[4]; int n = 0;\n for (int i = 0; i < 4; i++) {\n ivec2 Q = P + off[i];\n if (!inside(Q)) continue;\n cs[n] = at(iChannel0, Q); ks[n] = colorKey(cs[n]);\n if (ks[n] == c) return;\n n++;\n }\n if (n < 2) return;\n int best = 0, bc = 0;\n for (int i = 0; i < 4; i++) {\n if (i >= n) break;\n int m = 0;\n for (int j = 0; j < 4; j++) { if (j >= n) break; if (ks[j] == ks[i]) m++; }\n if (m > bc) { bc = m; best = i; }\n }\n fragColor = cs[best];\n}\n`;\n\n/** 3\u00D73 majority smoothing. iChannel0 = orphan. */\nexport const SMOOTH = /* glsl */`\nuniform int u_on;\nvoid main() {\n ivec2 P = topDown();\n vec4 me = at(iChannel0, P);\n fragColor = me;\n if (u_on == 0) return;\n int c = colorKey(me);\n ivec2 R = ivec2(u_resolution);\n int ks[9]; vec4 cs[9];\n for (int j = 0; j < 3; j++) for (int i = 0; i < 3; i++) {\n ivec2 Q = clamp(P + ivec2(i - 1, j - 1), ivec2(0), R - 1);\n cs[j * 3 + i] = at(iChannel0, Q); ks[j * 3 + i] = colorKey(cs[j * 3 + i]);\n }\n for (int i = 0; i < 9; i++) {\n if (ks[i] == c) continue;\n int m = 0;\n for (int j = 0; j < 9; j++) if (ks[j] == ks[i]) m++;\n if (m >= 5) { fragColor = cs[i]; return; }\n }\n}\n`;\n\n/** Outline, drawn to the canvas. iChannel0 = smooth. */\nexport const OUTLINE = /* glsl */`\n// 0 none, 1 outer, 2 inner\nuniform int u_outline;\nuniform int u_corners;\nuniform vec3 u_outlineColor;\nbool opaqueAt(ivec2 q) { return inside(q) && at(iChannel0, q).a > 0.5; }\nvoid main() {\n ivec2 P = topDown();\n vec4 me = at(iChannel0, P);\n fragColor = me;\n if (u_outline == 0) return;\n bool o = me.a > 0.5;\n ivec2 off[8] = ivec2[8](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0), ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1));\n int n = u_corners == 1 ? 8 : 4;\n for (int i = 0; i < 8; i++) {\n if (i >= n) break;\n ivec2 Q = P + off[i];\n if (!inside(Q)) continue;\n bool other = opaqueAt(Q);\n if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }\n }\n}\n`;\n", "// GPU backend: one ShaderMate instance, six passes, rendered on demand (never animating).\n\nimport { createShader } from 'shadermate';\nimport { COMMON, PREP, QUANT, DIFFUSE, RESOLVE, ORPHAN, SMOOTH, OUTLINE } from './shaders.js';\nimport { MAX_KERNEL } from '../dither/kernels.js';\n\nconst canvasOf = (w, h) => { const c = document.createElement('canvas'); c.width = w; c.height = h; return c; };\n\n/**\n * Create the WebGL 2 backend. Rejects when WebGL 2 or float render targets are missing,\n * so the caller can fall back to the CPU.\n */\nexport async function createGPUBackend() {\n if (typeof document === 'undefined') throw new Error('No DOM');\n const probe = canvasOf(1, 1).getContext('webgl2');\n if (!probe) throw new Error('WebGL 2 is not available');\n if (!probe.getExtension('EXT_color_buffer_float')) throw new Error('Float render targets are not available');\n const dbg = probe.getExtension('WEBGL_debug_renderer_info');\n const renderer = String(dbg ? probe.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : probe.getParameter(probe.RENDERER));\n probe.getExtension('WEBGL_lose_context')?.loseContext();\n\n const canvas = canvasOf(1, 1);\n const source = canvasOf(1, 1);\n const palette = canvasOf(256, 1);\n const matrix = canvasOf(1, 1);\n const nearest = el => ({ element: el, filter: 'nearest', wrap: 'clamp' });\n\n const sm = createShader({\n canvas,\n webgl: 2,\n size: [1, 1],\n pixelRatio: 1,\n autoplay: false,\n pauseWhenHidden: false,\n pointer: false,\n errorOverlay: false,\n warnMissingUniforms: false,\n preserveDrawingBuffer: true,\n premultipliedAlpha: false,\n antialias: false,\n dialect: 'shadermate',\n common: COMMON,\n samplers: { u_palette: nearest(palette), u_matrix: nearest(matrix) },\n uniforms: {\n u_count: 1, u_distance: 0, u_resample: 0, u_adjust: [0, 0, 0, 1], u_hue: 0, u_crop: [0, 0, 1, 1], u_alphaCut: 0.5,\n u_mode: 0, u_levels: 1, u_amount: 0,\n u_skew: 1, u_strength: 1, u_kn: 0, u_kernel: new Float32Array(MAX_KERNEL * 3),\n u_outline: 0, u_corners: 0, u_outlineColor: [0, 0, 0],\n },\n passes: [\n { name: 'prep', shader: PREP, float: 'full', filter: 'nearest', channels: [{ ...nearest(source), dynamic: false }] },\n { name: 'quant', shader: QUANT, filter: 'nearest', channels: ['prep'] },\n { name: 'diffuse', shader: DIFFUSE, float: 'full', filter: 'nearest', pingpong: true, iterations: 2, channels: ['prep', 'diffuse'] },\n { name: 'resolve', shader: RESOLVE, filter: 'nearest', channels: ['quant', 'diffuse'] },\n { name: 'orphan', shader: ORPHAN, filter: 'nearest', channels: ['resolve'] },\n { name: 'smooth', shader: SMOOTH, filter: 'nearest', channels: ['orphan'] },\n { name: 'out', shader: OUTLINE, screen: true, channels: ['smooth'] },\n ],\n });\n\n let failure = null;\n sm.on('error', e => { failure = e; });\n await sm.ready;\n if (failure || sm.error) { sm.destroy(); throw failure || sm.error; }\n\n // `u_on` is a per-pass switch: same name, different value in each pass\n const passUniforms = (name, values) => { for (const k in values) sm.set(k, values[k], name); };\n\n let lastSource = null;\n let paletteKey = '', matrixKey = '';\n\n async function setSource(frame) {\n if (frame.canvas === lastSource && !frame.dirty) return;\n source.width = frame.width; source.height = frame.height;\n const ctx = source.getContext('2d');\n ctx.clearRect(0, 0, source.width, source.height);\n ctx.drawImage(frame.canvas, 0, 0);\n await sm.setChannel(0, { ...nearest(source), dynamic: false }, 'prep');\n lastSource = frame.canvas;\n }\n\n function setPalette(plan) {\n const key = plan.palette.map(c => c.join(',')).join(';');\n if (key === paletteKey) return;\n paletteKey = key;\n const ctx = palette.getContext('2d');\n const img = ctx.createImageData(256, 1);\n plan.palette.forEach((c, i) => img.data.set([c[0], c[1], c[2], 255], i * 4));\n ctx.putImageData(img, 0, 0);\n }\n\n function setMatrix(map) {\n const key = map ? `${map.w}x${map.h}:${map.levels}:${map.values.join(',')}` : 'none';\n if (key === matrixKey) return;\n matrixKey = key;\n const m = map || { w: 1, h: 1, values: [0] };\n matrix.width = m.w; matrix.height = m.h;\n const ctx = matrix.getContext('2d');\n const img = ctx.createImageData(m.w, m.h);\n for (let i = 0; i < m.values.length; i++) img.data.set([m.values[i], 0, 0, 255], i * 4);\n ctx.putImageData(img, 0, 0);\n }\n\n /**\n * @param {ReturnType<import('../plan.js').makePlan>} plan\n * @param {{ canvas: HTMLCanvasElement, width: number, height: number, dirty?: boolean }} frame\n * @returns {Promise<Uint8ClampedArray>} RGBA bytes, rows top-down\n */\n async function run(plan, frame) {\n const s = plan.settings;\n await setSource(frame);\n if (plan.quantize) setPalette(plan);\n setMatrix(plan.map);\n if (sm.width !== plan.width || sm.height !== plan.height) sm.setSize(plan.width, plan.height);\n\n const diffusion = plan.kind === 'diffusion';\n const kernel = new Array(MAX_KERNEL).fill(null).map((_, i) => (plan.kernel && plan.kernel[i]) || [0, 0, 0]);\n sm.set({\n u_count: plan.palette.length || 1,\n u_distance: plan.distance,\n u_resample: s.size.resample === 'nearest' ? 1 : 0,\n u_adjust: [s.adjust.brightness, s.adjust.contrast, s.adjust.saturation, s.adjust.gamma],\n u_hue: s.adjust.hue,\n u_crop: [plan.crop.x, plan.crop.y, plan.crop.w, plan.crop.h],\n u_alphaCut: s.alpha.threshold,\n u_mode: !plan.quantize ? 0 : plan.kind === 'ordered' ? 2 : 1,\n u_levels: plan.map ? plan.map.levels : 1,\n u_amount: plan.map ? plan.spread * s.dither.strength : 0,\n u_skew: plan.skew,\n u_strength: s.dither.strength,\n u_kn: plan.kernel ? plan.kernel.length : 0,\n u_kernel: new Float32Array(kernel.flat()),\n u_outline: { none: 0, outer: 1, inner: 2 }[plan.outline.mode],\n u_corners: plan.outline.corners ? 1 : 0,\n u_outlineColor: plan.outline.color.map(v => v / 255),\n });\n passUniforms('diffuse', { u_on: diffusion ? 1 : 0 });\n passUniforms('resolve', { u_on: diffusion ? 1 : 0 });\n passUniforms('orphan', { u_on: s.cleanup.orphans ? 1 : 0 });\n passUniforms('smooth', { u_on: s.cleanup.smooth ? 1 : 0 });\n sm.getPass('diffuse').cfg.iterations = diffusion ? plan.waves : 1;\n\n const { data } = sm.readPixels();\n // GL rows are bottom-up\n const w = plan.width, h = plan.height, out = new Uint8ClampedArray(w * h * 4), row = w * 4;\n for (let y = 0; y < h; y++) out.set(data.subarray((h - 1 - y) * row, (h - y) * row), y * row);\n return out;\n }\n\n return {\n name: 'webgl',\n renderer,\n /** Software rasterisers (SwiftShader, llvmpipe) are slower than the CPU path for error diffusion. */\n software: /swiftshader|llvmpipe|softpipe|software|basic render/i.test(renderer),\n run,\n shader: sm,\n destroy() { sm.destroy(); },\n };\n}\n", "// Turning whatever the caller has into a \"frame\": { width, height, canvas?, data }.\n// Accepts URLs, Blobs/Files, <img>, <canvas>, OffscreenCanvas, ImageBitmap, <video> (current frame),\n// VideoFrame, ImageData or any { width, height, data } RGBA object, plus p5 / q5 images.\n\nexport const MAX_SOURCE = 4096;\nconst hasDOM = typeof document !== 'undefined';\n\nconst isRGBA = s => s && typeof s === 'object' && 'data' in s && 'width' in s && 'height' in s && s.data && s.data.length === s.width * s.height * 4;\n\n/** Load a URL or Blob into something drawable. */\nexport async function loadImage(src) {\n if (typeof Blob !== 'undefined' && src instanceof Blob) {\n if (typeof createImageBitmap === 'function') {\n try { return await createImageBitmap(src); } catch { /* fall through (e.g. SVG) */ }\n }\n src = URL.createObjectURL(src);\n }\n if (!hasDOM) throw new Error('Loading images by URL needs a browser; pass { width, height, data } in Node.');\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = src;\n await img.decode();\n return img;\n}\n\n/** Natural pixel size of a drawable. */\nexport function sizeOf(el) {\n return {\n width: el.naturalWidth || el.videoWidth || el.displayWidth || el.codedWidth || el.width || 0,\n height: el.naturalHeight || el.videoHeight || el.displayHeight || el.codedHeight || el.height || 0,\n };\n}\n\nfunction unwrap(src) {\n // p5.Image / q5 image / p5.Graphics / p5.Renderer\n if (src && !isRGBA(src) && typeof src === 'object') {\n if (src.canvas && typeof src.canvas === 'object' && 'getContext' in src.canvas) return src.canvas;\n if (src.elt && typeof src.elt === 'object' && 'getContext' in src.elt) return src.elt;\n }\n return src;\n}\n\n/**\n * @param {any} source\n * @param {{ maxSize?: number, canvas?: HTMLCanvasElement }} [opts] canvas: scratch canvas to reuse\n */\nexport async function toFrame(source, opts = {}) {\n const maxSize = opts.maxSize || MAX_SOURCE;\n let src = unwrap(source);\n if (typeof src === 'string' || (typeof Blob !== 'undefined' && src instanceof Blob)) src = await loadImage(src);\n if (src && typeof src.complete === 'boolean' && !src.complete && src.decode) await src.decode();\n\n if (isRGBA(src)) {\n const frame = { width: src.width, height: src.height, data: src.data, canvas: null };\n if (hasDOM) {\n Object.defineProperty(frame, 'canvas', {\n configurable: true,\n get() {\n const c = document.createElement('canvas'); c.width = src.width; c.height = src.height;\n const img = new ImageData(new Uint8ClampedArray(src.data), src.width, src.height);\n c.getContext('2d').putImageData(img, 0, 0);\n Object.defineProperty(frame, 'canvas', { value: c });\n return c;\n },\n });\n }\n return frame;\n }\n if (!hasDOM) throw new Error('Unsupported source in a non-browser environment. Pass { width, height, data }.');\n\n let { width, height } = sizeOf(src);\n if (!width || !height) throw new Error('Source has no size yet (is the image or video loaded?)');\n const k = Math.min(1, maxSize / Math.max(width, height));\n width = Math.max(1, Math.round(width * k)); height = Math.max(1, Math.round(height * k));\n\n const canvas = opts.canvas || document.createElement('canvas');\n canvas.width = width; canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n ctx.clearRect(0, 0, width, height);\n ctx.imageSmoothingEnabled = k < 1;\n ctx.imageSmoothingQuality = 'high';\n ctx.drawImage(src, 0, 0, width, height);\n let cached = null;\n return {\n width, height, canvas, dirty: true,\n get data() { return (cached ||= ctx.getImageData(0, 0, width, height).data); },\n };\n}\n", "// Pure pixel helpers (no DOM): integer upscaling, grid lines, colour counting.\n\nimport { parseColor, toHex } from '../color.js';\n\n/**\n * Nearest-neighbour integer upscale.\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\n * @param {number} k scale factor (integer \u2265 1)\n * @param {{ grid?: boolean, gridColor?: string, gridAlpha?: number }} [opts] grid: 1px lines between source pixels\n */\nexport function upscale(img, k = 1, opts = {}) {\n k = Math.max(1, Math.round(k));\n const w = img.width * k, h = img.height * k;\n const out = new Uint8ClampedArray(w * h * 4);\n const src = img.data, sw = img.width;\n for (let y = 0; y < h; y++) {\n const sy = (y / k) | 0;\n for (let x = 0; x < w; x++) {\n const so = (sy * sw + ((x / k) | 0)) * 4, o = (y * w + x) * 4;\n out[o] = src[so]; out[o + 1] = src[so + 1]; out[o + 2] = src[so + 2]; out[o + 3] = src[so + 3];\n }\n }\n if (opts.grid && k >= 3) {\n const [r, g, b] = parseColor(opts.gridColor || '#000000');\n const a = opts.gridAlpha ?? 0.35;\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\n if (x % k && y % k) continue;\n const o = (y * w + x) * 4;\n const sa = out[o + 3] / 255, oa = a + sa * (1 - a);\n out[o] = (r * a + out[o] * sa * (1 - a)) / oa;\n out[o + 1] = (g * a + out[o + 1] * sa * (1 - a)) / oa;\n out[o + 2] = (b * a + out[o + 2] * sa * (1 - a)) / oa;\n out[o + 3] = oa * 255;\n }\n }\n return { width: w, height: h, data: out };\n}\n\n/**\n * Nearest-neighbour resize to any size (used to export at the source's resolution, like 2.x's\n * \"full resolution\" download). Pixels may differ by one in size when the ratio isn't whole.\n */\nexport function resizeNearest(img, width, height) {\n width = Math.max(1, Math.round(width)); height = Math.max(1, Math.round(height));\n const out = new Uint8ClampedArray(width * height * 4);\n const xs = new Int32Array(width);\n for (let x = 0; x < width; x++) xs[x] = Math.min(img.width - 1, Math.floor((x + 0.5) * img.width / width));\n for (let y = 0; y < height; y++) {\n const sy = Math.min(img.height - 1, Math.floor((y + 0.5) * img.height / height));\n for (let x = 0; x < width; x++) {\n const so = (sy * img.width + xs[x]) * 4, o = (y * width + x) * 4;\n out[o] = img.data[so]; out[o + 1] = img.data[so + 1]; out[o + 2] = img.data[so + 2]; out[o + 3] = img.data[so + 3];\n }\n }\n return { width, height, data: out };\n}\n\n/** Distinct opaque colours in an image ('#rrggbb'), in order of first appearance. */\nexport function uniqueColors(img, limit = Infinity) {\n const seen = new Set();\n const d = img.data;\n for (let o = 0; o < d.length; o += 4) {\n if (d[o + 3] === 0) continue;\n seen.add((d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\n if (seen.size > limit) break;\n }\n return [...seen].map(v => toHex([v >> 16, (v >> 8) & 255, v & 255]));\n}\n\n/** True when the image has at least one non-opaque pixel. */\nexport function hasTransparency(img) {\n for (let o = 3; o < img.data.length; o += 4) if (img.data[o] < 255) return true;\n return false;\n}\n\n/**\n * Detect the pixel-grid size of an upscaled pixel-art image (e.g. a sprite saved at 4\u00D7).\n * Returns the largest block size b such that the image is made of b\u00D7b solid blocks\n * (allowing a small tolerance for JPEG noise), or 1.\n */\nexport function detectGrid(img, tolerance = 8) {\n const { width: w, height: h, data: d } = img;\n const same = (a, b) => Math.abs(d[a] - d[b]) <= tolerance && Math.abs(d[a + 1] - d[b + 1]) <= tolerance && Math.abs(d[a + 2] - d[b + 2]) <= tolerance && Math.abs(d[a + 3] - d[b + 3]) <= tolerance;\n // run lengths along rows and columns; the block size divides all of them (mostly)\n const gcd = (a, b) => (b ? gcd(b, a % b) : a);\n let g = 0;\n const stepY = Math.max(1, Math.floor(h / 64)), stepX = Math.max(1, Math.floor(w / 64));\n for (let y = 0; y < h; y += stepY) {\n let run = 1;\n for (let x = 1; x < w; x++) {\n if (same((y * w + x) * 4, (y * w + x - 1) * 4)) run++;\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\n }\n }\n for (let x = 0; x < w; x += stepX) {\n let run = 1;\n for (let y = 1; y < h; y++) {\n if (same((y * w + x) * 4, ((y - 1) * w + x) * 4)) run++;\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\n }\n }\n return g || 1;\n}\n", "// DOM helpers: canvases and downloads.\n\nimport { upscale } from './scale.js';\n\n/** RGBA image \u2192 <canvas>, upscaled by an integer factor with optional grid lines. */\nexport function toCanvas(img, scale = 1, opts = {}) {\n const up = scale > 1 || opts.grid ? upscale(img, scale, opts) : img;\n const c = opts.canvas || document.createElement('canvas');\n c.width = up.width; c.height = up.height;\n c.getContext('2d').putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\n return c;\n}\n\n/** Trigger a browser download for a Blob or bytes. */\nexport function downloadBlob(data, filename, type = 'application/octet-stream') {\n const blob = data instanceof Blob ? data : new Blob([data], { type });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename; a.rel = 'noopener';\n document.body.appendChild(a); a.click(); a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 10000);\n}\n", "// CRC-32 (IEEE), shared by the PNG and zip writers.\nlet table = null;\nexport function crc32(bytes, crc = 0) {\n if (!table) {\n table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n table[n] = c >>> 0;\n }\n }\n crc = ~crc >>> 0;\n for (let i = 0; i < bytes.length; i++) crc = table[(crc ^ bytes[i]) & 255] ^ (crc >>> 8);\n return ~crc >>> 0;\n}\n", "// Minimal PNG encoder: indexed (colour type 3, with tRNS) when the image has \u2264 256 colours,\n// otherwise RGBA. Uses CompressionStream('deflate'), so it works in browsers and in Node 18+.\n\nimport { crc32 } from './crc32.js';\nimport { upscale, resizeNearest } from './scale.js';\n\nconst SIG = [137, 80, 78, 71, 13, 10, 26, 10];\n\nasync function deflate(bytes) {\n if (typeof CompressionStream === 'function') {\n const cs = new CompressionStream('deflate');\n const stream = new Blob([bytes]).stream().pipeThrough(cs);\n return new Uint8Array(await new Response(stream).arrayBuffer());\n }\n const { deflateSync } = await import('node:zlib');\n return new Uint8Array(deflateSync(bytes));\n}\n\nfunction chunk(type, data) {\n const out = new Uint8Array(12 + data.length);\n const dv = new DataView(out.buffer);\n dv.setUint32(0, data.length);\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i);\n out.set(data, 8);\n dv.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)));\n return out;\n}\n\n/** Map pixels to palette indices. Returns null when there are more than 256 colours. */\nexport function indexImage(img) {\n const d = img.data, n = img.width * img.height;\n const map = new Map(), colors = [], idx = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n const o = i * 4;\n const k = d[o + 3] === 0 ? -1 : ((d[o] << 24) | (d[o + 1] << 16) | (d[o + 2] << 8) | d[o + 3]) >>> 0;\n let v = map.get(k);\n if (v === undefined) {\n if (colors.length === 256) return null;\n v = colors.length; map.set(k, v);\n colors.push(k === -1 ? [0, 0, 0, 0] : [d[o], d[o + 1], d[o + 2], d[o + 3]]);\n }\n idx[i] = v;\n }\n return { colors, indices: idx };\n}\n\n/**\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\n * @param {{ scale?: number, grid?: boolean, gridColor?: string, indexed?: boolean, width?: number, height?: number }} [opts]\n * width/height: resize to exactly this size (nearest neighbour) instead of scaling\n * @returns {Promise<Uint8Array>}\n */\nexport async function encodePNG(img, opts = {}) {\n if (opts.width && opts.height) img = resizeNearest(img, opts.width, opts.height);\n else if ((opts.scale && opts.scale > 1) || opts.grid) img = upscale(img, opts.scale || 1, opts);\n const { width: w, height: h } = img;\n const ix = opts.indexed === false ? null : indexImage(img);\n const ihdr = new Uint8Array(13);\n const dv = new DataView(ihdr.buffer);\n dv.setUint32(0, w); dv.setUint32(4, h);\n const parts = [new Uint8Array(SIG)];\n let raw;\n if (ix) {\n const bits = ix.colors.length <= 2 ? 1 : ix.colors.length <= 4 ? 2 : ix.colors.length <= 16 ? 4 : 8;\n ihdr.set([bits, 3, 0, 0, 0], 8);\n const stride = Math.ceil(w * bits / 8);\n raw = new Uint8Array((stride + 1) * h);\n for (let y = 0; y < h; y++) {\n const row = y * (stride + 1) + 1;\n for (let x = 0; x < w; x++) {\n const v = ix.indices[y * w + x];\n const bit = x * bits;\n raw[row + (bit >> 3)] |= v << (8 - bits - (bit & 7));\n }\n }\n parts.push(chunk('IHDR', ihdr));\n parts.push(chunk('PLTE', Uint8Array.from(ix.colors.flatMap(c => c.slice(0, 3)))));\n if (ix.colors.some(c => c[3] < 255)) {\n let last = ix.colors.length; while (last > 0 && ix.colors[last - 1][3] === 255) last--;\n parts.push(chunk('tRNS', Uint8Array.from(ix.colors.slice(0, last).map(c => c[3]))));\n }\n } else {\n ihdr.set([8, 6, 0, 0, 0], 8);\n raw = new Uint8Array((w * 4 + 1) * h);\n for (let y = 0; y < h; y++) raw.set(img.data.subarray ? img.data.subarray(y * w * 4, (y + 1) * w * 4) : Array.prototype.slice.call(img.data, y * w * 4, (y + 1) * w * 4), y * (w * 4 + 1) + 1);\n parts.push(chunk('IHDR', ihdr));\n }\n parts.push(chunk('IDAT', await deflate(raw)));\n parts.push(chunk('IEND', new Uint8Array(0)));\n const total = parts.reduce((s, p) => s + p.length, 0);\n const out = new Uint8Array(total);\n let o = 0; for (const p of parts) { out.set(p, o); o += p.length; }\n return out;\n}\n", "// The public engine: createPixelator() picks a backend and turns sources into pixel art.\n\nimport { makePlan } from './plan.js';\nimport { runCPU } from './cpu/pipeline.js';\nimport { createGPUBackend } from './gpu/backend.js';\nimport { toFrame } from './source.js';\nimport { normalizeSettings, LEGACY_DITHER } from './settings.js';\nimport { uniqueColors } from './export/scale.js';\nimport { toCanvas } from './export/canvas.js';\nimport { encodePNG } from './export/png.js';\n\nconst isVideo = s => typeof HTMLVideoElement !== 'undefined' && s instanceof HTMLVideoElement;\nconst isVideoFrame = s => typeof VideoFrame !== 'undefined' && s instanceof VideoFrame;\n\n/**\n * Create an engine. Reuse one for many images: the GPU backend compiles its shaders once.\n * @param {{ backend?: 'auto' | 'webgl' | 'cpu', diffusion?: 'auto' | 'gpu' | 'cpu', maxSourceSize?: number }} [options]\n * diffusion: where error diffusion runs. 'auto' uses the GPU unless WebGL is software-rendered.\n */\nexport async function createPixelator(options = {}) {\n const want = options.backend || 'auto';\n let gpu = null, gpuError = null;\n if (want !== 'cpu' && typeof document !== 'undefined') {\n try { gpu = await createGPUBackend(); } catch (e) {\n gpuError = e;\n if (want === 'webgl') throw e;\n }\n }\n const scratch = typeof document !== 'undefined' ? document.createElement('canvas') : null;\n let last = { source: null, frame: null };\n let queue = Promise.resolve();\n\n async function frameFor(source) {\n if (source === last.source && last.frame && !isVideo(source) && !isVideoFrame(source)) {\n last.frame.dirty = false;\n return last.frame;\n }\n const frame = await toFrame(source, { maxSize: options.maxSourceSize, canvas: scratch });\n last = { source, frame };\n return frame;\n }\n\n async function processNow(source, settings) {\n const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const frame = await frameFor(source);\n const plan = makePlan(settings, frame);\n let data, backend = 'cpu';\n const diffusionOnCPU = plan.kind === 'diffusion' && (options.diffusion === 'cpu' || (options.diffusion !== 'gpu' && gpu && gpu.software));\n if (gpu && frame.canvas && !diffusionOnCPU) {\n data = await gpu.run(plan, frame);\n backend = 'webgl';\n } else {\n data = runCPU(plan, frame);\n }\n const ms = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - t0;\n return makeResult(plan, data, backend, ms);\n }\n\n return {\n /** 'webgl' or 'cpu' */\n get backend() { return gpu ? 'webgl' : 'cpu'; },\n /** GPU renderer string (WebGL backend only). */\n get renderer() { return gpu ? gpu.renderer : ''; },\n /** Why the GPU backend is not in use, if it isn't. */\n get fallbackReason() { return gpuError ? String(gpuError.message || gpuError) : ''; },\n /**\n * Process one source. Calls are queued, so it is safe to call from input handlers.\n * @returns {Promise<PixelResult>}\n */\n process(source, settings = {}) {\n const run = queue.then(() => processNow(source, settings));\n queue = run.catch(() => { });\n return run;\n },\n /** Forget the cached source (call after drawing new content into the same canvas). */\n invalidate() { last = { source: null, frame: null }; },\n destroy() { if (gpu) gpu.destroy(); gpu = null; },\n /** The underlying ShaderMate instance (GPU backend only), for debugging. */\n get shader() { return gpu ? gpu.shader : null; },\n };\n}\n\n/**\n * @typedef {object} PixelResult\n * @property {number} width\n * @property {number} height\n * @property {Uint8ClampedArray} data RGBA, rows top-down\n * @property {string[]} palette colours actually available ('#rrggbb')\n * @property {object} settings normalised settings used\n * @property {'webgl'|'cpu'} backend\n * @property {number} ms processing time\n */\nexport function makeResult(plan, data, backend = 'cpu', ms = 0) {\n const result = {\n width: plan.width,\n height: plan.height,\n data,\n palette: plan.paletteHex ? plan.paletteHex.slice() : null,\n settings: plan.settings,\n kind: plan.kind,\n waves: plan.waves,\n /** The framed part of the source, as fractions of its width and height. */\n crop: { x: plan.crop.x / plan.srcWidth, y: plan.crop.y / plan.srcHeight, w: plan.crop.w / plan.srcWidth, h: plan.crop.h / plan.srcHeight },\n backend,\n ms,\n /** Distinct colours actually used in the image. */\n usedColors() { return uniqueColors(this); },\n toImageData() { return new ImageData(new Uint8ClampedArray(this.data), this.width, this.height); },\n /** Canvas at `scale` \u00D7 (nearest-neighbour), optional grid lines. */\n toCanvas(scale = 1, opts = {}) { return toCanvas(this, scale, opts); },\n /** PNG bytes (indexed when \u2264 256 colours unless `indexed: false`). */\n toPNG(opts = {}) { return encodePNG(this, opts); },\n async toBlob(opts = {}) { return new Blob([await encodePNG(this, opts)], { type: 'image/png' }); },\n };\n return result;\n}\n\nlet shared = null;\n/** One-shot helper with a shared engine. `pixelate(source, settings)`. */\nexport async function pixelate(source, settings) {\n // classic API: pixelate({ image, width, dither, strength, palette, resolution }) \u2192 canvas\n if (settings === undefined && source && typeof source === 'object' && 'image' in source && 'width' in source) {\n return pixelateClassic(source);\n }\n shared ||= createPixelator();\n return (await shared).process(source, settings);\n}\n\n/** Compatibility with image-to-pixel.js 2.x. Returns a canvas like the old function did. */\nasync function pixelateClassic(opts) {\n const { image, width, dither = 'none', strength = 0, palette = null, resolution = 'original' } = opts;\n let pal = { source: 'none' };\n if (Array.isArray(palette)) pal = { source: 'custom', colors: palette };\n else if (typeof palette === 'string') {\n const { fetchLospec } = await import('./palette/lospec.js');\n const p = await fetchLospec(palette);\n pal = { source: 'custom', colors: p.colors, name: p.name };\n }\n const settings = normalizeSettings({\n size: { width },\n palette: pal,\n dither: { method: LEGACY_DITHER[String(dither).toLowerCase()] || 'none', strength: strength / 100 },\n alpha: { threshold: 0 },\n });\n shared ||= createPixelator();\n const engine = await shared;\n const res = await engine.process(image, settings);\n if (resolution === 'original') {\n const frame = await toFrame(image);\n const c = document.createElement('canvas');\n c.width = frame.width; c.height = frame.height;\n const ctx = c.getContext('2d');\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(res.toCanvas(1), 0, 0, c.width, c.height);\n return c;\n }\n return res.toCanvas(1);\n}\n", "// image-to-pixel core: no UI. Works in browsers (WebGL 2 via ShaderMate, CPU fallback) and,\n// for { width, height, data } inputs, in Node on the CPU.\n\nexport { createPixelator, pixelate, makeResult } from './core/engine.js';\nexport {\n DEFAULTS, DITHER_METHODS, SETTINGS_VERSION, MAX_SIZE, LEGACY_DITHER,\n defaultSettings, normalizeSettings, mergeSettings, resolveSize, ditherKind, cropRect, ASPECTS,\n encodeSettings, decodeSettings, compactSettings, settingsToJSON, settingsFromJSON,\n} from './core/settings.js';\nexport { makePlan } from './core/plan.js';\nexport { runCPU } from './core/cpu/pipeline.js';\nexport { PALETTES, getPalette } from './core/palette/builtin.js';\nexport { parsePalette, toGPL, toHexFile, toPaletteJSON } from './core/palette/parse.js';\nexport { extractPalette } from './core/palette/extract.js';\nexport { fetchLospec, lospecSlug } from './core/palette/lospec.js';\nexport { thresholdMap, parseMatrix, bayer } from './core/dither/matrices.js';\nexport { KERNELS } from './core/dither/kernels.js';\nexport { PRESETS, getPreset } from './core/presets.js';\nexport { parseColor, toHex, oklab } from './core/color.js';\nexport { toFrame, loadImage } from './core/source.js';\nexport { upscale, resizeNearest, uniqueColors, detectGrid, hasTransparency } from './core/export/scale.js';\nexport { toCanvas, downloadBlob } from './core/export/canvas.js';\nexport { encodePNG } from './core/export/png.js';\nexport { encodeGIF } from './core/export/gif.js';\nexport { createZip } from './core/export/zip.js';\nexport { packSpriteSheet, buildTileset } from './core/export/sheet.js';\nexport { forEachFrame, estimateFps, seekTo, frameTimes, videoReady, mediaError, sniffVideoCodec } from './core/video/frames.js';\n\nexport const VERSION = '3.0.0';\n", "// Built-in presets: partial settings applied on top of the defaults.\n\nexport const PRESETS = [\n {\n id: 'balanced', name: 'Balanced', description: 'Endesga 32, Bayer 4\u00D74. A good first look at most photos.',\n settings: { size: { width: 96 }, palette: { source: 'builtin', id: 'endesga-32' }, dither: { method: 'bayer4', strength: 0.6 } },\n },\n {\n id: 'game-boy', name: 'Game Boy', description: 'Four greens, 160 px wide, ordered dither.',\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'game-boy-dmg' }, dither: { method: 'bayer4', strength: 1 }, adjust: { contrast: 0.15 } },\n },\n {\n id: 'pico-8', name: 'PICO-8', description: '128 px, the PICO-8 palette, blue-noise dither.',\n settings: { size: { width: 128 }, palette: { source: 'builtin', id: 'pico-8' }, dither: { method: 'bluenoise', strength: 0.7 } },\n },\n {\n id: 'one-bit', name: '1-bit Atkinson', description: 'Classic Mac look: two colours, Atkinson diffusion.',\n settings: { size: { width: 192 }, palette: { source: 'builtin', id: '1-bit-monitor' }, dither: { method: 'atkinson', strength: 1 }, adjust: { contrast: 0.2 } },\n },\n {\n id: 'faithful', name: 'Faithful colour', description: 'Palette extracted from the image, Floyd\u2013Steinberg.',\n settings: { size: { width: 128 }, palette: { source: 'extract', count: 24 }, dither: { method: 'floyd-steinberg', strength: 0.75 } },\n },\n {\n id: 'sprite', name: 'Clean sprite', description: 'No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.',\n settings: { size: { width: 48, resample: 'nearest' }, palette: { source: 'extract', count: 12 }, dither: { method: 'none' }, cleanup: { orphans: true }, outline: { mode: 'outer', color: '#1a1c2c' } },\n },\n {\n id: 'cga', name: 'CGA', description: '16 hard colours with an 8\u00D78 Bayer pattern.',\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'cga-16' }, dither: { method: 'bayer8', strength: 1 } },\n },\n {\n id: 'newsprint', name: 'Newsprint', description: 'Grey clustered-dot halftone.',\n settings: { size: { width: 220 }, palette: { source: 'builtin', id: 'grayscale-4' }, dither: { method: 'cluster8', strength: 1 }, adjust: { saturation: -1 } },\n },\n {\n id: 'soft', name: 'Soft painterly', description: 'Resurrect 64 with Sierra Lite and a light smooth.',\n settings: { size: { width: 112 }, palette: { source: 'builtin', id: 'resurrect-64' }, dither: { method: 'sierra-lite', strength: 0.6 }, cleanup: { smooth: true } },\n },\n];\n\nexport const getPreset = id => PRESETS.find(p => p.id === id) || null;\n", "// Animated GIF encoder. Pixel art already uses a small palette, so frames are written\n// losslessly with one global colour table whenever the whole animation fits in 256 colours\n// (255 + transparency). Otherwise each frame gets its own table, reduced by median cut if needed.\n\nimport { upscale } from './scale.js';\nimport { extractPalette } from '../palette/extract.js';\nimport { parseColor } from '../color.js';\n\nclass ByteWriter {\n constructor() { this.buf = new Uint8Array(1 << 16); this.n = 0; }\n byte(b) { if (this.n === this.buf.length) { const nb = new Uint8Array(this.buf.length * 2); nb.set(this.buf); this.buf = nb; } this.buf[this.n++] = b; }\n bytes(arr) { for (let i = 0; i < arr.length; i++) this.byte(arr[i]); }\n u16(v) { this.byte(v & 255); this.byte((v >> 8) & 255); }\n str(s) { for (let i = 0; i < s.length; i++) this.byte(s.charCodeAt(i)); }\n result() { return this.buf.slice(0, this.n); }\n}\n\n/** GIF-flavoured LZW for one frame of indices. */\nexport function lzwEncode(indices, minCodeSize, w) {\n const clear = 1 << minCodeSize, eoi = clear + 1;\n let codeSize = minCodeSize + 1, next = eoi + 1;\n let dict = new Map();\n let cur = 0, curBits = 0;\n const sub = [];\n let block = [];\n const emit = code => {\n cur |= code << curBits; curBits += codeSize;\n while (curBits >= 8) { block.push(cur & 255); cur >>>= 8; curBits -= 8; if (block.length === 255) { sub.push(block); block = []; } }\n };\n emit(clear);\n let prefix = indices[0];\n for (let i = 1; i < indices.length; i++) {\n const k = indices[i];\n const key = prefix * 256 + k;\n const hit = dict.get(key);\n if (hit !== undefined) { prefix = hit; continue; }\n emit(prefix);\n if (next < 4096) {\n dict.set(key, next++);\n if (next > (1 << codeSize) && codeSize < 12) codeSize++;\n } else {\n emit(clear); dict = new Map(); codeSize = minCodeSize + 1; next = eoi + 1;\n }\n prefix = k;\n }\n emit(prefix);\n emit(eoi);\n if (curBits > 0) block.push(cur & 255);\n if (block.length) sub.push(block);\n w.byte(minCodeSize);\n for (const b of sub) { w.byte(b.length); w.bytes(b); }\n w.byte(0);\n}\n\nconst keyOf = (d, o) => (d[o + 3] < 128 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\n\nfunction tableFor(colorKeys, transparent) {\n const list = [...colorKeys].filter(k => k !== -1);\n const colors = list.map(k => [k >> 16, (k >> 8) & 255, k & 255]);\n const tIndex = transparent ? colors.length : -1;\n if (transparent) colors.push([0, 0, 0]);\n let bits = 1; while ((1 << bits) < colors.length) bits++;\n while (colors.length < (1 << bits)) colors.push([0, 0, 0]);\n const index = new Map(list.map((k, i) => [k, i]));\n return { colors, bits, tIndex, index };\n}\n\nfunction reduce(frame, max) {\n // > max colours: median-cut palette, then nearest colour per pixel\n const pal = extractPalette(frame, max).map(parseColor);\n const d = new Uint8ClampedArray(frame.data);\n const cache = new Map();\n for (let o = 0; o < d.length; o += 4) {\n if (d[o + 3] < 128) continue;\n const k = (d[o] << 16) | (d[o + 1] << 8) | d[o + 2];\n let best = cache.get(k);\n if (best === undefined) {\n let bd = Infinity; best = 0;\n for (let i = 0; i < pal.length; i++) {\n const dr = d[o] - pal[i][0], dg = d[o + 1] - pal[i][1], db = d[o + 2] - pal[i][2];\n const dist = dr * dr * 3 + dg * dg * 4 + db * db * 2;\n if (dist < bd) { bd = dist; best = i; }\n }\n cache.set(k, best);\n }\n d.set(pal[best], o);\n }\n return { ...frame, data: d };\n}\n\n/**\n * @param {{ width: number, height: number, data: ArrayLike<number>, delay?: number }[]} frames delay in ms\n * @param {{ loop?: number, scale?: number, delay?: number }} [opts] loop: 0 = forever, -1 = play once\n * @returns {Uint8Array}\n */\nexport function encodeGIF(frames, opts = {}) {\n if (!frames.length) throw new Error('No frames');\n const scale = Math.max(1, Math.round(opts.scale || 1));\n const fr = frames.map(f => ({ ...(scale > 1 ? upscale(f, scale) : f), delay: f.delay ?? opts.delay ?? 100 }));\n const W = fr[0].width, H = fr[0].height;\n\n // collect colours\n let transparent = false;\n const all = new Set();\n const perFrame = fr.map(f => {\n const s = new Set();\n for (let o = 0; o < f.data.length; o += 4) { const k = keyOf(f.data, o); if (k === -1) transparent = true; s.add(k); all.add(k); }\n return s;\n });\n const opaqueCount = s => s.size - (s.has(-1) ? 1 : 0);\n const globalOK = opaqueCount(all) + (transparent ? 1 : 0) <= 256;\n const global = globalOK ? tableFor(all, transparent) : null;\n\n const w = new ByteWriter();\n w.str('GIF89a');\n w.u16(W); w.u16(H);\n w.byte(global ? 0xf0 | (global.bits - 1) : 0x00);\n w.byte(0); w.byte(0);\n if (global) for (const c of global.colors) w.bytes(c);\n if (fr.length > 1 && opts.loop !== -1) {\n w.byte(0x21); w.byte(0xff); w.byte(11); w.str('NETSCAPE2.0'); w.byte(3); w.byte(1); w.u16(opts.loop || 0); w.byte(0);\n }\n\n fr.forEach((f0, i) => {\n let f = f0, table = global, set = perFrame[i];\n if (!table) {\n const max = transparent ? 255 : 256;\n if (opaqueCount(set) > max) {\n f = reduce(f0, max);\n set = new Set(); for (let o = 0; o < f.data.length; o += 4) set.add(keyOf(f.data, o));\n }\n table = tableFor(set, set.has(-1));\n }\n // graphic control extension\n w.byte(0x21); w.byte(0xf9); w.byte(4);\n w.byte(((transparent ? 2 : 1) << 2) | (table.tIndex >= 0 ? 1 : 0));\n w.u16(Math.max(2, Math.round(f.delay / 10)));\n w.byte(table.tIndex >= 0 ? table.tIndex : 0);\n w.byte(0);\n // image descriptor\n w.byte(0x2c); w.u16(0); w.u16(0); w.u16(W); w.u16(H);\n w.byte(table === global ? 0 : 0x80 | (table.bits - 1));\n if (table !== global) for (const c of table.colors) w.bytes(c);\n const idx = new Uint8Array(W * H);\n for (let p = 0; p < idx.length; p++) {\n const k = keyOf(f.data, p * 4);\n idx[p] = k === -1 ? table.tIndex : table.index.get(k);\n }\n lzwEncode(idx, Math.max(2, table.bits), w);\n });\n w.byte(0x3b);\n return w.result();\n}\n", "// Store-only zip writer (PNGs and GIFs are already compressed, so deflating again buys little).\n\nimport { crc32 } from './crc32.js';\n\nconst enc = new TextEncoder();\n\n/**\n * @param {{ name: string, data: Uint8Array | string, date?: Date }[]} entries\n * @returns {Uint8Array}\n */\nexport function createZip(entries) {\n const files = [], central = [];\n let offset = 0;\n const used = new Set();\n for (const e of entries) {\n let name = e.name.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n // avoid duplicate names inside one archive\n if (used.has(name)) { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); let i = 2; while (used.has(`${m[1]}-${i}${m[2] || ''}`)) i++; name = `${m[1]}-${i}${m[2] || ''}`; }\n used.add(name);\n const nameBytes = enc.encode(name);\n const data = typeof e.data === 'string' ? enc.encode(e.data) : e.data;\n const crc = crc32(data);\n const d = e.date || new Date();\n const time = (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1);\n const date = ((d.getFullYear() - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate();\n\n const local = new Uint8Array(30 + nameBytes.length);\n const lv = new DataView(local.buffer);\n lv.setUint32(0, 0x04034b50, true); lv.setUint16(4, 20, true); lv.setUint16(6, 0x0800, true); // UTF-8 names\n lv.setUint16(8, 0, true); lv.setUint16(10, time, true); lv.setUint16(12, date, true);\n lv.setUint32(14, crc, true); lv.setUint32(18, data.length, true); lv.setUint32(22, data.length, true);\n lv.setUint16(26, nameBytes.length, true); lv.setUint16(28, 0, true);\n local.set(nameBytes, 30);\n\n const cen = new Uint8Array(46 + nameBytes.length);\n const cv = new DataView(cen.buffer);\n cv.setUint32(0, 0x02014b50, true); cv.setUint16(4, 20, true); cv.setUint16(6, 20, true); cv.setUint16(8, 0x0800, true);\n cv.setUint16(10, 0, true); cv.setUint16(12, time, true); cv.setUint16(14, date, true);\n cv.setUint32(16, crc, true); cv.setUint32(20, data.length, true); cv.setUint32(24, data.length, true);\n cv.setUint16(28, nameBytes.length, true); cv.setUint32(42, offset, true);\n cen.set(nameBytes, 46);\n\n files.push(local, data); central.push(cen);\n offset += local.length + data.length;\n }\n const cenSize = central.reduce((s, c) => s + c.length, 0);\n const end = new Uint8Array(22);\n const ev = new DataView(end.buffer);\n ev.setUint32(0, 0x06054b50, true); ev.setUint16(8, entries.length, true); ev.setUint16(10, entries.length, true);\n ev.setUint32(12, cenSize, true); ev.setUint32(16, offset, true);\n const out = new Uint8Array(offset + cenSize + 22);\n let o = 0;\n for (const p of [...files, ...central, end]) { out.set(p, o); o += p.length; }\n return out;\n}\n", "// Sprite sheets (many frames \u2192 one image + atlas JSON) and tilesets (one image \u2192 unique tiles + map).\n\nconst blank = (w, h) => ({ width: w, height: h, data: new Uint8ClampedArray(w * h * 4) });\n\nfunction blit(dst, src, dx, dy, sx = 0, sy = 0, sw = src.width, sh = src.height) {\n for (let y = 0; y < sh; y++) {\n const so = ((sy + y) * src.width + sx) * 4, o = ((dy + y) * dst.width + dx) * 4;\n dst.data.set(src.data.subarray ? src.data.subarray(so, so + sw * 4) : Array.prototype.slice.call(src.data, so, so + sw * 4), o);\n }\n}\n\n/**\n * Pack frames into a grid. Frames may differ in size; cells use the largest frame.\n * @param {{ width: number, height: number, data: ArrayLike<number>, name?: string, delay?: number }[]} frames\n * @param {{ columns?: number, padding?: number, name?: string }} [opts] columns: 0 = roughly square\n * @returns {{ image: { width, height, data }, atlas: object }}\n */\nexport function packSpriteSheet(frames, opts = {}) {\n if (!frames.length) throw new Error('No frames');\n const pad = Math.max(0, opts.padding | 0);\n const cw = Math.max(...frames.map(f => f.width)), ch = Math.max(...frames.map(f => f.height));\n const cols = Math.max(1, Math.min(frames.length, opts.columns || Math.ceil(Math.sqrt(frames.length))));\n const rows = Math.ceil(frames.length / cols);\n const W = cols * cw + (cols - 1) * pad, H = rows * ch + (rows - 1) * pad;\n const image = blank(W, H);\n const out = {};\n frames.forEach((f, i) => {\n const x = (i % cols) * (cw + pad), y = Math.floor(i / cols) * (ch + pad);\n blit(image, f, x, y);\n out[f.name || `frame-${String(i).padStart(3, '0')}`] = {\n frame: { x, y, w: f.width, h: f.height },\n sourceSize: { w: f.width, h: f.height },\n ...(f.delay != null ? { duration: Math.round(f.delay) } : {}),\n };\n });\n // the \"hash\" flavour of the TexturePacker / Aseprite JSON format, which most engines read\n const atlas = { frames: out, meta: { app: 'image-to-pixel', image: (opts.name || 'sheet') + '.png', size: { w: W, h: H }, scale: '1', columns: cols, rows, padding: pad } };\n return { image, atlas };\n}\n\n/**\n * Cut an image into tiles, drop duplicates (optionally counting mirrored tiles as duplicates)\n * and return the tileset image and a tile map.\n * @param {{ width, height, data }} img\n * @param {{ tileWidth?: number, tileHeight?: number, columns?: number, flips?: boolean }} [opts]\n * @returns {{ image, map: { width: number, height: number, tiles: number[], flips?: number[] }, count: number }}\n */\nexport function buildTileset(img, opts = {}) {\n const tw = Math.max(1, opts.tileWidth || 8), th = Math.max(1, opts.tileHeight || tw);\n const mw = Math.ceil(img.width / tw), mh = Math.ceil(img.height / th);\n const tiles = [], keys = new Map(), map = [], flipsOut = [];\n const read = (tx, ty) => {\n const t = blank(tw, th);\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\n const sx = tx * tw + x, sy = ty * th + y;\n if (sx >= img.width || sy >= img.height) continue;\n const so = (sy * img.width + sx) * 4;\n t.data.set([img.data[so], img.data[so + 1], img.data[so + 2], img.data[so + 3]], (y * tw + x) * 4);\n }\n return t;\n };\n const key = t => {\n let s = '';\n for (let i = 0; i < t.data.length; i += 4) s += t.data[i + 3] === 0 ? '.' : String.fromCharCode(t.data[i] + 1, t.data[i + 1] + 1, t.data[i + 2] + 1);\n return s;\n };\n const flip = (t, fx, fy) => {\n const o = blank(tw, th);\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\n const si = ((fy ? th - 1 - y : y) * tw + (fx ? tw - 1 - x : x)) * 4;\n o.data.set(t.data.subarray(si, si + 4), (y * tw + x) * 4);\n }\n return o;\n };\n for (let ty = 0; ty < mh; ty++) {\n for (let tx = 0; tx < mw; tx++) {\n const t = read(tx, ty);\n let id = keys.get(key(t)), f = 0;\n if (id === undefined && opts.flips) {\n for (const [fx, fy, code] of [[1, 0, 1], [0, 1, 2], [1, 1, 3]]) {\n const k = keys.get(key(flip(t, fx, fy)));\n if (k !== undefined) { id = k; f = code; break; }\n }\n }\n if (id === undefined) { id = tiles.length; tiles.push(t); keys.set(key(t), id); }\n map.push(id); flipsOut.push(f);\n }\n }\n const sheet = packSpriteSheet(tiles, { columns: opts.columns || Math.min(16, tiles.length) });\n return {\n image: sheet.image,\n map: { width: mw, height: mh, tileWidth: tw, tileHeight: th, tiles: map, ...(opts.flips ? { flips: flipsOut } : {}) },\n count: tiles.length,\n };\n}\n", "// Frame-accurate stepping through an HTMLVideoElement by seeking to the middle of each frame.\n// Seeking (instead of playing) means every frame is visited exactly once, regardless of how\n// long processing takes, and the same input always produces the same frames.\n\nconst wait = (el, ev, ms = 4000) => new Promise((res, rej) => {\n const t = setTimeout(() => { el.removeEventListener(ev, ok); rej(new Error(`Timed out waiting for \"${ev}\"`)); }, ms);\n const ok = () => { clearTimeout(t); res(); };\n el.addEventListener(ev, ok, { once: true });\n});\n\nconst MEDIA_ERRORS = {\n 1: 'loading was aborted',\n 2: 'a network error stopped the download',\n 3: 'the browser could not decode it',\n 4: \"this browser can't play this video's format\",\n};\n\n/** Turn a <video>'s MediaError into a readable Error (err.code is the MediaError code). */\nexport function mediaError(video) {\n const code = video.error ? video.error.code : 0;\n const err = new Error(MEDIA_ERRORS[code] || 'the video could not be loaded');\n err.code = code;\n if (video.error && video.error.message) err.detail = video.error.message;\n return err;\n}\n\n/** Resolve on `ok`, reject straight away if the media element reports an error. */\nconst waitOrFail = (video, ok, ms) => new Promise((res, rej) => {\n const done = () => { clearTimeout(t); video.removeEventListener(ok, onOk); video.removeEventListener('error', onErr); };\n const onOk = () => { done(); res(); };\n const onErr = () => { done(); rej(mediaError(video)); };\n const t = setTimeout(() => { done(); rej(new Error(`no response from the video decoder after ${ms / 1000} s`)); }, ms);\n video.addEventListener(ok, onOk, { once: true });\n video.addEventListener('error', onErr, { once: true });\n});\n\n/**\n * Wait until a video's metadata (size, duration) and first frame are available.\n * Rejects immediately with a readable message when the browser can't play the file.\n */\nexport async function videoReady(video, { timeout = 60000 } = {}) {\n if (video.error) throw mediaError(video);\n if (video.readyState < 1) await waitOrFail(video, 'loadedmetadata', timeout);\n if (video.readyState < 2) await waitOrFail(video, 'loadeddata', timeout).catch(e => { if (e.code) throw e; });\n return video;\n}\n\n/**\n * Best-effort codec name for an MP4/MOV/WebM file, read from its bytes. Used to explain playback errors.\n * @param {Blob} file\n * @returns {Promise<string>} e.g. 'H.265 (HEVC)', or '' when unknown\n */\nexport async function sniffVideoCodec(file) {\n const buf = new Uint8Array(await file.arrayBuffer());\n const NAMES = { avc1: 'H.264', avc3: 'H.264', hvc1: 'H.265 (HEVC)', hev1: 'H.265 (HEVC)', av01: 'AV1', vp09: 'VP9', vp08: 'VP8', mp4v: 'MPEG-4 Part 2', apcn: 'ProRes', apch: 'ProRes', apcs: 'ProRes', apco: 'ProRes', ap4h: 'ProRes 4444', dvh1: 'Dolby Vision', dvhe: 'Dolby Vision' };\n // MP4/MOV: the first sample entry of the 'stsd' box names the codec\n for (let i = 0; i + 24 < buf.length; i++) {\n if (buf[i] === 0x73 && buf[i + 1] === 0x74 && buf[i + 2] === 0x73 && buf[i + 3] === 0x64) {\n const type = String.fromCharCode(buf[i + 16], buf[i + 17], buf[i + 18], buf[i + 19]);\n if (NAMES[type]) return NAMES[type];\n }\n }\n // WebM/Matroska: CodecID strings such as V_VP9, V_AV1, V_MPEGH/ISO/HEVC\n const head = new TextDecoder('latin1').decode(buf.subarray(0, Math.min(buf.length, 1 << 20)));\n const m = /V_(VP8|VP9|AV1|MPEG4\\/ISO\\/AVC|MPEGH\\/ISO\\/HEVC)/.exec(head);\n if (m) return { VP8: 'VP8', VP9: 'VP9', AV1: 'AV1', 'MPEG4/ISO/AVC': 'H.264', 'MPEGH/ISO/HEVC': 'H.265 (HEVC)' }[m[1]];\n return '';\n}\n\n/** Seek and resolve once the frame at `time` is decoded and paintable. */\nexport async function seekTo(video, time) {\n time = Math.max(0, Math.min(time, (video.duration || 0) - 1e-4));\n if (Math.abs(video.currentTime - time) < 1e-6 && video.readyState >= 2) return;\n const presented = 'requestVideoFrameCallback' in video\n ? new Promise(res => { video.requestVideoFrameCallback(() => res()); setTimeout(res, 500); })\n : null;\n const seeked = wait(video, 'seeked');\n video.currentTime = time;\n await seeked;\n if (presented) await presented;\n}\n\n/**\n * Estimate the frame rate from presented frames (requestVideoFrameCallback), falling back to `fallback`.\n * Plays muted for a moment and restores the position.\n */\nexport async function estimateFps(video, fallback = 30) {\n if (!('requestVideoFrameCallback' in video)) return fallback;\n await videoReady(video);\n const was = { t: video.currentTime, muted: video.muted, paused: video.paused };\n const times = [];\n try {\n video.muted = true;\n await new Promise((res) => {\n const done = setTimeout(res, 1200);\n const cb = (_, meta) => {\n times.push(meta.mediaTime);\n if (times.length >= 12) { clearTimeout(done); res(); } else video.requestVideoFrameCallback(cb);\n };\n video.requestVideoFrameCallback(cb);\n video.play().catch(() => { clearTimeout(done); res(); });\n });\n } finally {\n video.pause();\n video.muted = was.muted;\n await seekTo(video, was.t).catch(() => { });\n }\n const deltas = [];\n for (let i = 1; i < times.length; i++) { const d = times[i] - times[i - 1]; if (d > 0.001) deltas.push(d); }\n if (deltas.length < 3) return fallback;\n deltas.sort((a, b) => a - b);\n const fps = 1 / deltas[Math.floor(deltas.length / 2)];\n // snap to common rates\n for (const r of [12, 15, 23.976, 24, 25, 29.97, 30, 48, 50, 59.94, 60]) if (Math.abs(fps - r) < 0.6) return r;\n return Math.round(fps);\n}\n\n/** Frame times (seconds, middle of each frame) for a clip. */\nexport function frameTimes({ duration, fps, start = 0, end = duration, maxFrames = Infinity }) {\n const out = [];\n const n = Math.min(maxFrames, Math.max(1, Math.floor((end - start) * fps + 1e-6)));\n for (let i = 0; i < n; i++) out.push(start + (i + 0.5) / fps);\n return out;\n}\n\n/**\n * Visit frames one by one.\n * @param {HTMLVideoElement} video\n * @param {{ fps: number, start?: number, end?: number, maxFrames?: number, signal?: AbortSignal,\n * onFrame: (info: { index: number, time: number, total: number }) => any }} opts\n */\nexport async function forEachFrame(video, opts) {\n await videoReady(video);\n const wasPaused = video.paused;\n video.pause();\n const times = frameTimes({ duration: video.duration, ...opts });\n for (let i = 0; i < times.length; i++) {\n if (opts.signal && opts.signal.aborted) throw new DOMException('Aborted', 'AbortError');\n await seekTo(video, times[i]);\n await opts.onFrame({ index: i, time: times[i], total: times.length });\n }\n if (!wasPaused) video.play().catch(() => { });\n return times.length;\n}\n"],
5
- "mappings": "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",
6
- "names": ["parseColor", "c", "s", "ch", "isColor", "toHex", "rgb", "v", "oklab", "r", "g", "b", "lin", "l", "m", "paletteSpread", "rgbs", "sum", "i", "best", "j", "dr", "dg", "db", "d", "normHex", "LUMA", "init_color", "__esmMin", "parseGPL", "text", "lines", "name", "colors", "raw", "line", "nm", "m", "normHex", "parseHexList", "h", "parseJASC", "l", "i", "parseJSON", "obj", "c", "parseLoose", "re", "parsePalette", "filename", "ext", "trimmed", "out", "dedupe", "toGPL", "rows", "r", "g", "b", "toHexFile", "toPaletteJSON", "init_parse", "__esmMin", "init_color", "list", "lospec_exports", "__export", "fetchLospec", "lospecSlug", "input", "s", "m", "slugOrUrl", "f", "slug", "res", "json", "p", "parseJSON", "init_lospec", "__esmMin", "init_parse", "PALETTES", "getPalette", "idOrName", "k", "p", "init_color", "SETTINGS_VERSION", "MAX_SIZE", "DITHER_METHODS", "ditherKind", "id", "m", "LEGACY_DITHER", "DEFAULTS", "clamp", "v", "lo", "hi", "d", "n", "oneOf", "list", "bool", "defaultSettings", "normalizeSettings", "input", "i", "s", "size", "adj", "pal", "dit", "al", "cl", "ol", "ex", "fr", "ASPECTS", "a", "source", "p", "getPalette", "c", "isColor", "normHex", "method", "normalizeMatrix", "h", "w", "out", "y", "row", "x", "cropRect", "srcW", "srcH", "frame", "zoom", "fx", "fy", "resolveSize", "diff", "b", "k", "va", "vb", "g", "kk", "b64url", "str", "bytes", "bin", "compactSettings", "settings", "encodeSettings", "decodeSettings", "obj", "settingsToJSON", "settingsFromJSON", "text", "mergeSettings", "base", "patch", "init_color", "BLUE_NOISE_B64", "fromB64", "b64", "c", "bayer", "n", "m", "s", "next", "y", "x", "v", "toRanks", "rows", "h", "w", "cells", "a", "b", "out", "r", "clustered", "row", "u", "CLUSTER4", "cache", "thresholdMap", "method", "custom", "map", "sq", "BLUE_NOISE_B64", "parseMatrix", "text", "l", "k", "div", "list", "dx", "dy", "w", "KERNELS", "MAX_KERNEL", "kernelSkew", "kernel", "s", "waveCount", "h", "skew", "init_color", "extractPalette", "img", "count", "opts", "maxSamples", "alphaThreshold", "n", "step", "pts", "i", "o", "boxes", "bi", "bestRange", "bestAxis", "b", "a", "lo", "hi", "p", "r", "q", "mid", "centers", "mean", "iter", "sums", "best", "bd", "c", "dr", "dg", "db", "d", "s", "hexes", "toHex", "lum", "h", "v", "list", "g", "init_color", "resample", "src", "w", "h", "mode", "crop", "ox", "oy", "sw", "sh", "d", "stride", "out", "nx", "ny", "xs", "ys", "i", "y", "j", "x", "r", "g", "b", "a", "row", "o", "al", "adjust", "buf", "brightness", "contrast", "saturation", "hue", "gamma", "f", "ig", "hk", "hq", "M", "l", "LUMA", "k", "r2", "g2", "b2", "clamp01", "alphaCut", "threshold", "v", "paletteSpace", "palette", "distance", "coords", "rgb", "c", "oklab", "W_RGB", "nearest", "sp", "p0", "p1", "p2", "w0", "w1", "w2", "best", "bd", "d0", "d1", "d2", "dist", "quantizeOrdered", "plan", "map", "amt", "t", "quantizeDiffusion", "acc", "strength", "kernel", "p", "er", "eg", "eb", "dx", "dy", "wt", "xx", "yy", "q", "key", "N4", "removeOrphans", "px", "ks", "os", "oo", "bc", "n", "smoothMajority", "outline", "color", "corners", "opaque", "inside", "nb", "me", "hit", "makePlan", "settings", "src", "s", "normalizeSettings", "crop", "cropRect", "width", "height", "resolveSize", "colors", "extractFrom", "quantize", "palette", "parseColor", "kind", "ditherKind", "map", "thresholdMap", "kernel", "KERNELS", "skew", "kernelSkew", "paletteSpread", "waveCount", "k", "w", "h", "prep", "resample", "adjust", "bytes", "i", "extractPalette", "runCPU", "plan", "src", "w", "h", "s", "buf", "resample", "adjust", "alphaCut", "px", "quantizeDiffusion", "quantizeOrdered", "removeOrphans", "smoothMajority", "outline", "VERSION", "MAX_CHANNELS", "DEFAULT_CANVAS_ID", "ShaderMateError", "message", "details", "warned", "warnOnce", "key", "args", "isBrowser", "isArrayLike", "v", "toArray", "isPow2", "n", "parseColor", "c", "_a", "_b", "_c", "_d", "isBrowser", "cv", "x", "d", "isDevHost", "h", "RefPool", "gl", "obj", "type", "id", "it", "createEmitter", "forward", "map", "on", "ev", "fn", "off", "s", "once", "wrapped", "data", "emit", "e", "clear", "EASES", "t", "createTweens", "active", "tween", "key", "get", "set", "to", "opts", "duration", "delay", "ease", "prev", "from", "isArr", "f", "resolve", "tw", "v", "now", "clamp01", "a", "i", "update", "cancel", "normalizePasses", "input", "list", "p", "ShaderMateError", "_e", "names", "dupes", "n", "chans", "MAX_CHANNELS", "normalizeChannel", "isEl", "isBitmap", "isTex", "ch", "passNames", "ownerName", "out", "isInlineSource", "src", "isWebGL2", "createContext", "canvas", "options", "attrs", "want", "getExtensions", "isGL2", "ext", "createQuad", "buf", "program", "loc", "parseShaderLog", "log", "lines", "userStart", "l", "errors", "row", "m", "logical", "physical", "compileShader", "label", "showExpandedOnError", "sh", "stage", "summary", "err", "marks", "numbered", "line", "createProgram", "vsrc", "fsrc", "getUniformInfo", "info", "VERT_GL2", "VERT_GL1", "BUILTIN_MACROS_GL2", "BUILTIN_MACROS_GL1", "MAIN_WRAP_GL2", "MAIN_WRAP_GL1", "FRAG_GL2", "FRAG_GL1", "createBlit", "quad", "uTex", "uSize", "tex", "w", "wrapMode", "wrap", "filterMode", "filter", "chooseFormat", "ifmt", "fmt", "isRenderable", "fbo", "ok", "createTarget", "pool", "wanted", "chosen", "warnOnce", "filterOpt", "depthTex", "status", "deleteTarget", "resolvePassSize", "size", "cw", "BUILTIN_UNIFORMS", "stripComments", "BUILTIN_DEFINES", "declareFragColor", "code", "FRAGCOORD_UNIFORMS", "SAMPLER_BUILTINS", "looksLikeFragCoord", "declareBuiltins", "channelTypes", "declared", "name", "used", "types", "resolveIncludes", "loader", "throwOnError", "warn", "done", "stack", "expand", "re", "last", "path", "raw", "expanded", "defineLines", "defines", "k", "DEFAULT_INJECT", "NO_INJECT", "assembleFragment", "enableDerivatives", "inject", "builtinOpts", "versionLine", "body", "vm", "head", "fragDecl", "userOut", "clean", "needWrap", "makeTexture2D", "source", "params", "env", "dynamic", "flipDefault", "flip", "npotLimited", "isPow2", "mip", "minFilter", "upload", "loadImage", "url", "res", "rej", "img", "FACE_NAMES", "loadCubeMap", "urls", "faces", "loaded", "failed", "u", "playOnGesture", "media", "go", "loadVideo", "video", "wrapper", "loadCamera", "constraints", "stream", "loadAudio", "mic", "spectro", "fftSize", "AC", "ctx", "analyser", "bins", "wave", "H", "rawFFT", "rawAnalyser", "getTime", "cleanup", "finish", "resume", "audio", "owned", "connect", "isCanvas", "el", "isVideo", "loadElement", "live", "base", "wrapTexture", "loadKeyboard", "held", "pressed", "toggle", "target", "onDown", "onUp", "onBlur", "loadChannel", "channelSamplerType", "splitPassBlob", "text", "heads", "bufferType", "num", "parseBracketSettings", "word", "parseUniformComments", "uniforms", "samplers", "init", "comment", "spec", "parseSamplerComment", "nums", "range", "defaults", "comps", "isBool", "value", "r", "ref", "usesMouseVec4", "GL_SAMPLER_2D", "GL_SAMPLER_CUBE", "auxPasses", "passObjs", "resolveSamplerSpecs", "po", "instanceSamplers", "aux", "screen", "byName", "annotated", "mm", "needsMainBackbuffer", "createCamera", "speed", "sensitivity", "pos", "yaw", "pitch", "keys", "dragging", "lastX", "lastY", "dir", "view", "onKey", "down", "kd", "ku", "pd", "pm", "pu", "wh", "blur", "lookAt", "upW", "rl", "dt", "right", "mv", "vec", "ALIASES", "add", "desc", "resolveUniformType", "GL_TYPES", "describeGLType", "glType", "GL_FLOAT", "GL_FLOAT_VEC4", "isUniformSpec", "isArrayLike", "toList", "uploadUniform", "transpose", "applyUniformMap", "strict", "warnMissing", "inf", "createPointer", "getFit", "smooth", "state", "clickPending", "moved", "paintedRect", "fit", "ba", "ra", "toShader", "clientX", "clientY", "toUV", "cx", "cy", "y", "onMove", "onLeave", "onWheel", "parseAspect", "parseSizing", "hasCanvas", "_f", "cfg", "createSizer", "ratio", "styled", "cssBox", "measure", "box", "applyStyle", "pending", "schedule", "ro", "createVisibility", "enabled", "margin", "onChange", "tabVisible", "inView", "notify", "onVis", "io", "entries", "DEFAULT_THEME", "resolveTheme", "createStats", "visible", "position", "theme", "T", "shown", "accDt", "accCpu", "lastDom", "show", "ms", "createErrorOverlay", "place", "esc", "title", "createCapture", "renderNow", "screenshot", "quality", "toBlob", "b", "download", "filename", "blob", "saveBlob", "record", "fps", "mimeType", "bitsPerSecond", "dl", "rec", "chunks", "handle", "finished", "normalizeArgs", "o", "resolveCanvas", "DEFAULT_CANVAS_ID", "setUniformIn", "cur", "readUniform", "createShader", "autoSetup", "globalDefines", "toArray", "commonSrc", "dialect", "includeStore", "strictUniforms", "warnUniforms", "showExpanded", "useOverlay", "givenCanvas", "bg", "emitter", "sizer", "pointer", "tweens", "overlay", "stats", "PASSES", "disposed", "rafId", "removeResize", "lastRender", "frame", "time", "playing", "timeScale", "fixedDelta", "maxFps", "loopLen", "maxDelta", "lastError", "refreshRate", "rafDts", "camera", "blit", "mainBackbuffer", "visibility", "reportError", "clearError", "loadText", "includeLoader", "commonText", "getCommon", "parsed", "buildProgram", "pass", "allPasses", "common", "full", "fc", "samplerNames", "frag", "resizeTargets", "handleResize", "loadPassChannels", "expandPassBlob", "unsupported", "passes", "build", "compiled", "fragcoord", "passTexture", "buffer", "drawPass", "iteration", "set1f", "set1i", "rw", "rh", "ky", "sz", "sw", "chTimes", "chRes", "texObj", "isCube", "chTime", "unit", "bindTex", "units", "frameStep", "advance", "rawDt", "t0", "loop", "startLoop", "stopLoop", "destroy", "onContextLost", "onContextRestored", "teardownPasses", "capture", "passName", "api", "hit", "scheduleRender", "owner", "renderQueued", "setShader", "setChannel", "index", "old", "VERSION", "readyPromise", "width", "height", "float", "COMMON", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "canvasOf", "w", "h", "c", "createGPUBackend", "probe", "dbg", "renderer", "canvas", "source", "palette", "matrix", "nearest", "el", "sm", "createShader", "COMMON", "MAX_KERNEL", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "failure", "e", "passUniforms", "name", "values", "k", "lastSource", "paletteKey", "matrixKey", "setSource", "frame", "ctx", "setPalette", "plan", "key", "img", "i", "setMatrix", "map", "m", "run", "s", "diffusion", "kernel", "_", "v", "data", "out", "row", "y", "hasDOM", "isRGBA", "s", "loadImage", "src", "img", "sizeOf", "el", "unwrap", "toFrame", "source", "opts", "maxSize", "frame", "c", "width", "height", "k", "canvas", "ctx", "cached", "init_color", "upscale", "img", "k", "opts", "w", "h", "out", "src", "sw", "y", "sy", "x", "so", "o", "r", "g", "b", "parseColor", "a", "sa", "oa", "resizeNearest", "width", "height", "xs", "uniqueColors", "limit", "seen", "d", "v", "toHex", "hasTransparency", "detectGrid", "tolerance", "same", "gcd", "stepY", "stepX", "run", "toCanvas", "img", "scale", "opts", "up", "upscale", "c", "downloadBlob", "data", "filename", "type", "blob", "url", "a", "table", "crc32", "bytes", "crc", "c", "k", "i", "SIG", "deflate", "bytes", "cs", "stream", "deflateSync", "chunk", "type", "data", "out", "dv", "i", "crc32", "indexImage", "img", "d", "map", "colors", "idx", "o", "k", "v", "encodePNG", "opts", "resizeNearest", "upscale", "w", "h", "ix", "ihdr", "parts", "raw", "bits", "stride", "y", "row", "bit", "c", "last", "total", "s", "p", "isVideo", "s", "isVideoFrame", "createPixelator", "options", "want", "gpu", "gpuError", "createGPUBackend", "e", "scratch", "last", "queue", "frameFor", "source", "frame", "toFrame", "processNow", "settings", "t0", "plan", "makePlan", "data", "backend", "diffusionOnCPU", "runCPU", "ms", "makeResult", "run", "uniqueColors", "scale", "opts", "toCanvas", "encodePNG", "shared", "pixelate", "pixelateClassic", "image", "width", "dither", "strength", "palette", "resolution", "pal", "fetchLospec", "p", "normalizeSettings", "LEGACY_DITHER", "res", "c", "ctx", "init_parse", "init_lospec", "PRESETS", "getPreset", "id", "p", "init_color", "init_color", "ByteWriter", "b", "nb", "arr", "i", "v", "s", "lzwEncode", "indices", "minCodeSize", "w", "clear", "eoi", "codeSize", "next", "dict", "cur", "curBits", "sub", "block", "emit", "code", "prefix", "k", "key", "hit", "keyOf", "d", "o", "tableFor", "colorKeys", "transparent", "list", "colors", "tIndex", "bits", "index", "reduce", "frame", "max", "pal", "extractPalette", "parseColor", "cache", "best", "bd", "dr", "dg", "db", "dist", "encodeGIF", "frames", "opts", "scale", "fr", "f", "upscale", "W", "H", "all", "perFrame", "opaqueCount", "global", "c", "f0", "table", "set", "idx", "p", "enc", "createZip", "entries", "files", "central", "offset", "used", "e", "name", "m", "i", "nameBytes", "data", "crc", "crc32", "d", "time", "date", "local", "lv", "cen", "cv", "cenSize", "s", "c", "end", "ev", "out", "o", "p", "blank", "w", "h", "blit", "dst", "src", "dx", "dy", "sx", "sy", "sw", "sh", "y", "so", "o", "packSpriteSheet", "frames", "opts", "pad", "cw", "ch", "cols", "rows", "W", "H", "image", "out", "i", "x", "atlas", "buildTileset", "img", "tw", "th", "mw", "mh", "tiles", "keys", "map", "flipsOut", "read", "tx", "ty", "t", "key", "s", "flip", "fx", "fy", "si", "id", "f", "code", "k", "wait", "el", "ev", "ms", "res", "rej", "t", "ok", "MEDIA_ERRORS", "mediaError", "video", "code", "err", "waitOrFail", "done", "onOk", "onErr", "videoReady", "timeout", "e", "sniffVideoCodec", "file", "buf", "NAMES", "type", "head", "m", "seekTo", "time", "presented", "seeked", "estimateFps", "fallback", "was", "times", "cb", "_", "meta", "deltas", "i", "d", "b", "fps", "r", "frameTimes", "duration", "start", "end", "maxFrames", "out", "n", "forEachFrame", "opts", "wasPaused", "VERSION"]
4
+ "sourcesContent": ["// Colour helpers shared by the CPU path, the GPU uniforms and the editor.\r\n// All channel values are sRGB in 0..1 unless a name says otherwise.\r\n\r\n/** Parse '#rgb', '#rrggbb', '#rrggbbaa', 'rrggbb' or [r,g,b] (0..255) into [r, g, b] bytes. */\r\nexport function parseColor(c) {\r\n if (Array.isArray(c)) return [c[0] | 0, c[1] | 0, c[2] | 0];\r\n let s = String(c).trim().replace(/^#|^0x/i, '');\r\n if (s.length === 3 || s.length === 4) s = s.slice(0, 3).split('').map(ch => ch + ch).join('');\r\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(s)) throw new Error(`Invalid colour \"${c}\"`);\r\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\r\n}\r\n\r\n/** True when `c` parses as a colour. */\r\nexport function isColor(c) {\r\n try { parseColor(c); return true; } catch { return false; }\r\n}\r\n\r\n/** [r, g, b] bytes \u2192 '#rrggbb'. */\r\nexport function toHex(rgb) {\r\n return '#' + rgb.slice(0, 3).map(v => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join('');\r\n}\r\n\r\n/** Normalise any colour to '#rrggbb' (lower case). */\r\nexport const normHex = c => toHex(parseColor(c));\r\n\r\nconst lin = c => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\r\n\r\n/** sRGB (0..1) \u2192 OKLab [L, a, b]. Same maths as the GLSL `oklab()` in gpu/shaders.js. */\r\nexport function oklab(r, g, b) {\r\n r = lin(r); g = lin(g); b = lin(b);\r\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\r\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\r\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\r\n return [\r\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s,\r\n ];\r\n}\r\n\r\n/** Relative luminance-ish weight used by saturation (Rec. 709). */\r\nexport const LUMA = [0.2126, 0.7152, 0.0722];\r\n\r\n/** Perceived lightness 0..1 of a hex colour; handy for picking text colours on swatches. */\r\nexport function lightness(hex) {\r\n const [r, g, b] = parseColor(hex);\r\n return oklab(r / 255, g / 255, b / 255)[0];\r\n}\r\n\r\n/**\r\n * Average distance (sRGB 0..1) from each palette colour to its nearest neighbour.\r\n * Ordered dithering scales its threshold by this so `strength` means the same thing\r\n * for a 2-colour and a 64-colour palette.\r\n */\r\nexport function paletteSpread(rgbs) {\r\n if (rgbs.length < 2) return 1;\r\n let sum = 0;\r\n for (let i = 0; i < rgbs.length; i++) {\r\n let best = Infinity;\r\n for (let j = 0; j < rgbs.length; j++) {\r\n if (i === j) continue;\r\n const dr = rgbs[i][0] - rgbs[j][0], dg = rgbs[i][1] - rgbs[j][1], db = rgbs[i][2] - rgbs[j][2];\r\n const d = Math.sqrt(dr * dr + dg * dg + db * db);\r\n if (d < best) best = d;\r\n }\r\n sum += best;\r\n }\r\n return Math.max(0.04, Math.min(1, sum / rgbs.length / 255));\r\n}\r\n", "// Palette file formats. Every parser returns { name, colors: ['#rrggbb', \u2026] }.\r\n//\r\n// .gpl GIMP / Aseprite / Krita palette\r\n// .hex one hex colour per line (Lospec \"HEX file\")\r\n// .txt Paint.NET palette (AARRGGBB per line, ';' comments)\r\n// .pal JASC-PAL (Paint Shop Pro, Aseprite export)\r\n// .json Lospec JSON ({ name, colors: ['rrggbb'] }), this tool's own export, or a plain array\r\n// anything else: every #hex / 6-digit token found in the text\r\n\r\nimport { normHex } from '../color.js';\r\n\r\nconst dedupe = list => [...new Set(list)];\r\n\r\nexport function parseGPL(text) {\r\n const lines = text.split(/\\r?\\n/);\r\n if (!/^GIMP Palette/i.test(lines[0] || '')) throw new Error('Not a GIMP palette (missing \"GIMP Palette\" header)');\r\n let name = '';\r\n const colors = [];\r\n for (const raw of lines.slice(1)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith('#')) continue;\r\n const nm = /^Name:\\s*(.*)$/i.exec(line);\r\n if (nm) { name = nm[1].trim(); continue; }\r\n if (/^Columns:/i.test(line)) continue;\r\n const m = /^(\\d{1,3})\\s+(\\d{1,3})\\s+(\\d{1,3})/.exec(line);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name, colors };\r\n}\r\n\r\nexport function parseHexList(text) {\r\n const colors = [];\r\n for (const raw of text.split(/\\r?\\n/)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith(';') || line.startsWith('//')) continue;\r\n const m = /^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\\b/i.exec(line);\r\n if (!m) continue;\r\n // 8 digits in a .txt palette are AARRGGBB (Paint.NET); in a .hex file they are rare, treat the same\r\n const h = m[1].length === 8 ? m[1].slice(2) : m[1];\r\n colors.push(normHex(h));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJASC(text) {\r\n const lines = text.split(/\\r?\\n/).map(l => l.trim());\r\n if (lines[0] !== 'JASC-PAL') throw new Error('Not a JASC palette');\r\n const n = parseInt(lines[2], 10) || 0;\r\n const colors = [];\r\n for (let i = 3; i < 3 + n && i < lines.length; i++) {\r\n const m = /^(\\d+)\\s+(\\d+)\\s+(\\d+)/.exec(lines[i]);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n const list = Array.isArray(obj) ? obj : (obj.colors || obj.palette || []);\r\n const colors = list.map(c => (typeof c === 'object' && c ? (c.hex || c.color) : c)).filter(Boolean).map(normHex);\r\n return { name: (!Array.isArray(obj) && obj.name) || '', colors };\r\n}\r\n\r\n/** Pull every hex-looking token out of free text (pasted CSS, a tweet, a Lospec page). */\r\nexport function parseLoose(text) {\r\n const colors = [];\r\n const re = /#?\\b([0-9a-f]{6})\\b/gi;\r\n let m;\r\n while ((m = re.exec(text))) colors.push(normHex(m[1]));\r\n return { name: '', colors };\r\n}\r\n\r\n/**\r\n * Parse palette text by file name / content sniffing.\r\n * @param {string} text\r\n * @param {string} [filename]\r\n * @returns {{ name: string, colors: string[] }}\r\n */\r\nexport function parsePalette(text, filename = '') {\r\n const ext = (/\\.([a-z0-9]+)$/i.exec(filename) || [])[1]?.toLowerCase() || '';\r\n const t = String(text).replace(/^\uFEFF/, '');\r\n const trimmed = t.trim();\r\n let out;\r\n if (ext === 'gpl' || /^GIMP Palette/i.test(trimmed)) out = parseGPL(trimmed);\r\n else if (ext === 'pal' || trimmed.startsWith('JASC-PAL')) out = parseJASC(trimmed);\r\n else if (ext === 'json' || trimmed.startsWith('{') || trimmed.startsWith('[')) out = parseJSON(trimmed);\r\n else if (ext === 'hex' || ext === 'txt') out = parseHexList(trimmed);\r\n else {\r\n out = parseHexList(trimmed);\r\n if (!out.colors.length) out = parseLoose(trimmed);\r\n }\r\n out.colors = dedupe(out.colors).slice(0, 256);\r\n if (!out.name && filename) out.name = filename.replace(/\\.[^.]+$/, '').replace(/[-_]+/g, ' ');\r\n if (!out.colors.length) throw new Error('No colours found in that palette');\r\n return out;\r\n}\r\n\r\n/** Palette \u2192 .gpl text. */\r\nexport function toGPL(name, colors) {\r\n const rows = colors.map(c => {\r\n const h = normHex(c);\r\n const r = parseInt(h.slice(1, 3), 16), g = parseInt(h.slice(3, 5), 16), b = parseInt(h.slice(5, 7), 16);\r\n return `${String(r).padStart(3)} ${String(g).padStart(3)} ${String(b).padStart(3)}\\t${h.slice(1)}`;\r\n });\r\n return `GIMP Palette\\nName: ${name || 'Palette'}\\nColumns: 8\\n#\\n${rows.join('\\n')}\\n`;\r\n}\r\n\r\n/** Palette \u2192 .hex text. */\r\nexport const toHexFile = colors => colors.map(c => normHex(c).slice(1)).join('\\n') + '\\n';\r\n\r\n/** Palette \u2192 JSON text (Lospec-compatible shape). */\r\nexport const toPaletteJSON = (name, colors) => JSON.stringify({ name: name || 'Palette', colors: colors.map(c => normHex(c).slice(1)) }, null, 2);\r\n", "// Lospec palette lookup by slug, e.g. 'rgbg-36' from https://lospec.com/palette-list/rgbg-36\r\n\r\nimport { parseJSON } from './parse.js';\r\n\r\n/** Turn a slug or a full Lospec URL into a slug. */\r\nexport function lospecSlug(input) {\r\n const s = String(input || '').trim();\r\n const m = /palette-list\\/([a-z0-9-]+)/i.exec(s);\r\n return (m ? m[1] : s).toLowerCase().replace(/\\.(json|hex|gpl)$/, '');\r\n}\r\n\r\n/**\r\n * Fetch a palette from Lospec. Needs network access; the editor caches results.\r\n * @returns {Promise<{ name: string, colors: string[], author?: string, slug: string }>}\r\n */\r\nexport async function fetchLospec(slugOrUrl, { fetch: f = globalThis.fetch } = {}) {\r\n const slug = lospecSlug(slugOrUrl);\r\n if (!/^[a-z0-9-]+$/.test(slug)) throw new Error('That does not look like a Lospec palette slug');\r\n const res = await f(`https://lospec.com/palette-list/${slug}.json`);\r\n if (!res.ok) throw new Error(`Lospec returned ${res.status} for \"${slug}\"`);\r\n const json = await res.json();\r\n const p = parseJSON(json);\r\n return { name: json.name || slug, author: json.author || '', colors: p.colors, slug };\r\n}\r\n", "// Built-in palettes. Most come from Lospec (https://lospec.com/palette-list); credit to their authors.\r\n// The list matches the classic editor plus a few staples.\r\n\r\n/** @type {{ id: string, name: string, author: string, colors: string[] }[]} */\r\nexport const PALETTES = [\r\n { id: \"1-bit-monitor\", name: \"1-Bit Monitor\", author: \"\", colors: [\"222323\",\"f0f6f0\"] },\r\n { id: \"apollo\", name: \"Apollo\", author: \"AdamCYounis\", colors: [\"172038\",\"253a5e\",\"3c5e8b\",\"4f8fba\",\"73bed3\",\"a4dddb\",\"19332d\",\"25562e\",\"468232\",\"75a743\",\"a8ca58\",\"d0da91\",\"4d2b32\",\"7a4841\",\"ad7757\",\"c09473\",\"d7b594\",\"e7d5b3\",\"341c27\",\"602c2c\",\"884b2b\",\"be772b\",\"de9e41\",\"e8c170\",\"241527\",\"411d31\",\"752438\",\"a53030\",\"cf573c\",\"da863e\",\"1e1d39\",\"402751\",\"7a367b\",\"a23e8c\",\"c65197\",\"df84a5\",\"090a14\",\"10141f\",\"151d28\",\"202e37\",\"394a50\",\"577277\",\"819796\",\"a8b5b2\",\"c7cfcc\",\"ebede9\"] },\r\n { id: \"batpalette\", name: \"Batpalette\", author: \"el Rojaz\", colors: [\"000000\",\"7f7f7f\",\"ffffff\",\"681e99\",\"3f48cc\",\"88ff82\",\"bfa621\",\"cc3d18\"] },\r\n { id: \"beached-boogaloo\", name: \"Beached Boogaloo\", author: \".tomais\", colors: [\"ff0b20\",\"8f0434\",\"500037\",\"a0ff00\",\"57e71e\",\"0ea717\",\"057833\",\"2cdeef\",\"2483e7\",\"153ab7\",\"0d0a87\",\"ff0b88\",\"a60fff\",\"6409cf\",\"eaef30\",\"ff880b\",\"b75308\",\"802202\",\"000000\",\"231940\",\"514378\",\"ffffff\",\"73a3a7\",\"366770\",\"f7b771\",\"c77650\",\"974c38\",\"873939\",\"601e2c\",\"300c1f\"] },\r\n { id: \"cc-29\", name: \"CC-29\", author: \"Alpha6\", colors: [\"f2f0e5\",\"b8b5b9\",\"868188\",\"646365\",\"45444f\",\"3a3858\",\"212123\",\"352b42\",\"43436a\",\"4b80ca\",\"68c2d3\",\"a2dcc7\",\"ede19e\",\"d3a068\",\"b45252\",\"6a536e\",\"4b4158\",\"80493a\",\"a77b5b\",\"e5ceb4\",\"c2d368\",\"8ab060\",\"567b79\",\"4e584a\",\"7b7243\",\"b2b47e\",\"edc8c4\",\"cf8acb\",\"5f556a\"] },\r\n { id: \"cga-16\", name: \"CGA 16\", author: \"\", colors: [\"000000\",\"0000aa\",\"00aa00\",\"00aaaa\",\"aa0000\",\"aa00aa\",\"aa5500\",\"aaaaaa\",\"555555\",\"5555ff\",\"55ff55\",\"55ffff\",\"ff5555\",\"ff55ff\",\"ffff55\",\"ffffff\"] },\r\n { id: \"chaotic-neutral\", name: \"Chaotic neutral\", author: \"Dodecahedron \u2DFD\", colors: [\"e1d4cb\",\"c19f90\",\"a56457\",\"6d504d\",\"484044\",\"392b29\",\"31312f\",\"d8eef0\",\"97999f\",\"81a4c0\",\"6a7f92\",\"415973\",\"43425a\",\"45334b\",\"4b1f40\",\"671087\",\"955ab9\"] },\r\n { id: \"endesga-32\", name: \"Endesga 32\", author: \"ENDESGA\", colors: [\"be4a2f\",\"d77643\",\"ead4aa\",\"e4a672\",\"b86f50\",\"733e39\",\"3e2731\",\"a22633\",\"e43b44\",\"f77622\",\"feae34\",\"fee761\",\"63c74d\",\"3e8948\",\"265c42\",\"193c3e\",\"124e89\",\"0099db\",\"2ce8f5\",\"ffffff\",\"c0cbdc\",\"8b9bb4\",\"5a6988\",\"3a4466\",\"262b44\",\"181425\",\"ff0044\",\"68386c\",\"b55088\",\"f6757a\",\"e8b796\",\"c28569\"] },\r\n { id: \"fantasy-24\", name: \"Fantasy 24\", author: \"\", colors: [\"1f240a\",\"39571c\",\"a58c27\",\"efac28\",\"efd8a1\",\"ab5c1c\",\"183f39\",\"ef692f\",\"efb775\",\"a56243\",\"773421\",\"724113\",\"2a1d0d\",\"392a1c\",\"684c3c\",\"927e6a\",\"276468\",\"ef3a0c\",\"45230d\",\"3c9f9c\",\"9b1a0a\",\"36170c\",\"550f0a\",\"300f0a\"] },\r\n { id: \"game-boy-dmg\", name: \"Game Boy (DMG)\", author: \"\", colors: [\"0f380f\",\"306230\",\"8bac0f\",\"9bbc0f\"] },\r\n { id: \"grayscale-4\", name: \"Grayscale 4\", author: \"\", colors: [\"000000\",\"555555\",\"aaaaaa\",\"ffffff\"] },\r\n { id: \"hidden-library\", name: \"Hidden Library\", author: \"Pixel Hoo\", colors: [\"100b2a\",\"2a213a\",\"314743\",\"65856d\",\"adca9a\",\"ecfeca\",\"582d27\",\"974133\",\"d67654\",\"5d3441\",\"a3685b\",\"ffb379\",\"ffe6a9\",\"ffffff\"] },\r\n { id: \"intacto14\", name: \"Intacto14\", author: \"Anubi\", colors: [\"221529\",\"4b5561\",\"879ba3\",\"cbf5ef\",\"62b4de\",\"5660d6\",\"5b29a6\",\"d64562\",\"f2735c\",\"edbb8e\",\"ab6375\",\"522152\",\"37ada2\",\"8cde8c\"] },\r\n { id: \"journey\", name: \"Journey\", author: \"\uD83C\uDF4DPineappleOnPizza\uD83C\uDF4D\", colors: [\"050914\",\"110524\",\"3b063a\",\"691749\",\"9c3247\",\"d46453\",\"f5a15d\",\"ffcf8e\",\"ff7a7d\",\"ff417d\",\"d61a88\",\"94007a\",\"42004e\",\"220029\",\"100726\",\"25082c\",\"3d1132\",\"73263d\",\"bd4035\",\"ed7b39\",\"ffb84a\",\"fff540\",\"c6d831\",\"77b02a\",\"429058\",\"2c645e\",\"153c4a\",\"052137\",\"0e0421\",\"0c0b42\",\"032769\",\"144491\",\"488bd4\",\"78d7ff\",\"b0fff1\",\"faffff\",\"c7d4e1\",\"928fb8\",\"5b537d\",\"392946\",\"24142c\",\"0e0f2c\",\"132243\",\"1a466b\",\"10908e\",\"28c074\",\"3dff6e\",\"f8ffb8\",\"f0c297\",\"cf968c\",\"8f5765\",\"52294b\",\"0f022e\",\"35003b\",\"64004c\",\"9b0e3e\",\"d41e3c\",\"ed4c40\",\"ff9757\",\"d4662f\",\"9c341a\",\"691b22\",\"450c28\",\"2d002e\"] },\r\n { id: \"lospec500\", name: \"Lospec500\", author: \"\", colors: [\"10121c\",\"2c1e31\",\"6b2643\",\"ac2847\",\"ec273f\",\"94493a\",\"de5d3a\",\"e98537\",\"f3a833\",\"4d3533\",\"6e4c30\",\"a26d3f\",\"ce9248\",\"dab163\",\"e8d282\",\"f7f3b7\",\"1e4044\",\"006554\",\"26854c\",\"5ab552\",\"9de64e\",\"008b8b\",\"62a477\",\"a6cb96\",\"d3eed3\",\"3e3b65\",\"3859b3\",\"3388de\",\"36c5f4\",\"6dead6\",\"5e5b8c\",\"8c78a5\",\"b0a7b8\",\"deceed\",\"9a4d76\",\"c878af\",\"cc99ff\",\"fa6e79\",\"ffa2ac\",\"ffd1d5\",\"f6e8e0\",\"ffffff\"] },\r\n { id: \"nyx8\", name: \"Nyx8\", author: \"Javier Guerrero\", colors: [\"08141e\",\"0f2a3f\",\"20394f\",\"4e495f\",\"816271\",\"997577\",\"c3a38a\",\"f6d6bd\"] },\r\n { id: \"oil-6\", name: \"Oil 6\", author: \"\", colors: [\"fbf5ef\",\"f2d3ab\",\"c69fa5\",\"8b6d9c\",\"494d7e\",\"272744\"] },\r\n { id: \"pico-8\", name: \"PICO-8\", author: \"\", colors: [\"000000\",\"1d2b53\",\"7e2553\",\"008751\",\"ab5236\",\"5f574f\",\"c2c3c7\",\"fff1e8\",\"ff004d\",\"ffa300\",\"ffec27\",\"00e436\",\"29adff\",\"83769c\",\"ff77a8\",\"ffccaa\"] },\r\n { id: \"resurrect-64\", name: \"Resurrect 64\", author: \"Kerrie Lake\", colors: [\"2e222f\",\"3e3546\",\"625565\",\"966c6c\",\"ab947a\",\"694f62\",\"7f708a\",\"9babb2\",\"c7dcd0\",\"ffffff\",\"6e2727\",\"b33831\",\"ea4f36\",\"f57d4a\",\"ae2334\",\"e83b3b\",\"fb6b1d\",\"f79617\",\"f9c22b\",\"7a3045\",\"9e4539\",\"cd683d\",\"e6904e\",\"fbb954\",\"4c3e24\",\"676633\",\"a2a947\",\"d5e04b\",\"fbff86\",\"165a4c\",\"239063\",\"1ebc73\",\"91db69\",\"cddf6c\",\"313638\",\"374e4a\",\"547e64\",\"92a984\",\"b2ba90\",\"0b5e65\",\"0b8a8f\",\"0eaf9b\",\"30e1b9\",\"8ff8e2\",\"323353\",\"484a77\",\"4d65b4\",\"4d9be6\",\"8fd3ff\",\"45293f\",\"6b3e75\",\"905ea9\",\"a884f3\",\"eaaded\",\"753c54\",\"a24b6f\",\"cf657f\",\"ed8099\",\"831c5d\",\"c32454\",\"f04f78\",\"f68181\",\"fca790\",\"fdcbb0\"] },\r\n { id: \"slso8\", name: \"SLSO8\", author: \"Luis Miguel Maldonado\", colors: [\"0d2b45\",\"203c56\",\"544e68\",\"8d697a\",\"d08159\",\"ffaa5e\",\"ffd4a3\",\"ffecd6\"] },\r\n { id: \"sweet-canyon-extended-64\", name: \"Sweet Canyon Extended 64\", author: \"Mr Slime\", colors: [\"0f0e11\",\"2d2c33\",\"40404a\",\"51545c\",\"6b7179\",\"7c8389\",\"a8b2b6\",\"d5d5d5\",\"eeebe0\",\"f1dbb1\",\"eec99f\",\"e1a17e\",\"cc9562\",\"ab7b49\",\"9a643a\",\"86482f\",\"783a29\",\"6a3328\",\"541d29\",\"42192c\",\"512240\",\"782349\",\"8b2e5d\",\"a93e89\",\"d062c8\",\"ec94ea\",\"f2bdfc\",\"eaebff\",\"a2fafa\",\"64e7e7\",\"54cfd8\",\"2fb6c3\",\"2c89af\",\"25739d\",\"2a5684\",\"214574\",\"1f2966\",\"101445\",\"3c0d3b\",\"66164c\",\"901f3d\",\"bb3030\",\"dc473c\",\"ec6a45\",\"fb9b41\",\"f0c04c\",\"f4d66e\",\"fffb76\",\"ccf17a\",\"97d948\",\"6fba3b\",\"229443\",\"1d7e45\",\"116548\",\"0c4f3f\",\"0a3639\",\"251746\",\"48246d\",\"69189c\",\"9f20c0\",\"e527d2\",\"ff51cf\",\"ff7ada\",\"ff9edb\"] },\r\n { id: \"sweetie-16\", name: \"Sweetie 16\", author: \"\", colors: [\"1a1c2c\",\"5d275d\",\"b13e53\",\"ef7d57\",\"ffcd75\",\"a7f070\",\"38b764\",\"257179\",\"29366f\",\"3b5dc9\",\"41a6f6\",\"73eff7\",\"f4f4f4\",\"94b0c2\",\"566c86\",\"333c57\"] },\r\n { id: \"toxic-haze\", name: \"Toxic Haze\", author: \"sillyTheJester\", colors: [\"e5ff00\",\"b8d14a\",\"9ab06e\",\"708763\",\"4c5c52\",\"393e40\",\"242424\"] },\r\n { id: \"vinik24\", name: \"Vinik24\", author: \"Vinik\", colors: [\"000000\",\"6f6776\",\"9a9a97\",\"c5ccb8\",\"8b5580\",\"c38890\",\"a593a5\",\"666092\",\"9a4f50\",\"c28d75\",\"7ca1c0\",\"416aa3\",\"8d6268\",\"be955c\",\"68aca9\",\"387080\",\"6e6962\",\"93a167\",\"6eaa78\",\"557064\",\"9d9f7f\",\"7e9e99\",\"5d6872\",\"433455\"] },\r\n];\r\n\r\n/** Look a built-in palette up by id or name (case-insensitive). */\r\nexport function getPalette(idOrName) {\r\n const k = String(idOrName || \"\").toLowerCase();\r\n return PALETTES.find(p => p.id === k || p.name.toLowerCase() === k) || null;\r\n}\r\n", "// The settings object is the one contract between the engine, the editor, presets,\r\n// share links and saved JSON. Everything goes through normalizeSettings().\r\n\r\nimport { getPalette } from './palette/builtin.js';\r\nimport { normHex, isColor } from './color.js';\r\n\r\nexport const SETTINGS_VERSION = 1;\r\nexport const MAX_SIZE = 2048;\r\n\r\n/** Dither methods. `kind` decides which pipeline runs them. */\r\nexport const DITHER_METHODS = [\r\n { id: 'none', label: 'None', kind: 'none' },\r\n { id: 'bayer2', label: 'Bayer 2\u00D72', kind: 'ordered' },\r\n { id: 'bayer4', label: 'Bayer 4\u00D74', kind: 'ordered' },\r\n { id: 'bayer8', label: 'Bayer 8\u00D78', kind: 'ordered' },\r\n { id: 'bayer16', label: 'Bayer 16\u00D716', kind: 'ordered' },\r\n { id: 'cluster4', label: 'Clustered dot 4\u00D74', kind: 'ordered' },\r\n { id: 'cluster8', label: 'Clustered dot 8\u00D78', kind: 'ordered' },\r\n { id: 'lines', label: 'Horizontal lines', kind: 'ordered' },\r\n { id: 'bluenoise', label: 'Blue noise', kind: 'ordered' },\r\n { id: 'custom', label: 'Custom matrix', kind: 'ordered' },\r\n { id: 'floyd-steinberg', label: 'Floyd\u2013Steinberg', kind: 'diffusion' },\r\n { id: 'atkinson', label: 'Atkinson', kind: 'diffusion' },\r\n { id: 'sierra-lite', label: 'Sierra Lite', kind: 'diffusion' },\r\n { id: 'sierra', label: 'Sierra', kind: 'diffusion' },\r\n { id: 'burkes', label: 'Burkes', kind: 'diffusion' },\r\n { id: 'jarvis', label: 'Jarvis\u2013Judice\u2013Ninke', kind: 'diffusion' },\r\n { id: 'stucki', label: 'Stucki', kind: 'diffusion' },\r\n];\r\nexport const ditherKind = id => (DITHER_METHODS.find(m => m.id === id) || { kind: 'none' }).kind;\r\n\r\n/** Names the classic image-to-pixel.js used, mapped to the new ids. */\r\nexport const LEGACY_DITHER = {\r\n 'none': 'none', 'floyd-steinberg': 'floyd-steinberg', 'atkinson': 'atkinson',\r\n 'ordered': 'bayer8', '2x2 bayer': 'bayer2', '4x4 bayer': 'bayer4', 'clustered 4x4': 'cluster4',\r\n};\r\n\r\nexport const DEFAULTS = Object.freeze({\r\n version: SETTINGS_VERSION,\r\n size: { mode: 'width', width: 96, height: 0, block: 8, resample: 'box' },\r\n adjust: { brightness: 0, contrast: 0, saturation: 0, hue: 0, gamma: 1 },\r\n frame: { aspect: 'original', zoom: 1, x: 0.5, y: 0.5 },\r\n palette: { source: 'builtin', id: 'endesga-32', name: 'Endesga 32', colors: [], count: 16, distance: 'oklab' },\r\n dither: { method: 'bayer4', strength: 0.6, matrix: null },\r\n alpha: { threshold: 0.5 },\r\n cleanup: { orphans: false, smooth: false },\r\n outline: { mode: 'none', color: '#000000', corners: false },\r\n export: { size: 'scale', scale: 4, indexed: true, grid: false, gridColor: '#000000' },\r\n});\r\n\r\nconst clamp = (v, lo, hi, d) => {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : d;\r\n};\r\nconst oneOf = (v, list, d) => (list.includes(v) ? v : d);\r\nconst bool = (v, d) => (typeof v === 'boolean' ? v : d);\r\n\r\n/** Deep copy of the defaults (palette colours resolved). */\r\nexport function defaultSettings() {\r\n return normalizeSettings({});\r\n}\r\n\r\n/**\r\n * Fill in defaults, clamp ranges, resolve built-in palette colours and drop unknown keys.\r\n * Never throws on bad values; it falls back to the default for that field.\r\n * @param {object} input partial settings\r\n */\r\nexport function normalizeSettings(input = {}) {\r\n const d = DEFAULTS;\r\n const i = input || {};\r\n const s = {}; const size = i.size || {}; const adj = i.adjust || {}; const pal = i.palette || {};\r\n const dit = i.dither || {}; const al = i.alpha || {}; const cl = i.cleanup || {}; const ol = i.outline || {};\r\n const ex = i.export || {};\r\n\r\n s.version = SETTINGS_VERSION;\r\n s.size = {\r\n mode: oneOf(size.mode, ['width', 'block'], d.size.mode),\r\n width: Math.round(clamp(size.width, 1, MAX_SIZE, d.size.width)),\r\n height: Math.round(clamp(size.height, 0, MAX_SIZE, d.size.height)),\r\n block: clamp(size.block, 1, 256, d.size.block),\r\n resample: oneOf(size.resample, ['box', 'nearest'], d.size.resample),\r\n };\r\n s.adjust = {\r\n brightness: clamp(adj.brightness, -1, 1, 0),\r\n contrast: clamp(adj.contrast, -1, 1, 0),\r\n saturation: clamp(adj.saturation, -1, 1, 0),\r\n hue: clamp(adj.hue, -180, 180, 0),\r\n gamma: clamp(adj.gamma, 0.2, 5, 1),\r\n };\r\n const fr = i.frame || {};\r\n s.frame = {\r\n aspect: oneOf(fr.aspect, ASPECTS.map(a => a.id), 'original'),\r\n zoom: clamp(fr.zoom, 1, 8, 1),\r\n x: clamp(fr.x, 0, 1, 0.5),\r\n y: clamp(fr.y, 0, 1, 0.5),\r\n };\r\n\r\n const source = oneOf(pal.source, ['builtin', 'custom', 'extract', 'none'], d.palette.source);\r\n s.palette = {\r\n source,\r\n id: typeof pal.id === 'string' ? pal.id : (source === 'builtin' ? d.palette.id : ''),\r\n name: typeof pal.name === 'string' ? pal.name : '',\r\n colors: [],\r\n count: Math.round(clamp(pal.count, 2, 256, d.palette.count)),\r\n distance: oneOf(pal.distance, ['oklab', 'rgb'], d.palette.distance),\r\n };\r\n if (source === 'builtin') {\r\n const p = getPalette(s.palette.id) || getPalette(d.palette.id);\r\n s.palette.id = p.id; s.palette.name = p.name; s.palette.colors = p.colors.map(c => '#' + c);\r\n } else if (source === 'custom') {\r\n s.palette.colors = (Array.isArray(pal.colors) ? pal.colors : []).filter(isColor).map(normHex).slice(0, 256);\r\n if (!s.palette.colors.length) s.palette.colors = ['#000000', '#ffffff'];\r\n s.palette.name = s.palette.name || 'Custom';\r\n } else if (source === 'extract') {\r\n s.palette.name = `Extracted (${s.palette.count})`;\r\n } else {\r\n s.palette.name = 'None';\r\n }\r\n\r\n const method = DITHER_METHODS.some(m => m.id === dit.method) ? dit.method : d.dither.method;\r\n s.dither = {\r\n method,\r\n strength: clamp(dit.strength, 0, 1, d.dither.strength),\r\n matrix: normalizeMatrix(dit.matrix),\r\n };\r\n s.alpha = { threshold: clamp(al.threshold, 0, 1, d.alpha.threshold) };\r\n s.cleanup = { orphans: bool(cl.orphans, false), smooth: bool(cl.smooth, false) };\r\n s.outline = {\r\n mode: oneOf(ol.mode, ['none', 'outer', 'inner'], 'none'),\r\n color: isColor(ol.color) ? normHex(ol.color) : d.outline.color,\r\n corners: bool(ol.corners, false),\r\n };\r\n s.export = {\r\n size: oneOf(ex.size, ['scale', 'source'], 'scale'),\r\n scale: Math.round(clamp(ex.scale, 1, 64, d.export.scale)),\r\n indexed: bool(ex.indexed, d.export.indexed),\r\n grid: bool(ex.grid, false),\r\n gridColor: isColor(ex.gridColor) ? normHex(ex.gridColor) : d.export.gridColor,\r\n };\r\n return s;\r\n}\r\n\r\n/** A custom threshold matrix: 2D array of numbers. Ranks are derived from the order of the values. */\r\nexport function normalizeMatrix(m) {\r\n if (!Array.isArray(m) || !m.length || !Array.isArray(m[0])) return null;\r\n const h = Math.min(16, m.length), w = Math.min(16, m[0].length);\r\n const out = [];\r\n for (let y = 0; y < h; y++) {\r\n const row = [];\r\n for (let x = 0; x < w; x++) { const v = Number((m[y] || [])[x]); row.push(Number.isFinite(v) ? v : 0); }\r\n out.push(row);\r\n }\r\n return out;\r\n}\r\n\r\n/** Frame aspect ratios. `ratio` is width / height; null keeps the source's. */\r\nexport const ASPECTS = [\r\n { id: 'original', label: 'Original', ratio: null },\r\n { id: '1:1', label: '1:1', ratio: 1 },\r\n { id: '4:3', label: '4:3', ratio: 4 / 3 },\r\n { id: '3:4', label: '3:4', ratio: 3 / 4 },\r\n { id: '3:2', label: '3:2', ratio: 3 / 2 },\r\n { id: '2:3', label: '2:3', ratio: 2 / 3 },\r\n { id: '16:9', label: '16:9', ratio: 16 / 9 },\r\n { id: '9:16', label: '9:16', ratio: 9 / 16 },\r\n];\r\n\r\n/**\r\n * The part of a srcW \u00D7 srcH source that `frame` keeps, in whole source pixels.\r\n * The largest rectangle of the chosen aspect that fits, divided by zoom, placed by x/y (0 = left/top, 1 = right/bottom).\r\n */\r\nexport function cropRect(srcW, srcH, frame = {}) {\r\n const a = (ASPECTS.find(x => x.id === frame.aspect) || ASPECTS[0]).ratio || srcW / srcH;\r\n let w = srcW, h = srcW / a;\r\n if (h > srcH) { h = srcH; w = srcH * a; }\r\n const zoom = Math.max(1, frame.zoom || 1);\r\n w = Math.max(1, Math.min(srcW, Math.round(w / zoom)));\r\n h = Math.max(1, Math.min(srcH, Math.round(h / zoom)));\r\n const fx = frame.x ?? 0.5, fy = frame.y ?? 0.5;\r\n return { x: Math.round((srcW - w) * fx), y: Math.round((srcH - h) * fy), w, h };\r\n}\r\n\r\n/** Output size in pixels for a source of srcW \u00D7 srcH. */\r\nexport function resolveSize(srcW, srcH, size) {\r\n let w, h;\r\n if (size.mode === 'block') {\r\n w = Math.max(1, Math.round(srcW / size.block));\r\n h = Math.max(1, Math.round(srcH / size.block));\r\n } else {\r\n w = size.width;\r\n h = size.height || Math.max(1, Math.round(w * srcH / srcW));\r\n }\r\n return { width: Math.min(MAX_SIZE, w), height: Math.min(MAX_SIZE, h) };\r\n}\r\n\r\n// ---- sharing ---------------------------------------------------------------\r\n\r\nfunction diff(a, b) {\r\n // keys of `a` whose value differs from `b` (one level deep per group)\r\n const out = {};\r\n for (const k of Object.keys(a)) {\r\n if (k === 'version') continue;\r\n const va = a[k], vb = b[k];\r\n if (va && typeof va === 'object' && !Array.isArray(va)) {\r\n const g = {};\r\n for (const kk of Object.keys(va)) if (JSON.stringify(va[kk]) !== JSON.stringify(vb && vb[kk])) g[kk] = va[kk];\r\n if (Object.keys(g).length) out[k] = g;\r\n } else if (JSON.stringify(va) !== JSON.stringify(vb)) out[k] = va;\r\n }\r\n return out;\r\n}\r\n\r\nconst b64url = {\r\n enc(str) {\r\n const bytes = new TextEncoder().encode(str);\r\n let bin = ''; for (const b of bytes) bin += String.fromCharCode(b);\r\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n },\r\n dec(s) {\r\n const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));\r\n return new TextDecoder().decode(Uint8Array.from(bin, c => c.charCodeAt(0)));\r\n },\r\n};\r\n\r\n/** Settings \u2192 the smallest JSON that rebuilds them (only what differs from the defaults). */\r\nexport function compactSettings(settings) {\r\n const s = normalizeSettings(settings);\r\n const out = diff(s, defaultSettings());\r\n if (out.palette) {\r\n if (s.palette.source !== 'custom') { delete out.palette.colors; delete out.palette.name; } // a built-in id is enough\r\n if (s.palette.source !== 'builtin') delete out.palette.id;\r\n if (s.palette.source !== 'extract') delete out.palette.count;\r\n }\r\n if (out.palette && !Object.keys(out.palette).length) delete out.palette;\r\n return out;\r\n}\r\n\r\n/** Settings \u2192 URL-safe string for `#s=\u2026`. */\r\nexport function encodeSettings(settings) {\r\n return b64url.enc(JSON.stringify({ v: SETTINGS_VERSION, ...compactSettings(settings) }));\r\n}\r\n\r\n/** `#s=\u2026` string (or a whole URL / hash) \u2192 settings. Throws on garbage. */\r\nexport function decodeSettings(str) {\r\n let s = String(str);\r\n const m = /[#&?]s=([A-Za-z0-9_-]+)/.exec(s);\r\n if (m) s = m[1];\r\n const obj = JSON.parse(b64url.dec(s));\r\n delete obj.v;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Settings \u2192 pretty JSON for saving to a file. */\r\nexport function settingsToJSON(settings) {\r\n return JSON.stringify({ $schema: 'image-to-pixel/settings', version: SETTINGS_VERSION, ...compactSettings(settings) }, null, 2);\r\n}\r\n\r\n/** JSON text \u2192 settings. Accepts a full or partial settings object. */\r\nexport function settingsFromJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n delete obj.$schema;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Apply a partial patch on top of settings (one level deep per group). */\r\nexport function mergeSettings(base, patch) {\r\n const out = JSON.parse(JSON.stringify(base));\r\n for (const k of Object.keys(patch || {})) {\r\n if (patch[k] && typeof patch[k] === 'object' && !Array.isArray(patch[k]) && out[k] && typeof out[k] === 'object') {\r\n Object.assign(out[k], patch[k]);\r\n } else out[k] = patch[k];\r\n }\r\n return normalizeSettings(out);\r\n}\r\n", "// A \"plan\" is everything both backends need, resolved once from settings + source size:\r\n// output size, palette bytes, threshold map, kernel, and the numbers derived from them.\r\n// Building it in one place keeps the CPU and GPU paths in lock-step.\r\n\r\nimport { normalizeSettings, resolveSize, ditherKind, cropRect } from './settings.js';\r\nimport { parseColor, paletteSpread } from './color.js';\r\nimport { thresholdMap } from './dither/matrices.js';\r\nimport { KERNELS, kernelSkew, waveCount } from './dither/kernels.js';\r\nimport { extractPalette } from './palette/extract.js';\r\nimport { resample, adjust } from './cpu/stages.js';\r\n\r\n/**\r\n * @param {object} settings\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA source (only read for palette extraction)\r\n */\r\nexport function makePlan(settings, src) {\r\n const s = normalizeSettings(settings);\r\n const crop = cropRect(src.width, src.height, s.frame);\r\n const { width, height } = resolveSize(crop.w, crop.h, s.size);\r\n\r\n let colors = s.palette.colors;\r\n if (s.palette.source === 'extract') colors = extractFrom(src, s, width, height, crop);\r\n const quantize = s.palette.source !== 'none' && colors.length > 0;\r\n const palette = quantize ? colors.map(parseColor) : [];\r\n\r\n let kind = quantize ? ditherKind(s.dither.method) : 'none';\r\n if (s.dither.strength <= 0) kind = 'none';\r\n\r\n const map = kind === 'ordered' ? thresholdMap(s.dither.method, s.dither.matrix) : null;\r\n const kernel = kind === 'diffusion' ? KERNELS[s.dither.method] : null;\r\n const skew = kernel ? kernelSkew(kernel) : 1;\r\n\r\n return {\r\n settings: s,\r\n srcWidth: src.width, srcHeight: src.height,\r\n crop, // source pixels kept by the frame settings\r\n width, height,\r\n quantize, kind,\r\n palette, // [[r, g, b] bytes]\r\n paletteHex: quantize ? colors.slice() : null,\r\n distance: s.palette.distance === 'rgb' ? 1 : 0,\r\n spread: quantize ? paletteSpread(palette) : 0,\r\n map, kernel, skew,\r\n waves: kernel ? waveCount(width, height, skew) : 0,\r\n outline: { mode: s.outline.mode, color: parseColor(s.outline.color), corners: s.outline.corners },\r\n };\r\n}\r\n\r\nfunction extractFrom(src, s, width, height, crop) {\r\n // extract from what will actually be quantised: the resized + adjusted image (capped for speed)\r\n const k = Math.min(1, 160 / Math.max(width, height));\r\n const w = Math.max(1, Math.round(width * k)), h = Math.max(1, Math.round(height * k));\r\n const prep = resample(src, w, h, 'box', crop);\r\n adjust(prep, s.adjust);\r\n const bytes = new Uint8ClampedArray(prep.length);\r\n for (let i = 0; i < prep.length; i++) bytes[i] = Math.round(prep[i] * 255);\r\n return extractPalette({ data: bytes, width: w, height: h }, s.palette.count, { alphaThreshold: Math.max(0.01, s.alpha.threshold) });\r\n}\r\n", "// Generated by scripts/gen-bluenoise.mjs: 64\u00D764 void-and-cluster blue noise, one byte per cell (0..255).\r\nexport const BLUE_NOISE_SIZE = 64;\r\nexport const BLUE_NOISE_B64 = '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';\r\n", "// Threshold maps for ordered dithering.\r\n// A map is { w, h, levels, values: Uint8Array } and the threshold of a cell is (value + 0.5) / levels.\r\n// The GPU reads the same bytes from a texture, so CPU and GPU agree exactly.\r\n\r\nimport { BLUE_NOISE_B64, BLUE_NOISE_SIZE } from './bluenoise-data.js';\r\n\r\nfunction fromB64(b64) {\r\n if (typeof atob === 'function') return Uint8Array.from(atob(b64), c => c.charCodeAt(0));\r\n return new Uint8Array(Buffer.from(b64, 'base64'));\r\n}\r\n\r\n/** Bayer index matrix of size n (power of two). */\r\nexport function bayer(n) {\r\n let m = [[0]];\r\n for (let s = 1; s < n; s *= 2) {\r\n const next = [];\r\n for (let y = 0; y < s * 2; y++) next.push(new Array(s * 2));\r\n for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) {\r\n const v = 4 * m[y][x];\r\n next[y][x] = v; next[y][x + s] = v + 2; next[y + s][x] = v + 3; next[y + s][x + s] = v + 1;\r\n }\r\n m = next;\r\n }\r\n return m;\r\n}\r\n\r\n/** Turn arbitrary numbers into ranks 0..n-1 (ties keep reading order). */\r\nexport function toRanks(rows) {\r\n const h = rows.length, w = rows[0].length;\r\n const cells = [];\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) cells.push({ i: y * w + x, v: rows[y][x] });\r\n cells.sort((a, b) => a.v - b.v || a.i - b.i);\r\n const out = new Uint8Array(w * h);\r\n cells.forEach((c, r) => { out[c.i] = r; });\r\n return out;\r\n}\r\n\r\n/** Clustered-dot screen: cells ranked by a dot function, two dots per tile at 45\u00B0. */\r\nfunction clustered(n) {\r\n const rows = [];\r\n for (let y = 0; y < n; y++) {\r\n const row = [];\r\n for (let x = 0; x < n; x++) {\r\n const u = (x + 0.5) / n * 2 * Math.PI, v = (y + 0.5) / n * 2 * Math.PI;\r\n row.push(-(Math.cos(u) + Math.cos(v)) + (x * n + y) * 1e-9);\r\n }\r\n rows.push(row);\r\n }\r\n return rows;\r\n}\r\n\r\nconst CLUSTER4 = [[7, 13, 11, 4], [12, 16, 14, 8], [10, 15, 6, 2], [5, 9, 3, 1]]; // classic editor's matrix\r\nconst cache = new Map();\r\n\r\n/**\r\n * Threshold map for an ordered method id ('bayer4', 'bluenoise', 'custom' \u2026).\r\n * @param {string} method\r\n * @param {number[][]|null} [custom] matrix for 'custom'\r\n */\r\nexport function thresholdMap(method, custom = null) {\r\n if (method === 'custom') {\r\n const m = custom && custom.length ? custom : bayer(4);\r\n return { w: m[0].length, h: m.length, levels: m.length * m[0].length, values: toRanks(m) };\r\n }\r\n if (cache.has(method)) return cache.get(method);\r\n let map;\r\n const sq = rows => ({ w: rows[0].length, h: rows.length, levels: rows.length * rows[0].length, values: toRanks(rows) });\r\n switch (method) {\r\n case 'bayer2': map = sq(bayer(2)); break;\r\n case 'bayer4': map = sq(bayer(4)); break;\r\n case 'bayer8': map = sq(bayer(8)); break;\r\n case 'bayer16': map = sq(bayer(16)); break;\r\n case 'cluster4': map = sq(CLUSTER4); break;\r\n case 'cluster8': map = sq(clustered(8)); break;\r\n case 'lines': map = sq([[0], [2], [1], [3]]); break;\r\n case 'bluenoise': map = { w: BLUE_NOISE_SIZE, h: BLUE_NOISE_SIZE, levels: 256, values: fromB64(BLUE_NOISE_B64) }; break;\r\n default: map = sq(bayer(4));\r\n }\r\n cache.set(method, map);\r\n return map;\r\n}\r\n\r\n/**\r\n * Parse a custom matrix typed by a person: rows on lines, numbers separated by spaces or commas.\r\n * Accepts an optional \"/ 16\" style divisor line, which is ignored (only the order matters).\r\n */\r\nexport function parseMatrix(text) {\r\n const rows = String(text).split(/\\r?\\n|;/).map(l => l.trim()).filter(l => l && !/^\\//.test(l))\r\n .map(l => l.replace(/[[\\]]/g, '').split(/[\\s,]+/).filter(Boolean).map(Number));\r\n if (!rows.length) throw new Error('Matrix is empty');\r\n const w = rows[0].length;\r\n if (rows.some(r => r.length !== w || r.some(v => !Number.isFinite(v)))) throw new Error('Every row needs the same number of values');\r\n if (w > 16 || rows.length > 16) throw new Error('Matrices are limited to 16\u00D716');\r\n return rows;\r\n}\r\n", "// Error-diffusion kernels as push offsets [dx, dy, weight] (weights already divided).\r\n// `skew` is the wavefront slope the GPU needs: pixels with x + skew*y = k only depend on\r\n// earlier waves, so each wave is one draw (see docs/how-it-works.md).\r\n\r\nconst k = (div, list) => list.map(([dx, dy, w]) => [dx, dy, w / div]);\r\n\r\nexport const KERNELS = {\r\n 'floyd-steinberg': k(16, [[1, 0, 7], [-1, 1, 3], [0, 1, 5], [1, 1, 1]]),\r\n 'atkinson': k(8, [[1, 0, 1], [2, 0, 1], [-1, 1, 1], [0, 1, 1], [1, 1, 1], [0, 2, 1]]),\r\n 'sierra-lite': k(4, [[1, 0, 2], [-1, 1, 1], [0, 1, 1]]),\r\n 'sierra': k(32, [[1, 0, 5], [2, 0, 3], [-2, 1, 2], [-1, 1, 4], [0, 1, 5], [1, 1, 4], [2, 1, 2], [-1, 2, 2], [0, 2, 3], [1, 2, 2]]),\r\n 'burkes': k(32, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2]]),\r\n 'jarvis': k(48, [[1, 0, 7], [2, 0, 5], [-2, 1, 3], [-1, 1, 5], [0, 1, 7], [1, 1, 5], [2, 1, 3], [-2, 2, 1], [-1, 2, 3], [0, 2, 5], [1, 2, 3], [2, 2, 1]]),\r\n 'stucki': k(42, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2], [-2, 2, 1], [-1, 2, 2], [0, 2, 4], [1, 2, 2], [2, 2, 1]]),\r\n};\r\n\r\nexport const MAX_KERNEL = 12;\r\n\r\n/** Smallest integer s so that every push offset lands on a later wave x + s*y. */\r\nexport function kernelSkew(kernel) {\r\n let s = 1;\r\n for (const [dx, dy] of kernel) if (dy > 0) s = Math.max(s, Math.floor(-dx / dy) + 1);\r\n return s;\r\n}\r\n\r\n/** Number of waves (GPU draws) for an image of w \u00D7 h. */\r\nexport const waveCount = (w, h, skew) => (w - 1) + skew * (h - 1) + 1;\r\n", "// Palette extraction: median cut on the image's colours, refined by a few k-means passes.\r\n// Deterministic (no randomness), so the same image always gives the same palette.\r\n\r\nimport { toHex } from '../color.js';\r\n\r\n/**\r\n * @param {{ data: ArrayLike<number>, width: number, height: number }} img RGBA bytes\r\n * @param {number} count number of colours (2..256)\r\n * @param {{ maxSamples?: number, alphaThreshold?: number }} [opts]\r\n * @returns {string[]} '#rrggbb' colours sorted dark \u2192 light\r\n */\r\nexport function extractPalette(img, count = 16, opts = {}) {\r\n const { maxSamples = 40000, alphaThreshold = 0.5 } = opts;\r\n const n = img.width * img.height;\r\n const step = Math.max(1, Math.floor(n / maxSamples));\r\n const pts = [];\r\n for (let i = 0; i < n; i += step) {\r\n const o = i * 4;\r\n if (img.data[o + 3] < alphaThreshold * 255) continue;\r\n pts.push([img.data[o], img.data[o + 1], img.data[o + 2]]);\r\n }\r\n if (!pts.length) return ['#000000', '#ffffff'].slice(0, Math.max(1, count));\r\n\r\n // ---- median cut\r\n let boxes = [pts];\r\n while (boxes.length < count) {\r\n let bi = -1, bestRange = -1, bestAxis = 0;\r\n boxes.forEach((b, i) => {\r\n if (b.length < 2) return;\r\n for (let a = 0; a < 3; a++) {\r\n let lo = 255, hi = 0;\r\n for (const p of b) { if (p[a] < lo) lo = p[a]; if (p[a] > hi) hi = p[a]; }\r\n // weight by population so big flat areas get split before tiny noisy ones\r\n const r = (hi - lo) * Math.sqrt(b.length);\r\n if (r > bestRange) { bestRange = r; bi = i; bestAxis = a; }\r\n }\r\n });\r\n if (bi < 0 || bestRange <= 0) break;\r\n const b = boxes[bi].slice().sort((p, q) => p[bestAxis] - q[bestAxis]);\r\n const mid = b.length >> 1;\r\n boxes.splice(bi, 1, b.slice(0, mid), b.slice(mid));\r\n }\r\n let centers = boxes.map(b => mean(b));\r\n\r\n // ---- k-means refinement\r\n for (let iter = 0; iter < 6; iter++) {\r\n const sums = centers.map(() => [0, 0, 0, 0]);\r\n for (const p of pts) {\r\n let best = 0, bd = Infinity;\r\n for (let c = 0; c < centers.length; c++) {\r\n const dr = p[0] - centers[c][0], dg = p[1] - centers[c][1], db = p[2] - centers[c][2];\r\n const d = dr * dr + dg * dg + db * db;\r\n if (d < bd) { bd = d; best = c; }\r\n }\r\n const s = sums[best]; s[0] += p[0]; s[1] += p[1]; s[2] += p[2]; s[3]++;\r\n }\r\n centers = centers.map((c, i) => (sums[i][3] ? [sums[i][0] / sums[i][3], sums[i][1] / sums[i][3], sums[i][2] / sums[i][3]] : c));\r\n }\r\n\r\n const hexes = [...new Set(centers.map(c => toHex(c)))];\r\n const lum = h => { const v = parseInt(h.slice(1), 16); return 0.2126 * (v >> 16) + 0.7152 * ((v >> 8) & 255) + 0.0722 * (v & 255); };\r\n return hexes.sort((a, b) => lum(a) - lum(b));\r\n}\r\n\r\nfunction mean(list) {\r\n let r = 0, g = 0, b = 0;\r\n for (const p of list) { r += p[0]; g += p[1]; b += p[2]; }\r\n return [r / list.length, g / list.length, b / list.length];\r\n}\r\n", "// CPU reference implementation of every pipeline stage.\r\n// The GLSL in gpu/shaders.js mirrors these functions line for line; tests compare the two.\r\n// Working buffers are Float32Array RGBA, rows top-down, values 0..1.\r\n\r\nimport { oklab, LUMA } from '../color.js';\r\n\r\n/**\r\n * Resample to w \u00D7 h. 'box' averages up to 16\u00D716 evenly spaced source texels per output pixel\r\n * (alpha-weighted); 'nearest' takes the centre texel. Integer maths, identical on the GPU.\r\n */\r\nexport function resample(src, w, h, mode = 'box', crop = null) {\r\n const ox = crop ? crop.x : 0, oy = crop ? crop.y : 0;\r\n const sw = crop ? crop.w : src.width, sh = crop ? crop.h : src.height, d = src.data, stride = src.width;\r\n const out = new Float32Array(w * h * 4);\r\n const nx = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sw / w)));\r\n const ny = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sh / h)));\r\n const xs = new Int32Array(w * nx), ys = new Int32Array(h * ny);\r\n for (let x = 0; x < w; x++) for (let i = 0; i < nx; i++) xs[x * nx + i] = ox + Math.min(sw - 1, Math.floor(((2 * (x * nx + i) + 1) * sw) / (2 * w * nx)));\r\n for (let y = 0; y < h; y++) for (let j = 0; j < ny; j++) ys[y * ny + j] = oy + Math.min(sh - 1, Math.floor(((2 * (y * ny + j) + 1) * sh) / (2 * h * ny)));\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n let r = 0, g = 0, b = 0, a = 0;\r\n for (let j = 0; j < ny; j++) {\r\n const row = ys[y * ny + j] * stride;\r\n for (let i = 0; i < nx; i++) {\r\n const o = (row + xs[x * nx + i]) * 4;\r\n const al = d[o + 3] / 255;\r\n r += d[o] / 255 * al; g += d[o + 1] / 255 * al; b += d[o + 2] / 255 * al; a += al;\r\n }\r\n }\r\n const o = (y * w + x) * 4;\r\n if (a > 0) { out[o] = r / a; out[o + 1] = g / a; out[o + 2] = b / a; }\r\n out[o + 3] = a / (nx * ny);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Brightness, contrast, saturation, hue, gamma \u2014 in that order, in place. */\r\nexport function adjust(buf, { brightness = 0, contrast = 0, saturation = 0, hue = 0, gamma = 1 }) {\r\n if (!brightness && !contrast && !saturation && !hue && gamma === 1) return buf;\r\n const f = contrast >= 0 ? 1 / (1 - 0.99 * contrast) : 1 + contrast;\r\n const ig = 1 / gamma;\r\n // luminance-preserving hue rotation: the CSS hue-rotate() matrix (rows sum to 1, so greys stay grey)\r\n const hk = Math.cos(hue * Math.PI / 180), hq = Math.sin(hue * Math.PI / 180);\r\n const M = [\r\n 0.213 + 0.787 * hk - 0.213 * hq, 0.715 - 0.715 * hk - 0.715 * hq, 0.072 - 0.072 * hk + 0.928 * hq,\r\n 0.213 - 0.213 * hk + 0.143 * hq, 0.715 + 0.285 * hk + 0.140 * hq, 0.072 - 0.072 * hk - 0.283 * hq,\r\n 0.213 - 0.213 * hk - 0.787 * hq, 0.715 - 0.715 * hk + 0.715 * hq, 0.072 + 0.928 * hk + 0.072 * hq,\r\n ];\r\n for (let o = 0; o < buf.length; o += 4) {\r\n let r = buf[o] + brightness, g = buf[o + 1] + brightness, b = buf[o + 2] + brightness;\r\n r = (r - 0.5) * f + 0.5; g = (g - 0.5) * f + 0.5; b = (b - 0.5) * f + 0.5;\r\n const l = r * LUMA[0] + g * LUMA[1] + b * LUMA[2];\r\n const k = 1 + saturation;\r\n r = l + (r - l) * k; g = l + (g - l) * k; b = l + (b - l) * k;\r\n if (hue) {\r\n const r2 = M[0] * r + M[1] * g + M[2] * b, g2 = M[3] * r + M[4] * g + M[5] * b, b2 = M[6] * r + M[7] * g + M[8] * b;\r\n r = r2; g = g2; b = b2;\r\n }\r\n buf[o] = Math.pow(clamp01(r), ig); buf[o + 1] = Math.pow(clamp01(g), ig); buf[o + 2] = Math.pow(clamp01(b), ig);\r\n }\r\n return buf;\r\n}\r\n\r\n/** Binary alpha: below the threshold becomes fully transparent, the rest fully opaque. */\r\nexport function alphaCut(buf, threshold) {\r\n for (let o = 3; o < buf.length; o += 4) buf[o] = buf[o] >= threshold && buf[o] > 0 ? 1 : 0;\r\n return buf;\r\n}\r\n\r\nexport const clamp01 = v => (v < 0 ? 0 : v > 1 ? 1 : v);\r\n\r\n/** Precompute what nearest() needs for a palette. */\r\nexport function paletteSpace(palette, distance) {\r\n const n = palette.length;\r\n const coords = new Float64Array(n * 3);\r\n const rgb = new Float64Array(n * 3);\r\n palette.forEach((c, i) => {\r\n rgb.set([c[0] / 255, c[1] / 255, c[2] / 255], i * 3);\r\n coords.set(distance === 1 ? [c[0] / 255, c[1] / 255, c[2] / 255] : oklab(c[0] / 255, c[1] / 255, c[2] / 255), i * 3);\r\n });\r\n return { n, coords, rgb, distance };\r\n}\r\n\r\nconst W_RGB = [0.299, 0.587, 0.114];\r\n\r\n/** Index of the nearest palette colour (ties: lowest index). */\r\nexport function nearest(sp, r, g, b) {\r\n let p0, p1, p2, w0 = 1, w1 = 1, w2 = 1;\r\n if (sp.distance === 1) { p0 = r; p1 = g; p2 = b; w0 = W_RGB[0]; w1 = W_RGB[1]; w2 = W_RGB[2]; }\r\n else [p0, p1, p2] = oklab(r, g, b);\r\n let best = 0, bd = Infinity;\r\n const c = sp.coords;\r\n for (let i = 0; i < sp.n; i++) {\r\n const d0 = p0 - c[i * 3], d1 = p1 - c[i * 3 + 1], d2 = p2 - c[i * 3 + 2];\r\n const dist = w0 * d0 * d0 + w1 * d1 * d1 + w2 * d2 * d2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\n\r\n/** No dithering / ordered dithering \u2192 RGBA bytes. */\r\nexport function quantizeOrdered(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = plan.quantize ? paletteSpace(plan.palette, plan.distance) : null;\r\n const map = plan.kind === 'ordered' ? plan.map : null;\r\n const amt = map ? plan.spread * plan.settings.dither.strength : 0;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4;\r\n if (buf[o + 3] < 0.5) continue; // transparent stays 0,0,0,0\r\n let r = buf[o], g = buf[o + 1], b = buf[o + 2];\r\n if (sp) {\r\n if (map) {\r\n const t = (map.values[(y % map.h) * map.w + (x % map.w)] + 0.5) / map.levels - 0.5;\r\n r = clamp01(r + t * amt); g = clamp01(g + t * amt); b = clamp01(b + t * amt);\r\n }\r\n const i = nearest(sp, r, g, b);\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2];\r\n } else {\r\n out[o] = Math.round(r * 255); out[o + 1] = Math.round(g * 255); out[o + 2] = Math.round(b * 255);\r\n }\r\n out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Error diffusion (left \u2192 right, top \u2192 bottom) \u2192 RGBA bytes. */\r\nexport function quantizeDiffusion(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = paletteSpace(plan.palette, plan.distance);\r\n const acc = new Float32Array(w * h * 3);\r\n const strength = plan.settings.dither.strength;\r\n const kernel = plan.kernel;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const p = y * w + x, o = p * 4;\r\n if (buf[o + 3] < 0.5) continue;\r\n const r = clamp01(buf[o] + acc[p * 3] * strength);\r\n const g = clamp01(buf[o + 1] + acc[p * 3 + 1] * strength);\r\n const b = clamp01(buf[o + 2] + acc[p * 3 + 2] * strength);\r\n const i = nearest(sp, r, g, b);\r\n const er = r - sp.rgb[i * 3], eg = g - sp.rgb[i * 3 + 1], eb = b - sp.rgb[i * 3 + 2];\r\n for (const [dx, dy, wt] of kernel) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || xx >= w || yy >= h) continue;\r\n const q = (yy * w + xx) * 3;\r\n acc[q] += er * wt; acc[q + 1] += eg * wt; acc[q + 2] += eb * wt;\r\n }\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2]; out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nconst key = (d, o) => (d[o + 3] === 0 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\nconst N4 = [[0, -1], [1, 0], [0, 1], [-1, 0]];\r\n\r\n/** Replace pixels that share no colour with any 4-neighbour by their most common neighbour. */\r\nexport function removeOrphans(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (const [dx, dy] of N4) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || yy < 0 || xx >= w || yy >= h) continue;\r\n const oo = (yy * w + xx) * 4;\r\n ks.push(key(src, oo)); os.push(oo);\r\n }\r\n if (ks.length < 2 || ks.includes(c)) continue;\r\n let best = 0, bc = 0;\r\n for (let i = 0; i < ks.length; i++) {\r\n let n = 0; for (let j = 0; j < ks.length; j++) if (ks[j] === ks[i]) n++;\r\n if (n > bc) { bc = n; best = i; }\r\n }\r\n px.set(src.subarray(os[best], os[best] + 4), o);\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** 3\u00D73 majority: a colour that fills at least 5 of the 9 cells wins. */\r\nexport function smoothMajority(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\r\n const xx = Math.min(w - 1, Math.max(0, x + dx)), yy = Math.min(h - 1, Math.max(0, y + dy));\r\n const oo = (yy * w + xx) * 4; ks.push(key(src, oo)); os.push(oo);\r\n }\r\n for (let i = 0; i < 9; i++) {\r\n if (ks[i] === c) continue;\r\n let n = 0; for (let j = 0; j < 9; j++) if (ks[j] === ks[i]) n++;\r\n if (n >= 5) { px.set(src.subarray(os[i], os[i] + 4), o); break; }\r\n }\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** Outline around (outer) or inside (inner) the opaque shape. */\r\nexport function outline(px, w, h, { mode, color, corners }) {\r\n if (mode === 'none') return px;\r\n const src = px.slice();\r\n const opaque = (x, y) => x >= 0 && y >= 0 && x < w && y < h && src[(y * w + x) * 4 + 3] > 0;\r\n const inside = (x, y) => x >= 0 && y >= 0 && x < w && y < h;\r\n const nb = corners ? [[0, -1], [1, 0], [0, 1], [-1, 0], [-1, -1], [1, -1], [1, 1], [-1, 1]] : N4;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const me = opaque(x, y);\r\n let hit = false;\r\n for (const [dx, dy] of nb) {\r\n const xx = x + dx, yy = y + dy;\r\n if (!inside(xx, yy)) continue;\r\n if (mode === 'outer' ? (!me && opaque(xx, yy)) : (me && !opaque(xx, yy))) { hit = true; break; }\r\n }\r\n if (hit) { const o = (y * w + x) * 4; px[o] = color[0]; px[o + 1] = color[1]; px[o + 2] = color[2]; px[o + 3] = 255; }\r\n }\r\n }\r\n return px;\r\n}\r\n", "// The whole pipeline on the CPU. Used when WebGL 2 is unavailable, in Node, and as the\r\n// reference the GPU output is tested against.\r\n\r\nimport { resample, adjust, alphaCut, quantizeOrdered, quantizeDiffusion, removeOrphans, smoothMajority, outline } from './stages.js';\r\n\r\n/**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA bytes, rows top-down\r\n * @returns {Uint8ClampedArray} RGBA bytes, plan.width \u00D7 plan.height\r\n */\r\nexport function runCPU(plan, src) {\r\n const { width: w, height: h, settings: s } = plan;\r\n const buf = resample(src, w, h, s.size.resample, plan.crop);\r\n adjust(buf, s.adjust);\r\n alphaCut(buf, s.alpha.threshold);\r\n const px = plan.kind === 'diffusion' ? quantizeDiffusion(buf, w, h, plan) : quantizeOrdered(buf, w, h, plan);\r\n if (s.cleanup.orphans) removeOrphans(px, w, h);\r\n if (s.cleanup.smooth) smoothMajority(px, w, h);\r\n outline(px, w, h, plan.outline);\r\n return px;\r\n}\r\n", "/* global __VERSION__ */\n// __VERSION__ is injected by esbuild (see esbuild.config.mjs); falls back when running src/ directly.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '2.0.0-dev';\nexport const MAX_CHANNELS = 4;\nexport const DEFAULT_CANVAS_ID = 'glcanvas';\n", "export class ShaderMateError extends Error {\n constructor(message, details) {\n super(message);\n this.name = 'ShaderMateError';\n if (details) Object.assign(this, details);\n }\n}\n\nconst warned = new Set();\n/** console.warn once per key. */\nexport function warnOnce(key, ...args) {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn('[ShaderMate]', ...args);\n}\n\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nexport const isArrayLike = v => Array.isArray(v) || (ArrayBuffer.isView(v) && !(v instanceof DataView));\nexport const toArray = v => (v == null ? [] : Array.isArray(v) ? v : [v]);\nexport const isPow2 = n => n > 0 && (n & (n - 1)) === 0;\nexport const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));\n\n/** `glsl` tagged template: no-op, but lets editors syntax-highlight inline shaders. */\nexport const glsl = (strings, ...values) => String.raw({ raw: strings }, ...values);\n\n/** Parse a CSS color ('#f80', 'rgb(\u2026)', 'red') or [r,g,b,a] into [r,g,b,a] 0..1. */\nexport function parseColor(c) {\n if (c == null) return null;\n if (Array.isArray(c)) return [c[0] ?? 0, c[1] ?? 0, c[2] ?? 0, c[3] ?? 1];\n if (typeof c === 'string' && isBrowser) {\n const cv = document.createElement('canvas');\n cv.width = cv.height = 1;\n const x = cv.getContext('2d');\n x.fillStyle = c;\n x.fillRect(0, 0, 1, 1);\n const d = x.getImageData(0, 0, 1, 1).data;\n return [d[0] / 255, d[1] / 255, d[2] / 255, d[3] / 255];\n }\n return null;\n}\n\n/** True when running on localhost / file: \u2014 used for dev-only defaults. */\nexport function isDevHost() {\n if (!isBrowser) return false;\n const h = location.hostname;\n return location.protocol === 'file:' || h === 'localhost' || h === '127.0.0.1' || h === '' || h.endsWith('.local');\n}\n", "/** Reference-counted store for GL objects so shared resources are freed exactly once. */\nexport class RefPool {\n constructor(gl) {\n this.gl = gl;\n this._items = new Map(); // id -> { obj, count, type }\n this._nextId = 1;\n }\n\n add(obj, type) {\n const id = this._nextId++;\n this._items.set(id, { obj, count: 1, type });\n return id;\n }\n\n ref(id) {\n const it = this._items.get(id);\n if (it) it.count++;\n return id;\n }\n\n /** Returns the raw GL object for an id (or null). */\n get(id) {\n const it = this._items.get(id);\n return it ? it.obj : null;\n }\n\n unref(id) {\n const it = this._items.get(id);\n if (!it) return;\n it.count--;\n if (it.count <= 0) this._destroy(id, it);\n }\n\n _destroy(id, it) {\n const { obj, type } = it;\n const gl = this.gl;\n switch (type) {\n case 'texture2D':\n case 'textureCube': gl.deleteTexture(obj); break;\n case 'fbo': gl.deleteFramebuffer(obj); break;\n case 'buffer': gl.deleteBuffer(obj); break;\n case 'program': gl.deleteProgram(obj); break;\n }\n this._items.delete(id);\n }\n\n /** Destroy everything regardless of refcount. */\n dispose() {\n for (const [id, it] of [...this._items]) this._destroy(id, it);\n }\n}\n", "/**\n * Tiny event emitter. `forward(ev, data)` (optional) receives every emitted event,\n * which is how instances feed the global ShaderMate.on() bus.\n */\nexport function createEmitter(forward) {\n const map = new Map();\n\n function on(ev, fn) {\n if (!map.has(ev)) map.set(ev, new Set());\n map.get(ev).add(fn);\n return () => off(ev, fn);\n }\n function off(ev, fn) {\n const s = map.get(ev);\n if (s) s.delete(fn);\n }\n function once(ev, fn) {\n const wrapped = data => { off(ev, wrapped); fn(data); };\n return on(ev, wrapped);\n }\n function emit(ev, data) {\n const s = map.get(ev);\n if (s) {\n for (const fn of [...s]) {\n try { fn(data); } catch (e) { console.error(`[ShaderMate] error in \"${ev}\" listener`, e); }\n }\n }\n if (forward) forward(ev, data);\n }\n function clear() { map.clear(); }\n\n return { on, off, once, emit, clear };\n}\n", "// Tiny tween engine for uniforms: sm.tween('u_hover', 1, { duration: 400, ease: 'outCubic' })\n\nexport const EASES = {\n linear: t => t,\n inQuad: t => t * t,\n outQuad: t => t * (2 - t),\n inOutQuad: t => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n inCubic: t => t * t * t,\n outCubic: t => 1 - Math.pow(1 - t, 3),\n inOutCubic: t => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2),\n outExpo: t => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n outBack: t => 1 + 2.70158 * Math.pow(t - 1, 3) + 1.70158 * Math.pow(t - 1, 2),\n outElastic: t => (t === 0 || t === 1 ? t : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * Math.PI) / 3) + 1),\n};\n\nexport function createTweens() {\n const active = new Map(); // key -> tween\n\n /**\n * getter/setter work on the live uniform value. Resolves when finished (false if interrupted).\n */\n function tween(key, get, set, to, opts = {}) {\n const { duration = 500, delay = 0 } = opts;\n const ease = typeof opts.ease === 'function' ? opts.ease : (EASES[opts.ease] || EASES.outCubic);\n const prev = active.get(key);\n if (prev) prev.resolve(false);\n\n const from = get();\n const isArr = Array.isArray(to) || ArrayBuffer.isView(to);\n const f = isArr ? Array.from(from ?? to) : Number(from ?? 0);\n const t = isArr ? Array.from(to) : Number(to);\n\n return new Promise(resolve => {\n const tw = {\n start: performance.now() + delay,\n resolve: v => { active.delete(key); resolve(v); },\n update(now) {\n const p = duration > 0 ? clamp01((now - this.start) / duration) : 1;\n if (p < 0) return;\n const e = ease(p);\n set(isArr ? f.map((a, i) => a + (t[i] - a) * e) : f + (t - f) * e);\n if (p >= 1) this.resolve(true);\n }\n };\n active.set(key, tw);\n });\n }\n\n function update(now) {\n for (const tw of [...active.values()]) tw.update(now);\n }\n\n function cancel(key) {\n if (key === undefined) { for (const tw of [...active.values()]) tw.resolve(false); return; }\n const tw = active.get(key);\n if (tw) tw.resolve(false);\n }\n\n return { tween, update, cancel, get size() { return active.size; } };\n}\n\nconst clamp01 = v => (v < 0 ? v : v > 1 ? 1 : v);\n", "import { MAX_CHANNELS } from '../constants.js';\nimport { ShaderMateError } from '../utils/util.js';\n\n/**\n * Normalize everything the user may pass as \"the shaders\" into an array of pass configs.\n *\n * 'frag.glsl' | '...glsl source...' -> one screen pass\n * { shader|src, ... } -> one pass\n * [ 'a.glsl', { name, shader, ... }, ... ] -> multipass (last one hits the screen unless `screen` is set)\n *\n * Caller objects are shallow-cloned; `uniforms` is kept by reference so live mutation works.\n */\nexport function normalizePasses(input) {\n let list;\n if (typeof input === 'string') list = [{ src: input }];\n else if (Array.isArray(input)) list = input.map(p => (typeof p === 'string' ? { src: p } : { ...p }));\n else if (input && typeof input === 'object') list = [{ ...input }];\n else throw new ShaderMateError('ShaderMate: expected a shader (string), a pass object, or an array of passes');\n if (!list.length) throw new ShaderMateError('ShaderMate: no passes given');\n\n list.forEach((p, i) => {\n if (p.src == null) p.src = p.shader ?? p.frag ?? p.fragment ?? p.glsl ?? p.url;\n if (p.src == null) throw new ShaderMateError(`Pass ${p.name ?? i} has no shader source (use \"shader\")`);\n if (p.name == null) p.name = list.length === 1 ? 'main' : 'pass' + i;\n if (p.uniforms == null) p.uniforms = {};\n });\n\n if (!list.some(p => p.screen)) list[list.length - 1].screen = true;\n if (list.filter(p => p.screen).length > 1) console.warn('[ShaderMate] Multiple screen:true passes; last drawn wins.');\n\n const names = list.map(p => p.name);\n const dupes = names.filter((n, i) => names.indexOf(n) !== i);\n if (dupes.length) throw new ShaderMateError('Duplicate pass names: ' + [...new Set(dupes)].join(', '));\n\n for (const p of list) {\n const chans = Array.isArray(p.channels) ? p.channels : (p.channels ? [p.channels] : []);\n p.channels = chans.slice(0, MAX_CHANNELS).map(c => normalizeChannel(c, names, p.name));\n while (p.channels.length < MAX_CHANNELS) p.channels.push(null);\n }\n return list;\n}\n\nconst isEl = v => typeof HTMLElement !== 'undefined' && v instanceof HTMLElement;\nconst isBitmap = v => typeof ImageBitmap !== 'undefined' && v instanceof ImageBitmap;\nconst isTex = v => typeof WebGLTexture !== 'undefined' && v instanceof WebGLTexture;\n\n/**\n * Channel shorthand:\n * 'BufferA' -> that pass's output (if a pass has that name), else an image URL\n * { pass:'A' } / { id:'A' } -> pass output (buffer: 'prev' | 'current' for ping-pong passes)\n * { url|image }, { video }, { audio|audioFFT }, { mic:true }, { camera:true }, { cubemap:[6 urls] }\n * { element } or a raw <canvas>/<video>/<img>/ImageBitmap\n * { texture: WebGLTexture, width, height, cube? }\n * common params: wrap, filter, flipY, mipmap\n */\nexport function normalizeChannel(ch, passNames = [], ownerName = '') {\n if (ch == null || ch === false) return null;\n if (typeof ch === 'string') return passNames.includes(ch) ? { pass: ch } : { url: ch };\n if (isEl(ch) || isBitmap(ch)) return { element: ch };\n if (isTex(ch)) return { texture: ch };\n const out = { ...ch };\n if (out.pass == null && out.id != null) out.pass = out.id;\n if (out.url == null && out.image != null) out.url = out.image;\n if (out.element == null && out.canvas != null) out.element = out.canvas;\n if (out.pass == null && out.src != null && out.url == null && out.video == null) out.url = out.src;\n if (out.pass != null && !passNames.includes(out.pass)) {\n console.warn(`[ShaderMate] Pass \"${ownerName}\": channel references unknown pass \"${out.pass}\"`);\n }\n return out;\n}\n\n/** True if `src` is GLSL text rather than a URL/path. */\nexport function isInlineSource(src) {\n return /[\\r\\n]/.test(src) || /^\\s*(void|#|precision|uniform|in |out |\\/\\/|\\/\\*)/.test(src) || /[{};]/.test(src);\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\nexport const isWebGL2 = gl =>\n typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n\n/**\n * options.webgl: 'auto' (default) | 2 | 1\n * options.alpha / premultipliedAlpha / preserveDrawingBuffer / antialias, plus options.contextAttributes.\n */\nexport function createContext(canvas, options = {}) {\n const attrs = Object.assign({\n alpha: options.alpha !== false,\n premultipliedAlpha: options.premultipliedAlpha !== false,\n preserveDrawingBuffer: !!options.preserveDrawingBuffer,\n antialias: !!options.antialias,\n powerPreference: options.powerPreference || 'default',\n }, options.contextAttributes);\n\n const want = options.webgl === undefined ? 'auto' : String(options.webgl);\n let gl = null;\n if (want === 'auto' || want === '2') gl = canvas.getContext('webgl2', attrs);\n if (!gl && (want === 'auto' || want === '1')) {\n gl = canvas.getContext('webgl', attrs) || canvas.getContext('experimental-webgl', attrs);\n }\n if (!gl) throw new ShaderMateError('WebGL not supported');\n return gl;\n}\n\nexport function getExtensions(gl, isGL2) {\n const ext = {};\n if (!isGL2) {\n ext.OES_texture_float = gl.getExtension('OES_texture_float');\n ext.OES_texture_half_float = gl.getExtension('OES_texture_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n ext.OES_texture_half_float_linear = gl.getExtension('OES_texture_half_float_linear');\n ext.OES_standard_derivatives = gl.getExtension('OES_standard_derivatives');\n ext.WEBGL_color_buffer_float = gl.getExtension('WEBGL_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.WEBGL_depth_texture = gl.getExtension('WEBGL_depth_texture');\n ext.EXT_shader_texture_lod = gl.getExtension('EXT_shader_texture_lod');\n } else {\n ext.EXT_color_buffer_float = gl.getExtension('EXT_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n }\n return ext;\n}\n", "/** Full-screen two-triangle quad. One per instance (GL buffers can't be shared across contexts). */\nexport function createQuad(gl) {\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n -1, -1, 1, -1, -1, 1,\n -1, 1, 1, -1, 1, 1\n ]), gl.STATIC_DRAW);\n\n return {\n /** Bind the quad to `program`'s a_position attribute (call right before drawing). */\n bind(program) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n const loc = gl.getAttribLocation(program, 'a_position');\n if (loc !== -1) {\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);\n }\n },\n draw() { gl.drawArrays(gl.TRIANGLES, 0, 6); },\n dispose() { gl.deleteBuffer(buf); }\n };\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\n/**\n * Parse a driver info log into [{ line, message }], with `line` relative to the user's\n * source (the injected `#line 1`), so errors point at the file the author wrote.\n */\nexport function parseShaderLog(log, src) {\n const lines = src.split('\\n');\n const userStart = lines.findIndex(l => /^\\s*#line\\s+1\\b/.test(l)) + 1;\n const errors = [];\n for (const row of log.split('\\n')) {\n const m = /ERROR:\\s*\\d+:(\\d+):\\s*(.*)/.exec(row);\n if (!m) continue;\n const logical = parseInt(m[1], 10);\n const physical = userStart > 0 ? userStart + logical - 1 : logical - 1; // 0-based index into `lines`\n errors.push({ line: logical, message: m[2].trim(), source: lines[physical] ?? '', physical });\n }\n return errors;\n}\n\n/**\n * Compile one shader. Returns { shader } or { error: ShaderMateError }.\n */\nexport function compileShader(gl, type, src, { label = '', showExpandedOnError = true } = {}) {\n const sh = gl.createShader(type);\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (gl.getShaderParameter(sh, gl.COMPILE_STATUS)) return { shader: sh };\n\n const log = gl.getShaderInfoLog(sh) || '';\n gl.deleteShader(sh);\n const errors = parseShaderLog(log, src);\n const stage = type === gl.VERTEX_SHADER ? 'Vertex' : 'Fragment';\n const summary = errors.length\n ? errors.map(e => `line ${e.line}: ${e.message}`).join('\\n')\n : log.trim();\n const err = new ShaderMateError(`${stage} shader compile error${label ? ` in pass \"${label}\"` : ''}:\\n${summary}`,\n { pass: label, stage, log, errors, source: src });\n\n if (showExpandedOnError) {\n const marks = new Set(errors.map(e => e.physical));\n const numbered = src.split('\\n').map((line, i) =>\n `${marks.has(i) ? '>>>' : ' '} ${String(i + 1).padStart(4, ' ')} | ${line}`).join('\\n');\n console.error('[ShaderMate] ' + err.message, { COMPILED: '\\n' + numbered });\n } else {\n console.error('[ShaderMate] ' + err.message);\n }\n return { error: err };\n}\n\n/** Link a program. Returns { program } or { error }. */\nexport function createProgram(gl, vsrc, fsrc, opts) {\n const v = compileShader(gl, gl.VERTEX_SHADER, vsrc, opts);\n if (v.error) return v;\n const f = compileShader(gl, gl.FRAGMENT_SHADER, fsrc, opts);\n if (f.error) { gl.deleteShader(v.shader); return f; }\n\n const p = gl.createProgram();\n gl.attachShader(p, v.shader);\n gl.attachShader(p, f.shader);\n gl.linkProgram(p);\n gl.deleteShader(v.shader);\n gl.deleteShader(f.shader);\n\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(p) || '';\n gl.deleteProgram(p);\n const err = new ShaderMateError(`Program link error${opts && opts.label ? ` in pass \"${opts.label}\"` : ''}: ${log}`, { pass: opts && opts.label, log });\n console.error('[ShaderMate] ' + err.message);\n return { error: err };\n }\n return { program: p };\n}\n\n/** name -> { loc, type, size } for every active uniform (array names have `[0]` stripped). */\nexport function getUniformInfo(gl, program) {\n const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n const out = {};\n for (let i = 0; i < n; i++) {\n const info = gl.getActiveUniform(program, i);\n if (!info) continue;\n out[info.name.replace(/\\[0\\]$/, '')] = {\n loc: gl.getUniformLocation(program, info.name),\n type: info.type,\n size: info.size\n };\n }\n return out;\n}\n", "export const VERT_GL2 = `#version 300 es\nlayout(location=0) in vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\nexport const VERT_GL1 = `attribute vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\n/** Texture-sampling compatibility macros so the same source compiles as GLSL ES 1.00 and 3.00. */\nexport const BUILTIN_MACROS_GL2 = `#define texture2D(s,u) texture(s,u)\n#define textureCube(s,u) texture(s,u)\n#define TEX(s,u) texture(s,u)\n#define TEX_LOD(s,u,l) textureLod(s,u,l)\n`;\n\nexport const BUILTIN_MACROS_GL1 = `#define texture(s,u) texture2D(s,u)\n#define TEX(s,u) texture2D(s,u)\n#define TEX_LOD(s,u,l) texture2D(s,u)\n`;\n\nexport const MAIN_WRAP_GL2 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n outColor = c;\n}`;\n\nexport const MAIN_WRAP_GL1 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n gl_FragColor = c;\n}`;\n", "import { createProgram } from './shader.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\n\nconst FRAG_GL2 = `#version 300 es\nprecision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size; out vec4 o;\nvoid main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`;\nconst FRAG_GL1 = `precision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size;\nvoid main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;\n\n/** Copies a texture to the default framebuffer (used when the screen pass also needs a readable backbuffer). */\nexport function createBlit(gl, isGL2, quad) {\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, isGL2 ? FRAG_GL2 : FRAG_GL1, { label: 'blit' });\n if (r.error) throw r.error;\n const program = r.program;\n const uTex = gl.getUniformLocation(program, 'u_tex');\n const uSize = gl.getUniformLocation(program, 'u_size');\n return {\n draw(tex, w, h) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, w, h);\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.uniform1i(uTex, 0);\n gl.uniform2f(uSize, w, h);\n quad.bind(program);\n quad.draw();\n },\n dispose() { gl.deleteProgram(program); }\n };\n}\n", "/** 'clamp' (default) | 'repeat' | 'mirror' */\nexport function wrapMode(gl, wrap) {\n if (wrap === 'repeat') return gl.REPEAT;\n if (wrap === 'mirror' || wrap === 'mirrored') return gl.MIRRORED_REPEAT;\n return gl.CLAMP_TO_EDGE;\n}\n\n/** 'linear' (default) | 'nearest' */\nexport function filterMode(gl, filter) {\n return filter === 'nearest' ? gl.NEAREST : gl.LINEAR;\n}\n", "import { wrapMode, filterMode } from './params.js';\nimport { warnOnce } from '../utils/util.js';\n\nfunction chooseFormat(gl, isGL2, ext, opts) {\n let ifmt = isGL2 ? gl.RGBA8 : gl.RGBA;\n const fmt = gl.RGBA;\n let type = gl.UNSIGNED_BYTE;\n\n if (opts.float === 'full' || opts.float === 32) {\n if (isGL2) { ifmt = gl.RGBA32F; type = gl.FLOAT; }\n else if (ext.OES_texture_float) type = gl.FLOAT;\n } else if (opts.float) {\n if (isGL2) { ifmt = gl.RGBA16F; type = gl.HALF_FLOAT; }\n else if (ext.OES_texture_half_float) type = ext.OES_texture_half_float.HALF_FLOAT_OES;\n else if (ext.OES_texture_float) type = gl.FLOAT;\n }\n return { ifmt, fmt, type };\n}\n\nfunction isRenderable(gl, ifmt, fmt, type) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, ifmt, 4, 4, 0, fmt, type, null);\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n const ok = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(fbo);\n gl.deleteTexture(tex);\n return ok;\n}\n\n/** Create a colour (+ optional depth) render target. Falls back to 8-bit if float isn't renderable. */\nexport function createTarget(gl, pool, w, h, opts, isGL2, ext) {\n const wanted = chooseFormat(gl, isGL2, ext, opts);\n let chosen = wanted;\n if (!isRenderable(gl, wanted.ifmt, wanted.fmt, wanted.type)) {\n warnOnce('fmt-fallback', 'Requested float format not renderable on this device; falling back to 8-bit.');\n chosen = { ifmt: isGL2 ? gl.RGBA8 : gl.RGBA, fmt: gl.RGBA, type: gl.UNSIGNED_BYTE };\n }\n // Linear filtering of float textures needs an extension; silently use nearest when unavailable.\n let filterOpt = opts.filter;\n if (chosen.type !== gl.UNSIGNED_BYTE && filterOpt !== 'nearest') {\n const linearOK = isGL2\n ? (chosen.type === gl.HALF_FLOAT || ext.OES_texture_float_linear)\n : (chosen.type === gl.FLOAT ? ext.OES_texture_float_linear : ext.OES_texture_half_float_linear);\n if (!linearOK) filterOpt = 'nearest';\n }\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n const wrap = wrapMode(gl, opts.wrap);\n const filter = filterMode(gl, filterOpt);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n gl.texImage2D(gl.TEXTURE_2D, 0, chosen.ifmt, w, h, 0, chosen.fmt, chosen.type, null);\n\n let depthTex = null;\n if (opts.depth) {\n if (!isGL2 && !ext.WEBGL_depth_texture) {\n warnOnce('depth-tex', 'depth: true needs WebGL2 or WEBGL_depth_texture; ignoring.');\n } else {\n depthTex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, depthTex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, isGL2 ? gl.DEPTH_COMPONENT16 : gl.DEPTH_COMPONENT,\n w, h, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null);\n }\n }\n\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n if (depthTex) gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTex, 0);\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n if (status !== gl.FRAMEBUFFER_COMPLETE) console.warn('[ShaderMate] Framebuffer incomplete:', status);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n depthId: depthTex ? pool.add(depthTex, 'texture2D') : null,\n fboId: pool.add(fbo, 'fbo'),\n width: w,\n height: h,\n fmt: chosen\n };\n}\n\nexport function deleteTarget(pool, t) {\n if (!t) return;\n pool.unref(t.texId);\n if (t.depthId) pool.unref(t.depthId);\n pool.unref(t.fboId);\n}\n\n/** Resolve a pass `size` option against the canvas size. */\nexport function resolvePassSize(size, cw, ch) {\n const c = n => Math.max(1, Math.round(n));\n if (size == null || size === 'screen' || size === 'canvas') return [cw, ch];\n if (size === 'half') return [c(cw / 2), c(ch / 2)];\n if (size === 'quarter') return [c(cw / 4), c(ch / 4)];\n if (typeof size === 'number') return [c(cw * size), c(ch * size)]; // scale factor\n if (Array.isArray(size)) return [c(size[0]), c(size[1])];\n if (typeof size === 'object' && size.width && size.height) return [c(size.width), c(size.height)];\n return [cw, ch];\n}\n", "// Built-in uniforms. They are declared automatically when a shader uses them\n// (and not already declared), and uploaded every frame when present in the program.\n//\n// ShaderToy names short names\n// vec3 iResolution vec2 u_resolution\n// float iTime float u_time\n// float iTimeDelta float u_delta\n// int iFrame int u_frame\n// float iFrameRate float u_fps\n// vec4 iMouse (x,y, click.x,click.y) vec2 u_mouse pixels, bottom-left origin\n// vec2 u_mouseUV 0..1\n// float u_mouseDown 0/1\n// vec4 iDate vec4 u_date\n// vec2 iScroll vec2 u_scroll page scroll in px\n// float u_pixelRatio\n// float u_aspect width / height\n// float iChannelTime[4]\n// vec3 iChannelResolution[4]\n// samplerX iChannel0..3\n\nexport const BUILTIN_UNIFORMS = {\n iResolution: 'vec3', iTime: 'float', iTimeDelta: 'float', iFrame: 'int', iFrameRate: 'float',\n iMouse: 'vec4', iDate: 'vec4', iScroll: 'vec2', iSampleRate: 'float',\n iChannelTime: 'float[4]', iChannelResolution: 'vec3[4]',\n u_resolution: 'vec2', u_time: 'float', u_delta: 'float', u_frame: 'int', u_fps: 'float',\n u_mouse: 'vec2', u_mouseUV: 'vec2', u_mouseDown: 'float', u_date: 'vec4', u_scroll: 'vec2',\n u_pixelRatio: 'float', u_aspect: 'float',\n // FragCoord.xyz-style names (declare `uniform vec4 u_mouse;` / `uniform float u_scroll;` yourself to get those shapes)\n u_time_delta: 'float', u_refresh_rate: 'float', u_drag: 'vec2', u_wheel: 'float',\n};\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/** ShaderToy legacy aliases. */\nexport const BUILTIN_DEFINES = '#define iGlobalTime iTime\\n';\n\n/** `out vec4 fragColor` (FragCoord.xyz / GLSL 3 style) when a shader writes to fragColor from its own main(). */\nexport function declareFragColor(src, isGL2) {\n const code = stripComments(src);\n if (!/\\bfragColor\\b/.test(code) || !/\\bvoid\\s+main\\s*\\(/.test(code)) return '';\n if (/\\bout\\s+vec4\\s+fragColor\\b/.test(code) || /#define\\s+fragColor\\b/.test(code)) return '';\n return isGL2 ? 'out vec4 fragColor;\\n' : '#define fragColor gl_FragColor\\n';\n}\n\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n */\n/** FragCoord.xyz-only built-ins (declared when used in a FragCoord-style shader or when dialect: 'fragcoord'). */\nexport const FRAGCOORD_UNIFORMS = {\n u_camera_pos: 'vec3', u_camera_dir: 'vec3', u_camera_view: 'mat4',\n u_recursion: 'int', u_max_recursion: 'int', u_color_gamut: 'int',\n};\n/** Sampler built-ins bound by name (see core/samplers.js). */\nexport const SAMPLER_BUILTINS = ['u_audio', 'u_keyboard', 'u_webcam', 'u_main'];\n\n/**\n * Heuristic: a FragCoord.xyz sketch writes `fragColor` from its own `main()` and never uses mainImage.\n */\nexport function looksLikeFragCoord(src) {\n const code = stripComments(src);\n return /\\bfragColor\\b/.test(code) && /\\bvoid\\s+main\\s*\\(/.test(code) && !/\\bmainImage\\s*\\(/.test(code);\n}\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n * opts.mouseVec4 / opts.scrollFloat switch u_mouse / u_scroll to the FragCoord.xyz shapes.\n * opts.samplerNames: extra sampler2D names to declare when used (pass samplers like u_pass1, u_blur).\n * opts.passCount: size for `u_passes[N]`.\n */\nexport function declareBuiltins(src, channelTypes = [], opts = {}) {\n const code = stripComments(src);\n let out = '';\n const declared = name => new RegExp('uniform\\\\s+(?:\\\\w+\\\\s+)*' + name + '\\\\b').test(code);\n const used = name => new RegExp('\\\\b' + name + '\\\\b').test(code);\n const types = Object.assign({}, BUILTIN_UNIFORMS, opts.fragcoord ? FRAGCOORD_UNIFORMS : null);\n if (opts.mouseVec4) types.u_mouse = 'vec4';\n if (opts.scrollFloat) types.u_scroll = 'float';\n\n for (const name in types) {\n if (!used(name) || declared(name)) continue;\n const t = types[name];\n const m = /^(\\w+)\\[(\\d+)\\]$/.exec(t);\n out += m ? `uniform ${m[1]} ${name}[${m[2]}];\\n` : `uniform ${t} ${name};\\n`;\n }\n for (let i = 0; i < 4; i++) {\n const name = 'iChannel' + i;\n if (!used(name) || declared(name)) continue;\n out += `uniform ${channelTypes[i] === 'cube' ? 'samplerCube' : 'sampler2D'} ${name};\\n`;\n }\n for (const name of new Set([...SAMPLER_BUILTINS, ...(opts.samplerNames || [])])) {\n if (used(name) && !declared(name)) out += `uniform sampler2D ${name};\\n`;\n }\n if (opts.passCount > 0 && /\\bu_passes\\b/.test(code) && !declared('u_passes')) out += `uniform sampler2D u_passes[${opts.passCount}];\\n`;\n return out;\n}\n", "import { BUILTIN_MACROS_GL1, BUILTIN_MACROS_GL2, MAIN_WRAP_GL1, MAIN_WRAP_GL2 } from './templates.js';\nimport { BUILTIN_DEFINES, declareBuiltins, declareFragColor } from './builtins.js';\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Expand `#include \"path\"` / `#include <path>` recursively.\n * Each file is included once (acts like an include guard); real cycles are reported.\n * `loader(path)` returns (a promise of) the file text.\n */\nexport async function resolveIncludes(src, { loader, throwOnError = false, warn = console.warn } = {}) {\n const done = new Set();\n const stack = [];\n\n async function expand(code) {\n const re = /^[ \\t]*#include\\s+[\"<]([^\">]+)[\">]/gm;\n let out = '';\n let last = 0;\n let m;\n while ((m = re.exec(code))) {\n const path = m[1];\n out += code.slice(last, m.index);\n last = re.lastIndex;\n\n if (stack.includes(path)) {\n warn('[ShaderMate] Circular include:', path);\n out += `\\n// skipped include \"${path}\" (circular)\\n`;\n } else if (done.has(path)) {\n out += `\\n// skipped include \"${path}\" (already included)\\n`;\n } else {\n done.add(path);\n stack.push(path);\n try {\n const raw = await loader(path);\n const expanded = await expand(raw);\n out += `\\n// begin include \"${path}\"\\n${expanded}\\n// end include \"${path}\"\\n`;\n } catch (e) {\n warn(`[ShaderMate] Failed to load include \"${path}\"`, e);\n if (throwOnError) throw e;\n out += `\\n// failed include \"${path}\"\\n`;\n } finally {\n stack.pop();\n }\n }\n }\n return out + code.slice(last);\n }\n return expand(src);\n}\n\n/** Turn defines (strings / {KEY: value} objects) into `#define` lines. */\nexport function defineLines(defines) {\n let out = '';\n for (const d of defines) {\n if (typeof d === 'string') out += `#define ${d}\\n`;\n else if (d && typeof d === 'object') {\n for (const k in d) {\n const v = d[k];\n out += (v === true || v === undefined) ? `#define ${k}\\n` : `#define ${k} ${v}\\n`;\n }\n }\n }\n return out;\n}\n\nexport const DEFAULT_INJECT = { header: true, builtins: true, uniforms: true, defines: true, mainWrap: true };\nexport const NO_INJECT = { header: false, builtins: false, uniforms: false, defines: false, mainWrap: false };\n\n/**\n * Wrap user GLSL into a complete fragment shader.\n * inject.header #version (GL2) + precision\n * inject.builtins texture compatibility macros, `out vec4 outColor` (GL2), iGlobalTime alias\n * inject.uniforms auto-declare built-in uniforms the shader uses (iTime, iResolution, iChannel0 \u2026)\n * inject.defines user #defines\n * inject.mainWrap wrap `mainImage(out vec4, in vec2)` in a main()\n */\nexport function assembleFragment(src, { isGL2, defines = [], enableDerivatives = false, inject = DEFAULT_INJECT, channelTypes = [], builtinOpts = {} } = {}) {\n if (!inject || !Object.values(inject).some(Boolean)) return src;\n\n // A user-supplied #version must stay on line 1: hoist it.\n let versionLine = '';\n let body = src;\n const vm = /^[ \\t]*#version[^\\n]*/m.exec(body);\n if (vm) {\n versionLine = vm[0].trim() + '\\n';\n body = body.slice(0, vm.index) + body.slice(vm.index + vm[0].length);\n }\n\n let head = '';\n if (versionLine) head += versionLine;\n else if (inject.header && isGL2) head += '#version 300 es\\n';\n // #extension must precede any non-preprocessor token (incl. precision statements).\n if (inject.builtins && !isGL2 && enableDerivatives) head += '#extension GL_OES_standard_derivatives : enable\\n';\n if (inject.header) head += 'precision highp float;\\nprecision highp int;\\n';\n if (inject.builtins) {\n head += isGL2 ? BUILTIN_MACROS_GL2 : BUILTIN_MACROS_GL1;\n head += BUILTIN_DEFINES;\n // Exactly one fragment output: the user's own `out vec4 \u2026`, a `fragColor` they write to from\n // main() (FragCoord.xyz / GLSL 3 style), or our `outColor` for the mainImage wrapper.\n const fragDecl = declareFragColor(body, isGL2);\n const userOut = /\\bout\\s+(?:\\w+\\s+)*vec4\\s+\\w+\\s*;/.test(stripComments(body)); // a declaration, not a `mainImage(out vec4 c, \u2026)` parameter\n if (fragDecl) head += fragDecl;\n else if (isGL2 && !userOut) head += 'out vec4 outColor;\\n';\n }\n if (inject.uniforms) head += declareBuiltins(body, channelTypes, builtinOpts);\n if (inject.defines) head += defineLines(defines);\n\n const clean = stripComments(body);\n const needWrap = inject.mainWrap && /\\bmainImage\\s*\\(/.test(clean) && !/\\bvoid\\s+main\\s*\\(/.test(clean);\n\n let out = head + '#line 1\\n' + body;\n if (needWrap) out += isGL2 ? MAIN_WRAP_GL2 : MAIN_WRAP_GL1;\n return out;\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\nimport { isPow2, warnOnce } from '../utils/util.js';\n\n/**\n * Upload an image/video/canvas/ImageBitmap to a new 2D texture.\n * Returns a channel wrapper: { texId, width, height, update(), dispose? }.\n */\nexport function makeTexture2D(gl, pool, source, w, h, params = {}, env = {}, { dynamic = false, flipDefault = false } = {}) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n\n const flip = params.flipY === undefined ? flipDefault : !!params.flipY;\n // WebGL1 only supports clamp + no mipmaps on non-power-of-two textures\n const npotLimited = !env.isGL2 && !(isPow2(w) && isPow2(h));\n if (npotLimited && params.wrap && params.wrap !== 'clamp') {\n warnOnce('npot-wrap', 'Non-power-of-two texture in WebGL1: forcing wrap to clamp.');\n }\n const wrap = npotLimited ? gl.CLAMP_TO_EDGE : wrapMode(gl, params.wrap);\n const mip = !!params.mipmap && !dynamic && !npotLimited;\n const filter = filterMode(gl, params.filter);\n const minFilter = mip\n ? (params.filter === 'nearest' ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_LINEAR)\n : filter;\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n\n const upload = () => {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flip);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !!params.premultiplyAlpha);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n };\n upload();\n if (mip) gl.generateMipmap(gl.TEXTURE_2D);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n width: w,\n height: h,\n source,\n update: dynamic\n ? () => {\n if (source.readyState !== undefined && source.readyState < 2) return; // media not ready\n gl.bindTexture(gl.TEXTURE_2D, tex);\n upload();\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n : () => { }\n };\n}\n\nexport function loadImage(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const img = new Image();\n img.crossOrigin = params.crossOrigin === undefined ? 'anonymous' : params.crossOrigin;\n img.onload = () => res(makeTexture2D(gl, pool, img, img.naturalWidth, img.naturalHeight, params, env));\n img.onerror = () => rej(new Error(`Failed to load image \"${url}\"`));\n img.src = url;\n });\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\n\nconst FACE_NAMES = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n\n/** urls: [posx, negx, posy, negy, posz, negz] */\nexport function loadCubeMap(gl, pool, urls, params = {}) {\n return new Promise((res, rej) => {\n if (!Array.isArray(urls) || urls.length !== 6) return rej(new Error('cubemap needs an array of 6 URLs'));\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n const wrap = wrapMode(gl, params.wrap);\n const filter = filterMode(gl, params.filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, wrap);\n\n const faces = [\n gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Z, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n ];\n let loaded = 0, w = 0, h = 0, failed = false;\n\n urls.forEach((u, i) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n if (failed) return;\n if (!w) { w = img.width; h = img.height; }\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.texImage2D(faces[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n if (++loaded === 6) {\n if (params.mipmap) gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n res({ texId: pool.add(tex, 'textureCube'), width: w, height: h, cubemap: true, update() { } });\n }\n };\n img.onerror = () => {\n if (failed) return;\n failed = true;\n gl.deleteTexture(tex);\n rej(new Error(`Failed to load cubemap face ${FACE_NAMES[i]}: \"${u}\"`));\n };\n img.src = u;\n });\n });\n}\n", "import { makeTexture2D } from './image.js';\n\n/** Retry media playback on the first user gesture when autoplay is blocked. */\nexport function playOnGesture(media) {\n const p = media.play && media.play();\n if (p && p.catch) {\n p.catch(() => {\n const go = () => { media.play().catch(() => { }); };\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n });\n }\n}\n\n/** Video file -> live texture. `{ video: 'clip.mp4', muted, loop }` */\nexport function loadVideo(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const video = document.createElement('video');\n Object.assign(video, {\n src: url, crossOrigin: 'anonymous',\n loop: params.loop !== false, muted: params.muted !== false, playsInline: true, autoplay: true\n });\n video.addEventListener('error', () => rej(new Error(`Failed to load video \"${url}\"`)), { once: true });\n video.addEventListener('canplay', () => {\n playOnGesture(video);\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.getTime = () => video.currentTime;\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); video.removeAttribute('src'); video.load(); };\n res(wrapper);\n }, { once: true });\n video.load();\n });\n}\n\n/** Webcam -> live texture. `{ camera: true }` or `{ camera: { facingMode: 'user' } }` */\nexport function loadCamera(gl, pool, params = {}, env = {}) {\n const constraints = typeof params.camera === 'object' ? params.camera : { facingMode: 'user' };\n return navigator.mediaDevices.getUserMedia({ video: constraints, audio: false }).then(stream => new Promise(res => {\n const video = document.createElement('video');\n Object.assign(video, { srcObject: stream, muted: true, playsInline: true, autoplay: true });\n video.addEventListener('loadedmetadata', () => {\n video.play().catch(() => { });\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); stream.getTracks().forEach(t => t.stop()); };\n res(wrapper);\n }, { once: true });\n }));\n}\n", "/**\n * Audio -> spectrum texture (width = fftSize/2, 8-bit, read `.r`).\n * Row 0 = frequency spectrum, row 1 = waveform (ShaderToy layout). Height is 2.\n * { audio: 'song.mp3', fftSize: 1024 } file (loops, starts on first user gesture)\n * { mic: true } microphone input\n * { audio: audioElement } an <audio> element you control yourself\n */\nexport function loadAudio(gl, pool, ch, { mic = false } = {}) {\n const spectro = ch.layout === 'spectrogram'; // FragCoord.xyz u_audio: 512x512, scrolling history\n const fftSize = ch.fftSize || (spectro ? 1024 : 512);\n const AC = window.AudioContext || window.webkitAudioContext;\n\n return new Promise((res, rej) => {\n const ctx = new AC();\n const analyser = ctx.createAnalyser();\n analyser.fftSize = fftSize;\n analyser.smoothingTimeConstant = ch.smoothing ?? 0.8;\n\n const bins = analyser.frequencyBinCount;\n const wave = new Uint8Array(fftSize);\n // ShaderToy layout: bins x 2 (row 0 spectrum, row 1 waveform), LUMINANCE.\n // Spectrogram layout: bins x bins RGB, row 0 = newest (R weighted FFT, G waveform, B raw FFT), older rows above.\n const H = spectro ? bins : 2;\n const chans = spectro ? 3 : 1;\n const data = new Uint8Array(bins * H * chans);\n const rawFFT = spectro ? new Uint8Array(bins) : null;\n let rawAnalyser = null;\n if (spectro) { rawAnalyser = ctx.createAnalyser(); rawAnalyser.fftSize = fftSize; rawAnalyser.smoothingTimeConstant = 0; }\n\n const tex = gl.createTexture();\n const fmt = spectro ? gl.RGB : gl.LUMINANCE;\n const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, fmt, bins, H, 0, fmt, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n upload();\n\n let getTime = () => ctx.currentTime;\n let cleanup = () => { };\n\n const finish = () => {\n const resume = () => { if (ctx.state === 'suspended') ctx.resume(); };\n resume();\n window.addEventListener('pointerdown', resume, { once: true });\n window.addEventListener('keydown', resume, { once: true });\n res({\n texId: pool.add(tex, 'texture2D'),\n width: bins, height: H,\n analyser, context: ctx,\n getTime,\n update() {\n if (spectro) {\n const row = bins * 3;\n data.copyWithin(row, 0, data.length - row); // scroll history up one row\n analyser.getByteFrequencyData(rawFFT); // smoothed (\"weighted\") spectrum\n analyser.getByteTimeDomainData(wave);\n for (let i = 0; i < bins; i++) { data[i * 3] = rawFFT[i]; data[i * 3 + 1] = wave[i * 2]; }\n rawAnalyser.getByteFrequencyData(rawFFT); // unsmoothed\n for (let i = 0; i < bins; i++) data[i * 3 + 2] = rawFFT[i];\n } else {\n analyser.getByteFrequencyData(data.subarray(0, bins));\n analyser.getByteTimeDomainData(wave);\n data.set(wave.subarray(0, bins), bins);\n }\n upload();\n },\n dispose() { cleanup(); ctx.close && ctx.close(); }\n });\n };\n\n if (mic) {\n navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(stream => {\n const src = ctx.createMediaStreamSource(stream);\n src.connect(analyser); // not connected to destination: no feedback loop\n if (rawAnalyser) src.connect(rawAnalyser);\n cleanup = () => stream.getTracks().forEach(t => t.stop());\n finish();\n }).catch(rej);\n return;\n }\n\n const url = ch.audio || ch.audioFFT;\n const audio = url instanceof HTMLMediaElement ? url : new Audio();\n const owned = audio !== url;\n if (owned) Object.assign(audio, { src: url, crossOrigin: 'anonymous', loop: ch.loop !== false, autoplay: true });\n getTime = () => audio.currentTime;\n\n const connect = () => {\n const src = ctx.createMediaElementSource(audio);\n src.connect(analyser);\n if (rawAnalyser) src.connect(rawAnalyser);\n analyser.connect(ctx.destination);\n if (owned) {\n const go = () => { if (ctx.state === 'suspended') ctx.resume(); audio.play().catch(() => { }); };\n go();\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n cleanup = () => { audio.pause(); audio.removeAttribute('src'); audio.load(); };\n }\n finish();\n };\n if (audio.readyState >= 3) connect();\n else {\n audio.addEventListener('canplay', connect, { once: true });\n audio.addEventListener('error', () => rej(new Error(`Failed to load audio \"${url}\"`)), { once: true });\n if (owned) audio.load();\n }\n });\n}\n", "import { makeTexture2D } from './image.js';\n\nconst isCanvas = el => typeof HTMLCanvasElement !== 'undefined' && el instanceof HTMLCanvasElement;\nconst isVideo = el => typeof HTMLVideoElement !== 'undefined' && el instanceof HTMLVideoElement;\n\n/**\n * Use an existing element as a texture: <canvas>, <video>, <img>, ImageBitmap.\n * Canvases and videos are re-uploaded every frame (set `dynamic: false` to upload once).\n * Great for feeding a p5 / three.js / 2D canvas into a shader: channels: [myCanvas]\n */\nexport function loadElement(gl, pool, el, params = {}, env = {}) {\n const w = el.videoWidth || el.naturalWidth || el.width || 1;\n const h = el.videoHeight || el.naturalHeight || el.height || 1;\n const live = isCanvas(el) || isVideo(el);\n const dynamic = params.dynamic === undefined ? live : !!params.dynamic;\n const wrapper = makeTexture2D(gl, pool, el, w, h, params, env, { dynamic, flipDefault: live });\n if (isVideo(el)) wrapper.getTime = () => el.currentTime;\n // keep the reported size in sync with a canvas that is resized later\n if (dynamic) {\n const base = wrapper.update;\n wrapper.update = () => {\n wrapper.width = el.videoWidth || el.naturalWidth || el.width || 1;\n wrapper.height = el.videoHeight || el.naturalHeight || el.height || 1;\n base();\n };\n }\n return Promise.resolve(wrapper);\n}\n\n/** Wrap a WebGLTexture the user created elsewhere (same GL context). */\nexport function wrapTexture(gl, pool, ch) {\n const id = pool.add(ch.texture, ch.cube ? 'textureCube' : 'texture2D');\n pool.ref(id); // never deleted by us: the user owns it\n return Promise.resolve({ texId: id, width: ch.width || 1, height: ch.height || 1, cubemap: !!ch.cube, update() { } });\n}\n", "/**\n * Keyboard state texture, ShaderToy layout (also what FragCoord.xyz's u_keyboard describes):\n * 256 x 3, 8-bit, one column per key code:\n * row 0 key currently held (texelFetch(k, ivec2(code, 0), 0).x)\n * row 1 key pressed this frame\n * row 2 toggle (flips on each press)\n * Key codes follow ShaderToy: JS keyCode (letters are their uppercase ASCII, 32 = space, 37..40 = arrows\u2026).\n * { keyboard: true } or { keyboard: { target: element } }\n */\nexport function loadKeyboard(gl, pool, ch = {}) {\n const W = 256, ROWS = 3;\n const data = new Uint8Array(W * ROWS);\n const held = new Uint8Array(W);\n const pressed = new Uint8Array(W);\n const toggle = new Uint8Array(W);\n const target = (ch.keyboard && typeof ch.keyboard === 'object' && ch.keyboard.target) || window;\n\n const code = e => {\n if (typeof e.keyCode === 'number' && e.keyCode) return e.keyCode & 255;\n const k = e.key || '';\n return k.length === 1 ? k.toUpperCase().charCodeAt(0) & 255 : 0;\n };\n const onDown = e => {\n const c = code(e);\n if (!held[c]) { pressed[c] = 255; toggle[c] = toggle[c] ? 0 : 255; }\n held[c] = 255;\n };\n const onUp = e => { held[code(e)] = 0; };\n const onBlur = () => held.fill(0);\n target.addEventListener('keydown', onDown);\n target.addEventListener('keyup', onUp);\n window.addEventListener('blur', onBlur);\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, W, ROWS, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n upload();\n\n return Promise.resolve({\n texId: pool.add(tex, 'texture2D'),\n width: W, height: ROWS,\n keyboard: true,\n update() {\n data.set(held, 0);\n data.set(pressed, W);\n data.set(toggle, W * 2);\n upload();\n pressed.fill(0); // \"pressed\" lasts exactly one frame\n },\n dispose() {\n target.removeEventListener('keydown', onDown);\n target.removeEventListener('keyup', onUp);\n window.removeEventListener('blur', onBlur);\n }\n });\n}\n", "import { loadImage } from './image.js';\nimport { loadCubeMap } from './cubemap.js';\nimport { loadVideo, loadCamera } from './video.js';\nimport { loadAudio } from './audio.js';\nimport { loadElement, wrapTexture } from './element.js';\nimport { loadKeyboard } from './keyboard.js';\n\n/**\n * Load one external (non-pass) channel. Resolves to a wrapper\n * { texId, width, height, update(), cubemap?, getTime?, dispose? } or rejects.\n */\nexport function loadChannel(gl, pool, ch, env) {\n if (ch.texture) return wrapTexture(gl, pool, ch);\n if (ch.element) return loadElement(gl, pool, ch.element, ch, env);\n if (ch.url) return loadImage(gl, pool, ch.url, ch, env);\n if (ch.video) return loadVideo(gl, pool, ch.video, ch, env);\n if (ch.camera) return loadCamera(gl, pool, ch, env);\n if (ch.mic) return loadAudio(gl, pool, ch, { mic: true });\n if (ch.keyboard) return loadKeyboard(gl, pool, ch);\n if (ch.audio || ch.audioFFT) return loadAudio(gl, pool, ch);\n if (ch.cubemap) return loadCubeMap(gl, pool, ch.cubemap, ch);\n return Promise.reject(new Error('Unrecognised channel: ' + JSON.stringify(ch)));\n}\n\n/** Sampler type a channel will need in GLSL. */\nexport function channelSamplerType(ch) {\n if (!ch) return null;\n return ch.cubemap || (ch.texture && ch.cube) ? 'cube' : '2D';\n}\n", "// FragCoord.xyz conventions: multi-pass paste blobs and uniform comment annotations.\n// Everything here is plain text processing; the runtime binds the results.\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Split a pasted multi-pass blob into passes. Recognised headers (each on its own line):\n * // Pass 1 // Pass 2 \u2014 Horizontal blur // Main\n * // Common // Pass: blur \u2014 Buffer type: 2D\n * // ===== Pass: Name ===== (export style)\n * Returns null when no headers are present (plain single shader).\n */\nexport function splitPassBlob(text) {\n const re = /^[ \\t]*\\/\\/[ \\t]*(?:=+[ \\t]*)?(?:Pass[ \\t]*:?[ \\t]*([^\\n=\u2014\u2013-]+?)|(Main)|(Common))[ \\t]*(?:[\u2014\u2013-]+[^\\n]*)?(?:=+)?[ \\t]*$/gim;\n const heads = [];\n let m;\n while ((m = re.exec(text))) heads.push({ index: m.index, end: m.index + m[0].length, raw: m[0], pass: m[1], main: !!m[2], common: !!m[3] });\n if (!heads.length) return null;\n\n const out = { common: text.slice(0, heads[0].index).trim(), passes: [] };\n heads.forEach((h, i) => {\n const body = text.slice(h.end, i + 1 < heads.length ? heads[i + 1].index : text.length).trim();\n if (h.common) { out.common = (out.common ? out.common + '\\n' : '') + body; return; }\n const label = h.main ? 'main' : String(h.pass).trim();\n const bufferType = /buffer\\s*type\\s*:\\s*(\\w+)/i.exec(h.raw);\n const num = /^(\\d+)$/.exec(label);\n out.passes.push({\n name: h.main ? 'main' : (num ? 'pass' + num[1] : label.replace(/[^\\w]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase()),\n label,\n main: h.main,\n src: body,\n bufferType: bufferType ? bufferType[1].toLowerCase() : '2d',\n });\n });\n\n // Loose #define lines before the first header belong to Common (FragCoord hoists them).\n if (out.common && !/[{};]/.test(stripComments(out.common))) {\n // only defines/comments: fine as common\n }\n return out;\n}\n\n/** `[linear repeat mipmap]` / `[nearest clamp]` bracket settings -> channel params */\nexport function parseBracketSettings(s) {\n const p = {};\n const m = /\\[([^\\]]*)\\]/.exec(s || '');\n if (!m) return p;\n for (const word of m[1].toLowerCase().split(/[\\s,]+/)) {\n if (word === 'nearest' || word === 'linear') p.filter = word;\n else if (word === 'clamp' || word === 'repeat' || word === 'mirror') p.wrap = word;\n else if (word === 'mipmap') p.mipmap = true;\n else if (word === 'flipy' || word === 'flip') p.flipY = true;\n }\n return p;\n}\n\n/**\n * Parse uniform annotations FragCoord users write in comments and strip the (non-GLSL) initializers.\n *\n * uniform float u_speed; //1.0, [0.0, 5.0] -> value 1.0, min 0, max 5\n * uniform float u_x = 0.5; //[0.0, 5.0] -> value 0.5 (initializer removed from source)\n * uniform vec3 u_color; //0.2, 0.55, 1.0, [0, 1] -> value [0.2,0.55,1]\n * uniform sampler2D u_tex; //https://x/y.png [linear repeat]\n * uniform sampler2D u_clip; //https://x/loop.mp4 -> video + u_clip_time\n * uniform sampler2D u_a; // ref:pass1 [nearest clamp] | ref:pass:blur | ref:main | ref:sampler u_tex\n * uniform sampler2D u_audio; // mic | https://x.mp3 | [VIDEO] | [CAM]\n *\n * Returns { source, uniforms: { name: spec }, samplers: { name: channelSpec } }.\n */\nexport function parseUniformComments(src) {\n const uniforms = {};\n const samplers = {};\n const lines = src.split('\\n');\n const re = /^\\s*uniform\\s+(?:(?:lowp|mediump|highp)\\s+)?(\\w+)\\s+(\\w+)(?:\\s*\\[\\s*\\d+\\s*\\])?\\s*(?:=\\s*([^;]+))?;\\s*(?:\\/\\/(.*))?$/;\n\n const outLines = lines.map(line => {\n const m = re.exec(line);\n if (!m) return line;\n const [, type, name, init, comment = ''] = m;\n const c = comment.trim();\n const isSampler = /^sampler/.test(type);\n\n if (isSampler) {\n const spec = parseSamplerComment(name, c, type);\n if (spec) samplers[name] = spec;\n } else {\n const spec = {};\n const nums = s => (s.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g) || []).map(Number);\n const range = /\\[([^\\]]*)\\]/.exec(c);\n const defaults = nums(c.replace(/\\[[^\\]]*\\]/, ''));\n const comps = /vec(\\d)/.test(type) ? +type.match(/vec(\\d)/)[1] : 1;\n const isBool = /^bool/.test(type);\n let value;\n if (init) {\n const v = nums(init);\n value = comps === 1 ? (isBool ? /true/.test(init) : (v[0] ?? 0)) : v.slice(0, comps);\n } else if (defaults.length) {\n value = comps === 1 ? defaults[0] : (defaults.length >= comps ? defaults.slice(0, comps) : new Array(comps).fill(defaults[0]));\n }\n if (range) {\n const r = nums(range[1]);\n if (r.length >= 2) { spec.min = r[0]; spec.max = r[1]; if (r.length >= 3) spec.step = r[2]; }\n }\n if (value !== undefined || range) {\n spec.value = value !== undefined ? value : (comps === 1 ? (spec.min ?? 0) : new Array(comps).fill(spec.min ?? 0));\n uniforms[name] = spec;\n }\n }\n // GLSL ES has no uniform initializers: `uniform float x = 0.5;` -> `uniform float x;`\n return init ? line.replace(/\\s*=\\s*[^;]+;/, ';') : line;\n });\n\n return { source: outLines.join('\\n'), uniforms, samplers };\n}\n\nfunction parseSamplerComment(name, c, type) {\n const params = parseBracketSettings(c);\n const text = c.replace(/\\[[^\\]]*\\]/g, '').trim();\n\n const ref = /^ref:\\s*(.+)$/i.exec(text);\n if (ref) {\n const r = ref[1].trim();\n let m;\n if ((m = /^pass\\s*(\\d+)(?::out(\\d+))?$/i.exec(r))) return { pass: 'pass' + m[1], ...params };\n if ((m = /^pass:\\s*(\\S+)/i.exec(r))) return { pass: m[1], ...params };\n if (/^main$/i.test(r)) return { pass: 'main', ...params };\n if ((m = /^sampler\\s+(\\w+)/i.exec(r))) return { sameAs: m[1], ...params };\n return null;\n }\n if (name === 'u_audio' || /audio/i.test(name) && /^(mic|\\[CAM\\]|\\[VIDEO\\])?$/i.test(text)) {\n if (/^https?:|^data:/i.test(text)) return { audio: text, layout: 'spectrogram' };\n return { mic: true, layout: 'spectrogram' };\n }\n if (name === 'u_webcam') return { camera: true, ...params };\n if (name === 'u_keyboard') return { keyboard: true };\n if (/^(https?:|data:)/i.test(text)) {\n const url = text.split(/\\s+/)[0];\n if (/\\.(mp4|webm|mov|ogv|m4v)(\\?|$)/i.test(url)) return { video: url, ...params };\n if (/\\.(mp3|wav|ogg|m4a|aac|flac)(\\?|$)/i.test(url)) return { audio: url, layout: 'spectrogram' };\n return type === 'samplerCube' ? null : { url, ...params };\n }\n return null;\n}\n\n/** Does the source use `u_mouse` as a vec4 (any z/w access)? */\nexport function usesMouseVec4(src) {\n return /\\bu_mouse\\s*\\.\\s*[xyzw]*[zw]/.test(stripComments(src));\n}\n\n/** Does the source reference any of the given identifiers? */\nexport function usesAny(src, names) {\n const code = stripComments(src);\n return names.filter(n => new RegExp('\\\\b' + n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b').test(code));\n}\n", "// Named sampler binding: any `uniform sampler2D u_xxx` that isn't an iChannelN gets a source\n// by name \u2014 a pass (`u_blur`, `u_pass1`, `u_main`), a comment-annotated URL/ref (FragCoord.xyz),\n// or a live input (`u_audio`, `u_keyboard`, `u_webcam`). Explicit `samplers: { name: source }`\n// on the pass or instance wins over everything.\n\nexport const GL_SAMPLER_2D = 35678;\nexport const GL_SAMPLER_CUBE = 35680;\n\n/** Aux (non-screen) passes in order: what FragCoord calls Pass 1, Pass 2\u2026 */\nexport const auxPasses = passObjs => passObjs.filter(p => !p.cfg.screen);\n\n/**\n * Decide where each named sampler of a compiled pass comes from.\n * Returns [{ name, info, spec }] where spec is a channel spec ({ pass } | loader spec) or { array: [passObj\u2026] }.\n */\nexport function resolveSamplerSpecs(po, passObjs, instanceSamplers = {}) {\n const out = [];\n const aux = auxPasses(passObjs);\n const screen = passObjs.find(p => p.cfg.screen);\n const byName = new Map(passObjs.map(p => [p.name, p]));\n const annotated = Object.assign({}, po.cfg.annotatedSamplers, po.cfg.samplers);\n\n for (const name in po.uniformInfo) {\n const info = po.uniformInfo[name];\n if (info.type !== GL_SAMPLER_2D && info.type !== GL_SAMPLER_CUBE) continue;\n if (/^iChannel\\d$/.test(name)) continue;\n\n let spec = instanceSamplers[name] || annotated[name] || null;\n let m;\n if (spec && spec.sameAs) spec = annotated[spec.sameAs] || instanceSamplers[spec.sameAs] || null;\n\n if (!spec) {\n if (name === 'u_passes' && info.size > 1) spec = { array: aux.slice(0, info.size) };\n else if (name === 'u_main') spec = screen ? { pass: screen.name } : null;\n else if ((m = /^u_pass(\\d+)$/.exec(name)) && aux[+m[1] - 1]) spec = { pass: aux[+m[1] - 1].name };\n else if (name.startsWith('u_') && byName.has(name.slice(2))) spec = { pass: name.slice(2) };\n else if (name === 'u_audio') spec = { mic: true, layout: 'spectrogram' };\n else if (name === 'u_keyboard') spec = { keyboard: true };\n else if (name === 'u_webcam') spec = { camera: true };\n }\n if (spec && spec.pass != null && !byName.has(spec.pass)) {\n // \"pass1\" style refs resolve by aux index too\n const mm = /^pass(\\d+)$/.exec(spec.pass);\n if (mm && aux[+mm[1] - 1]) spec = { ...spec, pass: aux[+mm[1] - 1].name };\n else if (spec.pass === 'main' && screen) spec = { ...spec, pass: screen.name };\n }\n if (spec) out.push({ name, info, spec });\n }\n return out;\n}\n\n/** Does any pass sample the screen pass (so it needs a readable backbuffer)? */\nexport function needsMainBackbuffer(passObjs) {\n const screen = passObjs.find(p => p.cfg.screen);\n if (!screen) return false;\n return passObjs.some(po => (po.samplers || []).some(s => s.spec.pass === screen.name) ||\n po.cfg.channels.some(c => c && c.pass === screen.name));\n}\n", "/**\n * Fly camera for `u_camera_pos` / `u_camera_dir` / `u_camera_view` (FragCoord.xyz convention).\n * WASD / arrows move, Q/E (or Space/Shift) down/up, mouse drag looks around, wheel dollies.\n * u_camera_view is the world-to-camera matrix, column-major (OpenGL convention), so\n * mat3(u_camera_view) * dir goes world->camera and transpose goes back.\n */\nexport function createCamera(canvas, { target = window, speed = 1.5, sensitivity = 0.004 } = {}) {\n const pos = [0, 0, 0];\n let yaw = -Math.PI / 2, pitch = 0; // looking down -Z\n const keys = new Set();\n let dragging = false, lastX = 0, lastY = 0;\n const dir = [0, 0, -1];\n const view = new Float32Array(16);\n\n const onKey = (e, down) => {\n const k = e.key.length === 1 ? e.key.toLowerCase() : e.key;\n if (down) keys.add(k); else keys.delete(k);\n };\n const kd = e => onKey(e, true), ku = e => onKey(e, false);\n const pd = e => { if (e.button === 0) { dragging = true; lastX = e.clientX; lastY = e.clientY; } };\n const pm = e => {\n if (!dragging) return;\n yaw += (e.clientX - lastX) * sensitivity;\n pitch -= (e.clientY - lastY) * sensitivity;\n pitch = Math.max(-1.55, Math.min(1.55, pitch));\n lastX = e.clientX; lastY = e.clientY;\n };\n const pu = () => { dragging = false; };\n const wh = e => { const f = dir; const d = -e.deltaY * 0.002 * speed; pos[0] += f[0] * d; pos[1] += f[1] * d; pos[2] += f[2] * d; };\n const blur = () => keys.clear();\n\n target.addEventListener('keydown', kd); target.addEventListener('keyup', ku);\n canvas.addEventListener('pointerdown', pd); window.addEventListener('pointermove', pm); window.addEventListener('pointerup', pu);\n canvas.addEventListener('wheel', wh, { passive: true }); window.addEventListener('blur', blur);\n\n function lookAt() {\n const f = dir;\n // right = normalize(cross(f, up)), up' = cross(right, f)\n const upW = [0, 1, 0];\n let r = [f[1] * upW[2] - f[2] * upW[1], f[2] * upW[0] - f[0] * upW[2], f[0] * upW[1] - f[1] * upW[0]];\n const rl = Math.hypot(r[0], r[1], r[2]) || 1; r = r.map(v => v / rl);\n const u = [r[1] * f[2] - r[2] * f[1], r[2] * f[0] - r[0] * f[2], r[0] * f[1] - r[1] * f[0]];\n // column-major world->camera\n view.set([\n r[0], u[0], -f[0], 0,\n r[1], u[1], -f[1], 0,\n r[2], u[2], -f[2], 0,\n -(r[0] * pos[0] + r[1] * pos[1] + r[2] * pos[2]),\n -(u[0] * pos[0] + u[1] * pos[1] + u[2] * pos[2]),\n (f[0] * pos[0] + f[1] * pos[1] + f[2] * pos[2]),\n 1,\n ]);\n return { right: r, up: u };\n }\n\n return {\n pos, dir, view,\n /** Advance by dt seconds. */\n update(dt) {\n dir[0] = Math.cos(pitch) * Math.cos(yaw); dir[1] = Math.sin(pitch); dir[2] = Math.cos(pitch) * Math.sin(yaw);\n const { right } = lookAt();\n const v = speed * dt * (keys.has('Shift') ? 3 : 1);\n const mv = (vec, s) => { pos[0] += vec[0] * s; pos[1] += vec[1] * s; pos[2] += vec[2] * s; };\n if (keys.has('w') || keys.has('ArrowUp')) mv(dir, v);\n if (keys.has('s') || keys.has('ArrowDown')) mv(dir, -v);\n if (keys.has('d') || keys.has('ArrowRight')) mv(right, v);\n if (keys.has('a') || keys.has('ArrowLeft')) mv(right, -v);\n if (keys.has('e') || keys.has(' ')) pos[1] += v;\n if (keys.has('q') || keys.has('c')) pos[1] -= v;\n lookAt();\n },\n dispose() {\n target.removeEventListener('keydown', kd); target.removeEventListener('keyup', ku);\n canvas.removeEventListener('pointerdown', pd); window.removeEventListener('pointermove', pm); window.removeEventListener('pointerup', pu);\n canvas.removeEventListener('wheel', wh); window.removeEventListener('blur', blur);\n }\n };\n}\n", "// Uniform type resolution.\n//\n// A uniform `type` may be written as the GLSL type ('float', 'vec3', 'mat4', 'int[]', ...)\n// or as the classic WebGL shorthand ('1f', '3f', 'Matrix4fv', ...). Case-insensitive.\n// If no type is given at all, it's inferred from the compiled shader (see describeGLType).\n//\n// Descriptor: { kind: 'f' | 'i' | 'u' | 'm', n } (n = components, or matrix dimension)\n\nconst ALIASES = Object.create(null);\nconst add = (desc, ...names) => names.forEach(n => { ALIASES[n.toLowerCase()] = desc; });\n\n// float family\nadd({ kind: 'f', n: 1 }, 'float', 'number', 'f', '1f', '1fv', 'float[]', 'uniform1f', 'uniform1fv');\nadd({ kind: 'f', n: 2 }, 'vec2', '2f', '2fv', 'vec2[]', 'uniform2f', 'uniform2fv');\nadd({ kind: 'f', n: 3 }, 'vec3', '3f', '3fv', 'vec3[]', 'uniform3f', 'uniform3fv');\nadd({ kind: 'f', n: 4 }, 'vec4', '4f', '4fv', 'vec4[]', 'uniform4f', 'uniform4fv');\n\n// int / bool family (bool uniforms are uploaded as ints)\nadd({ kind: 'i', n: 1 }, 'int', 'bool', 'boolean', 'i', '1i', '1iv', 'int[]', 'bool[]', 'uniform1i', 'uniform1iv');\nadd({ kind: 'i', n: 2 }, 'ivec2', 'bvec2', '2i', '2iv', 'ivec2[]', 'bvec2[]', 'uniform2i', 'uniform2iv');\nadd({ kind: 'i', n: 3 }, 'ivec3', 'bvec3', '3i', '3iv', 'ivec3[]', 'bvec3[]', 'uniform3i', 'uniform3iv');\nadd({ kind: 'i', n: 4 }, 'ivec4', 'bvec4', '4i', '4iv', 'ivec4[]', 'bvec4[]', 'uniform4i', 'uniform4iv');\n\n// unsigned int (WebGL2)\nadd({ kind: 'u', n: 1 }, 'uint', '1ui', '1uiv', 'uint[]');\nadd({ kind: 'u', n: 2 }, 'uvec2', '2ui', '2uiv', 'uvec2[]');\nadd({ kind: 'u', n: 3 }, 'uvec3', '3ui', '3uiv', 'uvec3[]');\nadd({ kind: 'u', n: 4 }, 'uvec4', '4ui', '4uiv', 'uvec4[]');\n\n// matrices\nadd({ kind: 'm', n: 2 }, 'mat2', 'matrix2fv', 'mat2fv', 'uniformmatrix2fv');\nadd({ kind: 'm', n: 3 }, 'mat3', 'matrix3fv', 'mat3fv', 'uniformmatrix3fv');\nadd({ kind: 'm', n: 4 }, 'mat4', 'matrix4fv', 'mat4fv', 'uniformmatrix4fv');\n\n/** 'vec3' | '3f' | 'Matrix4fv' | ... -> descriptor, or null if unknown. */\nexport function resolveUniformType(type) {\n if (typeof type !== 'string') return null;\n return ALIASES[type.trim().toLowerCase()] || null;\n}\n\n// GL enum -> descriptor (numeric constants are identical across contexts)\nconst GL_TYPES = {\n 5126: { kind: 'f', n: 1 }, // FLOAT\n 35664: { kind: 'f', n: 2 }, // FLOAT_VEC2\n 35665: { kind: 'f', n: 3 },\n 35666: { kind: 'f', n: 4 },\n 5124: { kind: 'i', n: 1 }, // INT\n 35667: { kind: 'i', n: 2 }, // INT_VEC2\n 35668: { kind: 'i', n: 3 },\n 35669: { kind: 'i', n: 4 },\n 35670: { kind: 'i', n: 1 }, // BOOL\n 35671: { kind: 'i', n: 2 }, // BOOL_VEC2\n 35672: { kind: 'i', n: 3 },\n 35673: { kind: 'i', n: 4 },\n 5125: { kind: 'u', n: 1 }, // UNSIGNED_INT\n 36294: { kind: 'u', n: 2 }, // UNSIGNED_INT_VEC2\n 36295: { kind: 'u', n: 3 },\n 36296: { kind: 'u', n: 4 },\n 35674: { kind: 'm', n: 2 }, // FLOAT_MAT2\n 35675: { kind: 'm', n: 3 },\n 35676: { kind: 'm', n: 4 },\n};\n\n/** Active-uniform GL type -> descriptor. Samplers etc. return undefined (managed via channels). */\nexport function describeGLType(glType) {\n return GL_TYPES[glType];\n}\n\nexport const GL_FLOAT = 5126;\nexport const GL_FLOAT_VEC2 = 35664;\nexport const GL_FLOAT_VEC4 = 35666;\n", "import { describeGLType, resolveUniformType } from './types.js';\nimport { isArrayLike, ShaderMateError, warnOnce } from '../utils/util.js';\n\n/**\n * A uniform entry is either a plain value (`0.5`, `[1,0,0]`, `true`)\n * or a spec object `{ type?, value, transpose?, ...ui hints }`.\n */\nexport function isUniformSpec(v) {\n return v != null && typeof v === 'object' && !isArrayLike(v) && 'value' in v;\n}\n\nconst num = v => (typeof v === 'boolean' ? (v ? 1 : 0) : v);\n\nfunction toList(value, n) {\n if (typeof value === 'number' || typeof value === 'boolean') return new Array(n).fill(num(value)); // broadcast\n if (ArrayBuffer.isView(value)) return value;\n if (Array.isArray(value) && value.some(x => typeof x === 'boolean')) return value.map(num);\n return value;\n}\n\n/** Upload `value` to `loc` according to a descriptor from types.js. */\nexport function uploadUniform(gl, loc, d, value, transpose) {\n const n = d.n;\n switch (d.kind) {\n case 'f':\n if (n === 1 && typeof value === 'number') return gl.uniform1f(loc, value);\n return gl['uniform' + n + 'fv'](loc, toList(value, n));\n case 'i':\n if (n === 1 && (typeof value === 'number' || typeof value === 'boolean')) return gl.uniform1i(loc, +value);\n return gl['uniform' + n + 'iv'](loc, toList(value, n));\n case 'u':\n if (n === 1 && typeof value === 'number') return gl.uniform1ui(loc, value);\n return gl['uniform' + n + 'uiv'](loc, toList(value, n));\n case 'm':\n return gl['uniformMatrix' + n + 'fv'](loc, !!transpose, value);\n }\n}\n\n/**\n * Apply a name -> entry map using the compiled program's uniform info.\n * Types are optional: when omitted they come from the shader itself.\n */\nexport function applyUniformMap(gl, info, map, { strict = false, warnMissing = false, label = '' } = {}) {\n if (!map) return;\n for (const name in map) {\n const raw = map[name];\n const spec = isUniformSpec(raw) ? raw : null;\n const value = spec ? spec.value : raw;\n if (value === undefined || value === null) continue;\n\n const inf = info[name];\n if (!inf || !inf.loc) {\n if (strict) throw new ShaderMateError('Unknown uniform: ' + name);\n if (warnMissing) warnOnce('missing-uniform:' + label + ':' + name,\n `Uniform \"${name}\" not found in ${label ? `pass \"${label}\"` : 'shader'} (misspelled, undeclared, or optimized out).`);\n continue;\n }\n\n let d;\n if (spec && spec.type != null) {\n d = resolveUniformType(spec.type);\n if (!d) {\n if (strict) throw new ShaderMateError('Unknown uniform type: ' + spec.type + ' for ' + name);\n warnOnce('bad-type:' + name, 'Unknown uniform type', spec.type, name);\n continue;\n }\n } else {\n d = describeGLType(inf.type);\n if (!d) continue; // sampler or unsupported type\n }\n uploadUniform(gl, inf.loc, d, value, spec && spec.transpose);\n }\n}\n", "/**\n * Pointer state (mouse / touch / pen). Coordinates are canvas pixels with the origin at the\n * bottom-left (ShaderToy convention), computed from the canvas's *painted* box so they stay\n * correct with CSS scaling, devicePixelRatio and object-fit letterboxing.\n *\n * options.target: 'window' (default \u2014 hero text overlaying the canvas doesn't block input)\n * | 'canvas' | any Element\n * options.smooth: 0 (off) \u2026 1 exponential smoothing applied per frame\n */\nexport function createPointer(canvas, getFit, options = {}) {\n const target = options.target === 'canvas' ? canvas\n : (options.target && typeof options.target === 'object') ? options.target\n : window;\n const smooth = +options.smooth || 0;\n\n const raw = { x: 0, y: 0, down: false, over: false, dragX: 0, dragY: 0, wheel: 0 };\n const state = { x: 0, y: 0, clickX: 0, clickY: 0, down: false, over: false, uvX: 0, uvY: 0, dragX: 0, dragY: 0, wheel: 0, clicked: false };\n let clickPending = false;\n let lastX = 0, lastY = 0;\n let moved = false;\n\n /** Painted rectangle of the bitmap inside the element box (accounts for object-fit). */\n function paintedRect() {\n const r = canvas.getBoundingClientRect();\n const fit = getFit ? getFit() : 'fill';\n if (!r.width || !r.height || (fit !== 'contain' && fit !== 'cover')) return r;\n const ba = canvas.width / canvas.height, ra = r.width / r.height;\n let w, h;\n if ((ra > ba) === (fit === 'contain')) { h = r.height; w = h * ba; } else { w = r.width; h = w / ba; }\n return { left: r.left + (r.width - w) / 2, top: r.top + (r.height - h) / 2, width: w, height: h, bottom: 0, right: 0 };\n }\n\n /** client (DOM) coords -> canvas pixel coords, bottom-left origin */\n function toShader(clientX, clientY) {\n const r = paintedRect();\n if (!r.width || !r.height) return [0, 0];\n return [\n (clientX - r.left) * (canvas.width / r.width),\n (r.top + r.height - clientY) * (canvas.height / r.height)\n ];\n }\n const toUV = (cx, cy) => { const [x, y] = toShader(cx, cy); return [x / canvas.width, y / canvas.height]; };\n\n const onMove = e => {\n const [x, y] = toShader(e.clientX, e.clientY);\n if (raw.down) { raw.dragX += x - lastX; raw.dragY += y - lastY; } // cumulative click-and-drag offset\n lastX = x; lastY = y;\n raw.x = x; raw.y = y;\n raw.over = x >= 0 && y >= 0 && x <= canvas.width && y <= canvas.height;\n if (!moved) { moved = true; state.x = x; state.y = y; }\n };\n const onDown = e => {\n if (e.button !== undefined && e.button !== 0) return;\n onMove(e);\n if (target === window && !raw.over) return; // clicks outside the canvas don't count as a press\n raw.down = true;\n state.down = true;\n clickPending = true;\n lastX = raw.x; lastY = raw.y;\n state.clickX = raw.x; state.clickY = raw.y;\n if (!smooth) { state.x = raw.x; state.y = raw.y; }\n };\n const onUp = () => { raw.down = false; state.down = false; };\n const onLeave = () => { raw.over = false; };\n const onWheel = e => { raw.wheel += -e.deltaY * 0.002; }; // mouse-wheel accumulator (exp(wheel) makes a nice zoom)\n\n if (options.touch !== false && target === canvas) canvas.style.touchAction = 'none';\n target.addEventListener('pointermove', onMove, { passive: true });\n target.addEventListener('pointerdown', onDown, { passive: true });\n window.addEventListener('pointerup', onUp, { passive: true });\n window.addEventListener('pointercancel', onUp, { passive: true });\n target.addEventListener('pointerleave', onLeave, { passive: true });\n target.addEventListener('wheel', onWheel, { passive: true });\n\n return {\n state,\n toShader,\n toUV,\n /** Call once per frame. */\n update() {\n if (smooth > 0 && smooth < 1) {\n const k = 1 - Math.pow(1 - smooth, 1); // per-frame factor\n state.x += (raw.x - state.x) * k;\n state.y += (raw.y - state.y) * k;\n } else { state.x = raw.x; state.y = raw.y; }\n state.over = raw.over;\n state.clicked = clickPending; clickPending = false; // true for exactly one frame after a press\n state.dragX = raw.dragX; state.dragY = raw.dragY; state.wheel = raw.wheel;\n state.uvX = canvas.width ? state.x / canvas.width : 0;\n state.uvY = canvas.height ? state.y / canvas.height : 0;\n },\n dispose() {\n target.removeEventListener('pointermove', onMove);\n target.removeEventListener('pointerdown', onDown);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n target.removeEventListener('pointerleave', onLeave);\n target.removeEventListener('wheel', onWheel);\n }\n };\n}\n", "// Canvas sizing.\n//\n// size: 'canvas' (default when you pass a canvas) bitmap follows the canvas's CSS box \u2014 style it\n// however you like (width:100%; height:60vh \u2026) and ShaderMate keeps up.\n// size: 'window' (default when no canvas is given) fixed full-window canvas.\n// size: [w, h] fixed internal resolution; CSS box is yours, `fit` decides how it's shown.\n//\n// pixelRatio: 'auto' (default, capped by maxPixelRatio = 2) | number\n// scale: 1 extra render-scale multiplier (0.5 = render at half res, cheap on big heroes)\n// aspect: 16/9 | '16:9' | [16, 9] lock the bitmap aspect; shown with object-fit\n// fit: 'contain' | 'cover' | 'fill' how a fixed/aspect-locked bitmap fills its CSS box\n\nfunction parseAspect(a) {\n if (!a) return 0;\n if (typeof a === 'number') return a;\n if (Array.isArray(a)) return a[0] / a[1];\n if (typeof a === 'string') {\n const m = a.split(/[:/x]/).map(Number);\n return m.length === 2 && m[1] ? m[0] / m[1] : Number(a) || 0;\n }\n return 0;\n}\n\nexport function parseSizing(options = {}, hasCanvas = true) {\n const s = options.size ?? options.sizing;\n const cfg = {\n mode: hasCanvas ? 'canvas' : 'window',\n width: 0, height: 0,\n aspect: parseAspect(options.aspect),\n fit: options.fit || 'contain',\n pixelRatio: options.pixelRatio ?? options.dpr ?? 'auto',\n maxPixelRatio: options.maxPixelRatio ?? 2,\n scale: options.scale ?? options.renderScale ?? 1,\n };\n if (Array.isArray(s)) { cfg.mode = 'fixed'; cfg.width = s[0]; cfg.height = s[1]; }\n else if (typeof s === 'string') cfg.mode = s === 'screen' || s === 'fullscreen' ? 'window' : s === 'element' ? 'canvas' : s;\n else if (s && typeof s === 'object') { cfg.mode = 'fixed'; cfg.width = s.width; cfg.height = s.height; if (s.fit) cfg.fit = s.fit; }\n if (cfg.mode === 'fixed') cfg.aspect = cfg.width / cfg.height;\n return cfg;\n}\n\nexport function createSizer(canvas, options = {}, hasCanvas = true) {\n const cfg = parseSizing(options, hasCanvas);\n const ratio = () => (cfg.pixelRatio === 'auto'\n ? Math.min(window.devicePixelRatio || 1, cfg.maxPixelRatio)\n : (Number(cfg.pixelRatio) || 1));\n let styled = false;\n\n function cssBox() {\n if (cfg.mode === 'window') return { w: window.innerWidth, h: window.innerHeight };\n return { w: canvas.clientWidth || window.innerWidth, h: canvas.clientHeight || window.innerHeight };\n }\n\n function measure() {\n if (cfg.mode === 'fixed') return { w: cfg.width, h: cfg.height };\n const box = cssBox();\n const k = ratio() * cfg.scale;\n let w = box.w, h = box.h;\n if (cfg.aspect) {\n if (w / h > cfg.aspect) w = h * cfg.aspect; else h = w / cfg.aspect;\n }\n return { w: w * k, h: h * k };\n }\n\n function applyStyle() {\n if (styled) return;\n styled = true;\n if (cfg.mode === 'window') {\n canvas.style.cssText += ';display:block;position:fixed;left:0;top:0;width:100%;height:100%;';\n }\n if (cfg.mode === 'fixed' || cfg.aspect) canvas.style.objectFit = cfg.fit;\n }\n\n return {\n cfg,\n /** 'contain' | 'cover' | 'fill' as currently applied (for pointer mapping). */\n fit: () => ((cfg.mode === 'fixed' || cfg.aspect) ? cfg.fit : 'fill'),\n setFixed(w, h) { cfg.mode = 'fixed'; cfg.width = w; cfg.height = h; cfg.aspect = w / h; styled = false; },\n /** Recompute; returns true when the bitmap size changed. */\n update() {\n applyStyle();\n const m = measure();\n const w = Math.max(1, Math.round(m.w)), h = Math.max(1, Math.round(m.h));\n if (canvas.width === w && canvas.height === h) return false;\n canvas.width = w;\n canvas.height = h;\n return true;\n },\n /** Call `fn` on window resize / canvas box changes. Returns a disposer. */\n observe(fn) {\n let pending = false;\n const schedule = () => {\n if (pending) return;\n pending = true;\n requestAnimationFrame(() => { pending = false; fn(); });\n };\n window.addEventListener('resize', schedule);\n let ro = null;\n if (cfg.mode === 'canvas' && typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(schedule);\n ro.observe(canvas);\n }\n return () => { window.removeEventListener('resize', schedule); if (ro) ro.disconnect(); };\n }\n };\n}\n", "/**\n * Tracks whether rendering is worthwhile: tab visible AND canvas in (or near) the viewport.\n * Saves battery on long pages with a hero at the top.\n */\nexport function createVisibility(canvas, { enabled = true, margin = '100px', onChange } = {}) {\n let tabVisible = typeof document === 'undefined' ? true : !document.hidden;\n let inView = true;\n const notify = () => onChange && onChange(tabVisible && inView);\n\n const onVis = () => { tabVisible = !document.hidden; notify(); };\n let io = null;\n if (enabled) {\n document.addEventListener('visibilitychange', onVis);\n if (typeof IntersectionObserver !== 'undefined') {\n io = new IntersectionObserver(entries => {\n for (const e of entries) inView = e.isIntersecting;\n notify();\n }, { rootMargin: margin });\n io.observe(canvas);\n }\n }\n return {\n get visible() { return tabVisible && inView; },\n dispose() {\n if (enabled) document.removeEventListener('visibilitychange', onVis);\n if (io) io.disconnect();\n }\n };\n}\n", "// Shared look for ShaderMate's own UI (stats overlay, error overlay, GUI addon).\n// Dark editor palette: VS Code \"Dark Modern\" tones. Override per instance with options.theme.\nexport const DEFAULT_THEME = {\n font: '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n mono: '\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n bg: '#1f1f1f',\n bgAlt: '#181818',\n raised: '#2a2d2e',\n hover: '#37373d',\n border: '#3c3c3c',\n text: '#cccccc',\n textStrong: '#ececec',\n label: '#9d9d9d',\n accent: '#4daafc',\n number: '#4daafc',\n string: '#d1977f',\n red: '#e46962',\n redSoft: '#4e3534',\n redText: '#f9dedc',\n radius: '8px',\n shadow: '0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)',\n};\n\nexport function resolveTheme(t) {\n return Object.assign({}, DEFAULT_THEME, t && typeof t === 'object' ? t : null);\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Stats overlay (FPS, frame time, CPU time, frame count, resolution).\n * Nothing is installed unless you ask: stats: true (visible) | 'key' (hidden until the key is pressed).\n */\nexport function createStats({ visible = false, key = 'F1', position = 'top-left', theme } = {}) {\n const T = resolveTheme(theme);\n const el = document.createElement('div');\n const [v, h] = position.split('-');\n el.style.cssText =\n `position:fixed;${v === 'bottom' ? 'bottom' : 'top'}:12px;${h === 'right' ? 'right' : 'left'}:12px;` +\n `z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${T.border};border-radius:${T.radius};` +\n `background:${T.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${T.shadow};` +\n `color:${T.text};font:12px/1.5 ${T.mono};pointer-events:none;display:none`;\n document.body.appendChild(el);\n\n const row = (label, value) =>\n `<div style=\"display:flex;justify-content:space-between;gap:14px\"><span style=\"color:${T.label}\">${label}</span><span style=\"color:${T.textStrong}\">${value}</span></div>`;\n\n let shown = false;\n let accDt = 0, accCpu = 0, n = 0, lastDom = 0;\n\n function show(on = true) {\n shown = !!on;\n el.style.display = shown ? 'block' : 'none';\n accDt = accCpu = n = 0;\n }\n const toggle = () => show(!shown);\n const onKey = e => { if (e.key === key) { e.preventDefault(); toggle(); } };\n if (key) window.addEventListener('keydown', onKey);\n show(visible);\n\n return {\n show, toggle,\n isVisible: () => shown,\n update(info) {\n if (!shown) return;\n accDt += info.rawDt; accCpu += info.cpuMs; n++;\n const now = performance.now();\n if (now - lastDom < 250) return;\n lastDom = now;\n const ms = (accDt / n) * 1000;\n el.innerHTML =\n `<div style=\"display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px\"><b style=\"color:${T.accent};font-size:16px;font-weight:600\">${(1000 / ms).toFixed(0)}<span style=\"font-size:11px;color:${T.label};font-weight:400\"> fps</span></b><span style=\"color:${T.label}\">${ms.toFixed(1)} ms</span></div>` +\n row('cpu', (accCpu / n).toFixed(2) + ' ms') +\n row('frame', info.frame) +\n row('time', info.time.toFixed(2) + ' s') +\n row('size', `${info.width}\u00D7${info.height}`) +\n row('passes', info.passes);\n accDt = accCpu = n = 0;\n },\n dispose() {\n if (key) window.removeEventListener('keydown', onKey);\n el.remove();\n }\n };\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Compile-error overlay drawn over the canvas (dev aid). Enabled by default on localhost\n * (errorOverlay: 'auto'); set errorOverlay: true/false to force.\n */\nexport function createErrorOverlay(canvas, theme) {\n const T = resolveTheme(theme);\n let el = null;\n\n function place() {\n if (!el) return;\n const r = canvas.getBoundingClientRect();\n Object.assign(el.style, { left: r.left + 'px', top: r.top + 'px', width: r.width + 'px', height: r.height + 'px' });\n }\n const esc = s => String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;');\n\n return {\n show(err) {\n if (!el) {\n el = document.createElement('div');\n el.style.cssText =\n 'position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;' +\n `background:${T.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${T.text};font:13px/1.55 ${T.font}`;\n document.body.appendChild(el);\n window.addEventListener('resize', place);\n }\n const errors = err.errors || [];\n const title = esc(err.message.split('\\n')[0]);\n let body = '';\n if (errors.length) {\n body = errors.map(e =>\n `<div style=\"display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};margin-bottom:8px\">` +\n `<span style=\"color:${T.red};font-family:${T.mono};font-size:12px\">line ${e.line}</span><span style=\"color:${T.textStrong}\">${esc(e.message)}</span>` +\n `<span></span><code style=\"color:${T.label};font-family:${T.mono};font-size:12px;white-space:pre-wrap\">${esc(e.source.trim())}</code></div>`).join('');\n } else if (err.log) {\n body = `<pre style=\"margin:0;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};color:${T.label};font:12px/1.5 ${T.mono};white-space:pre-wrap\">${esc(err.log)}</pre>`;\n }\n el.innerHTML =\n `<div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px\">` +\n `<span style=\"display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${T.redSoft};color:${T.redText};font-size:11.5px;font-weight:500\">Shader error</span>` +\n `<b style=\"color:${T.textStrong};font-weight:600\">${title}</b></div>` + body;\n el.style.display = 'block';\n place();\n },\n hide() { if (el) el.style.display = 'none'; },\n dispose() { if (el) { el.remove(); window.removeEventListener('resize', place); el = null; } }\n };\n}\n", "/**\n * Screenshots and video capture. `renderNow()` draws a fresh frame synchronously, so these\n * work without preserveDrawingBuffer (the pixels are read in the same task as the draw).\n */\nexport function createCapture(canvas, renderNow) {\n function screenshot(type = 'image/png', quality) {\n renderNow();\n return canvas.toDataURL(type, quality);\n }\n\n function toBlob(type = 'image/png', quality) {\n renderNow();\n return new Promise((res, rej) => canvas.toBlob(b => (b ? res(b) : rej(new Error('toBlob failed'))), type, quality));\n }\n\n async function download(filename = 'shadermate.png', type, quality) {\n if (!type) type = /\\.jpe?g$/i.test(filename) ? 'image/jpeg' : /\\.webp$/i.test(filename) ? 'image/webp' : 'image/png';\n const blob = await toBlob(type, quality);\n saveBlob(blob, filename);\n }\n\n /**\n * Record the canvas to a WebM (or whatever the browser supports).\n * const rec = sm.record({ fps: 60 }); \u2026 const blob = await rec.stop();\n * await sm.record({ duration: 5000, download: 'loop.webm' });\n */\n function record({ fps = 60, mimeType, bitsPerSecond = 8_000_000, duration = 0, download: dl } = {}) {\n if (typeof MediaRecorder === 'undefined' || !canvas.captureStream) throw new Error('MediaRecorder not supported');\n const stream = canvas.captureStream(fps);\n const type = mimeType || ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm', 'video/mp4']\n .find(t => MediaRecorder.isTypeSupported(t)) || '';\n const rec = new MediaRecorder(stream, { mimeType: type || undefined, videoBitsPerSecond: bitsPerSecond });\n const chunks = [];\n rec.ondataavailable = e => { if (e.data.size) chunks.push(e.data); };\n const done = new Promise(res => { rec.onstop = () => res(new Blob(chunks, { type: rec.mimeType })); });\n rec.start(100);\n\n const handle = {\n recorder: rec,\n stop() { if (rec.state !== 'inactive') rec.stop(); stream.getTracks().forEach(t => t.stop()); return done; },\n done\n };\n if (duration > 0) {\n const finished = new Promise(res => setTimeout(() => res(handle.stop()), duration));\n if (dl) return finished.then(blob => { saveBlob(blob, typeof dl === 'string' ? dl : 'shadermate.webm'); return blob; });\n return finished;\n }\n return handle;\n }\n\n return { screenshot, toBlob, download, record };\n}\n\nexport function saveBlob(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n", "import { MAX_CHANNELS, DEFAULT_CANVAS_ID, VERSION } from '../constants.js';\nimport { ShaderMateError, toArray, warnOnce, isBrowser, parseColor, isDevHost } from '../utils/util.js';\nimport { RefPool } from './RefPool.js';\nimport { createEmitter } from './events.js';\nimport { createTweens } from './tween.js';\nimport { normalizePasses, normalizeChannel, isInlineSource } from './passes.js';\nimport { createContext, getExtensions, isWebGL2 } from '../gl/context.js';\nimport { createQuad } from '../gl/quad.js';\nimport { createBlit } from '../gl/blit.js';\nimport { createProgram, getUniformInfo } from '../gl/shader.js';\nimport { createTarget, deleteTarget, resolvePassSize } from '../gl/targets.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\nimport { resolveIncludes, assembleFragment, DEFAULT_INJECT, NO_INJECT } from '../glsl/preprocess.js';\nimport { loadChannel, channelSamplerType } from '../loaders/index.js';\nimport { splitPassBlob, parseUniformComments, usesMouseVec4 } from '../glsl/fragcoord.js';\nimport { looksLikeFragCoord } from '../glsl/builtins.js';\nimport { resolveSamplerSpecs, needsMainBackbuffer, auxPasses } from './samplers.js';\nimport { createCamera } from '../input/camera.js';\nimport { applyUniformMap, isUniformSpec } from '../uniforms/apply.js';\nimport { GL_FLOAT, GL_FLOAT_VEC4, GL_FLOAT_VEC2 } from '../uniforms/types.js';\nimport { createPointer } from '../input/pointer.js';\nimport { createSizer } from '../view/sizing.js';\nimport { createVisibility } from '../view/visibility.js';\nimport { createStats } from '../ui/stats.js';\nimport { createErrorOverlay } from '../ui/errorOverlay.js';\nimport { createCapture } from '../capture/capture.js';\n\n/** Accepts create(options) or create(shaderOrPasses, options). */\nfunction normalizeArgs(a, b) {\n if (typeof a === 'string' || Array.isArray(a)) return { ...(b || {}), passes: a };\n if (a && typeof a === 'object' && (a.shader != null || a.passes != null || a.src != null)) {\n const o = { ...a };\n // Single-shader form: per-pass fields written at the top level belong to that one pass.\n if (o.passes == null) o.passes = { src: o.shader ?? o.src, uniforms: o.passUniforms, channels: o.channels, pingpong: o.pingpong, float: o.float };\n else if (o.channels != null) console.warn('[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead.');\n return o;\n }\n throw new ShaderMateError('createShader: pass a shader string, an array of passes, or { shader | passes, ...options }');\n}\n\nfunction resolveCanvas(c) {\n if (c && typeof c === 'object' && typeof c.getContext === 'function') return { canvas: c, given: true };\n if (typeof c === 'string') {\n let el = document.getElementById(c);\n if (!el) { try { el = document.querySelector(c); } catch { /* invalid selector */ } }\n if (!el) throw new ShaderMateError(`Canvas not found: \"${c}\"`);\n return { canvas: el, given: true };\n }\n let el = document.getElementById(DEFAULT_CANVAS_ID);\n if (el) return { canvas: el, given: true };\n el = document.createElement('canvas');\n el.id = DEFAULT_CANVAS_ID;\n (document.body || document.documentElement).appendChild(el);\n return { canvas: el, given: false };\n}\n\nfunction setUniformIn(map, name, value) {\n const cur = map[name];\n if (isUniformSpec(cur)) cur.value = value;\n else map[name] = value;\n}\nconst readUniform = (map, name) => (isUniformSpec(map[name]) ? map[name].value : map[name]);\n\n/**\n * Create a ShaderMate instance. Returns synchronously; shaders and textures load in the\n * background. `await sm.ready` to know when the first frame can render.\n */\nexport function createShader(a, b) {\n if (!isBrowser) throw new ShaderMateError('ShaderMate needs a browser environment (window/document).');\n const options = normalizeArgs(a, b);\n\n // ---- options ---------------------------------------------------------\n const autoSetup = options.autoSetup !== false;\n const inject = Object.assign({}, autoSetup ? DEFAULT_INJECT : NO_INJECT, options.inject);\n const globalDefines = toArray(options.defines);\n let commonSrc = typeof options.common === 'string' ? options.common : '';\n const dialect = options.dialect || 'auto'; // 'auto' | 'fragcoord' | 'shadertoy' | 'shadermate'\n const instanceSamplers = options.samplers || {};\n const uniforms = options.uniforms || {}; // instance-wide, live\n const includeStore = options.includes || {};\n const strictUniforms = !!options.strictUniforms;\n const warnUniforms = options.warnMissingUniforms !== false;\n const showExpanded = options.showExpandedOnError !== false;\n const useOverlay = options.errorOverlay === undefined || options.errorOverlay === 'auto' ? isDevHost() : !!options.errorOverlay;\n\n // ---- context ---------------------------------------------------------\n let canvas, givenCanvas, gl;\n if (options.gl) {\n gl = options.gl; canvas = gl.canvas; givenCanvas = true;\n } else {\n ({ canvas, given: givenCanvas } = resolveCanvas(options.canvas));\n gl = createContext(canvas, options);\n }\n const isGL2 = isWebGL2(gl);\n const ext = getExtensions(gl, isGL2);\n const env = { isGL2, ext };\n const pool = new RefPool(gl);\n const enableDerivatives = !!(isGL2 || ext.OES_standard_derivatives);\n const bg = parseColor(options.background ?? options.clearColor) || [0, 0, 0, 0];\n gl.clearColor(bg[0], bg[1], bg[2], bg[3]);\n\n const emitter = createEmitter();\n const { emit, on, off, once } = emitter;\n const quad = createQuad(gl);\n const sizer = createSizer(canvas, options, givenCanvas);\n const pointer = createPointer(canvas, sizer.fit, options.pointer === false ? { target: 'canvas', smooth: 0 } : (typeof options.pointer === 'object' ? options.pointer : {}));\n const tweens = createTweens();\n const overlay = useOverlay ? createErrorOverlay(canvas, options.theme) : null;\n let stats = null;\n if (options.stats) {\n stats = createStats({\n visible: options.stats === true || options.stats === 'visible',\n key: options.statsKey === undefined ? 'F1' : options.statsKey,\n position: options.statsPosition,\n theme: options.theme,\n });\n }\n\n // ---- state -----------------------------------------------------------\n const passObjs = [];\n const byName = new Map();\n let PASSES = [];\n let disposed = false;\n let loaded = false;\n let rafId = null;\n let removeResize = () => { };\n let last = performance.now();\n let lastRender = 0;\n let frame = 0;\n let time = options.time || 0;\n let playing = options.autoplay !== false && !options.startPaused && !options.paused;\n let timeScale = options.timeScale ?? 1;\n let fixedDelta = options.fixedDelta || 0;\n let maxFps = options.maxFps || options.fps || 0;\n let loopLen = options.loop || 0;\n const maxDelta = options.maxDelta ?? 0.1;\n let visible = true;\n let lastError = null;\n let refreshRate = 60; // estimated display refresh rate (median of recent rAF intervals)\n const rafDts = [];\n let camera = null; // fly camera, created when a pass uses u_camera_*\n let blit = null; // copies the screen pass' buffer to the canvas when u_main is sampled\n let mainBackbuffer = false;\n\n const visibility = createVisibility(canvas, {\n enabled: options.pauseWhenHidden !== false,\n onChange: v => { visible = v; if (v) last = performance.now(); emit('visibility', v); }\n });\n\n // ---- helpers ---------------------------------------------------------\n function reportError(err) {\n lastError = err;\n if (overlay) overlay.show(err);\n emit('error', err);\n if (options.onError) options.onError(err);\n }\n function clearError() {\n lastError = null;\n if (overlay) overlay.hide();\n }\n\n const loadText = async path => {\n const r = await fetch(path);\n if (!r.ok) throw new ShaderMateError(`Failed to fetch ${path}: ${r.status} ${r.statusText}`);\n return r.text();\n };\n const includeLoader = async path => (includeStore[path] != null ? includeStore[path] : loadText(path));\n\n let commonText = null;\n async function getCommon() {\n if (commonText !== null) return commonText;\n if (!commonSrc) return (commonText = '');\n const raw = isInlineSource(commonSrc) ? commonSrc : await loadText(commonSrc);\n const parsed = parseUniformComments(raw); // Common may declare annotated uniforms too\n for (const n in parsed.uniforms) if (!(n in uniforms)) uniforms[n] = parsed.uniforms[n];\n Object.assign(instanceSamplers, parsed.samplers, instanceSamplers);\n return (commonText = parsed.source);\n }\n\n /** Fetch (if needed), preprocess and compile a pass' fragment shader. */\n async function buildProgram(pass, src, allPasses = PASSES) {\n let text = isInlineSource(src) ? src : await loadText(src);\n const common = await getCommon();\n\n // FragCoord.xyz annotations: `uniform float u_x = 0.5; //[0, 1]`, `uniform sampler2D u_tex; //https://\u2026`\n const parsed = parseUniformComments(text);\n text = parsed.source;\n for (const n in parsed.uniforms) if (!(n in pass.uniforms) && !(n in uniforms)) pass.uniforms[n] = parsed.uniforms[n];\n pass.annotatedSamplers = parsed.samplers;\n\n const full = common ? common + '\\n#line 1\\n' + text : text;\n const expanded = await resolveIncludes(full, { loader: includeLoader });\n\n const fc = dialect === 'fragcoord' || (dialect === 'auto' && looksLikeFragCoord(expanded));\n const samplerNames = [];\n const aux = allPasses.filter(p => !p.screen);\n allPasses.forEach(p => samplerNames.push('u_' + p.name));\n aux.forEach((p, i) => { const n = 'u_pass' + (i + 1); if (!samplerNames.includes(n)) samplerNames.push(n); });\n\n const frag = assembleFragment(expanded, {\n isGL2,\n defines: [...globalDefines, ...toArray(pass.defines)],\n enableDerivatives,\n inject,\n channelTypes: pass.channels.map(channelSamplerType),\n builtinOpts: {\n fragcoord: fc,\n mouseVec4: fc || dialect === 'fragcoord' || usesMouseVec4(expanded),\n scrollFloat: fc || dialect === 'fragcoord',\n samplerNames,\n passCount: aux.length,\n },\n });\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, frag, { label: pass.name, showExpandedOnError: showExpanded });\n if (r.error) throw r.error;\n return { program: r.program, source: text, compiled: frag, fragcoord: fc };\n }\n\n function resizeTargets() {\n for (const po of passObjs) {\n const cfg = po.cfg;\n if (cfg.screen && !mainBackbuffer) continue;\n const [w, h] = cfg.screen ? [canvas.width, canvas.height] : resolvePassSize(cfg.size, canvas.width, canvas.height);\n if (po.target && po.target.width === w && po.target.height === h) continue;\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.target = createTarget(gl, pool, w, h, cfg, isGL2, ext);\n po.targetPrev = (cfg.pingpong || (cfg.screen && mainBackbuffer)) ? createTarget(gl, pool, w, h, cfg, isGL2, ext) : null;\n }\n }\n\n function handleResize() {\n if (disposed) return;\n if (sizer.update()) {\n gl.viewport(0, 0, canvas.width, canvas.height);\n resizeTargets();\n emit('resize', { width: canvas.width, height: canvas.height });\n if (!playing && loaded) renderNow(); // keep a paused canvas crisp\n }\n }\n\n async function loadPassChannels(po) {\n await Promise.all(po.cfg.channels.map(async (ch, i) => {\n if (!ch || ch.pass != null) return;\n try {\n po.texChannels[i] = await loadChannel(gl, pool, ch, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" channel ${i}: ${e.message}`);\n emit('error', e);\n }\n }));\n // named samplers (u_pass1, u_blur, u_main, u_audio, annotated URLs \u2026)\n po.samplers = resolveSamplerSpecs(po, passObjs, instanceSamplers);\n await Promise.all(po.samplers.map(async s => {\n if (s.spec.pass != null || s.spec.array) return;\n try {\n s.wrap = await loadChannel(gl, pool, s.spec, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" sampler ${s.name}: ${e.message}`);\n emit('error', e);\n }\n }));\n }\n\n // ---- build -----------------------------------------------------------\n /** A pasted FragCoord.xyz multi-pass blob (`// Pass 1` \u2026 `// Main`) becomes a pass list. */\n function expandPassBlob(input) {\n if (typeof input !== 'string' || !isInlineSource(input)) return input;\n const blob = splitPassBlob(input);\n if (!blob) return input;\n if (blob.common) commonSrc = commonSrc ? commonSrc + '\\n' + blob.common : blob.common;\n const unsupported = blob.passes.find(p => p.bufferType !== '2d');\n if (unsupported) throw new ShaderMateError(`Pass \"${unsupported.label}\" uses a ${unsupported.bufferType} buffer; ShaderMate supports 2D buffers only.`);\n const passes = blob.passes.map(p => p.main\n ? { name: 'main', shader: p.src, screen: true }\n : { name: p.name, shader: p.src, pingpong: true, float: true }); // aux passes keep history (feedback) like FragCoord\n if (!passes.some(p => p.screen)) passes[passes.length - 1].screen = true;\n return passes;\n }\n\n async function build() {\n PASSES = normalizePasses(expandPassBlob(options.passes));\n for (const p of PASSES) if (p.iterations > 1 && !p.screen) p.pingpong = true; // recursion reads the previous iteration\n for (let i = 0; i < PASSES.length; i++) {\n const pass = PASSES[i];\n const { program, source, compiled, fragcoord } = await buildProgram(pass, pass.src);\n if (disposed) { gl.deleteProgram(program); return; }\n const po = {\n cfg: pass, name: pass.name, index: i,\n programId: pool.add(program, 'program'),\n uniformInfo: getUniformInfo(gl, program),\n source, compiled, fragcoord,\n target: null, targetPrev: null,\n texChannels: new Array(MAX_CHANNELS).fill(null),\n samplers: [],\n };\n passObjs.push(po);\n byName.set(po.name, po);\n }\n await Promise.all(passObjs.map(loadPassChannels));\n if (disposed) return;\n mainBackbuffer = needsMainBackbuffer(passObjs);\n if (mainBackbuffer && !blit) blit = createBlit(gl, isGL2, quad);\n if (!camera && passObjs.some(po => po.uniformInfo.u_camera_pos || po.uniformInfo.u_camera_dir || po.uniformInfo.u_camera_view)) {\n camera = createCamera(canvas, typeof options.camera === 'object' ? options.camera : {});\n }\n resizeTargets();\n }\n\n // ---- frame -----------------------------------------------------------\n /** Texture of another pass as seen from `po` (previous frame when reading itself / a later pass). */\n function passTexture(po, src, buffer) {\n let t = null;\n if (src.targetPrev) {\n const prev = buffer === 'prev' || (buffer !== 'current' && src.index >= po.index);\n t = prev ? src.targetPrev : src.target;\n } else if (src === po) {\n warnOnce('self:' + po.name, `Pass \"${po.name}\" reads its own output; add pingpong: true.`);\n } else if (src.cfg.screen) {\n warnOnce('screen:' + src.name, `Pass \"${po.name}\" can't read screen pass \"${src.name}\" (it has no texture).`);\n } else t = src.target;\n return t;\n }\n\n function drawPass(po, f, iteration = 0) {\n const cfg = po.cfg;\n const program = pool.get(po.programId);\n const u = po.uniformInfo;\n const m = pointer.state;\n const set1f = (n, v) => { const i = u[n]; if (i) gl.uniform1f(i.loc, v); };\n const set1i = (n, v) => { const i = u[n]; if (i) gl.uniform1i(i.loc, v); };\n\n if (po.targetPrev) { const t = po.targetPrev; po.targetPrev = po.target; po.target = t; }\n\n let rw, rh;\n if (cfg.screen && !mainBackbuffer) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n rw = canvas.width; rh = canvas.height;\n } else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n rw = po.target.width; rh = po.target.height;\n }\n const k = cfg.screen ? 1 : rw / canvas.width; // mouse in this pass' pixel space\n const ky = cfg.screen ? 1 : rh / canvas.height;\n gl.viewport(0, 0, rw, rh);\n gl.useProgram(program);\n gl.clear(gl.COLOR_BUFFER_BIT | (po.target && po.target.depthId ? gl.DEPTH_BUFFER_BIT : 0));\n\n // built-ins\n set1f('iTime', f.time); set1f('u_time', f.time);\n set1f('iTimeDelta', f.dt); set1f('u_delta', f.dt); set1f('u_time_delta', f.dt);\n set1i('iFrame', f.frame); set1i('u_frame', f.frame);\n set1f('iFrameRate', f.fps); set1f('u_fps', f.fps); set1f('u_refresh_rate', f.refreshRate);\n set1f('iSampleRate', 44100);\n if (u.iResolution) gl.uniform3f(u.iResolution.loc, rw, rh, 1);\n if (u.u_resolution) gl.uniform2f(u.u_resolution.loc, rw, rh);\n set1f('u_aspect', rw / rh);\n set1f('u_pixelRatio', f.dpr);\n if (u.iDate) gl.uniform4fv(u.iDate.loc, f.date);\n if (u.u_date) gl.uniform4fv(u.u_date.loc, f.date);\n if (u.iScroll) gl.uniform2f(u.iScroll.loc, f.scrollX, f.scrollY);\n if (u.u_scroll) {\n // vec2 = page scroll (ShaderMate); float = mouse-wheel accumulator (FragCoord.xyz convention)\n if (u.u_scroll.type === GL_FLOAT) gl.uniform1f(u.u_scroll.loc, m.wheel); else gl.uniform2f(u.u_scroll.loc, f.scrollX, f.scrollY);\n }\n set1f('u_wheel', m.wheel);\n if (u.u_drag) gl.uniform2f(u.u_drag.loc, m.dragX * k, m.dragY * ky);\n set1i('u_recursion', iteration);\n set1i('u_max_recursion', cfg.iterations || 1);\n set1i('u_color_gamut', 0);\n if (camera) {\n if (u.u_camera_pos) gl.uniform3fv(u.u_camera_pos.loc, camera.pos);\n if (u.u_camera_dir) gl.uniform3fv(u.u_camera_dir.loc, camera.dir);\n if (u.u_camera_view) gl.uniformMatrix4fv(u.u_camera_view.loc, false, camera.view);\n }\n if (u.iMouse) {\n // ShaderToy semantics: z > 0 while the button is held, w > 0 only on the frame of the click; both carry |click pos| otherwise\n const sz = m.down ? 1 : -1, sw = m.clicked ? 1 : -1;\n gl.uniform4f(u.iMouse.loc, m.x * k, m.y * ky, m.clickX * k * sz, m.clickY * ky * sw);\n }\n if (u.u_mouse) {\n // vec2 = position; vec4 = position + click position, zw negative while the button is up (FragCoord.xyz convention)\n if (u.u_mouse.type === GL_FLOAT_VEC4) { const s = m.down ? 1 : -1; gl.uniform4f(u.u_mouse.loc, m.x * k, m.y * ky, m.clickX * k * s, m.clickY * ky * s); }\n else gl.uniform2f(u.u_mouse.loc, m.x * k, m.y * ky);\n }\n if (u.u_mouseUV) gl.uniform2f(u.u_mouseUV.loc, m.uvX, m.uvY);\n set1f('u_mouseDown', m.down ? 1 : 0);\n\n // channels\n const chTimes = [0, 0, 0, 0];\n const chRes = new Float32Array(12);\n for (let i = 0; i < MAX_CHANNELS; i++) {\n const ch = cfg.channels[i];\n if (!ch) continue;\n let texObj = null, w = 0, h = 0, isCube = false, chTime = f.time;\n\n if (ch.pass != null) {\n const src = byName.get(ch.pass);\n const t = src ? passTexture(po, src, ch.buffer) : null;\n if (t) { texObj = pool.get(t.texId); w = t.width; h = t.height; }\n } else {\n const wrap = po.texChannels[i];\n if (wrap) {\n texObj = pool.get(wrap.texId); w = wrap.width; h = wrap.height; isCube = !!wrap.cubemap;\n if (wrap.getTime) chTime = wrap.getTime();\n }\n }\n if (texObj) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, texObj);\n set1i('iChannel' + i, i);\n chTimes[i] = chTime;\n chRes[i * 3] = w; chRes[i * 3 + 1] = h; chRes[i * 3 + 2] = 1;\n }\n }\n if (u.iChannelTime) (u.iChannelTime.type === GL_FLOAT_VEC4 ? gl.uniform4fv : gl.uniform1fv).call(gl, u.iChannelTime.loc, chTimes);\n if (u.iChannelResolution) gl.uniform3fv(u.iChannelResolution.loc, chRes);\n\n // named samplers on texture units after the four iChannels\n let unit = MAX_CHANNELS;\n for (const s of po.samplers) {\n const bindTex = (tex, isCube) => { gl.activeTexture(gl.TEXTURE0 + unit); gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, tex); return unit++; };\n if (s.spec.array) {\n const units = s.spec.array.map(src => { const t = passTexture(po, src, s.spec.buffer); return t ? bindTex(pool.get(t.texId), false) : 0; });\n gl.uniform1iv(s.info.loc, units);\n } else if (s.spec.pass != null) {\n const src = byName.get(s.spec.pass);\n const t = src ? passTexture(po, src, s.spec.buffer) : null;\n if (t) gl.uniform1i(s.info.loc, bindTex(pool.get(t.texId), false));\n } else if (s.wrap) {\n gl.uniform1i(s.info.loc, bindTex(pool.get(s.wrap.texId), !!s.wrap.cubemap));\n if (s.wrap.getTime) set1f(s.name + '_time', s.wrap.getTime()); // FragCoord: companion <name>_time for video\n const res = u[s.name + '_resolution']; if (res) gl.uniform2f(res.loc, s.wrap.width, s.wrap.height);\n }\n }\n\n // user uniforms: instance-wide first, then per-pass overrides\n applyUniformMap(gl, u, uniforms, { strict: false });\n applyUniformMap(gl, u, cfg.uniforms, { strict: strictUniforms, warnMissing: warnUniforms, label: po.name });\n\n quad.bind(program);\n quad.draw();\n }\n\n /** Advance the clock (if playing/forced) and draw every pass. */\n function frameStep(now, { advance = playing, rawDt } = {}) {\n const t0 = performance.now();\n if (rawDt === undefined) rawDt = Math.max(0, (now - last) * 0.001);\n last = now;\n if (rawDt > 0.002 && rawDt < 0.1) { rafDts.push(rawDt); if (rafDts.length > 30) rafDts.shift(); if (rafDts.length >= 10) { const s = [...rafDts].sort((a, b) => a - b); refreshRate = Math.round(1 / s[s.length >> 1]); } }\n let dt = fixedDelta > 0 ? fixedDelta : Math.min(rawDt, maxDelta);\n if (advance) {\n time += dt * timeScale;\n if (loopLen > 0) time = ((time % loopLen) + loopLen) % loopLen;\n } else dt = 0;\n frame++;\n const fps = rawDt > 0 ? 1 / rawDt : 0;\n tweens.update(now);\n pointer.update();\n\n const info = { time, frame, dt, fps };\n emit('beforeFrame', info);\n if (options.onFrame) options.onFrame(info);\n\n const d = new Date();\n const f = {\n time, frame, dt, fps,\n dpr: window.devicePixelRatio || 1,\n date: [d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds() + d.getMilliseconds() / 1000],\n scrollX: window.scrollX || 0, scrollY: window.scrollY || 0,\n refreshRate,\n };\n\n if (camera) camera.update(rawDt);\n for (const po of passObjs) {\n for (const w of po.texChannels) if (w && w.update) w.update();\n for (const s of po.samplers) if (s.wrap && s.wrap.update) s.wrap.update();\n }\n for (const po of passObjs) {\n const n = Math.max(1, po.cfg.iterations | 0);\n for (let i = 0; i < n; i++) drawPass(po, f, i);\n if (po.cfg.screen && mainBackbuffer && blit) blit.draw(pool.get(po.target.texId), canvas.width, canvas.height);\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n emit('afterFrame', info);\n if (stats) stats.update({ rawDt, cpuMs: performance.now() - t0, frame, time, width: canvas.width, height: canvas.height, passes: passObjs.length });\n }\n\n function loop(now) {\n rafId = requestAnimationFrame(loop);\n if (!loaded || !visible) { last = now; return; }\n if (!playing && tweens.size === 0 && options.renderWhilePaused !== true) { last = now; return; }\n if (maxFps > 0 && now - lastRender < 1000 / maxFps - 0.5) return;\n lastRender = now;\n frameStep(now);\n }\n\n /** Draw one frame right now without advancing time (used by screenshots, resize while paused\u2026). */\n function renderNow() {\n if (!loaded || disposed) return;\n frameStep(performance.now(), { advance: false, rawDt: 0 });\n }\n\n // ---- lifecycle -------------------------------------------------------\n function startLoop() {\n if (disposed || rafId != null) return;\n last = performance.now();\n rafId = requestAnimationFrame(loop);\n }\n function stopLoop() {\n if (rafId != null) cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n function destroy() {\n if (disposed) return;\n disposed = true;\n stopLoop();\n removeResize();\n pointer.dispose();\n visibility.dispose();\n tweens.cancel();\n if (stats) stats.dispose();\n if (overlay) overlay.dispose();\n if (camera) camera.dispose();\n if (blit) blit.dispose();\n canvas.removeEventListener('webglcontextlost', onContextLost);\n canvas.removeEventListener('webglcontextrestored', onContextRestored);\n teardownPasses();\n quad.dispose();\n emit('destroy');\n emitter.clear();\n if (!givenCanvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);\n }\n\n function teardownPasses() {\n for (const po of passObjs) {\n pool.unref(po.programId);\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.texChannels.forEach(w => { if (!w) return; if (w.dispose) w.dispose(); pool.unref(w.texId); });\n (po.samplers || []).forEach(s => { if (!s.wrap) return; if (s.wrap.dispose) s.wrap.dispose(); pool.unref(s.wrap.texId); });\n }\n passObjs.length = 0;\n byName.clear();\n }\n\n function onContextLost(e) {\n e.preventDefault();\n stopLoop();\n loaded = false;\n console.warn('[ShaderMate] WebGL context lost.');\n emit('contextlost');\n }\n async function onContextRestored() {\n console.warn('[ShaderMate] WebGL context restored, rebuilding.');\n pool._items.clear();\n passObjs.length = 0; byName.clear();\n try { await build(); loaded = true; startLoop(); emit('contextrestored'); }\n catch (err) { reportError(err); }\n }\n canvas.addEventListener('webglcontextlost', onContextLost);\n canvas.addEventListener('webglcontextrestored', onContextRestored);\n\n // ---- public API ------------------------------------------------------\n const capture = createCapture(canvas, renderNow);\n\n function set(name, value, passName) {\n if (name && typeof name === 'object') { for (const k in name) set(k, name[k], value); return api; }\n tweens.cancel(name);\n let hit = false;\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) { setUniformIn(po.cfg.uniforms, name, value); hit = true; }\n }\n if (!hit) {\n if (passName) {\n const po = byName.get(passName);\n if (!po) throw new ShaderMateError(`set: unknown pass \"${passName}\"`);\n setUniformIn(po.cfg.uniforms, name, value);\n } else setUniformIn(uniforms, name, value);\n }\n if (!playing && loaded) scheduleRender();\n return api;\n }\n function get(name, passName) {\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) return readUniform(po.cfg.uniforms, name);\n }\n return readUniform(uniforms, name);\n }\n function tween(name, to, opts = {}) {\n const passName = opts.pass;\n const owner = () => {\n for (const po of passObjs) if ((!passName || po.name === passName) && name in po.cfg.uniforms) return po.cfg.uniforms;\n return uniforms;\n };\n return tweens.tween(name, () => readUniform(owner(), name), v => setUniformIn(owner(), name, v), to, opts);\n }\n\n let renderQueued = false;\n function scheduleRender() {\n if (renderQueued) return;\n renderQueued = true;\n requestAnimationFrame(() => { renderQueued = false; if (!playing) renderNow(); });\n }\n\n async function setShader(src, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setShader: unknown pass \"${passName}\"`);\n try {\n const { program, source, compiled } = await buildProgram(po.cfg, src, PASSES);\n if (disposed) { gl.deleteProgram(program); return; }\n pool.unref(po.programId);\n po.programId = pool.add(program, 'program');\n po.uniformInfo = getUniformInfo(gl, program);\n po.cfg.src = src; po.source = source; po.compiled = compiled;\n await loadPassChannels(po);\n clearError();\n emit('shader', { pass: po.name });\n if (!playing) scheduleRender();\n } catch (err) {\n reportError(err);\n throw err;\n }\n }\n\n async function setChannel(index, source, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setChannel: unknown pass \"${passName}\"`);\n const ch = normalizeChannel(source, [...byName.keys()], po.name);\n const old = po.texChannels[index];\n if (old) { if (old.dispose) old.dispose(); pool.unref(old.texId); po.texChannels[index] = null; }\n po.cfg.channels[index] = ch;\n if (ch && ch.pass == null) po.texChannels[index] = await loadChannel(gl, pool, ch, env);\n if (!playing) scheduleRender();\n }\n\n const api = {\n version: VERSION,\n canvas, gl, isWebGL2: isGL2,\n theme: options.theme,\n get camera() { return camera; },\n uniforms,\n get passes() { return passObjs; },\n get ready() { return readyPromise; },\n get loaded() { return loaded; },\n get error() { return lastError; },\n\n // playback\n play() { if (!playing) { playing = true; last = performance.now(); emit('play'); } return api; },\n pause() { if (playing) { playing = false; emit('pause'); } return api; },\n toggle() { return playing ? api.pause() : api.play(); },\n get playing() { return playing; },\n step(n = 1) { for (let i = 0; i < n; i++) frameStep(performance.now(), { advance: true, rawDt: fixedDelta || 1 / 60 }); return api; },\n render: renderNow,\n destroy, dispose: destroy,\n\n // time\n get time() { return time; }, set time(t) { time = t; if (!playing) scheduleRender(); },\n get frame() { return frame; },\n get timeScale() { return timeScale; }, set timeScale(s) { timeScale = s; },\n get maxFps() { return maxFps; }, set maxFps(v) { maxFps = v || 0; },\n get loop() { return loopLen; }, set loop(v) { loopLen = v || 0; },\n seek(t) { time = t; if (!playing) scheduleRender(); return api; },\n setFixedDelta(dt) { fixedDelta = dt || 0; return api; },\n\n // uniforms\n set, get, tween,\n setUniform: set, getUniform: get,\n\n // live editing\n setShader, setChannel,\n getPass: name => byName.get(name) || null,\n getTexture(name) {\n const po = name ? byName.get(name) : passObjs.find(p => !p.cfg.screen) || passObjs[0];\n return po && po.target ? pool.get(po.target.texId) : null;\n },\n readPixels({ pass, x = 0, y = 0, width, height, float } = {}) {\n const po = pass ? byName.get(pass) : null;\n renderNow();\n if (po && po.target) gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n else gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n const w = width ?? (po && po.target ? po.target.width : canvas.width);\n const h = height ?? (po && po.target ? po.target.height : canvas.height);\n let out = new Uint8Array(w * h * 4);\n const isFloat = po && po.target && po.target.fmt.type !== gl.UNSIGNED_BYTE;\n if (isFloat) {\n // float / half-float targets can only be read back as floats\n const f = new Float32Array(w * h * 4);\n gl.readPixels(x, y, w, h, gl.RGBA, gl.FLOAT, f);\n if (float !== false) out = f;\n else for (let i = 0; i < f.length; i++) out[i] = Math.max(0, Math.min(255, Math.round(f[i] * 255)));\n } else gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, out);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { data: out, width: w, height: h, float: out instanceof Float32Array };\n },\n\n // sizing / input\n resize: handleResize,\n setSize(w, h) { sizer.setFixed(w, h); handleResize(); return api; },\n get width() { return canvas.width; },\n get height() { return canvas.height; },\n pointer: pointer.state,\n domToShader: pointer.toShader,\n domToUV: pointer.toUV,\n\n // capture\n screenshot: capture.screenshot,\n toBlob: capture.toBlob,\n download: capture.download,\n record: capture.record,\n\n // events\n on, off, once,\n\n // dev\n stats: {\n show: (v = true) => { if (!stats) stats = createStats({ visible: false, key: options.statsKey === undefined ? 'F1' : options.statsKey, theme: options.theme }); stats.show(v); },\n toggle: () => api.stats.show(!(stats && stats.isVisible())),\n },\n };\n\n // ---- go --------------------------------------------------------------\n sizer.update();\n gl.viewport(0, 0, canvas.width, canvas.height);\n removeResize = sizer.observe(handleResize);\n\n const readyPromise = (async () => {\n await build();\n if (disposed) return api;\n loaded = true;\n clearError();\n emit('load', api);\n if (options.onReady) options.onReady(api);\n startLoop();\n if (!playing) renderNow();\n return api;\n })();\n readyPromise.catch(err => { if (!disposed) reportError(err); });\n\n return api;\n}\n", "// GLSL (WebGL 2) for the GPU pipeline. Each pass mirrors a function in cpu/stages.js.\r\n// ShaderMate adds the #version line, precision, fragColor and the built-in uniforms.\r\n//\r\n// prep \u2500\u25B6 quant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n// \u2514\u2500\u2500\u2500\u25B6 diffuse (N waves) \u2500\u25B6 resolve \u2500\u25B6 orphan \u2500\u25B6 smooth \u2500\u25B6 out (screen)\r\n//\r\n// Note: no trailing comments on uniform lines; ShaderMate reads trailing numbers there as default values.\r\n// All passes address pixels top-down (`P`, row 0 = top) so the maths matches the CPU.\r\n\r\nexport const COMMON = /* glsl */`\r\n// 256\u00D71, palette colours in x = 0..count-1\r\nuniform sampler2D u_palette;\r\nuniform int u_count;\r\n// 0 = OKLab, 1 = weighted RGB\r\nuniform int u_distance;\r\n\r\nivec2 topDown() { return ivec2(int(gl_FragCoord.x), int(u_resolution.y) - 1 - int(gl_FragCoord.y)); }\r\nvec4 at(sampler2D t, ivec2 p) { ivec2 s = textureSize(t, 0); return texelFetch(t, ivec2(p.x, s.y - 1 - p.y), 0); }\r\nbool inside(ivec2 p) { return p.x >= 0 && p.y >= 0 && p.x < int(u_resolution.x) && p.y < int(u_resolution.y); }\r\nvec3 palColor(int i) { return texelFetch(u_palette, ivec2(i, 0), 0).rgb; }\r\n\r\nfloat linear1(float c) { return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4); }\r\nvec3 oklab(vec3 c) {\r\n c = vec3(linear1(c.r), linear1(c.g), linear1(c.b));\r\n float l = pow(0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b, 1.0 / 3.0);\r\n float m = pow(0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b, 1.0 / 3.0);\r\n float s = pow(0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b, 1.0 / 3.0);\r\n return vec3(0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s);\r\n}\r\nvec3 space(vec3 c) { return u_distance == 1 ? c : oklab(c); }\r\nint nearestIndex(vec3 c) {\r\n vec3 p = space(c);\r\n vec3 w = u_distance == 1 ? vec3(0.299, 0.587, 0.114) : vec3(1.0);\r\n int best = 0; float bd = 1e20;\r\n for (int i = 0; i < 256; i++) {\r\n if (i >= u_count) break;\r\n vec3 d = p - space(palColor(i));\r\n float dist = dot(w * d, d);\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\nint colorKey(vec4 c) {\r\n if (c.a < 0.5) return -1;\r\n ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));\r\n return b.r * 65536 + b.g * 256 + b.b;\r\n}\r\n`;\r\n\r\n/** Resample (box / nearest) + adjust + alpha cut. iChannel0 = source image. */\r\nexport const PREP = /* glsl */`\r\n// 0 box, 1 nearest\r\nuniform int u_resample;\r\n// brightness, contrast, saturation, gamma\r\nuniform vec4 u_adjust;\r\n// hue rotation in degrees\r\nuniform float u_hue;\r\nuniform float u_alphaCut;\r\n// source region in texels: x, y (from the top-left), width, height\r\nuniform ivec4 u_crop;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n ivec2 R = ivec2(u_resolution);\r\n ivec2 O = u_crop.xy;\r\n ivec2 S = u_crop.zw;\r\n int nx = u_resample == 1 ? 1 : clamp((S.x + R.x - 1) / R.x, 1, 16);\r\n int ny = u_resample == 1 ? 1 : clamp((S.y + R.y - 1) / R.y, 1, 16);\r\n vec4 acc = vec4(0.0);\r\n for (int j = 0; j < 16; j++) {\r\n if (j >= ny) break;\r\n int sy = min(S.y - 1, ((2 * (P.y * ny + j) + 1) * S.y) / (2 * R.y * ny));\r\n for (int i = 0; i < 16; i++) {\r\n if (i >= nx) break;\r\n int sx = min(S.x - 1, ((2 * (P.x * nx + i) + 1) * S.x) / (2 * R.x * nx));\r\n vec4 c = at(iChannel0, O + ivec2(sx, sy));\r\n acc += vec4(c.rgb * c.a, c.a);\r\n }\r\n }\r\n vec3 c = acc.a > 0.0 ? acc.rgb / acc.a : vec3(0.0);\r\n float a = acc.a / float(nx * ny);\r\n\r\n float br = u_adjust.x, co = u_adjust.y, sa = u_adjust.z, ga = u_adjust.w;\r\n if (br != 0.0 || co != 0.0 || sa != 0.0 || ga != 1.0 || u_hue != 0.0) {\r\n float f = co >= 0.0 ? 1.0 / (1.0 - 0.99 * co) : 1.0 + co;\r\n c = (c + br - 0.5) * f + 0.5;\r\n float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\r\n c = l + (c - l) * (1.0 + sa);\r\n if (u_hue != 0.0) {\r\n float h = radians(u_hue), k = cos(h), q = sin(h);\r\n c = vec3(\r\n (0.213 + 0.787 * k - 0.213 * q) * c.r + (0.715 - 0.715 * k - 0.715 * q) * c.g + (0.072 - 0.072 * k + 0.928 * q) * c.b,\r\n (0.213 - 0.213 * k + 0.143 * q) * c.r + (0.715 + 0.285 * k + 0.140 * q) * c.g + (0.072 - 0.072 * k - 0.283 * q) * c.b,\r\n (0.213 - 0.213 * k - 0.787 * q) * c.r + (0.715 - 0.715 * k + 0.715 * q) * c.g + (0.072 + 0.928 * k + 0.072 * q) * c.b);\r\n }\r\n c = pow(clamp(c, 0.0, 1.0), vec3(1.0 / ga));\r\n }\r\n a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;\r\n fragColor = vec4(c * a, a);\r\n}\r\n`;\r\n\r\n/** No dither / ordered dither. iChannel0 = prep. */\r\nexport const QUANT = /* glsl */`\r\n// threshold bytes in .r\r\nuniform sampler2D u_matrix;\r\n// 0 pass-through, 1 nearest, 2 ordered\r\nuniform int u_mode;\r\nuniform float u_levels;\r\n// spread \u00D7 strength\r\nuniform float u_amount;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0); return; }\r\n vec3 c = p.rgb;\r\n if (u_mode == 0) { fragColor = vec4(floor(c * 255.0 + 0.5) / 255.0, 1.0); return; }\r\n if (u_mode == 2) {\r\n ivec2 ms = textureSize(u_matrix, 0);\r\n float v = floor(at(u_matrix, ivec2(P.x % ms.x, P.y % ms.y)).r * 255.0 + 0.5);\r\n float t = (v + 0.5) / u_levels - 0.5;\r\n c = clamp(c + t * u_amount, 0.0, 1.0);\r\n }\r\n fragColor = vec4(palColor(nearestIndex(c)), 1.0);\r\n}\r\n`;\r\n\r\n/**\r\n * Error diffusion as a wavefront. Iteration r computes every pixel with x + skew*y == r,\r\n * pulling the stored error of already-computed neighbours.\r\n * Output: rgb = quantisation error, a = palette index (-1 not yet computed, -2 transparent).\r\n * iChannel0 = prep, iChannel1 = this pass (previous iteration).\r\n */\r\nexport const DIFFUSE = /* glsl */`\r\n// iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)\r\nuniform int u_recursion;\r\nuniform int u_on;\r\nuniform int u_skew;\r\nuniform float u_strength;\r\nuniform int u_kn;\r\n// push offsets (dx, dy) and weight\r\nuniform vec3 u_kernel[12];\r\n\r\nvoid main() {\r\n if (u_on == 0) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n ivec2 P = topDown();\r\n int k = P.x + u_skew * P.y;\r\n int r = u_recursion;\r\n if (k < r) { fragColor = at(iChannel1, P); return; }\r\n if (k > r) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0, 0.0, 0.0, -2.0); return; }\r\n vec3 acc = vec3(0.0);\r\n for (int i = 0; i < 12; i++) {\r\n if (i >= u_kn) break;\r\n ivec2 Q = P - ivec2(u_kernel[i].xy);\r\n if (!inside(Q)) continue;\r\n vec4 e = at(iChannel1, Q);\r\n if (e.a >= 0.0) acc += e.rgb * u_kernel[i].z;\r\n }\r\n vec3 c = clamp(p.rgb + acc * u_strength, 0.0, 1.0);\r\n int idx = nearestIndex(c);\r\n fragColor = vec4(c - palColor(idx), float(idx));\r\n}\r\n`;\r\n\r\n/** Pick the ordered result or turn diffusion indices into colours. iChannel0 = quant, iChannel1 = diffuse. */\r\nexport const RESOLVE = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n if (u_on == 0) { fragColor = at(iChannel0, P); return; }\r\n vec4 d = at(iChannel1, P);\r\n fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);\r\n}\r\n`;\r\n\r\n/** Orphan removal. iChannel0 = resolve. */\r\nexport const ORPHAN = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 off[4] = ivec2[4](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0));\r\n int ks[4]; vec4 cs[4]; int n = 0;\r\n for (int i = 0; i < 4; i++) {\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n cs[n] = at(iChannel0, Q); ks[n] = colorKey(cs[n]);\r\n if (ks[n] == c) return;\r\n n++;\r\n }\r\n if (n < 2) return;\r\n int best = 0, bc = 0;\r\n for (int i = 0; i < 4; i++) {\r\n if (i >= n) break;\r\n int m = 0;\r\n for (int j = 0; j < 4; j++) { if (j >= n) break; if (ks[j] == ks[i]) m++; }\r\n if (m > bc) { bc = m; best = i; }\r\n }\r\n fragColor = cs[best];\r\n}\r\n`;\r\n\r\n/** 3\u00D73 majority smoothing. iChannel0 = orphan. */\r\nexport const SMOOTH = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 R = ivec2(u_resolution);\r\n int ks[9]; vec4 cs[9];\r\n for (int j = 0; j < 3; j++) for (int i = 0; i < 3; i++) {\r\n ivec2 Q = clamp(P + ivec2(i - 1, j - 1), ivec2(0), R - 1);\r\n cs[j * 3 + i] = at(iChannel0, Q); ks[j * 3 + i] = colorKey(cs[j * 3 + i]);\r\n }\r\n for (int i = 0; i < 9; i++) {\r\n if (ks[i] == c) continue;\r\n int m = 0;\r\n for (int j = 0; j < 9; j++) if (ks[j] == ks[i]) m++;\r\n if (m >= 5) { fragColor = cs[i]; return; }\r\n }\r\n}\r\n`;\r\n\r\n/** Outline, drawn to the canvas. iChannel0 = smooth. */\r\nexport const OUTLINE = /* glsl */`\r\n// 0 none, 1 outer, 2 inner\r\nuniform int u_outline;\r\nuniform int u_corners;\r\nuniform vec3 u_outlineColor;\r\nbool opaqueAt(ivec2 q) { return inside(q) && at(iChannel0, q).a > 0.5; }\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_outline == 0) return;\r\n bool o = me.a > 0.5;\r\n ivec2 off[8] = ivec2[8](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0), ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1));\r\n int n = u_corners == 1 ? 8 : 4;\r\n for (int i = 0; i < 8; i++) {\r\n if (i >= n) break;\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n bool other = opaqueAt(Q);\r\n if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }\r\n }\r\n}\r\n`;\r\n", "// GPU backend: one ShaderMate instance, six passes, rendered on demand (never animating).\r\n\r\nimport { createShader } from 'shadermate';\r\nimport { COMMON, PREP, QUANT, DIFFUSE, RESOLVE, ORPHAN, SMOOTH, OUTLINE } from './shaders.js';\r\nimport { MAX_KERNEL } from '../dither/kernels.js';\r\n\r\nconst canvasOf = (w, h) => { const c = document.createElement('canvas'); c.width = w; c.height = h; return c; };\r\n\r\n/**\r\n * Create the WebGL 2 backend. Rejects when WebGL 2 or float render targets are missing,\r\n * so the caller can fall back to the CPU.\r\n */\r\nexport async function createGPUBackend() {\r\n if (typeof document === 'undefined') throw new Error('No DOM');\r\n const probe = canvasOf(1, 1).getContext('webgl2');\r\n if (!probe) throw new Error('WebGL 2 is not available');\r\n if (!probe.getExtension('EXT_color_buffer_float')) throw new Error('Float render targets are not available');\r\n const dbg = probe.getExtension('WEBGL_debug_renderer_info');\r\n const renderer = String(dbg ? probe.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : probe.getParameter(probe.RENDERER));\r\n probe.getExtension('WEBGL_lose_context')?.loseContext();\r\n\r\n const canvas = canvasOf(1, 1);\r\n const source = canvasOf(1, 1);\r\n const palette = canvasOf(256, 1);\r\n const matrix = canvasOf(1, 1);\r\n const nearest = el => ({ element: el, filter: 'nearest', wrap: 'clamp' });\r\n\r\n const sm = createShader({\r\n canvas,\r\n webgl: 2,\r\n size: [1, 1],\r\n pixelRatio: 1,\r\n autoplay: false,\r\n pauseWhenHidden: false,\r\n pointer: false,\r\n errorOverlay: false,\r\n warnMissingUniforms: false,\r\n preserveDrawingBuffer: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n dialect: 'shadermate',\r\n common: COMMON,\r\n samplers: { u_palette: nearest(palette), u_matrix: nearest(matrix) },\r\n uniforms: {\r\n u_count: 1, u_distance: 0, u_resample: 0, u_adjust: [0, 0, 0, 1], u_hue: 0, u_crop: [0, 0, 1, 1], u_alphaCut: 0.5,\r\n u_mode: 0, u_levels: 1, u_amount: 0,\r\n u_skew: 1, u_strength: 1, u_kn: 0, u_kernel: new Float32Array(MAX_KERNEL * 3),\r\n u_outline: 0, u_corners: 0, u_outlineColor: [0, 0, 0],\r\n },\r\n passes: [\r\n { name: 'prep', shader: PREP, float: 'full', filter: 'nearest', channels: [{ ...nearest(source), dynamic: false }] },\r\n { name: 'quant', shader: QUANT, filter: 'nearest', channels: ['prep'] },\r\n { name: 'diffuse', shader: DIFFUSE, float: 'full', filter: 'nearest', pingpong: true, iterations: 2, channels: ['prep', 'diffuse'] },\r\n { name: 'resolve', shader: RESOLVE, filter: 'nearest', channels: ['quant', 'diffuse'] },\r\n { name: 'orphan', shader: ORPHAN, filter: 'nearest', channels: ['resolve'] },\r\n { name: 'smooth', shader: SMOOTH, filter: 'nearest', channels: ['orphan'] },\r\n { name: 'out', shader: OUTLINE, screen: true, channels: ['smooth'] },\r\n ],\r\n });\r\n\r\n let failure = null;\r\n sm.on('error', e => { failure = e; });\r\n await sm.ready;\r\n if (failure || sm.error) { sm.destroy(); throw failure || sm.error; }\r\n\r\n // `u_on` is a per-pass switch: same name, different value in each pass\r\n const passUniforms = (name, values) => { for (const k in values) sm.set(k, values[k], name); };\r\n\r\n let lastSource = null;\r\n let paletteKey = '', matrixKey = '';\r\n\r\n async function setSource(frame) {\r\n if (frame.canvas === lastSource && !frame.dirty) return;\r\n source.width = frame.width; source.height = frame.height;\r\n const ctx = source.getContext('2d');\r\n ctx.clearRect(0, 0, source.width, source.height);\r\n ctx.drawImage(frame.canvas, 0, 0);\r\n await sm.setChannel(0, { ...nearest(source), dynamic: false }, 'prep');\r\n lastSource = frame.canvas;\r\n }\r\n\r\n function setPalette(plan) {\r\n const key = plan.palette.map(c => c.join(',')).join(';');\r\n if (key === paletteKey) return;\r\n paletteKey = key;\r\n const ctx = palette.getContext('2d');\r\n const img = ctx.createImageData(256, 1);\r\n plan.palette.forEach((c, i) => img.data.set([c[0], c[1], c[2], 255], i * 4));\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n function setMatrix(map) {\r\n const key = map ? `${map.w}x${map.h}:${map.levels}:${map.values.join(',')}` : 'none';\r\n if (key === matrixKey) return;\r\n matrixKey = key;\r\n const m = map || { w: 1, h: 1, values: [0] };\r\n matrix.width = m.w; matrix.height = m.h;\r\n const ctx = matrix.getContext('2d');\r\n const img = ctx.createImageData(m.w, m.h);\r\n for (let i = 0; i < m.values.length; i++) img.data.set([m.values[i], 0, 0, 255], i * 4);\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n /**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ canvas: HTMLCanvasElement, width: number, height: number, dirty?: boolean }} frame\r\n * @returns {Promise<Uint8ClampedArray>} RGBA bytes, rows top-down\r\n */\r\n async function run(plan, frame) {\r\n const s = plan.settings;\r\n await setSource(frame);\r\n if (plan.quantize) setPalette(plan);\r\n setMatrix(plan.map);\r\n if (sm.width !== plan.width || sm.height !== plan.height) sm.setSize(plan.width, plan.height);\r\n\r\n const diffusion = plan.kind === 'diffusion';\r\n const kernel = new Array(MAX_KERNEL).fill(null).map((_, i) => (plan.kernel && plan.kernel[i]) || [0, 0, 0]);\r\n sm.set({\r\n u_count: plan.palette.length || 1,\r\n u_distance: plan.distance,\r\n u_resample: s.size.resample === 'nearest' ? 1 : 0,\r\n u_adjust: [s.adjust.brightness, s.adjust.contrast, s.adjust.saturation, s.adjust.gamma],\r\n u_hue: s.adjust.hue,\r\n u_crop: [plan.crop.x, plan.crop.y, plan.crop.w, plan.crop.h],\r\n u_alphaCut: s.alpha.threshold,\r\n u_mode: !plan.quantize ? 0 : plan.kind === 'ordered' ? 2 : 1,\r\n u_levels: plan.map ? plan.map.levels : 1,\r\n u_amount: plan.map ? plan.spread * s.dither.strength : 0,\r\n u_skew: plan.skew,\r\n u_strength: s.dither.strength,\r\n u_kn: plan.kernel ? plan.kernel.length : 0,\r\n u_kernel: new Float32Array(kernel.flat()),\r\n u_outline: { none: 0, outer: 1, inner: 2 }[plan.outline.mode],\r\n u_corners: plan.outline.corners ? 1 : 0,\r\n u_outlineColor: plan.outline.color.map(v => v / 255),\r\n });\r\n passUniforms('diffuse', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('resolve', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('orphan', { u_on: s.cleanup.orphans ? 1 : 0 });\r\n passUniforms('smooth', { u_on: s.cleanup.smooth ? 1 : 0 });\r\n sm.getPass('diffuse').cfg.iterations = diffusion ? plan.waves : 1;\r\n\r\n const { data } = sm.readPixels();\r\n // GL rows are bottom-up\r\n const w = plan.width, h = plan.height, out = new Uint8ClampedArray(w * h * 4), row = w * 4;\r\n for (let y = 0; y < h; y++) out.set(data.subarray((h - 1 - y) * row, (h - y) * row), y * row);\r\n return out;\r\n }\r\n\r\n return {\r\n name: 'webgl',\r\n renderer,\r\n /** Software rasterisers (SwiftShader, llvmpipe) are slower than the CPU path for error diffusion. */\r\n software: /swiftshader|llvmpipe|softpipe|software|basic render/i.test(renderer),\r\n run,\r\n shader: sm,\r\n destroy() { sm.destroy(); },\r\n };\r\n}\r\n", "// Turning whatever the caller has into a \"frame\": { width, height, canvas?, data }.\r\n// Accepts URLs, Blobs/Files, <img>, <canvas>, OffscreenCanvas, ImageBitmap, <video> (current frame),\r\n// VideoFrame, ImageData or any { width, height, data } RGBA object, plus p5 / q5 images.\r\n\r\nexport const MAX_SOURCE = 4096;\r\nconst hasDOM = typeof document !== 'undefined';\r\n\r\nconst isRGBA = s => s && typeof s === 'object' && 'data' in s && 'width' in s && 'height' in s && s.data && s.data.length === s.width * s.height * 4;\r\n\r\n/** Load a URL or Blob into something drawable. */\r\nexport async function loadImage(src) {\r\n if (typeof Blob !== 'undefined' && src instanceof Blob) {\r\n if (typeof createImageBitmap === 'function') {\r\n try { return await createImageBitmap(src); } catch { /* fall through (e.g. SVG) */ }\r\n }\r\n src = URL.createObjectURL(src);\r\n }\r\n if (!hasDOM) throw new Error('Loading images by URL needs a browser; pass { width, height, data } in Node.');\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.decoding = 'async';\r\n img.src = src;\r\n await img.decode();\r\n return img;\r\n}\r\n\r\n/** Natural pixel size of a drawable. */\r\nexport function sizeOf(el) {\r\n return {\r\n width: el.naturalWidth || el.videoWidth || el.displayWidth || el.codedWidth || el.width || 0,\r\n height: el.naturalHeight || el.videoHeight || el.displayHeight || el.codedHeight || el.height || 0,\r\n };\r\n}\r\n\r\nfunction unwrap(src) {\r\n // p5.Image / q5 image / p5.Graphics / p5.Renderer\r\n if (src && !isRGBA(src) && typeof src === 'object') {\r\n if (src.canvas && typeof src.canvas === 'object' && 'getContext' in src.canvas) return src.canvas;\r\n if (src.elt && typeof src.elt === 'object' && 'getContext' in src.elt) return src.elt;\r\n }\r\n return src;\r\n}\r\n\r\n/**\r\n * @param {any} source\r\n * @param {{ maxSize?: number, canvas?: HTMLCanvasElement }} [opts] canvas: scratch canvas to reuse\r\n */\r\nexport async function toFrame(source, opts = {}) {\r\n const maxSize = opts.maxSize || MAX_SOURCE;\r\n let src = unwrap(source);\r\n if (typeof src === 'string' || (typeof Blob !== 'undefined' && src instanceof Blob)) src = await loadImage(src);\r\n if (src && typeof src.complete === 'boolean' && !src.complete && src.decode) await src.decode();\r\n\r\n if (isRGBA(src)) {\r\n const frame = { width: src.width, height: src.height, data: src.data, canvas: null };\r\n if (hasDOM) {\r\n Object.defineProperty(frame, 'canvas', {\r\n configurable: true,\r\n get() {\r\n const c = document.createElement('canvas'); c.width = src.width; c.height = src.height;\r\n const img = new ImageData(new Uint8ClampedArray(src.data), src.width, src.height);\r\n c.getContext('2d').putImageData(img, 0, 0);\r\n Object.defineProperty(frame, 'canvas', { value: c });\r\n return c;\r\n },\r\n });\r\n }\r\n return frame;\r\n }\r\n if (!hasDOM) throw new Error('Unsupported source in a non-browser environment. Pass { width, height, data }.');\r\n\r\n let { width, height } = sizeOf(src);\r\n if (!width || !height) throw new Error('Source has no size yet (is the image or video loaded?)');\r\n const k = Math.min(1, maxSize / Math.max(width, height));\r\n width = Math.max(1, Math.round(width * k)); height = Math.max(1, Math.round(height * k));\r\n\r\n const canvas = opts.canvas || document.createElement('canvas');\r\n canvas.width = width; canvas.height = height;\r\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.imageSmoothingEnabled = k < 1;\r\n ctx.imageSmoothingQuality = 'high';\r\n ctx.drawImage(src, 0, 0, width, height);\r\n let cached = null;\r\n return {\r\n width, height, canvas, dirty: true,\r\n get data() { return (cached ||= ctx.getImageData(0, 0, width, height).data); },\r\n };\r\n}\r\n", "// Pure pixel helpers (no DOM): integer upscaling, grid lines, colour counting.\r\n\r\nimport { parseColor, toHex } from '../color.js';\r\n\r\n/**\r\n * Nearest-neighbour integer upscale.\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {number} k scale factor (integer \u2265 1)\r\n * @param {{ grid?: boolean, gridColor?: string, gridAlpha?: number }} [opts] grid: 1px lines between source pixels\r\n */\r\nexport function upscale(img, k = 1, opts = {}) {\r\n k = Math.max(1, Math.round(k));\r\n const w = img.width * k, h = img.height * k;\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const src = img.data, sw = img.width;\r\n for (let y = 0; y < h; y++) {\r\n const sy = (y / k) | 0;\r\n for (let x = 0; x < w; x++) {\r\n const so = (sy * sw + ((x / k) | 0)) * 4, o = (y * w + x) * 4;\r\n out[o] = src[so]; out[o + 1] = src[so + 1]; out[o + 2] = src[so + 2]; out[o + 3] = src[so + 3];\r\n }\r\n }\r\n if (opts.grid && k >= 3) {\r\n const [r, g, b] = parseColor(opts.gridColor || '#000000');\r\n const a = opts.gridAlpha ?? 0.35;\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\r\n if (x % k && y % k) continue;\r\n const o = (y * w + x) * 4;\r\n const sa = out[o + 3] / 255, oa = a + sa * (1 - a);\r\n out[o] = (r * a + out[o] * sa * (1 - a)) / oa;\r\n out[o + 1] = (g * a + out[o + 1] * sa * (1 - a)) / oa;\r\n out[o + 2] = (b * a + out[o + 2] * sa * (1 - a)) / oa;\r\n out[o + 3] = oa * 255;\r\n }\r\n }\r\n return { width: w, height: h, data: out };\r\n}\r\n\r\n/**\r\n * Nearest-neighbour resize to any size (used to export at the source's resolution, like 2.x's\r\n * \"full resolution\" download). Pixels may differ by one in size when the ratio isn't whole.\r\n */\r\nexport function resizeNearest(img, width, height) {\r\n width = Math.max(1, Math.round(width)); height = Math.max(1, Math.round(height));\r\n const out = new Uint8ClampedArray(width * height * 4);\r\n const xs = new Int32Array(width);\r\n for (let x = 0; x < width; x++) xs[x] = Math.min(img.width - 1, Math.floor((x + 0.5) * img.width / width));\r\n for (let y = 0; y < height; y++) {\r\n const sy = Math.min(img.height - 1, Math.floor((y + 0.5) * img.height / height));\r\n for (let x = 0; x < width; x++) {\r\n const so = (sy * img.width + xs[x]) * 4, o = (y * width + x) * 4;\r\n out[o] = img.data[so]; out[o + 1] = img.data[so + 1]; out[o + 2] = img.data[so + 2]; out[o + 3] = img.data[so + 3];\r\n }\r\n }\r\n return { width, height, data: out };\r\n}\r\n\r\n/** Distinct opaque colours in an image ('#rrggbb'), in order of first appearance. */\r\nexport function uniqueColors(img, limit = Infinity) {\r\n const seen = new Set();\r\n const d = img.data;\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] === 0) continue;\r\n seen.add((d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n if (seen.size > limit) break;\r\n }\r\n return [...seen].map(v => toHex([v >> 16, (v >> 8) & 255, v & 255]));\r\n}\r\n\r\n/** True when the image has at least one non-opaque pixel. */\r\nexport function hasTransparency(img) {\r\n for (let o = 3; o < img.data.length; o += 4) if (img.data[o] < 255) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Detect the pixel-grid size of an upscaled pixel-art image (e.g. a sprite saved at 4\u00D7).\r\n * Returns the largest block size b such that the image is made of b\u00D7b solid blocks\r\n * (allowing a small tolerance for JPEG noise), or 1.\r\n */\r\nexport function detectGrid(img, tolerance = 8) {\r\n const { width: w, height: h, data: d } = img;\r\n const same = (a, b) => Math.abs(d[a] - d[b]) <= tolerance && Math.abs(d[a + 1] - d[b + 1]) <= tolerance && Math.abs(d[a + 2] - d[b + 2]) <= tolerance && Math.abs(d[a + 3] - d[b + 3]) <= tolerance;\r\n // run lengths along rows and columns; the block size divides all of them (mostly)\r\n const gcd = (a, b) => (b ? gcd(b, a % b) : a);\r\n let g = 0;\r\n const stepY = Math.max(1, Math.floor(h / 64)), stepX = Math.max(1, Math.floor(w / 64));\r\n for (let y = 0; y < h; y += stepY) {\r\n let run = 1;\r\n for (let x = 1; x < w; x++) {\r\n if (same((y * w + x) * 4, (y * w + x - 1) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n for (let x = 0; x < w; x += stepX) {\r\n let run = 1;\r\n for (let y = 1; y < h; y++) {\r\n if (same((y * w + x) * 4, ((y - 1) * w + x) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n return g || 1;\r\n}\r\n", "// DOM helpers: canvases and downloads.\r\n\r\nimport { upscale } from './scale.js';\r\n\r\n/** RGBA image \u2192 <canvas>, upscaled by an integer factor with optional grid lines. */\r\nexport function toCanvas(img, scale = 1, opts = {}) {\r\n const up = scale > 1 || opts.grid ? upscale(img, scale, opts) : img;\r\n const c = opts.canvas || document.createElement('canvas');\r\n c.width = up.width; c.height = up.height;\r\n c.getContext('2d').putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\r\n return c;\r\n}\r\n\r\n/** Trigger a browser download for a Blob or bytes. */\r\nexport function downloadBlob(data, filename, type = 'application/octet-stream') {\r\n const blob = data instanceof Blob ? data : new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url; a.download = filename; a.rel = 'noopener';\r\n document.body.appendChild(a); a.click(); a.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 10000);\r\n}\r\n", "// CRC-32 (IEEE), shared by the PNG and zip writers.\r\nlet table = null;\r\nexport function crc32(bytes, crc = 0) {\r\n if (!table) {\r\n table = new Uint32Array(256);\r\n for (let n = 0; n < 256; n++) {\r\n let c = n;\r\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n table[n] = c >>> 0;\r\n }\r\n }\r\n crc = ~crc >>> 0;\r\n for (let i = 0; i < bytes.length; i++) crc = table[(crc ^ bytes[i]) & 255] ^ (crc >>> 8);\r\n return ~crc >>> 0;\r\n}\r\n", "// Minimal PNG encoder: indexed (colour type 3, with tRNS) when the image has \u2264 256 colours,\r\n// otherwise RGBA. Uses CompressionStream('deflate'), so it works in browsers and in Node 18+.\r\n\r\nimport { crc32 } from './crc32.js';\r\nimport { upscale, resizeNearest } from './scale.js';\r\n\r\nconst SIG = [137, 80, 78, 71, 13, 10, 26, 10];\r\n\r\nasync function deflate(bytes) {\r\n if (typeof CompressionStream === 'function') {\r\n const cs = new CompressionStream('deflate');\r\n const stream = new Blob([bytes]).stream().pipeThrough(cs);\r\n return new Uint8Array(await new Response(stream).arrayBuffer());\r\n }\r\n const { deflateSync } = await import('node:zlib');\r\n return new Uint8Array(deflateSync(bytes));\r\n}\r\n\r\nfunction chunk(type, data) {\r\n const out = new Uint8Array(12 + data.length);\r\n const dv = new DataView(out.buffer);\r\n dv.setUint32(0, data.length);\r\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i);\r\n out.set(data, 8);\r\n dv.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)));\r\n return out;\r\n}\r\n\r\n/** Map pixels to palette indices. Returns null when there are more than 256 colours. */\r\nexport function indexImage(img) {\r\n const d = img.data, n = img.width * img.height;\r\n const map = new Map(), colors = [], idx = new Uint8Array(n);\r\n for (let i = 0; i < n; i++) {\r\n const o = i * 4;\r\n const k = d[o + 3] === 0 ? -1 : ((d[o] << 24) | (d[o + 1] << 16) | (d[o + 2] << 8) | d[o + 3]) >>> 0;\r\n let v = map.get(k);\r\n if (v === undefined) {\r\n if (colors.length === 256) return null;\r\n v = colors.length; map.set(k, v);\r\n colors.push(k === -1 ? [0, 0, 0, 0] : [d[o], d[o + 1], d[o + 2], d[o + 3]]);\r\n }\r\n idx[i] = v;\r\n }\r\n return { colors, indices: idx };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {{ scale?: number, grid?: boolean, gridColor?: string, indexed?: boolean, width?: number, height?: number }} [opts]\r\n * width/height: resize to exactly this size (nearest neighbour) instead of scaling\r\n * @returns {Promise<Uint8Array>}\r\n */\r\nexport async function encodePNG(img, opts = {}) {\r\n if (opts.width && opts.height) img = resizeNearest(img, opts.width, opts.height);\r\n else if ((opts.scale && opts.scale > 1) || opts.grid) img = upscale(img, opts.scale || 1, opts);\r\n const { width: w, height: h } = img;\r\n const ix = opts.indexed === false ? null : indexImage(img);\r\n const ihdr = new Uint8Array(13);\r\n const dv = new DataView(ihdr.buffer);\r\n dv.setUint32(0, w); dv.setUint32(4, h);\r\n const parts = [new Uint8Array(SIG)];\r\n let raw;\r\n if (ix) {\r\n const bits = ix.colors.length <= 2 ? 1 : ix.colors.length <= 4 ? 2 : ix.colors.length <= 16 ? 4 : 8;\r\n ihdr.set([bits, 3, 0, 0, 0], 8);\r\n const stride = Math.ceil(w * bits / 8);\r\n raw = new Uint8Array((stride + 1) * h);\r\n for (let y = 0; y < h; y++) {\r\n const row = y * (stride + 1) + 1;\r\n for (let x = 0; x < w; x++) {\r\n const v = ix.indices[y * w + x];\r\n const bit = x * bits;\r\n raw[row + (bit >> 3)] |= v << (8 - bits - (bit & 7));\r\n }\r\n }\r\n parts.push(chunk('IHDR', ihdr));\r\n parts.push(chunk('PLTE', Uint8Array.from(ix.colors.flatMap(c => c.slice(0, 3)))));\r\n if (ix.colors.some(c => c[3] < 255)) {\r\n let last = ix.colors.length; while (last > 0 && ix.colors[last - 1][3] === 255) last--;\r\n parts.push(chunk('tRNS', Uint8Array.from(ix.colors.slice(0, last).map(c => c[3]))));\r\n }\r\n } else {\r\n ihdr.set([8, 6, 0, 0, 0], 8);\r\n raw = new Uint8Array((w * 4 + 1) * h);\r\n for (let y = 0; y < h; y++) raw.set(img.data.subarray ? img.data.subarray(y * w * 4, (y + 1) * w * 4) : Array.prototype.slice.call(img.data, y * w * 4, (y + 1) * w * 4), y * (w * 4 + 1) + 1);\r\n parts.push(chunk('IHDR', ihdr));\r\n }\r\n parts.push(chunk('IDAT', await deflate(raw)));\r\n parts.push(chunk('IEND', new Uint8Array(0)));\r\n const total = parts.reduce((s, p) => s + p.length, 0);\r\n const out = new Uint8Array(total);\r\n let o = 0; for (const p of parts) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// The public engine: createPixelator() picks a backend and turns sources into pixel art.\r\n\r\nimport { makePlan } from './plan.js';\r\nimport { runCPU } from './cpu/pipeline.js';\r\nimport { createGPUBackend } from './gpu/backend.js';\r\nimport { toFrame } from './source.js';\r\nimport { normalizeSettings, LEGACY_DITHER } from './settings.js';\r\nimport { uniqueColors } from './export/scale.js';\r\nimport { toCanvas } from './export/canvas.js';\r\nimport { encodePNG } from './export/png.js';\r\n\r\nconst isVideo = s => typeof HTMLVideoElement !== 'undefined' && s instanceof HTMLVideoElement;\r\nconst isVideoFrame = s => typeof VideoFrame !== 'undefined' && s instanceof VideoFrame;\r\n\r\n/**\r\n * Create an engine. Reuse one for many images: the GPU backend compiles its shaders once.\r\n * @param {{ backend?: 'auto' | 'webgl' | 'cpu', diffusion?: 'auto' | 'gpu' | 'cpu', maxSourceSize?: number }} [options]\r\n * diffusion: where error diffusion runs. 'auto' uses the GPU unless WebGL is software-rendered.\r\n */\r\nexport async function createPixelator(options = {}) {\r\n const want = options.backend || 'auto';\r\n let gpu = null, gpuError = null;\r\n if (want !== 'cpu' && typeof document !== 'undefined') {\r\n try { gpu = await createGPUBackend(); } catch (e) {\r\n gpuError = e;\r\n if (want === 'webgl') throw e;\r\n }\r\n }\r\n const scratch = typeof document !== 'undefined' ? document.createElement('canvas') : null;\r\n let last = { source: null, frame: null };\r\n let queue = Promise.resolve();\r\n\r\n async function frameFor(source) {\r\n if (source === last.source && last.frame && !isVideo(source) && !isVideoFrame(source)) {\r\n last.frame.dirty = false;\r\n return last.frame;\r\n }\r\n const frame = await toFrame(source, { maxSize: options.maxSourceSize, canvas: scratch });\r\n last = { source, frame };\r\n return frame;\r\n }\r\n\r\n async function processNow(source, settings) {\r\n const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now();\r\n const frame = await frameFor(source);\r\n const plan = makePlan(settings, frame);\r\n let data, backend = 'cpu';\r\n const diffusionOnCPU = plan.kind === 'diffusion' && (options.diffusion === 'cpu' || (options.diffusion !== 'gpu' && gpu && gpu.software));\r\n if (gpu && frame.canvas && !diffusionOnCPU) {\r\n data = await gpu.run(plan, frame);\r\n backend = 'webgl';\r\n } else {\r\n data = runCPU(plan, frame);\r\n }\r\n const ms = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - t0;\r\n return makeResult(plan, data, backend, ms);\r\n }\r\n\r\n return {\r\n /** 'webgl' or 'cpu' */\r\n get backend() { return gpu ? 'webgl' : 'cpu'; },\r\n /** GPU renderer string (WebGL backend only). */\r\n get renderer() { return gpu ? gpu.renderer : ''; },\r\n /** Why the GPU backend is not in use, if it isn't. */\r\n get fallbackReason() { return gpuError ? String(gpuError.message || gpuError) : ''; },\r\n /**\r\n * Process one source. Calls are queued, so it is safe to call from input handlers.\r\n * @returns {Promise<PixelResult>}\r\n */\r\n process(source, settings = {}) {\r\n const run = queue.then(() => processNow(source, settings));\r\n queue = run.catch(() => { });\r\n return run;\r\n },\r\n /** Forget the cached source (call after drawing new content into the same canvas). */\r\n invalidate() { last = { source: null, frame: null }; },\r\n destroy() { if (gpu) gpu.destroy(); gpu = null; },\r\n /** The underlying ShaderMate instance (GPU backend only), for debugging. */\r\n get shader() { return gpu ? gpu.shader : null; },\r\n };\r\n}\r\n\r\n/**\r\n * @typedef {object} PixelResult\r\n * @property {number} width\r\n * @property {number} height\r\n * @property {Uint8ClampedArray} data RGBA, rows top-down\r\n * @property {string[]} palette colours actually available ('#rrggbb')\r\n * @property {object} settings normalised settings used\r\n * @property {'webgl'|'cpu'} backend\r\n * @property {number} ms processing time\r\n */\r\nexport function makeResult(plan, data, backend = 'cpu', ms = 0) {\r\n const result = {\r\n width: plan.width,\r\n height: plan.height,\r\n data,\r\n palette: plan.paletteHex ? plan.paletteHex.slice() : null,\r\n settings: plan.settings,\r\n kind: plan.kind,\r\n waves: plan.waves,\r\n /** The framed part of the source, as fractions of its width and height. */\r\n crop: { x: plan.crop.x / plan.srcWidth, y: plan.crop.y / plan.srcHeight, w: plan.crop.w / plan.srcWidth, h: plan.crop.h / plan.srcHeight },\r\n backend,\r\n ms,\r\n /** Distinct colours actually used in the image. */\r\n usedColors() { return uniqueColors(this); },\r\n toImageData() { return new ImageData(new Uint8ClampedArray(this.data), this.width, this.height); },\r\n /** Canvas at `scale` \u00D7 (nearest-neighbour), optional grid lines. */\r\n toCanvas(scale = 1, opts = {}) { return toCanvas(this, scale, opts); },\r\n /** PNG bytes (indexed when \u2264 256 colours unless `indexed: false`). */\r\n toPNG(opts = {}) { return encodePNG(this, opts); },\r\n async toBlob(opts = {}) { return new Blob([await encodePNG(this, opts)], { type: 'image/png' }); },\r\n };\r\n return result;\r\n}\r\n\r\nlet shared = null;\r\n/** One-shot helper with a shared engine. `pixelate(source, settings)`. */\r\nexport async function pixelate(source, settings) {\r\n // classic API: pixelate({ image, width, dither, strength, palette, resolution }) \u2192 canvas\r\n if (settings === undefined && source && typeof source === 'object' && 'image' in source && 'width' in source) {\r\n return pixelateClassic(source);\r\n }\r\n shared ||= createPixelator();\r\n return (await shared).process(source, settings);\r\n}\r\n\r\n/** Compatibility with image-to-pixel.js 2.x. Returns a canvas like the old function did. */\r\nasync function pixelateClassic(opts) {\r\n const { image, width, dither = 'none', strength = 0, palette = null, resolution = 'original' } = opts;\r\n let pal = { source: 'none' };\r\n if (Array.isArray(palette)) pal = { source: 'custom', colors: palette };\r\n else if (typeof palette === 'string') {\r\n const { fetchLospec } = await import('./palette/lospec.js');\r\n const p = await fetchLospec(palette);\r\n pal = { source: 'custom', colors: p.colors, name: p.name };\r\n }\r\n const settings = normalizeSettings({\r\n size: { width },\r\n palette: pal,\r\n dither: { method: LEGACY_DITHER[String(dither).toLowerCase()] || 'none', strength: strength / 100 },\r\n alpha: { threshold: 0 },\r\n });\r\n shared ||= createPixelator();\r\n const engine = await shared;\r\n const res = await engine.process(image, settings);\r\n if (resolution === 'original') {\r\n const frame = await toFrame(image);\r\n const c = document.createElement('canvas');\r\n c.width = frame.width; c.height = frame.height;\r\n const ctx = c.getContext('2d');\r\n ctx.imageSmoothingEnabled = false;\r\n ctx.drawImage(res.toCanvas(1), 0, 0, c.width, c.height);\r\n return c;\r\n }\r\n return res.toCanvas(1);\r\n}\r\n", "// image-to-pixel core: no UI. Works in browsers (WebGL 2 via ShaderMate, CPU fallback) and,\r\n// for { width, height, data } inputs, in Node on the CPU.\r\n\r\nexport { createPixelator, pixelate, makeResult } from './core/engine.js';\r\nexport {\r\n DEFAULTS, DITHER_METHODS, SETTINGS_VERSION, MAX_SIZE, LEGACY_DITHER,\r\n defaultSettings, normalizeSettings, mergeSettings, resolveSize, ditherKind, cropRect, ASPECTS,\r\n encodeSettings, decodeSettings, compactSettings, settingsToJSON, settingsFromJSON,\r\n} from './core/settings.js';\r\nexport { makePlan } from './core/plan.js';\r\nexport { runCPU } from './core/cpu/pipeline.js';\r\nexport { PALETTES, getPalette } from './core/palette/builtin.js';\r\nexport { parsePalette, toGPL, toHexFile, toPaletteJSON } from './core/palette/parse.js';\r\nexport { extractPalette } from './core/palette/extract.js';\r\nexport { fetchLospec, lospecSlug } from './core/palette/lospec.js';\r\nexport { thresholdMap, parseMatrix, bayer } from './core/dither/matrices.js';\r\nexport { KERNELS } from './core/dither/kernels.js';\r\nexport { PRESETS, getPreset } from './core/presets.js';\r\nexport { parseColor, toHex, oklab } from './core/color.js';\r\nexport { toFrame, loadImage } from './core/source.js';\r\nexport { upscale, resizeNearest, uniqueColors, detectGrid, hasTransparency } from './core/export/scale.js';\r\nexport { toCanvas, downloadBlob } from './core/export/canvas.js';\r\nexport { encodePNG } from './core/export/png.js';\r\nexport { encodeGIF } from './core/export/gif.js';\r\nexport { createZip } from './core/export/zip.js';\r\nexport { packSpriteSheet, buildTileset } from './core/export/sheet.js';\r\nexport { forEachFrame, estimateFps, seekTo, frameTimes, videoReady, mediaError, sniffVideoCodec } from './core/video/frames.js';\r\n\r\n/* global __ITP_VERSION__ */\r\n// The build replaces __ITP_VERSION__ with package.json's version; unbundled source reports 'dev'.\r\nexport const VERSION = typeof __ITP_VERSION__ === 'string' ? __ITP_VERSION__ : 'dev';\r\n", "// Built-in presets: partial settings applied on top of the defaults.\r\n\r\nexport const PRESETS = [\r\n {\r\n id: 'balanced', name: 'Balanced', description: 'Endesga 32, Bayer 4\u00D74. A good first look at most photos.',\r\n settings: { size: { width: 96 }, palette: { source: 'builtin', id: 'endesga-32' }, dither: { method: 'bayer4', strength: 0.6 } },\r\n },\r\n {\r\n id: 'game-boy', name: 'Game Boy', description: 'Four greens, 160 px wide, ordered dither.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'game-boy-dmg' }, dither: { method: 'bayer4', strength: 1 }, adjust: { contrast: 0.15 } },\r\n },\r\n {\r\n id: 'pico-8', name: 'PICO-8', description: '128 px, the PICO-8 palette, blue-noise dither.',\r\n settings: { size: { width: 128 }, palette: { source: 'builtin', id: 'pico-8' }, dither: { method: 'bluenoise', strength: 0.7 } },\r\n },\r\n {\r\n id: 'one-bit', name: '1-bit Atkinson', description: 'Classic Mac look: two colours, Atkinson diffusion.',\r\n settings: { size: { width: 192 }, palette: { source: 'builtin', id: '1-bit-monitor' }, dither: { method: 'atkinson', strength: 1 }, adjust: { contrast: 0.2 } },\r\n },\r\n {\r\n id: 'faithful', name: 'Faithful colour', description: 'Palette extracted from the image, Floyd\u2013Steinberg.',\r\n settings: { size: { width: 128 }, palette: { source: 'extract', count: 24 }, dither: { method: 'floyd-steinberg', strength: 0.75 } },\r\n },\r\n {\r\n id: 'sprite', name: 'Clean sprite', description: 'No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.',\r\n settings: { size: { width: 48, resample: 'nearest' }, palette: { source: 'extract', count: 12 }, dither: { method: 'none' }, cleanup: { orphans: true }, outline: { mode: 'outer', color: '#1a1c2c' } },\r\n },\r\n {\r\n id: 'cga', name: 'CGA', description: '16 hard colours with an 8\u00D78 Bayer pattern.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'cga-16' }, dither: { method: 'bayer8', strength: 1 } },\r\n },\r\n {\r\n id: 'newsprint', name: 'Newsprint', description: 'Grey clustered-dot halftone.',\r\n settings: { size: { width: 220 }, palette: { source: 'builtin', id: 'grayscale-4' }, dither: { method: 'cluster8', strength: 1 }, adjust: { saturation: -1 } },\r\n },\r\n {\r\n id: 'soft', name: 'Soft painterly', description: 'Resurrect 64 with Sierra Lite and a light smooth.',\r\n settings: { size: { width: 112 }, palette: { source: 'builtin', id: 'resurrect-64' }, dither: { method: 'sierra-lite', strength: 0.6 }, cleanup: { smooth: true } },\r\n },\r\n];\r\n\r\nexport const getPreset = id => PRESETS.find(p => p.id === id) || null;\r\n", "// Animated GIF encoder. Pixel art already uses a small palette, so frames are written\r\n// losslessly with one global colour table whenever the whole animation fits in 256 colours\r\n// (255 + transparency). Otherwise each frame gets its own table, reduced by median cut if needed.\r\n\r\nimport { upscale } from './scale.js';\r\nimport { extractPalette } from '../palette/extract.js';\r\nimport { parseColor } from '../color.js';\r\n\r\nclass ByteWriter {\r\n constructor() { this.buf = new Uint8Array(1 << 16); this.n = 0; }\r\n byte(b) { if (this.n === this.buf.length) { const nb = new Uint8Array(this.buf.length * 2); nb.set(this.buf); this.buf = nb; } this.buf[this.n++] = b; }\r\n bytes(arr) { for (let i = 0; i < arr.length; i++) this.byte(arr[i]); }\r\n u16(v) { this.byte(v & 255); this.byte((v >> 8) & 255); }\r\n str(s) { for (let i = 0; i < s.length; i++) this.byte(s.charCodeAt(i)); }\r\n result() { return this.buf.slice(0, this.n); }\r\n}\r\n\r\n/** GIF-flavoured LZW for one frame of indices. */\r\nexport function lzwEncode(indices, minCodeSize, w) {\r\n const clear = 1 << minCodeSize, eoi = clear + 1;\r\n let codeSize = minCodeSize + 1, next = eoi + 1;\r\n let dict = new Map();\r\n let cur = 0, curBits = 0;\r\n const sub = [];\r\n let block = [];\r\n const emit = code => {\r\n cur |= code << curBits; curBits += codeSize;\r\n while (curBits >= 8) { block.push(cur & 255); cur >>>= 8; curBits -= 8; if (block.length === 255) { sub.push(block); block = []; } }\r\n };\r\n emit(clear);\r\n let prefix = indices[0];\r\n for (let i = 1; i < indices.length; i++) {\r\n const k = indices[i];\r\n const key = prefix * 256 + k;\r\n const hit = dict.get(key);\r\n if (hit !== undefined) { prefix = hit; continue; }\r\n emit(prefix);\r\n if (next < 4096) {\r\n dict.set(key, next++);\r\n if (next > (1 << codeSize) && codeSize < 12) codeSize++;\r\n } else {\r\n emit(clear); dict = new Map(); codeSize = minCodeSize + 1; next = eoi + 1;\r\n }\r\n prefix = k;\r\n }\r\n emit(prefix);\r\n emit(eoi);\r\n if (curBits > 0) block.push(cur & 255);\r\n if (block.length) sub.push(block);\r\n w.byte(minCodeSize);\r\n for (const b of sub) { w.byte(b.length); w.bytes(b); }\r\n w.byte(0);\r\n}\r\n\r\nconst keyOf = (d, o) => (d[o + 3] < 128 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n\r\nfunction tableFor(colorKeys, transparent) {\r\n const list = [...colorKeys].filter(k => k !== -1);\r\n const colors = list.map(k => [k >> 16, (k >> 8) & 255, k & 255]);\r\n const tIndex = transparent ? colors.length : -1;\r\n if (transparent) colors.push([0, 0, 0]);\r\n let bits = 1; while ((1 << bits) < colors.length) bits++;\r\n while (colors.length < (1 << bits)) colors.push([0, 0, 0]);\r\n const index = new Map(list.map((k, i) => [k, i]));\r\n return { colors, bits, tIndex, index };\r\n}\r\n\r\nfunction reduce(frame, max) {\r\n // > max colours: median-cut palette, then nearest colour per pixel\r\n const pal = extractPalette(frame, max).map(parseColor);\r\n const d = new Uint8ClampedArray(frame.data);\r\n const cache = new Map();\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] < 128) continue;\r\n const k = (d[o] << 16) | (d[o + 1] << 8) | d[o + 2];\r\n let best = cache.get(k);\r\n if (best === undefined) {\r\n let bd = Infinity; best = 0;\r\n for (let i = 0; i < pal.length; i++) {\r\n const dr = d[o] - pal[i][0], dg = d[o + 1] - pal[i][1], db = d[o + 2] - pal[i][2];\r\n const dist = dr * dr * 3 + dg * dg * 4 + db * db * 2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n cache.set(k, best);\r\n }\r\n d.set(pal[best], o);\r\n }\r\n return { ...frame, data: d };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, delay?: number }[]} frames delay in ms\r\n * @param {{ loop?: number, scale?: number, delay?: number }} [opts] loop: 0 = forever, -1 = play once\r\n * @returns {Uint8Array}\r\n */\r\nexport function encodeGIF(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const scale = Math.max(1, Math.round(opts.scale || 1));\r\n const fr = frames.map(f => ({ ...(scale > 1 ? upscale(f, scale) : f), delay: f.delay ?? opts.delay ?? 100 }));\r\n const W = fr[0].width, H = fr[0].height;\r\n\r\n // collect colours\r\n let transparent = false;\r\n const all = new Set();\r\n const perFrame = fr.map(f => {\r\n const s = new Set();\r\n for (let o = 0; o < f.data.length; o += 4) { const k = keyOf(f.data, o); if (k === -1) transparent = true; s.add(k); all.add(k); }\r\n return s;\r\n });\r\n const opaqueCount = s => s.size - (s.has(-1) ? 1 : 0);\r\n const globalOK = opaqueCount(all) + (transparent ? 1 : 0) <= 256;\r\n const global = globalOK ? tableFor(all, transparent) : null;\r\n\r\n const w = new ByteWriter();\r\n w.str('GIF89a');\r\n w.u16(W); w.u16(H);\r\n w.byte(global ? 0xf0 | (global.bits - 1) : 0x00);\r\n w.byte(0); w.byte(0);\r\n if (global) for (const c of global.colors) w.bytes(c);\r\n if (fr.length > 1 && opts.loop !== -1) {\r\n w.byte(0x21); w.byte(0xff); w.byte(11); w.str('NETSCAPE2.0'); w.byte(3); w.byte(1); w.u16(opts.loop || 0); w.byte(0);\r\n }\r\n\r\n fr.forEach((f0, i) => {\r\n let f = f0, table = global, set = perFrame[i];\r\n if (!table) {\r\n const max = transparent ? 255 : 256;\r\n if (opaqueCount(set) > max) {\r\n f = reduce(f0, max);\r\n set = new Set(); for (let o = 0; o < f.data.length; o += 4) set.add(keyOf(f.data, o));\r\n }\r\n table = tableFor(set, set.has(-1));\r\n }\r\n // graphic control extension\r\n w.byte(0x21); w.byte(0xf9); w.byte(4);\r\n w.byte(((transparent ? 2 : 1) << 2) | (table.tIndex >= 0 ? 1 : 0));\r\n w.u16(Math.max(2, Math.round(f.delay / 10)));\r\n w.byte(table.tIndex >= 0 ? table.tIndex : 0);\r\n w.byte(0);\r\n // image descriptor\r\n w.byte(0x2c); w.u16(0); w.u16(0); w.u16(W); w.u16(H);\r\n w.byte(table === global ? 0 : 0x80 | (table.bits - 1));\r\n if (table !== global) for (const c of table.colors) w.bytes(c);\r\n const idx = new Uint8Array(W * H);\r\n for (let p = 0; p < idx.length; p++) {\r\n const k = keyOf(f.data, p * 4);\r\n idx[p] = k === -1 ? table.tIndex : table.index.get(k);\r\n }\r\n lzwEncode(idx, Math.max(2, table.bits), w);\r\n });\r\n w.byte(0x3b);\r\n return w.result();\r\n}\r\n", "// Store-only zip writer (PNGs and GIFs are already compressed, so deflating again buys little).\r\n\r\nimport { crc32 } from './crc32.js';\r\n\r\nconst enc = new TextEncoder();\r\n\r\n/**\r\n * @param {{ name: string, data: Uint8Array | string, date?: Date }[]} entries\r\n * @returns {Uint8Array}\r\n */\r\nexport function createZip(entries) {\r\n const files = [], central = [];\r\n let offset = 0;\r\n const used = new Set();\r\n for (const e of entries) {\r\n let name = e.name.replace(/\\\\/g, '/').replace(/^\\/+/, '');\r\n // avoid duplicate names inside one archive\r\n if (used.has(name)) { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); let i = 2; while (used.has(`${m[1]}-${i}${m[2] || ''}`)) i++; name = `${m[1]}-${i}${m[2] || ''}`; }\r\n used.add(name);\r\n const nameBytes = enc.encode(name);\r\n const data = typeof e.data === 'string' ? enc.encode(e.data) : e.data;\r\n const crc = crc32(data);\r\n const d = e.date || new Date();\r\n const time = (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1);\r\n const date = ((d.getFullYear() - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate();\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true); lv.setUint16(4, 20, true); lv.setUint16(6, 0x0800, true); // UTF-8 names\r\n lv.setUint16(8, 0, true); lv.setUint16(10, time, true); lv.setUint16(12, date, true);\r\n lv.setUint32(14, crc, true); lv.setUint32(18, data.length, true); lv.setUint32(22, data.length, true);\r\n lv.setUint16(26, nameBytes.length, true); lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n const cen = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(cen.buffer);\r\n cv.setUint32(0, 0x02014b50, true); cv.setUint16(4, 20, true); cv.setUint16(6, 20, true); cv.setUint16(8, 0x0800, true);\r\n cv.setUint16(10, 0, true); cv.setUint16(12, time, true); cv.setUint16(14, date, true);\r\n cv.setUint32(16, crc, true); cv.setUint32(20, data.length, true); cv.setUint32(24, data.length, true);\r\n cv.setUint16(28, nameBytes.length, true); cv.setUint32(42, offset, true);\r\n cen.set(nameBytes, 46);\r\n\r\n files.push(local, data); central.push(cen);\r\n offset += local.length + data.length;\r\n }\r\n const cenSize = central.reduce((s, c) => s + c.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true); ev.setUint16(8, entries.length, true); ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, cenSize, true); ev.setUint32(16, offset, true);\r\n const out = new Uint8Array(offset + cenSize + 22);\r\n let o = 0;\r\n for (const p of [...files, ...central, end]) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// Sprite sheets (many frames \u2192 one image + atlas JSON) and tilesets (one image \u2192 unique tiles + map).\r\n\r\nconst blank = (w, h) => ({ width: w, height: h, data: new Uint8ClampedArray(w * h * 4) });\r\n\r\nfunction blit(dst, src, dx, dy, sx = 0, sy = 0, sw = src.width, sh = src.height) {\r\n for (let y = 0; y < sh; y++) {\r\n const so = ((sy + y) * src.width + sx) * 4, o = ((dy + y) * dst.width + dx) * 4;\r\n dst.data.set(src.data.subarray ? src.data.subarray(so, so + sw * 4) : Array.prototype.slice.call(src.data, so, so + sw * 4), o);\r\n }\r\n}\r\n\r\n/**\r\n * Pack frames into a grid. Frames may differ in size; cells use the largest frame.\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, name?: string, delay?: number }[]} frames\r\n * @param {{ columns?: number, padding?: number, name?: string }} [opts] columns: 0 = roughly square\r\n * @returns {{ image: { width, height, data }, atlas: object }}\r\n */\r\nexport function packSpriteSheet(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const pad = Math.max(0, opts.padding | 0);\r\n const cw = Math.max(...frames.map(f => f.width)), ch = Math.max(...frames.map(f => f.height));\r\n const cols = Math.max(1, Math.min(frames.length, opts.columns || Math.ceil(Math.sqrt(frames.length))));\r\n const rows = Math.ceil(frames.length / cols);\r\n const W = cols * cw + (cols - 1) * pad, H = rows * ch + (rows - 1) * pad;\r\n const image = blank(W, H);\r\n const out = {};\r\n frames.forEach((f, i) => {\r\n const x = (i % cols) * (cw + pad), y = Math.floor(i / cols) * (ch + pad);\r\n blit(image, f, x, y);\r\n out[f.name || `frame-${String(i).padStart(3, '0')}`] = {\r\n frame: { x, y, w: f.width, h: f.height },\r\n sourceSize: { w: f.width, h: f.height },\r\n ...(f.delay != null ? { duration: Math.round(f.delay) } : {}),\r\n };\r\n });\r\n // the \"hash\" flavour of the TexturePacker / Aseprite JSON format, which most engines read\r\n const atlas = { frames: out, meta: { app: 'image-to-pixel', image: (opts.name || 'sheet') + '.png', size: { w: W, h: H }, scale: '1', columns: cols, rows, padding: pad } };\r\n return { image, atlas };\r\n}\r\n\r\n/**\r\n * Cut an image into tiles, drop duplicates (optionally counting mirrored tiles as duplicates)\r\n * and return the tileset image and a tile map.\r\n * @param {{ width, height, data }} img\r\n * @param {{ tileWidth?: number, tileHeight?: number, columns?: number, flips?: boolean }} [opts]\r\n * @returns {{ image, map: { width: number, height: number, tiles: number[], flips?: number[] }, count: number }}\r\n */\r\nexport function buildTileset(img, opts = {}) {\r\n const tw = Math.max(1, opts.tileWidth || 8), th = Math.max(1, opts.tileHeight || tw);\r\n const mw = Math.ceil(img.width / tw), mh = Math.ceil(img.height / th);\r\n const tiles = [], keys = new Map(), map = [], flipsOut = [];\r\n const read = (tx, ty) => {\r\n const t = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const sx = tx * tw + x, sy = ty * th + y;\r\n if (sx >= img.width || sy >= img.height) continue;\r\n const so = (sy * img.width + sx) * 4;\r\n t.data.set([img.data[so], img.data[so + 1], img.data[so + 2], img.data[so + 3]], (y * tw + x) * 4);\r\n }\r\n return t;\r\n };\r\n const key = t => {\r\n let s = '';\r\n for (let i = 0; i < t.data.length; i += 4) s += t.data[i + 3] === 0 ? '.' : String.fromCharCode(t.data[i] + 1, t.data[i + 1] + 1, t.data[i + 2] + 1);\r\n return s;\r\n };\r\n const flip = (t, fx, fy) => {\r\n const o = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const si = ((fy ? th - 1 - y : y) * tw + (fx ? tw - 1 - x : x)) * 4;\r\n o.data.set(t.data.subarray(si, si + 4), (y * tw + x) * 4);\r\n }\r\n return o;\r\n };\r\n for (let ty = 0; ty < mh; ty++) {\r\n for (let tx = 0; tx < mw; tx++) {\r\n const t = read(tx, ty);\r\n let id = keys.get(key(t)), f = 0;\r\n if (id === undefined && opts.flips) {\r\n for (const [fx, fy, code] of [[1, 0, 1], [0, 1, 2], [1, 1, 3]]) {\r\n const k = keys.get(key(flip(t, fx, fy)));\r\n if (k !== undefined) { id = k; f = code; break; }\r\n }\r\n }\r\n if (id === undefined) { id = tiles.length; tiles.push(t); keys.set(key(t), id); }\r\n map.push(id); flipsOut.push(f);\r\n }\r\n }\r\n const sheet = packSpriteSheet(tiles, { columns: opts.columns || Math.min(16, tiles.length) });\r\n return {\r\n image: sheet.image,\r\n map: { width: mw, height: mh, tileWidth: tw, tileHeight: th, tiles: map, ...(opts.flips ? { flips: flipsOut } : {}) },\r\n count: tiles.length,\r\n };\r\n}\r\n", "// Frame-accurate stepping through an HTMLVideoElement by seeking to the middle of each frame.\n// Seeking (instead of playing) means every frame is visited exactly once, regardless of how\n// long processing takes, and the same input always produces the same frames.\n\nconst wait = (el, ev, ms = 4000) => new Promise((res, rej) => {\n const t = setTimeout(() => { el.removeEventListener(ev, ok); rej(new Error(`Timed out waiting for \"${ev}\"`)); }, ms);\n const ok = () => { clearTimeout(t); res(); };\n el.addEventListener(ev, ok, { once: true });\n});\n\nconst MEDIA_ERRORS = {\n 1: 'loading was aborted',\n 2: 'a network error stopped the download',\n 3: 'the browser could not decode it',\n 4: \"this browser can't play this video's format\",\n};\n\n/** Turn a <video>'s MediaError into a readable Error (err.code is the MediaError code). */\nexport function mediaError(video) {\n const code = video.error ? video.error.code : 0;\n const err = new Error(MEDIA_ERRORS[code] || 'the video could not be loaded');\n err.code = code;\n if (video.error && video.error.message) err.detail = video.error.message;\n return err;\n}\n\n/** Resolve on `ok`, reject straight away if the media element reports an error. */\nconst waitOrFail = (video, ok, ms) => new Promise((res, rej) => {\n const done = () => { clearTimeout(t); video.removeEventListener(ok, onOk); video.removeEventListener('error', onErr); };\n const onOk = () => { done(); res(); };\n const onErr = () => { done(); rej(mediaError(video)); };\n const t = setTimeout(() => { done(); rej(new Error(`no response from the video decoder after ${ms / 1000} s`)); }, ms);\n video.addEventListener(ok, onOk, { once: true });\n video.addEventListener('error', onErr, { once: true });\n});\n\n/**\n * Wait until a video's metadata (size, duration) and first frame are available.\n * Rejects immediately with a readable message when the browser can't play the file.\n */\nexport async function videoReady(video, { timeout = 60000 } = {}) {\n if (video.error) throw mediaError(video);\n if (video.readyState < 1) await waitOrFail(video, 'loadedmetadata', timeout);\n if (video.readyState < 2) await waitOrFail(video, 'loadeddata', timeout).catch(e => { if (e.code) throw e; });\n return video;\n}\n\n/**\n * Best-effort codec name for an MP4/MOV/WebM file, read from its bytes. Used to explain playback errors.\n * @param {Blob} file\n * @returns {Promise<string>} e.g. 'H.265 (HEVC)', or '' when unknown\n */\nexport async function sniffVideoCodec(file) {\n const buf = new Uint8Array(await file.arrayBuffer());\n const NAMES = { avc1: 'H.264', avc3: 'H.264', hvc1: 'H.265 (HEVC)', hev1: 'H.265 (HEVC)', av01: 'AV1', vp09: 'VP9', vp08: 'VP8', mp4v: 'MPEG-4 Part 2', apcn: 'ProRes', apch: 'ProRes', apcs: 'ProRes', apco: 'ProRes', ap4h: 'ProRes 4444', dvh1: 'Dolby Vision', dvhe: 'Dolby Vision' };\n // MP4/MOV: the first sample entry of the 'stsd' box names the codec\n for (let i = 0; i + 24 < buf.length; i++) {\n if (buf[i] === 0x73 && buf[i + 1] === 0x74 && buf[i + 2] === 0x73 && buf[i + 3] === 0x64) {\n const type = String.fromCharCode(buf[i + 16], buf[i + 17], buf[i + 18], buf[i + 19]);\n if (NAMES[type]) return NAMES[type];\n }\n }\n // WebM/Matroska: CodecID strings such as V_VP9, V_AV1, V_MPEGH/ISO/HEVC\n const head = new TextDecoder('latin1').decode(buf.subarray(0, Math.min(buf.length, 1 << 20)));\n const m = /V_(VP8|VP9|AV1|MPEG4\\/ISO\\/AVC|MPEGH\\/ISO\\/HEVC)/.exec(head);\n if (m) return { VP8: 'VP8', VP9: 'VP9', AV1: 'AV1', 'MPEG4/ISO/AVC': 'H.264', 'MPEGH/ISO/HEVC': 'H.265 (HEVC)' }[m[1]];\n return '';\n}\n\n/**\n * Does this MP4/MOV/WebM file have an audio track? Reads only the container headers: for MP4/MOV the\n * top-level boxes are walked to 'moov' (which phones often write at the end) and only that box is read.\n * @param {Blob} file\n * @returns {Promise<boolean | null>} null when it can't tell\n */\nexport async function hasAudioTrack(file) {\n try {\n const head = new Uint8Array(await file.slice(0, 12).arrayBuffer());\n if (head[0] === 0x1a && head[1] === 0x45 && head[2] === 0xdf && head[3] === 0xa3) {\n // WebM/Matroska: Tracks sit near the start; audio CodecIDs all begin with A_\n const text = new TextDecoder('latin1').decode(await file.slice(0, 4 << 20).arrayBuffer());\n return /A_(OPUS|VORBIS|AAC|MPEG|AC3|EAC3|FLAC|PCM|DTS|TRUEHD|ALAC)/.test(text);\n }\n for (let o = 0; o + 8 <= file.size;) {\n const dv = new DataView(await file.slice(o, o + 16).arrayBuffer());\n let size = dv.getUint32(0);\n const type = String.fromCharCode(dv.getUint8(4), dv.getUint8(5), dv.getUint8(6), dv.getUint8(7));\n if (size === 1) size = Number(dv.getBigUint64(8));\n else if (size === 0) size = file.size - o;\n if (size < 8) return null;\n if (type === 'moov') {\n const moov = new Uint8Array(await file.slice(o, o + size).arrayBuffer());\n // each track's 'hdlr' box names its kind 12 bytes after the box type: 'vide', 'soun', \u2026\n for (let i = 4; i + 16 <= moov.length; i++) {\n if (moov[i] === 0x68 && moov[i + 1] === 0x64 && moov[i + 2] === 0x6c && moov[i + 3] === 0x72\n && moov[i + 12] === 0x73 && moov[i + 13] === 0x6f && moov[i + 14] === 0x75 && moov[i + 15] === 0x6e) return true;\n }\n return false;\n }\n o += size;\n }\n return null;\n } catch (_) {\n return null;\n }\n}\n\n/** Seek and resolve once the frame at `time` is decoded and paintable. */\nexport async function seekTo(video, time) {\n time = Math.max(0, Math.min(time, (video.duration || 0) - 1e-4));\n if (Math.abs(video.currentTime - time) < 1e-6 && video.readyState >= 2) return;\n const presented = 'requestVideoFrameCallback' in video\n ? new Promise(res => { video.requestVideoFrameCallback(() => res()); setTimeout(res, 500); })\n : null;\n const seeked = wait(video, 'seeked');\n video.currentTime = time;\n await seeked;\n if (presented) await presented;\n}\n\n/**\n * Estimate the frame rate from presented frames (requestVideoFrameCallback), falling back to `fallback`.\n * Plays muted for a moment and restores the position.\n */\nexport async function estimateFps(video, fallback = 30) {\n if (!('requestVideoFrameCallback' in video)) return fallback;\n await videoReady(video);\n const was = { t: video.currentTime, muted: video.muted, paused: video.paused };\n const times = [];\n try {\n video.muted = true;\n await new Promise((res) => {\n const done = setTimeout(res, 1200);\n const cb = (_, meta) => {\n times.push(meta.mediaTime);\n if (times.length >= 12) { clearTimeout(done); res(); } else video.requestVideoFrameCallback(cb);\n };\n video.requestVideoFrameCallback(cb);\n video.play().catch(() => { clearTimeout(done); res(); });\n });\n } finally {\n video.pause();\n video.muted = was.muted;\n await seekTo(video, was.t).catch(() => { });\n }\n const deltas = [];\n for (let i = 1; i < times.length; i++) { const d = times[i] - times[i - 1]; if (d > 0.001) deltas.push(d); }\n if (deltas.length < 3) return fallback;\n deltas.sort((a, b) => a - b);\n const fps = 1 / deltas[Math.floor(deltas.length / 2)];\n // snap to common rates\n for (const r of [12, 15, 23.976, 24, 25, 29.97, 30, 48, 50, 59.94, 60]) if (Math.abs(fps - r) < 0.6) return r;\n return Math.round(fps);\n}\n\n/** Frame times (seconds, middle of each frame) for a clip. */\nexport function frameTimes({ duration, fps, start = 0, end = duration, maxFrames = Infinity }) {\n const out = [];\n const n = Math.min(maxFrames, Math.max(1, Math.floor((end - start) * fps + 1e-6)));\n for (let i = 0; i < n; i++) out.push(start + (i + 0.5) / fps);\n return out;\n}\n\n/**\n * Visit frames one by one.\n * @param {HTMLVideoElement} video\n * @param {{ fps: number, start?: number, end?: number, maxFrames?: number, signal?: AbortSignal,\n * onFrame: (info: { index: number, time: number, total: number }) => any }} opts\n */\nexport async function forEachFrame(video, opts) {\n await videoReady(video);\n const wasPaused = video.paused;\n video.pause();\n const times = frameTimes({ duration: video.duration, ...opts });\n for (let i = 0; i < times.length; i++) {\n if (opts.signal && opts.signal.aborted) throw new DOMException('Aborted', 'AbortError');\n await seekTo(video, times[i]);\n await opts.onFrame({ index: i, time: times[i], total: times.length });\n }\n if (!wasPaused) video.play().catch(() => { });\n return times.length;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["parseColor", "c", "s", "ch", "isColor", "toHex", "rgb", "v", "oklab", "r", "g", "b", "lin", "l", "m", "paletteSpread", "rgbs", "sum", "i", "best", "j", "dr", "dg", "db", "d", "normHex", "LUMA", "init_color", "__esmMin", "parseGPL", "text", "lines", "name", "colors", "raw", "line", "nm", "m", "normHex", "parseHexList", "h", "parseJASC", "l", "i", "parseJSON", "obj", "c", "parseLoose", "re", "parsePalette", "filename", "ext", "trimmed", "out", "dedupe", "toGPL", "rows", "r", "g", "b", "toHexFile", "toPaletteJSON", "init_parse", "__esmMin", "init_color", "list", "lospec_exports", "__export", "fetchLospec", "lospecSlug", "input", "s", "m", "slugOrUrl", "f", "slug", "res", "json", "p", "parseJSON", "init_lospec", "__esmMin", "init_parse", "PALETTES", "getPalette", "idOrName", "k", "p", "init_color", "SETTINGS_VERSION", "MAX_SIZE", "DITHER_METHODS", "ditherKind", "id", "m", "LEGACY_DITHER", "DEFAULTS", "clamp", "v", "lo", "hi", "d", "n", "oneOf", "list", "bool", "defaultSettings", "normalizeSettings", "input", "i", "s", "size", "adj", "pal", "dit", "al", "cl", "ol", "ex", "fr", "ASPECTS", "a", "source", "p", "getPalette", "c", "isColor", "normHex", "method", "normalizeMatrix", "h", "w", "out", "y", "row", "x", "cropRect", "srcW", "srcH", "frame", "zoom", "fx", "fy", "resolveSize", "diff", "b", "k", "va", "vb", "g", "kk", "b64url", "str", "bytes", "bin", "compactSettings", "settings", "encodeSettings", "decodeSettings", "obj", "settingsToJSON", "settingsFromJSON", "text", "mergeSettings", "base", "patch", "init_color", "BLUE_NOISE_B64", "fromB64", "b64", "c", "bayer", "n", "m", "s", "next", "y", "x", "v", "toRanks", "rows", "h", "w", "cells", "a", "b", "out", "r", "clustered", "row", "u", "CLUSTER4", "cache", "thresholdMap", "method", "custom", "map", "sq", "BLUE_NOISE_B64", "parseMatrix", "text", "l", "k", "div", "list", "dx", "dy", "w", "KERNELS", "MAX_KERNEL", "kernelSkew", "kernel", "s", "waveCount", "h", "skew", "init_color", "extractPalette", "img", "count", "opts", "maxSamples", "alphaThreshold", "n", "step", "pts", "i", "o", "boxes", "bi", "bestRange", "bestAxis", "b", "a", "lo", "hi", "p", "r", "q", "mid", "centers", "mean", "iter", "sums", "best", "bd", "c", "dr", "dg", "db", "d", "s", "hexes", "toHex", "lum", "h", "v", "list", "g", "init_color", "resample", "src", "w", "h", "mode", "crop", "ox", "oy", "sw", "sh", "d", "stride", "out", "nx", "ny", "xs", "ys", "i", "y", "j", "x", "r", "g", "b", "a", "row", "o", "al", "adjust", "buf", "brightness", "contrast", "saturation", "hue", "gamma", "f", "ig", "hk", "hq", "M", "l", "LUMA", "k", "r2", "g2", "b2", "clamp01", "alphaCut", "threshold", "v", "paletteSpace", "palette", "distance", "coords", "rgb", "c", "oklab", "W_RGB", "nearest", "sp", "p0", "p1", "p2", "w0", "w1", "w2", "best", "bd", "d0", "d1", "d2", "dist", "quantizeOrdered", "plan", "map", "amt", "t", "quantizeDiffusion", "acc", "strength", "kernel", "p", "er", "eg", "eb", "dx", "dy", "wt", "xx", "yy", "q", "key", "N4", "removeOrphans", "px", "ks", "os", "oo", "bc", "n", "smoothMajority", "outline", "color", "corners", "opaque", "inside", "nb", "me", "hit", "makePlan", "settings", "src", "s", "normalizeSettings", "crop", "cropRect", "width", "height", "resolveSize", "colors", "extractFrom", "quantize", "palette", "parseColor", "kind", "ditherKind", "map", "thresholdMap", "kernel", "KERNELS", "skew", "kernelSkew", "paletteSpread", "waveCount", "k", "w", "h", "prep", "resample", "adjust", "bytes", "i", "extractPalette", "runCPU", "plan", "src", "w", "h", "s", "buf", "resample", "adjust", "alphaCut", "px", "quantizeDiffusion", "quantizeOrdered", "removeOrphans", "smoothMajority", "outline", "VERSION", "MAX_CHANNELS", "DEFAULT_CANVAS_ID", "ShaderMateError", "message", "details", "warned", "warnOnce", "key", "args", "isBrowser", "isArrayLike", "v", "toArray", "isPow2", "n", "parseColor", "c", "_a", "_b", "_c", "_d", "isBrowser", "cv", "x", "d", "isDevHost", "h", "RefPool", "gl", "obj", "type", "id", "it", "createEmitter", "forward", "map", "on", "ev", "fn", "off", "s", "once", "wrapped", "data", "emit", "e", "clear", "EASES", "t", "createTweens", "active", "tween", "key", "get", "set", "to", "opts", "duration", "delay", "ease", "prev", "from", "isArr", "f", "resolve", "tw", "v", "now", "clamp01", "a", "i", "update", "cancel", "normalizePasses", "input", "list", "p", "ShaderMateError", "_e", "names", "dupes", "n", "chans", "MAX_CHANNELS", "normalizeChannel", "isEl", "isBitmap", "isTex", "ch", "passNames", "ownerName", "out", "isInlineSource", "src", "isWebGL2", "createContext", "canvas", "options", "attrs", "want", "getExtensions", "isGL2", "ext", "createQuad", "buf", "program", "loc", "parseShaderLog", "log", "lines", "userStart", "l", "errors", "row", "m", "logical", "physical", "compileShader", "label", "showExpandedOnError", "sh", "stage", "summary", "err", "marks", "numbered", "line", "createProgram", "vsrc", "fsrc", "getUniformInfo", "info", "VERT_GL2", "VERT_GL1", "BUILTIN_MACROS_GL2", "BUILTIN_MACROS_GL1", "MAIN_WRAP_GL2", "MAIN_WRAP_GL1", "FRAG_GL2", "FRAG_GL1", "createBlit", "quad", "uTex", "uSize", "tex", "w", "wrapMode", "wrap", "filterMode", "filter", "chooseFormat", "ifmt", "fmt", "isRenderable", "fbo", "ok", "createTarget", "pool", "wanted", "chosen", "warnOnce", "filterOpt", "depthTex", "status", "deleteTarget", "resolvePassSize", "size", "cw", "BUILTIN_UNIFORMS", "stripComments", "BUILTIN_DEFINES", "declareFragColor", "code", "FRAGCOORD_UNIFORMS", "SAMPLER_BUILTINS", "looksLikeFragCoord", "declareBuiltins", "channelTypes", "declared", "name", "used", "types", "resolveIncludes", "loader", "throwOnError", "warn", "done", "stack", "expand", "re", "last", "path", "raw", "expanded", "defineLines", "defines", "k", "DEFAULT_INJECT", "NO_INJECT", "assembleFragment", "enableDerivatives", "inject", "builtinOpts", "versionLine", "body", "vm", "head", "fragDecl", "userOut", "clean", "needWrap", "makeTexture2D", "source", "params", "env", "dynamic", "flipDefault", "flip", "npotLimited", "isPow2", "mip", "minFilter", "upload", "loadImage", "url", "res", "rej", "img", "FACE_NAMES", "loadCubeMap", "urls", "faces", "loaded", "failed", "u", "playOnGesture", "media", "go", "loadVideo", "video", "wrapper", "loadCamera", "constraints", "stream", "loadAudio", "mic", "spectro", "fftSize", "AC", "ctx", "analyser", "bins", "wave", "H", "rawFFT", "rawAnalyser", "getTime", "cleanup", "finish", "resume", "audio", "owned", "connect", "isCanvas", "el", "isVideo", "loadElement", "live", "base", "wrapTexture", "loadKeyboard", "held", "pressed", "toggle", "target", "onDown", "onUp", "onBlur", "loadChannel", "channelSamplerType", "splitPassBlob", "text", "heads", "bufferType", "num", "parseBracketSettings", "word", "parseUniformComments", "uniforms", "samplers", "init", "comment", "spec", "parseSamplerComment", "nums", "range", "defaults", "comps", "isBool", "value", "r", "ref", "usesMouseVec4", "GL_SAMPLER_2D", "GL_SAMPLER_CUBE", "auxPasses", "passObjs", "resolveSamplerSpecs", "po", "instanceSamplers", "aux", "screen", "byName", "annotated", "mm", "needsMainBackbuffer", "createCamera", "speed", "sensitivity", "pos", "yaw", "pitch", "keys", "dragging", "lastX", "lastY", "dir", "view", "onKey", "down", "kd", "ku", "pd", "pm", "pu", "wh", "blur", "lookAt", "upW", "rl", "dt", "right", "mv", "vec", "ALIASES", "add", "desc", "resolveUniformType", "GL_TYPES", "describeGLType", "glType", "GL_FLOAT", "GL_FLOAT_VEC4", "isUniformSpec", "isArrayLike", "toList", "uploadUniform", "transpose", "applyUniformMap", "strict", "warnMissing", "inf", "createPointer", "getFit", "smooth", "state", "clickPending", "moved", "paintedRect", "fit", "ba", "ra", "toShader", "clientX", "clientY", "toUV", "cx", "cy", "y", "onMove", "onLeave", "onWheel", "parseAspect", "parseSizing", "hasCanvas", "_f", "cfg", "createSizer", "ratio", "styled", "cssBox", "measure", "box", "applyStyle", "pending", "schedule", "ro", "createVisibility", "enabled", "margin", "onChange", "tabVisible", "inView", "notify", "onVis", "io", "entries", "DEFAULT_THEME", "resolveTheme", "createStats", "visible", "position", "theme", "T", "shown", "accDt", "accCpu", "lastDom", "show", "ms", "createErrorOverlay", "place", "esc", "title", "createCapture", "renderNow", "screenshot", "quality", "toBlob", "b", "download", "filename", "blob", "saveBlob", "record", "fps", "mimeType", "bitsPerSecond", "dl", "rec", "chunks", "handle", "finished", "normalizeArgs", "o", "resolveCanvas", "DEFAULT_CANVAS_ID", "setUniformIn", "cur", "readUniform", "createShader", "autoSetup", "globalDefines", "toArray", "commonSrc", "dialect", "includeStore", "strictUniforms", "warnUniforms", "showExpanded", "useOverlay", "givenCanvas", "bg", "emitter", "sizer", "pointer", "tweens", "overlay", "stats", "PASSES", "disposed", "rafId", "removeResize", "lastRender", "frame", "time", "playing", "timeScale", "fixedDelta", "maxFps", "loopLen", "maxDelta", "lastError", "refreshRate", "rafDts", "camera", "blit", "mainBackbuffer", "visibility", "reportError", "clearError", "loadText", "includeLoader", "commonText", "getCommon", "parsed", "buildProgram", "pass", "allPasses", "common", "full", "fc", "samplerNames", "frag", "resizeTargets", "handleResize", "loadPassChannels", "expandPassBlob", "unsupported", "passes", "build", "compiled", "fragcoord", "passTexture", "buffer", "drawPass", "iteration", "set1f", "set1i", "rw", "rh", "ky", "sz", "sw", "chTimes", "chRes", "texObj", "isCube", "chTime", "unit", "bindTex", "units", "frameStep", "advance", "rawDt", "t0", "loop", "startLoop", "stopLoop", "destroy", "onContextLost", "onContextRestored", "teardownPasses", "capture", "passName", "api", "hit", "scheduleRender", "owner", "renderQueued", "setShader", "setChannel", "index", "old", "VERSION", "readyPromise", "width", "height", "float", "COMMON", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "canvasOf", "w", "h", "c", "createGPUBackend", "probe", "dbg", "renderer", "canvas", "source", "palette", "matrix", "nearest", "el", "sm", "createShader", "COMMON", "MAX_KERNEL", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "failure", "e", "passUniforms", "name", "values", "k", "lastSource", "paletteKey", "matrixKey", "setSource", "frame", "ctx", "setPalette", "plan", "key", "img", "i", "setMatrix", "map", "m", "run", "s", "diffusion", "kernel", "_", "v", "data", "out", "row", "y", "hasDOM", "isRGBA", "s", "loadImage", "src", "img", "sizeOf", "el", "unwrap", "toFrame", "source", "opts", "maxSize", "frame", "c", "width", "height", "k", "canvas", "ctx", "cached", "init_color", "upscale", "img", "k", "opts", "w", "h", "out", "src", "sw", "y", "sy", "x", "so", "o", "r", "g", "b", "parseColor", "a", "sa", "oa", "resizeNearest", "width", "height", "xs", "uniqueColors", "limit", "seen", "d", "v", "toHex", "hasTransparency", "detectGrid", "tolerance", "same", "gcd", "stepY", "stepX", "run", "toCanvas", "img", "scale", "opts", "up", "upscale", "c", "downloadBlob", "data", "filename", "type", "blob", "url", "a", "table", "crc32", "bytes", "crc", "c", "k", "i", "SIG", "deflate", "bytes", "cs", "stream", "deflateSync", "chunk", "type", "data", "out", "dv", "i", "crc32", "indexImage", "img", "d", "map", "colors", "idx", "o", "k", "v", "encodePNG", "opts", "resizeNearest", "upscale", "w", "h", "ix", "ihdr", "parts", "raw", "bits", "stride", "y", "row", "bit", "c", "last", "total", "s", "p", "isVideo", "s", "isVideoFrame", "createPixelator", "options", "want", "gpu", "gpuError", "createGPUBackend", "e", "scratch", "last", "queue", "frameFor", "source", "frame", "toFrame", "processNow", "settings", "t0", "plan", "makePlan", "data", "backend", "diffusionOnCPU", "runCPU", "ms", "makeResult", "run", "uniqueColors", "scale", "opts", "toCanvas", "encodePNG", "shared", "pixelate", "pixelateClassic", "image", "width", "dither", "strength", "palette", "resolution", "pal", "fetchLospec", "p", "normalizeSettings", "LEGACY_DITHER", "res", "c", "ctx", "init_parse", "init_lospec", "PRESETS", "getPreset", "id", "p", "init_color", "init_color", "ByteWriter", "b", "nb", "arr", "i", "v", "s", "lzwEncode", "indices", "minCodeSize", "w", "clear", "eoi", "codeSize", "next", "dict", "cur", "curBits", "sub", "block", "emit", "code", "prefix", "k", "key", "hit", "keyOf", "d", "o", "tableFor", "colorKeys", "transparent", "list", "colors", "tIndex", "bits", "index", "reduce", "frame", "max", "pal", "extractPalette", "parseColor", "cache", "best", "bd", "dr", "dg", "db", "dist", "encodeGIF", "frames", "opts", "scale", "fr", "f", "upscale", "W", "H", "all", "perFrame", "opaqueCount", "global", "c", "f0", "table", "set", "idx", "p", "enc", "createZip", "entries", "files", "central", "offset", "used", "e", "name", "m", "i", "nameBytes", "data", "crc", "crc32", "d", "time", "date", "local", "lv", "cen", "cv", "cenSize", "s", "c", "end", "ev", "out", "o", "p", "blank", "w", "h", "blit", "dst", "src", "dx", "dy", "sx", "sy", "sw", "sh", "y", "so", "o", "packSpriteSheet", "frames", "opts", "pad", "cw", "ch", "cols", "rows", "W", "H", "image", "out", "i", "x", "atlas", "buildTileset", "img", "tw", "th", "mw", "mh", "tiles", "keys", "map", "flipsOut", "read", "tx", "ty", "t", "key", "s", "flip", "fx", "fy", "si", "id", "f", "code", "k", "wait", "el", "ev", "ms", "res", "rej", "t", "ok", "MEDIA_ERRORS", "mediaError", "video", "code", "err", "waitOrFail", "done", "onOk", "onErr", "videoReady", "timeout", "e", "sniffVideoCodec", "file", "buf", "NAMES", "type", "head", "m", "seekTo", "video", "time", "presented", "res", "seeked", "wait", "estimateFps", "fallback", "videoReady", "was", "times", "done", "cb", "_", "meta", "deltas", "i", "d", "b", "fps", "r", "frameTimes", "duration", "start", "end", "maxFrames", "out", "n", "forEachFrame", "opts", "wasPaused", "VERSION"]
7
7
  }