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.
- package/LICENSE +21 -21
- package/README.md +2 -2
- package/dist/editor.css +1 -1
- package/dist/editor.css.map +2 -2
- package/dist/editor.esm.js +60 -60
- package/dist/editor.esm.js.map +4 -4
- package/dist/fonts/README.md +6 -6
- package/dist/fonts/geist-LICENSE.txt +93 -93
- package/dist/image-to-pixel.bundle.esm.js +16 -16
- package/dist/image-to-pixel.bundle.esm.js.map +3 -3
- package/dist/image-to-pixel.cjs +2 -2
- package/dist/image-to-pixel.cjs.map +2 -2
- package/dist/image-to-pixel.esm.js +2 -2
- package/dist/image-to-pixel.esm.js.map +2 -2
- package/dist/image-to-pixel.js +2 -2
- package/dist/image-to-pixel.js.map +2 -2
- package/dist/image-to-pixel.min.js +11 -11
- package/dist/image-to-pixel.min.js.map +3 -3
- package/dist/video.esm.js +2 -2
- package/dist/video.esm.js.map +4 -4
- package/lib/core/color.js +69 -69
- package/lib/core/cpu/pipeline.js +21 -21
- package/lib/core/cpu/stages.js +227 -227
- package/lib/core/dither/bluenoise-data.js +3 -3
- package/lib/core/dither/kernels.js +27 -27
- package/lib/core/dither/matrices.js +95 -95
- package/lib/core/engine.js +158 -158
- package/lib/core/export/canvas.js +22 -22
- package/lib/core/export/crc32.js +15 -15
- package/lib/core/export/gif.js +153 -153
- package/lib/core/export/png.js +94 -94
- package/lib/core/export/scale.js +103 -103
- package/lib/core/export/sheet.js +95 -95
- package/lib/core/export/zip.js +55 -55
- package/lib/core/gpu/backend.js +159 -159
- package/lib/core/gpu/shaders.js +258 -258
- package/lib/core/palette/builtin.js +36 -36
- package/lib/core/palette/extract.js +69 -69
- package/lib/core/palette/lospec.js +24 -24
- package/lib/core/palette/parse.js +112 -112
- package/lib/core/plan.js +58 -58
- package/lib/core/presets.js +42 -42
- package/lib/core/settings.js +274 -274
- package/lib/core/source.js +89 -89
- package/lib/core/video/audio.js +159 -0
- package/lib/core/video/frames.js +38 -0
- package/lib/core/video/mux-mp4.js +213 -24
- package/lib/core/video/mux-webm.js +63 -22
- package/lib/editor/controls.js +139 -139
- package/lib/editor/dom.js +65 -65
- package/lib/editor/exporter.js +43 -3
- package/lib/editor/icons.js +4 -0
- package/lib/editor/index.js +218 -9
- package/lib/editor/inspector.js +19 -4
- package/lib/editor/library.js +8 -2
- package/lib/editor/persist.js +18 -18
- package/lib/editor/samples.js +90 -90
- package/lib/editor/stage.js +239 -239
- package/lib/editor/store.js +80 -80
- package/lib/editor/styles/editor.css +34 -1
- package/lib/editor/styles/fonts/README.md +6 -6
- package/lib/editor/styles/fonts/geist-LICENSE.txt +93 -93
- package/lib/editor/styles/tokens.css +89 -89
- package/lib/editor/ui.js +97 -97
- package/lib/editor/workspace.js +62 -0
- package/lib/index.js +31 -29
- package/lib/video.js +37 -7
- package/package.json +1 -1
- package/types/editor.d.ts +34 -34
- package/types/index.d.ts +196 -196
- package/types/video.d.ts +61 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! image-to-pixel v3 | MIT | https://github.com/Tezumie/Image-to-Pixel */
|
|
2
|
-
var $r=Object.defineProperty;var Et=(e,t)=>()=>(e&&(t=e(e=0)),t);var Kr=(e,t)=>{for(var n in t)$r(e,n,{get:t[n],enumerable:!0})};function ce(e){if(Array.isArray(e))return[e[0]|0,e[1]|0,e[2]|0];let t=String(e).trim().replace(/^#|^0x/i,"");if((t.length===3||t.length===4)&&(t=t.slice(0,3).split("").map(n=>n+n).join("")),!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(t))throw new Error(`Invalid colour "${e}"`);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}function Je(e){try{return ce(e),!0}catch{return!1}}function Ce(e){return"#"+e.slice(0,3).map(t=>Math.max(0,Math.min(255,Math.round(t))).toString(16).padStart(2,"0")).join("")}function Ze(e,t,n){e=vt(e),t=vt(t),n=vt(n);let r=Math.cbrt(.4122214708*e+.5363325363*t+.0514459929*n),o=Math.cbrt(.2119034982*e+.6806995451*t+.1073969566*n),i=Math.cbrt(.0883024619*e+.2817188376*t+.6299787005*n);return[.2104542553*r+.793617785*o-.0040720468*i,1.9779984951*r-2.428592205*o+.4505937099*i,.0259040371*r+.7827717662*o-.808675766*i]}function
|
|
1
|
+
/*! image-to-pixel v3.1.0 | MIT | https://github.com/Tezumie/Image-to-Pixel */
|
|
2
|
+
var $r=Object.defineProperty;var Et=(e,t)=>()=>(e&&(t=e(e=0)),t);var Kr=(e,t)=>{for(var n in t)$r(e,n,{get:t[n],enumerable:!0})};function ce(e){if(Array.isArray(e))return[e[0]|0,e[1]|0,e[2]|0];let t=String(e).trim().replace(/^#|^0x/i,"");if((t.length===3||t.length===4)&&(t=t.slice(0,3).split("").map(n=>n+n).join("")),!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(t))throw new Error(`Invalid colour "${e}"`);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}function Je(e){try{return ce(e),!0}catch{return!1}}function Ce(e){return"#"+e.slice(0,3).map(t=>Math.max(0,Math.min(255,Math.round(t))).toString(16).padStart(2,"0")).join("")}function Ze(e,t,n){e=vt(e),t=vt(t),n=vt(n);let r=Math.cbrt(.4122214708*e+.5363325363*t+.0514459929*n),o=Math.cbrt(.2119034982*e+.6806995451*t+.1073969566*n),i=Math.cbrt(.0883024619*e+.2817188376*t+.6299787005*n);return[.2104542553*r+.793617785*o-.0040720468*i,1.9779984951*r-2.428592205*o+.4505937099*i,.0259040371*r+.7827717662*o-.808675766*i]}function Rn(e){if(e.length<2)return 1;let t=0;for(let n=0;n<e.length;n++){let r=1/0;for(let o=0;o<e.length;o++){if(n===o)continue;let i=e[n][0]-e[o][0],a=e[n][1]-e[o][1],s=e[n][2]-e[o][2],c=Math.sqrt(i*i+a*a+s*s);c<r&&(r=c)}t+=r}return Math.max(.04,Math.min(1,t/e.length/255))}var Q,vt,Qe,le=Et(()=>{Q=e=>Ce(ce(e)),vt=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);Qe=[.2126,.7152,.0722]});function Bi(e){let t=e.split(/\r?\n/);if(!/^GIMP Palette/i.test(t[0]||""))throw new Error('Not a GIMP palette (missing "GIMP Palette" header)');let n="",r=[];for(let o of t.slice(1)){let i=o.trim();if(!i||i.startsWith("#"))continue;let a=/^Name:\s*(.*)$/i.exec(i);if(a){n=a[1].trim();continue}if(/^Columns:/i.test(i))continue;let s=/^(\d{1,3})\s+(\d{1,3})\s+(\d{1,3})/.exec(i);s&&r.push(Q([+s[1],+s[2],+s[3]]))}return{name:n,colors:r}}function Mr(e){let t=[];for(let n of e.split(/\r?\n/)){let r=n.trim();if(!r||r.startsWith(";")||r.startsWith("//"))continue;let o=/^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\b/i.exec(r);if(!o)continue;let i=o[1].length===8?o[1].slice(2):o[1];t.push(Q(i))}return{name:"",colors:t}}function Xi(e){let t=e.split(/\r?\n/).map(o=>o.trim());if(t[0]!=="JASC-PAL")throw new Error("Not a JASC palette");let n=parseInt(t[2],10)||0,r=[];for(let o=3;o<3+n&&o<t.length;o++){let i=/^(\d+)\s+(\d+)\s+(\d+)/.exec(t[o]);i&&r.push(Q([+i[1],+i[2],+i[3]]))}return{name:"",colors:r}}function Kt(e){let t=typeof e=="string"?JSON.parse(e):e,r=(Array.isArray(t)?t:t.colors||t.palette||[]).map(o=>typeof o=="object"&&o?o.hex||o.color:o).filter(Boolean).map(Q);return{name:!Array.isArray(t)&&t.name||"",colors:r}}function ji(e){let t=[],n=/#?\b([0-9a-f]{6})\b/gi,r;for(;r=n.exec(e);)t.push(Q(r[1]));return{name:"",colors:t}}function Gi(e,t=""){let n=(/\.([a-z0-9]+)$/i.exec(t)||[])[1]?.toLowerCase()||"",o=String(e).replace(/^/,"").trim(),i;if(n==="gpl"||/^GIMP Palette/i.test(o)?i=Bi(o):n==="pal"||o.startsWith("JASC-PAL")?i=Xi(o):n==="json"||o.startsWith("{")||o.startsWith("[")?i=Kt(o):n==="hex"||n==="txt"?i=Mr(o):(i=Mr(o),i.colors.length||(i=ji(o))),i.colors=Ni(i.colors).slice(0,256),!i.name&&t&&(i.name=t.replace(/\.[^.]+$/,"").replace(/[-_]+/g," ")),!i.colors.length)throw new Error("No colours found in that palette");return i}function zi(e,t){let n=t.map(r=>{let o=Q(r),i=parseInt(o.slice(1,3),16),a=parseInt(o.slice(3,5),16),s=parseInt(o.slice(5,7),16);return`${String(i).padStart(3)} ${String(a).padStart(3)} ${String(s).padStart(3)} ${o.slice(1)}`});return`GIMP Palette
|
|
3
3
|
Name: ${e||"Palette"}
|
|
4
4
|
Columns: 8
|
|
5
5
|
#
|
|
@@ -7,7 +7,7 @@ ${n.join(`
|
|
|
7
7
|
`)}
|
|
8
8
|
`}var Ni,Hi,Wi,qt=Et(()=>{le();Ni=e=>[...new Set(e)];Hi=e=>e.map(t=>Q(t).slice(1)).join(`
|
|
9
9
|
`)+`
|
|
10
|
-
`,Wi=(e,t)=>JSON.stringify({name:e||"Palette",colors:t.map(n=>Q(n).slice(1))},null,2)});var Cr={};Kr(Cr,{fetchLospec:()=>kr,lospecSlug:()=>Jt});function Jt(e){let t=String(e||"").trim(),n=/palette-list\/([a-z0-9-]+)/i.exec(t);return(n?n[1]:t).toLowerCase().replace(/\.(json|hex|gpl)$/,"")}async function kr(e,{fetch:t=globalThis.fetch}={}){let n=Jt(e);if(!/^[a-z0-9-]+$/.test(n))throw new Error("That does not look like a Lospec palette slug");let r=await t(`https://lospec.com/palette-list/${n}.json`);if(!r.ok)throw new Error(`Lospec returned ${r.status} for "${n}"`);let o=await r.json(),i=Kt(o);return{name:o.name||n,author:o.author||"",colors:i.colors,slug:n}}var Zt=Et(()=>{qt()});var An=[{id:"1-bit-monitor",name:"1-Bit Monitor",author:"",colors:["222323","f0f6f0"]},{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"]},{id:"batpalette",name:"Batpalette",author:"el Rojaz",colors:["000000","7f7f7f","ffffff","681e99","3f48cc","88ff82","bfa621","cc3d18"]},{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"]},{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"]},{id:"cga-16",name:"CGA 16",author:"",colors:["000000","0000aa","00aa00","00aaaa","aa0000","aa00aa","aa5500","aaaaaa","555555","5555ff","55ff55","55ffff","ff5555","ff55ff","ffff55","ffffff"]},{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"]},{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"]},{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"]},{id:"game-boy-dmg",name:"Game Boy (DMG)",author:"",colors:["0f380f","306230","8bac0f","9bbc0f"]},{id:"grayscale-4",name:"Grayscale 4",author:"",colors:["000000","555555","aaaaaa","ffffff"]},{id:"hidden-library",name:"Hidden Library",author:"Pixel Hoo",colors:["100b2a","2a213a","314743","65856d","adca9a","ecfeca","582d27","974133","d67654","5d3441","a3685b","ffb379","ffe6a9","ffffff"]},{id:"intacto14",name:"Intacto14",author:"Anubi",colors:["221529","4b5561","879ba3","cbf5ef","62b4de","5660d6","5b29a6","d64562","f2735c","edbb8e","ab6375","522152","37ada2","8cde8c"]},{id:"journey",name:"Journey",author:"\u{1F34D}PineappleOnPizza\u{1F34D}",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"]},{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"]},{id:"nyx8",name:"Nyx8",author:"Javier Guerrero",colors:["08141e","0f2a3f","20394f","4e495f","816271","997577","c3a38a","f6d6bd"]},{id:"oil-6",name:"Oil 6",author:"",colors:["fbf5ef","f2d3ab","c69fa5","8b6d9c","494d7e","272744"]},{id:"pico-8",name:"PICO-8",author:"",colors:["000000","1d2b53","7e2553","008751","ab5236","5f574f","c2c3c7","fff1e8","ff004d","ffa300","ffec27","00e436","29adff","83769c","ff77a8","ffccaa"]},{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"]},{id:"slso8",name:"SLSO8",author:"Luis Miguel Maldonado",colors:["0d2b45","203c56","544e68","8d697a","d08159","ffaa5e","ffd4a3","ffecd6"]},{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"]},{id:"sweetie-16",name:"Sweetie 16",author:"",colors:["1a1c2c","5d275d","b13e53","ef7d57","ffcd75","a7f070","38b764","257179","29366f","3b5dc9","41a6f6","73eff7","f4f4f4","94b0c2","566c86","333c57"]},{id:"toxic-haze",name:"Toxic Haze",author:"sillyTheJester",colors:["e5ff00","b8d14a","9ab06e","708763","4c5c52","393e40","242424"]},{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"]}];function qe(e){let t=String(e||"").toLowerCase();return An.find(n=>n.id===t||n.name.toLowerCase()===t)||null}le();var Xe=1,Be=2048,_t=[{id:"none",label:"None",kind:"none"},{id:"bayer2",label:"Bayer 2\xD72",kind:"ordered"},{id:"bayer4",label:"Bayer 4\xD74",kind:"ordered"},{id:"bayer8",label:"Bayer 8\xD78",kind:"ordered"},{id:"bayer16",label:"Bayer 16\xD716",kind:"ordered"},{id:"cluster4",label:"Clustered dot 4\xD74",kind:"ordered"},{id:"cluster8",label:"Clustered dot 8\xD78",kind:"ordered"},{id:"lines",label:"Horizontal lines",kind:"ordered"},{id:"bluenoise",label:"Blue noise",kind:"ordered"},{id:"custom",label:"Custom matrix",kind:"ordered"},{id:"floyd-steinberg",label:"Floyd\u2013Steinberg",kind:"diffusion"},{id:"atkinson",label:"Atkinson",kind:"diffusion"},{id:"sierra-lite",label:"Sierra Lite",kind:"diffusion"},{id:"sierra",label:"Sierra",kind:"diffusion"},{id:"burkes",label:"Burkes",kind:"diffusion"},{id:"jarvis",label:"Jarvis\u2013Judice\u2013Ninke",kind:"diffusion"},{id:"stucki",label:"Stucki",kind:"diffusion"}],Tt=e=>(_t.find(t=>t.id===e)||{kind:"none"}).kind,St={none:"none","floyd-steinberg":"floyd-steinberg",atkinson:"atkinson",ordered:"bayer8","2x2 bayer":"bayer2","4x4 bayer":"bayer4","clustered 4x4":"cluster4"},Rn=Object.freeze({version:Xe,size:{mode:"width",width:96,height:0,block:8,resample:"box"},adjust:{brightness:0,contrast:0,saturation:0,hue:0,gamma:1},frame:{aspect:"original",zoom:1,x:.5,y:.5},palette:{source:"builtin",id:"endesga-32",name:"Endesga 32",colors:[],count:16,distance:"oklab"},dither:{method:"bayer4",strength:.6,matrix:null},alpha:{threshold:.5},cleanup:{orphans:!1,smooth:!1},outline:{mode:"none",color:"#000000",corners:!1},export:{size:"scale",scale:4,indexed:!0,grid:!1,gridColor:"#000000"}}),K=(e,t,n,r)=>{let o=Number(e);return Number.isFinite(o)?Math.min(n,Math.max(t,o)):r},pe=(e,t,n)=>t.includes(e)?e:n,Ne=(e,t)=>typeof e=="boolean"?e:t;function kn(){return fe({})}function fe(e={}){let t=Rn,n=e||{},r={},o=n.size||{},i=n.adjust||{},a=n.palette||{},s=n.dither||{},c=n.alpha||{},l=n.cleanup||{},u=n.outline||{},d=n.export||{};r.version=Xe,r.size={mode:pe(o.mode,["width","block"],t.size.mode),width:Math.round(K(o.width,1,Be,t.size.width)),height:Math.round(K(o.height,0,Be,t.size.height)),block:K(o.block,1,256,t.size.block),resample:pe(o.resample,["box","nearest"],t.size.resample)},r.adjust={brightness:K(i.brightness,-1,1,0),contrast:K(i.contrast,-1,1,0),saturation:K(i.saturation,-1,1,0),hue:K(i.hue,-180,180,0),gamma:K(i.gamma,.2,5,1)};let f=n.frame||{};r.frame={aspect:pe(f.aspect,et.map(g=>g.id),"original"),zoom:K(f.zoom,1,8,1),x:K(f.x,0,1,.5),y:K(f.y,0,1,.5)};let m=pe(a.source,["builtin","custom","extract","none"],t.palette.source);if(r.palette={source:m,id:typeof a.id=="string"?a.id:m==="builtin"?t.palette.id:"",name:typeof a.name=="string"?a.name:"",colors:[],count:Math.round(K(a.count,2,256,t.palette.count)),distance:pe(a.distance,["oklab","rgb"],t.palette.distance)},m==="builtin"){let g=qe(r.palette.id)||qe(t.palette.id);r.palette.id=g.id,r.palette.name=g.name,r.palette.colors=g.colors.map(x=>"#"+x)}else m==="custom"?(r.palette.colors=(Array.isArray(a.colors)?a.colors:[]).filter(Je).map(Q).slice(0,256),r.palette.colors.length||(r.palette.colors=["#000000","#ffffff"]),r.palette.name=r.palette.name||"Custom"):m==="extract"?r.palette.name=`Extracted (${r.palette.count})`:r.palette.name="None";let b=_t.some(g=>g.id===s.method)?s.method:t.dither.method;return r.dither={method:b,strength:K(s.strength,0,1,t.dither.strength),matrix:qr(s.matrix)},r.alpha={threshold:K(c.threshold,0,1,t.alpha.threshold)},r.cleanup={orphans:Ne(l.orphans,!1),smooth:Ne(l.smooth,!1)},r.outline={mode:pe(u.mode,["none","outer","inner"],"none"),color:Je(u.color)?Q(u.color):t.outline.color,corners:Ne(u.corners,!1)},r.export={size:pe(d.size,["scale","source"],"scale"),scale:Math.round(K(d.scale,1,64,t.export.scale)),indexed:Ne(d.indexed,t.export.indexed),grid:Ne(d.grid,!1),gridColor:Je(d.gridColor)?Q(d.gridColor):t.export.gridColor},r}function qr(e){if(!Array.isArray(e)||!e.length||!Array.isArray(e[0]))return null;let t=Math.min(16,e.length),n=Math.min(16,e[0].length),r=[];for(let o=0;o<t;o++){let i=[];for(let a=0;a<n;a++){let s=Number((e[o]||[])[a]);i.push(Number.isFinite(s)?s:0)}r.push(i)}return r}var et=[{id:"original",label:"Original",ratio:null},{id:"1:1",label:"1:1",ratio:1},{id:"4:3",label:"4:3",ratio:4/3},{id:"3:4",label:"3:4",ratio:3/4},{id:"3:2",label:"3:2",ratio:3/2},{id:"2:3",label:"2:3",ratio:2/3},{id:"16:9",label:"16:9",ratio:16/9},{id:"9:16",label:"9:16",ratio:9/16}];function At(e,t,n={}){let r=(et.find(l=>l.id===n.aspect)||et[0]).ratio||e/t,o=e,i=e/r;i>t&&(i=t,o=t*r);let a=Math.max(1,n.zoom||1);o=Math.max(1,Math.min(e,Math.round(o/a))),i=Math.max(1,Math.min(t,Math.round(i/a)));let s=n.x??.5,c=n.y??.5;return{x:Math.round((e-o)*s),y:Math.round((t-i)*c),w:o,h:i}}function Mt(e,t,n){let r,o;return n.mode==="block"?(r=Math.max(1,Math.round(e/n.block)),o=Math.max(1,Math.round(t/n.block))):(r=n.width,o=n.height||Math.max(1,Math.round(r*t/e))),{width:Math.min(Be,r),height:Math.min(Be,o)}}function Jr(e,t){let n={};for(let r of Object.keys(e)){if(r==="version")continue;let o=e[r],i=t[r];if(o&&typeof o=="object"&&!Array.isArray(o)){let a={};for(let s of Object.keys(o))JSON.stringify(o[s])!==JSON.stringify(i&&i[s])&&(a[s]=o[s]);Object.keys(a).length&&(n[r]=a)}else JSON.stringify(o)!==JSON.stringify(i)&&(n[r]=o)}return n}var Cn={enc(e){let t=new TextEncoder().encode(e),n="";for(let r of t)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},dec(e){let t=atob(e.replace(/-/g,"+").replace(/_/g,"/"));return new TextDecoder().decode(Uint8Array.from(t,n=>n.charCodeAt(0)))}};function Rt(e){let t=fe(e),n=Jr(t,kn());return n.palette&&(t.palette.source!=="custom"&&(delete n.palette.colors,delete n.palette.name),t.palette.source!=="builtin"&&delete n.palette.id,t.palette.source!=="extract"&&delete n.palette.count),n.palette&&!Object.keys(n.palette).length&&delete n.palette,n}function Zr(e){return Cn.enc(JSON.stringify({v:Xe,...Rt(e)}))}function Qr(e){let t=String(e),n=/[#&?]s=([A-Za-z0-9_-]+)/.exec(t);n&&(t=n[1]);let r=JSON.parse(Cn.dec(t));return delete r.v,fe(r)}function eo(e){return JSON.stringify({$schema:"image-to-pixel/settings",version:Xe,...Rt(e)},null,2)}function to(e){let t=typeof e=="string"?JSON.parse(e):e;return delete t.$schema,fe(t)}function no(e,t){let n=JSON.parse(JSON.stringify(e));for(let r of Object.keys(t||{}))t[r]&&typeof t[r]=="object"&&!Array.isArray(t[r])&&n[r]&&typeof n[r]=="object"?Object.assign(n[r],t[r]):n[r]=t[r];return fe(n)}le();var Un="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";function ro(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):new Uint8Array(Buffer.from(e,"base64"))}function be(e){let t=[[0]];for(let n=1;n<e;n*=2){let r=[];for(let o=0;o<n*2;o++)r.push(new Array(n*2));for(let o=0;o<n;o++)for(let i=0;i<n;i++){let a=4*t[o][i];r[o][i]=a,r[o][i+n]=a+2,r[o+n][i]=a+3,r[o+n][i+n]=a+1}t=r}return t}function Ln(e){let t=e.length,n=e[0].length,r=[];for(let i=0;i<t;i++)for(let a=0;a<n;a++)r.push({i:i*n+a,v:e[i][a]});r.sort((i,a)=>i.v-a.v||i.i-a.i);let o=new Uint8Array(n*t);return r.forEach((i,a)=>{o[i.i]=a}),o}function oo(e){let t=[];for(let n=0;n<e;n++){let r=[];for(let o=0;o<e;o++){let i=(o+.5)/e*2*Math.PI,a=(n+.5)/e*2*Math.PI;r.push(-(Math.cos(i)+Math.cos(a))+(o*e+n)*1e-9)}t.push(r)}return t}var io=[[7,13,11,4],[12,16,14,8],[10,15,6,2],[5,9,3,1]],kt=new Map;function Ct(e,t=null){if(e==="custom"){let o=t&&t.length?t:be(4);return{w:o[0].length,h:o.length,levels:o.length*o[0].length,values:Ln(o)}}if(kt.has(e))return kt.get(e);let n,r=o=>({w:o[0].length,h:o.length,levels:o.length*o[0].length,values:Ln(o)});switch(e){case"bayer2":n=r(be(2));break;case"bayer4":n=r(be(4));break;case"bayer8":n=r(be(8));break;case"bayer16":n=r(be(16));break;case"cluster4":n=r(io);break;case"cluster8":n=r(oo(8));break;case"lines":n=r([[0],[2],[1],[3]]);break;case"bluenoise":n={w:64,h:64,levels:256,values:ro(Un)};break;default:n=r(be(4))}return kt.set(e,n),n}function ao(e){let t=String(e).split(/\r?\n|;/).map(r=>r.trim()).filter(r=>r&&!/^\//.test(r)).map(r=>r.replace(/[[\]]/g,"").split(/[\s,]+/).filter(Boolean).map(Number));if(!t.length)throw new Error("Matrix is empty");let n=t[0].length;if(t.some(r=>r.length!==n||r.some(o=>!Number.isFinite(o))))throw new Error("Every row needs the same number of values");if(n>16||t.length>16)throw new Error("Matrices are limited to 16\xD716");return t}var we=(e,t)=>t.map(([n,r,o])=>[n,r,o/e]),Ut={"floyd-steinberg":we(16,[[1,0,7],[-1,1,3],[0,1,5],[1,1,1]]),atkinson:we(8,[[1,0,1],[2,0,1],[-1,1,1],[0,1,1],[1,1,1],[0,2,1]]),"sierra-lite":we(4,[[1,0,2],[-1,1,1],[0,1,1]]),sierra:we(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]]),burkes:we(32,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2]]),jarvis:we(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]]),stucki:we(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]])},Pt=12;function In(e){let t=1;for(let[n,r]of e)r>0&&(t=Math.max(t,Math.floor(-n/r)+1));return t}var Fn=(e,t,n)=>e-1+n*(t-1)+1;le();function je(e,t=16,n={}){let{maxSamples:r=4e4,alphaThreshold:o=.5}=n,i=e.width*e.height,a=Math.max(1,Math.floor(i/r)),s=[];for(let f=0;f<i;f+=a){let m=f*4;e.data[m+3]<o*255||s.push([e.data[m],e.data[m+1],e.data[m+2]])}if(!s.length)return["#000000","#ffffff"].slice(0,Math.max(1,t));let c=[s];for(;c.length<t;){let f=-1,m=-1,b=0;if(c.forEach((y,h)=>{if(!(y.length<2))for(let E=0;E<3;E++){let p=255,_=0;for(let R of y)R[E]<p&&(p=R[E]),R[E]>_&&(_=R[E]);let T=(_-p)*Math.sqrt(y.length);T>m&&(m=T,f=h,b=E)}}),f<0||m<=0)break;let g=c[f].slice().sort((y,h)=>y[b]-h[b]),x=g.length>>1;c.splice(f,1,g.slice(0,x),g.slice(x))}let l=c.map(f=>so(f));for(let f=0;f<6;f++){let m=l.map(()=>[0,0,0,0]);for(let b of s){let g=0,x=1/0;for(let h=0;h<l.length;h++){let E=b[0]-l[h][0],p=b[1]-l[h][1],_=b[2]-l[h][2],T=E*E+p*p+_*_;T<x&&(x=T,g=h)}let y=m[g];y[0]+=b[0],y[1]+=b[1],y[2]+=b[2],y[3]++}l=l.map((b,g)=>m[g][3]?[m[g][0]/m[g][3],m[g][1]/m[g][3],m[g][2]/m[g][3]]:b)}let u=[...new Set(l.map(f=>Ce(f)))],d=f=>{let m=parseInt(f.slice(1),16);return .2126*(m>>16)+.7152*(m>>8&255)+.0722*(m&255)};return u.sort((f,m)=>d(f)-d(m))}function so(e){let t=0,n=0,r=0;for(let o of e)t+=o[0],n+=o[1],r+=o[2];return[t/e.length,n/e.length,r/e.length]}le();function nt(e,t,n,r="box",o=null){let i=o?o.x:0,a=o?o.y:0,s=o?o.w:e.width,c=o?o.h:e.height,l=e.data,u=e.width,d=new Float32Array(t*n*4),f=r==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(s/t))),m=r==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(c/n))),b=new Int32Array(t*f),g=new Int32Array(n*m);for(let x=0;x<t;x++)for(let y=0;y<f;y++)b[x*f+y]=i+Math.min(s-1,Math.floor((2*(x*f+y)+1)*s/(2*t*f)));for(let x=0;x<n;x++)for(let y=0;y<m;y++)g[x*m+y]=a+Math.min(c-1,Math.floor((2*(x*m+y)+1)*c/(2*n*m)));for(let x=0;x<n;x++)for(let y=0;y<t;y++){let h=0,E=0,p=0,_=0;for(let R=0;R<m;R++){let S=g[x*m+R]*u;for(let O=0;O<f;O++){let L=(S+b[y*f+O])*4,X=l[L+3]/255;h+=l[L]/255*X,E+=l[L+1]/255*X,p+=l[L+2]/255*X,_+=X}}let T=(x*t+y)*4;_>0&&(d[T]=h/_,d[T+1]=E/_,d[T+2]=p/_),d[T+3]=_/(f*m)}return d}function rt(e,{brightness:t=0,contrast:n=0,saturation:r=0,hue:o=0,gamma:i=1}){if(!t&&!n&&!r&&!o&&i===1)return e;let a=n>=0?1/(1-.99*n):1+n,s=1/i,c=Math.cos(o*Math.PI/180),l=Math.sin(o*Math.PI/180),u=[.213+.787*c-.213*l,.715-.715*c-.715*l,.072-.072*c+.928*l,.213-.213*c+.143*l,.715+.285*c+.14*l,.072-.072*c-.283*l,.213-.213*c-.787*l,.715-.715*c+.715*l,.072+.928*c+.072*l];for(let d=0;d<e.length;d+=4){let f=e[d]+t,m=e[d+1]+t,b=e[d+2]+t;f=(f-.5)*a+.5,m=(m-.5)*a+.5,b=(b-.5)*a+.5;let g=f*Qe[0]+m*Qe[1]+b*Qe[2],x=1+r;if(f=g+(f-g)*x,m=g+(m-g)*x,b=g+(b-g)*x,o){let y=u[0]*f+u[1]*m+u[2]*b,h=u[3]*f+u[4]*m+u[5]*b,E=u[6]*f+u[7]*m+u[8]*b;f=y,m=h,b=E}e[d]=Math.pow(de(f),s),e[d+1]=Math.pow(de(m),s),e[d+2]=Math.pow(de(b),s)}return e}function On(e,t){for(let n=3;n<e.length;n+=4)e[n]=e[n]>=t&&e[n]>0?1:0;return e}var de=e=>e<0?0:e>1?1:e;function Dn(e,t){let n=e.length,r=new Float64Array(n*3),o=new Float64Array(n*3);return e.forEach((i,a)=>{o.set([i[0]/255,i[1]/255,i[2]/255],a*3),r.set(t===1?[i[0]/255,i[1]/255,i[2]/255]:Ze(i[0]/255,i[1]/255,i[2]/255),a*3)}),{n,coords:r,rgb:o,distance:t}}var Lt=[.299,.587,.114];function Nn(e,t,n,r){let o,i,a,s=1,c=1,l=1;e.distance===1?(o=t,i=n,a=r,s=Lt[0],c=Lt[1],l=Lt[2]):[o,i,a]=Ze(t,n,r);let u=0,d=1/0,f=e.coords;for(let m=0;m<e.n;m++){let b=o-f[m*3],g=i-f[m*3+1],x=a-f[m*3+2],y=s*b*b+c*g*g+l*x*x;y<d&&(d=y,u=m)}return u}function Bn(e,t,n,r){let o=new Uint8ClampedArray(t*n*4),i=r.quantize?Dn(r.palette,r.distance):null,a=r.kind==="ordered"?r.map:null,s=a?r.spread*r.settings.dither.strength:0;for(let c=0;c<n;c++)for(let l=0;l<t;l++){let u=(c*t+l)*4;if(e[u+3]<.5)continue;let d=e[u],f=e[u+1],m=e[u+2];if(i){if(a){let g=(a.values[c%a.h*a.w+l%a.w]+.5)/a.levels-.5;d=de(d+g*s),f=de(f+g*s),m=de(m+g*s)}let b=Nn(i,d,f,m);o[u]=r.palette[b][0],o[u+1]=r.palette[b][1],o[u+2]=r.palette[b][2]}else o[u]=Math.round(d*255),o[u+1]=Math.round(f*255),o[u+2]=Math.round(m*255);o[u+3]=255}return o}function Xn(e,t,n,r){let o=new Uint8ClampedArray(t*n*4),i=Dn(r.palette,r.distance),a=new Float32Array(t*n*3),s=r.settings.dither.strength,c=r.kernel;for(let l=0;l<n;l++)for(let u=0;u<t;u++){let d=l*t+u,f=d*4;if(e[f+3]<.5)continue;let m=de(e[f]+a[d*3]*s),b=de(e[f+1]+a[d*3+1]*s),g=de(e[f+2]+a[d*3+2]*s),x=Nn(i,m,b,g),y=m-i.rgb[x*3],h=b-i.rgb[x*3+1],E=g-i.rgb[x*3+2];for(let[p,_,T]of c){let R=u+p,S=l+_;if(R<0||R>=t||S>=n)continue;let O=(S*t+R)*3;a[O]+=y*T,a[O+1]+=h*T,a[O+2]+=E*T}o[f]=r.palette[x][0],o[f+1]=r.palette[x][1],o[f+2]=r.palette[x][2],o[f+3]=255}return o}var tt=(e,t)=>e[t+3]===0?-1:e[t]<<16|e[t+1]<<8|e[t+2],jn=[[0,-1],[1,0],[0,1],[-1,0]];function Gn(e,t,n){let r=e.slice();for(let o=0;o<n;o++)for(let i=0;i<t;i++){let a=(o*t+i)*4,s=tt(r,a),c=[],l=[];for(let[f,m]of jn){let b=i+f,g=o+m;if(b<0||g<0||b>=t||g>=n)continue;let x=(g*t+b)*4;c.push(tt(r,x)),l.push(x)}if(c.length<2||c.includes(s))continue;let u=0,d=0;for(let f=0;f<c.length;f++){let m=0;for(let b=0;b<c.length;b++)c[b]===c[f]&&m++;m>d&&(d=m,u=f)}e.set(r.subarray(l[u],l[u]+4),a)}return e}function zn(e,t,n){let r=e.slice();for(let o=0;o<n;o++)for(let i=0;i<t;i++){let a=(o*t+i)*4,s=tt(r,a),c=[],l=[];for(let u=-1;u<=1;u++)for(let d=-1;d<=1;d++){let f=Math.min(t-1,Math.max(0,i+d)),b=(Math.min(n-1,Math.max(0,o+u))*t+f)*4;c.push(tt(r,b)),l.push(b)}for(let u=0;u<9;u++){if(c[u]===s)continue;let d=0;for(let f=0;f<9;f++)c[f]===c[u]&&d++;if(d>=5){e.set(r.subarray(l[u],l[u]+4),a);break}}}return e}function Hn(e,t,n,{mode:r,color:o,corners:i}){if(r==="none")return e;let a=e.slice(),s=(u,d)=>u>=0&&d>=0&&u<t&&d<n&&a[(d*t+u)*4+3]>0,c=(u,d)=>u>=0&&d>=0&&u<t&&d<n,l=i?[[0,-1],[1,0],[0,1],[-1,0],[-1,-1],[1,-1],[1,1],[-1,1]]:jn;for(let u=0;u<n;u++)for(let d=0;d<t;d++){let f=s(d,u),m=!1;for(let[b,g]of l){let x=d+b,y=u+g;if(c(x,y)&&(r==="outer"?!f&&s(x,y):f&&!s(x,y))){m=!0;break}}if(m){let b=(u*t+d)*4;e[b]=o[0],e[b+1]=o[1],e[b+2]=o[2],e[b+3]=255}}return e}function It(e,t){let n=fe(e),r=At(t.width,t.height,n.frame),{width:o,height:i}=Mt(r.w,r.h,n.size),a=n.palette.colors;n.palette.source==="extract"&&(a=co(t,n,o,i,r));let s=n.palette.source!=="none"&&a.length>0,c=s?a.map(ce):[],l=s?Tt(n.dither.method):"none";n.dither.strength<=0&&(l="none");let u=l==="ordered"?Ct(n.dither.method,n.dither.matrix):null,d=l==="diffusion"?Ut[n.dither.method]:null,f=d?In(d):1;return{settings:n,srcWidth:t.width,srcHeight:t.height,crop:r,width:o,height:i,quantize:s,kind:l,palette:c,paletteHex:s?a.slice():null,distance:n.palette.distance==="rgb"?1:0,spread:s?Mn(c):0,map:u,kernel:d,skew:f,waves:d?Fn(o,i,f):0,outline:{mode:n.outline.mode,color:ce(n.outline.color),corners:n.outline.corners}}}function co(e,t,n,r,o){let i=Math.min(1,160/Math.max(n,r)),a=Math.max(1,Math.round(n*i)),s=Math.max(1,Math.round(r*i)),c=nt(e,a,s,"box",o);rt(c,t.adjust);let l=new Uint8ClampedArray(c.length);for(let u=0;u<c.length;u++)l[u]=Math.round(c[u]*255);return je({data:l,width:a,height:s},t.palette.count,{alphaThreshold:Math.max(.01,t.alpha.threshold)})}function Ft(e,t){let{width:n,height:r,settings:o}=e,i=nt(t,n,r,o.size.resample,e.crop);rt(i,o.adjust),On(i,o.alpha.threshold);let a=e.kind==="diffusion"?Xn(i,n,r,e):Bn(i,n,r,e);return o.cleanup.orphans&&Gn(a,n,r),o.cleanup.smooth&&zn(a,n,r),Hn(a,n,r,e.outline),a}var fo="2.0.0",Ge=4,Wn="glcanvas",H=class extends Error{constructor(e,t){super(e),this.name="ShaderMateError",t&&Object.assign(this,t)}},Vn=new Set;function xe(e,...t){Vn.has(e)||(Vn.add(e),console.warn("[ShaderMate]",...t))}var Xt=typeof window<"u"&&typeof document<"u",uo=e=>Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView),Yn=e=>e==null?[]:Array.isArray(e)?e:[e],$n=e=>e>0&&(e&e-1)===0;function lo(e){var t,n,r,o;if(e==null)return null;if(Array.isArray(e))return[(t=e[0])!=null?t:0,(n=e[1])!=null?n:0,(r=e[2])!=null?r:0,(o=e[3])!=null?o:1];if(typeof e=="string"&&Xt){let i=document.createElement("canvas");i.width=i.height=1;let a=i.getContext("2d");a.fillStyle=e,a.fillRect(0,0,1,1);let s=a.getImageData(0,0,1,1).data;return[s[0]/255,s[1]/255,s[2]/255,s[3]/255]}return null}function mo(){if(!Xt)return!1;let e=location.hostname;return location.protocol==="file:"||e==="localhost"||e==="127.0.0.1"||e===""||e.endsWith(".local")}var ho=class{constructor(e){this.gl=e,this._items=new Map,this._nextId=1}add(e,t){let n=this._nextId++;return this._items.set(n,{obj:e,count:1,type:t}),n}ref(e){let t=this._items.get(e);return t&&t.count++,e}get(e){let t=this._items.get(e);return t?t.obj:null}unref(e){let t=this._items.get(e);t&&(t.count--,t.count<=0&&this._destroy(e,t))}_destroy(e,t){let{obj:n,type:r}=t,o=this.gl;switch(r){case"texture2D":case"textureCube":o.deleteTexture(n);break;case"fbo":o.deleteFramebuffer(n);break;case"buffer":o.deleteBuffer(n);break;case"program":o.deleteProgram(n);break}this._items.delete(e)}dispose(){for(let[e,t]of[...this._items])this._destroy(e,t)}};function po(e){let t=new Map;function n(s,c){return t.has(s)||t.set(s,new Set),t.get(s).add(c),()=>r(s,c)}function r(s,c){let l=t.get(s);l&&l.delete(c)}function o(s,c){let l=u=>{r(s,l),c(u)};return n(s,l)}function i(s,c){let l=t.get(s);if(l)for(let u of[...l])try{u(c)}catch(d){console.error(`[ShaderMate] error in "${s}" listener`,d)}e&&e(s,c)}function a(){t.clear()}return{on:n,off:r,once:o,emit:i,clear:a}}var Kn={linear:e=>e,inQuad:e=>e*e,outQuad:e=>e*(2-e),inOutQuad:e=>e<.5?2*e*e:-1+(4-2*e)*e,inCubic:e=>e*e*e,outCubic:e=>1-Math.pow(1-e,3),inOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,outExpo:e=>e===1?1:1-Math.pow(2,-10*e),outBack:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),outElastic:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e*10-.75)*(2*Math.PI)/3)+1};function bo(){let e=new Map;function t(o,i,a,s,c={}){let{duration:l=500,delay:u=0}=c,d=typeof c.ease=="function"?c.ease:Kn[c.ease]||Kn.outCubic,f=e.get(o);f&&f.resolve(!1);let m=i(),b=Array.isArray(s)||ArrayBuffer.isView(s),g=b?Array.from(m??s):Number(m??0),x=b?Array.from(s):Number(s);return new Promise(y=>{let h={start:performance.now()+u,resolve:E=>{e.delete(o),y(E)},update(E){let p=l>0?wo((E-this.start)/l):1;if(p<0)return;let _=d(p);a(b?g.map((T,R)=>T+(x[R]-T)*_):g+(x-g)*_),p>=1&&this.resolve(!0)}};e.set(o,h)})}function n(o){for(let i of[...e.values()])i.update(o)}function r(o){if(o===void 0){for(let a of[...e.values()])a.resolve(!1);return}let i=e.get(o);i&&i.resolve(!1)}return{tween:t,update:n,cancel:r,get size(){return e.size}}}var wo=e=>e<0?e:e>1?1:e;function xo(e){let t;if(typeof e=="string")t=[{src:e}];else if(Array.isArray(e))t=e.map(o=>typeof o=="string"?{src:o}:{...o});else if(e&&typeof e=="object")t=[{...e}];else throw new H("ShaderMate: expected a shader (string), a pass object, or an array of passes");if(!t.length)throw new H("ShaderMate: no passes given");t.forEach((o,i)=>{var a,s,c,l,u;if(o.src==null&&(o.src=(l=(c=(s=(a=o.shader)!=null?a:o.frag)!=null?s:o.fragment)!=null?c:o.glsl)!=null?l:o.url),o.src==null)throw new H(`Pass ${(u=o.name)!=null?u:i} has no shader source (use "shader")`);o.name==null&&(o.name=t.length===1?"main":"pass"+i),o.uniforms==null&&(o.uniforms={})}),t.some(o=>o.screen)||(t[t.length-1].screen=!0),t.filter(o=>o.screen).length>1&&console.warn("[ShaderMate] Multiple screen:true passes; last drawn wins.");let n=t.map(o=>o.name),r=n.filter((o,i)=>n.indexOf(o)!==i);if(r.length)throw new H("Duplicate pass names: "+[...new Set(r)].join(", "));for(let o of t){let i=Array.isArray(o.channels)?o.channels:o.channels?[o.channels]:[];for(o.channels=i.slice(0,Ge).map(a=>cr(a,n,o.name));o.channels.length<Ge;)o.channels.push(null)}return t}var go=e=>typeof HTMLElement<"u"&&e instanceof HTMLElement,yo=e=>typeof ImageBitmap<"u"&&e instanceof ImageBitmap,Eo=e=>typeof WebGLTexture<"u"&&e instanceof WebGLTexture;function cr(e,t=[],n=""){if(e==null||e===!1)return null;if(typeof e=="string")return t.includes(e)?{pass:e}:{url:e};if(go(e)||yo(e))return{element:e};if(Eo(e))return{texture:e};let r={...e};return r.pass==null&&r.id!=null&&(r.pass=r.id),r.url==null&&r.image!=null&&(r.url=r.image),r.element==null&&r.canvas!=null&&(r.element=r.canvas),r.pass==null&&r.src!=null&&r.url==null&&r.video==null&&(r.url=r.src),r.pass!=null&&!t.includes(r.pass)&&console.warn(`[ShaderMate] Pass "${n}": channel references unknown pass "${r.pass}"`),r}function Ot(e){return/[\r\n]/.test(e)||/^\s*(void|#|precision|uniform|in |out |\/\/|\/\*)/.test(e)||/[{};]/.test(e)}var vo=e=>typeof WebGL2RenderingContext<"u"&&e instanceof WebGL2RenderingContext;function _o(e,t={}){let n=Object.assign({alpha:t.alpha!==!1,premultipliedAlpha:t.premultipliedAlpha!==!1,preserveDrawingBuffer:!!t.preserveDrawingBuffer,antialias:!!t.antialias,powerPreference:t.powerPreference||"default"},t.contextAttributes),r=t.webgl===void 0?"auto":String(t.webgl),o=null;if((r==="auto"||r==="2")&&(o=e.getContext("webgl2",n)),!o&&(r==="auto"||r==="1")&&(o=e.getContext("webgl",n)||e.getContext("experimental-webgl",n)),!o)throw new H("WebGL not supported");return o}function To(e,t){let n={};return t?(n.EXT_color_buffer_float=e.getExtension("EXT_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear")):(n.OES_texture_float=e.getExtension("OES_texture_float"),n.OES_texture_half_float=e.getExtension("OES_texture_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear"),n.OES_texture_half_float_linear=e.getExtension("OES_texture_half_float_linear"),n.OES_standard_derivatives=e.getExtension("OES_standard_derivatives"),n.WEBGL_color_buffer_float=e.getExtension("WEBGL_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.WEBGL_depth_texture=e.getExtension("WEBGL_depth_texture"),n.EXT_shader_texture_lod=e.getExtension("EXT_shader_texture_lod")),n}function So(e){let t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),e.STATIC_DRAW),{bind(n){e.bindBuffer(e.ARRAY_BUFFER,t);let r=e.getAttribLocation(n,"a_position");r!==-1&&(e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,0,0))},draw(){e.drawArrays(e.TRIANGLES,0,6)},dispose(){e.deleteBuffer(t)}}}function Ao(e,t){var n;let r=t.split(`
|
|
10
|
+
`,Wi=(e,t)=>JSON.stringify({name:e||"Palette",colors:t.map(n=>Q(n).slice(1))},null,2)});var Cr={};Kr(Cr,{fetchLospec:()=>Ur,lospecSlug:()=>Jt});function Jt(e){let t=String(e||"").trim(),n=/palette-list\/([a-z0-9-]+)/i.exec(t);return(n?n[1]:t).toLowerCase().replace(/\.(json|hex|gpl)$/,"")}async function Ur(e,{fetch:t=globalThis.fetch}={}){let n=Jt(e);if(!/^[a-z0-9-]+$/.test(n))throw new Error("That does not look like a Lospec palette slug");let r=await t(`https://lospec.com/palette-list/${n}.json`);if(!r.ok)throw new Error(`Lospec returned ${r.status} for "${n}"`);let o=await r.json(),i=Kt(o);return{name:o.name||n,author:o.author||"",colors:i.colors,slug:n}}var Zt=Et(()=>{qt()});var An=[{id:"1-bit-monitor",name:"1-Bit Monitor",author:"",colors:["222323","f0f6f0"]},{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"]},{id:"batpalette",name:"Batpalette",author:"el Rojaz",colors:["000000","7f7f7f","ffffff","681e99","3f48cc","88ff82","bfa621","cc3d18"]},{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"]},{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"]},{id:"cga-16",name:"CGA 16",author:"",colors:["000000","0000aa","00aa00","00aaaa","aa0000","aa00aa","aa5500","aaaaaa","555555","5555ff","55ff55","55ffff","ff5555","ff55ff","ffff55","ffffff"]},{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"]},{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"]},{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"]},{id:"game-boy-dmg",name:"Game Boy (DMG)",author:"",colors:["0f380f","306230","8bac0f","9bbc0f"]},{id:"grayscale-4",name:"Grayscale 4",author:"",colors:["000000","555555","aaaaaa","ffffff"]},{id:"hidden-library",name:"Hidden Library",author:"Pixel Hoo",colors:["100b2a","2a213a","314743","65856d","adca9a","ecfeca","582d27","974133","d67654","5d3441","a3685b","ffb379","ffe6a9","ffffff"]},{id:"intacto14",name:"Intacto14",author:"Anubi",colors:["221529","4b5561","879ba3","cbf5ef","62b4de","5660d6","5b29a6","d64562","f2735c","edbb8e","ab6375","522152","37ada2","8cde8c"]},{id:"journey",name:"Journey",author:"\u{1F34D}PineappleOnPizza\u{1F34D}",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"]},{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"]},{id:"nyx8",name:"Nyx8",author:"Javier Guerrero",colors:["08141e","0f2a3f","20394f","4e495f","816271","997577","c3a38a","f6d6bd"]},{id:"oil-6",name:"Oil 6",author:"",colors:["fbf5ef","f2d3ab","c69fa5","8b6d9c","494d7e","272744"]},{id:"pico-8",name:"PICO-8",author:"",colors:["000000","1d2b53","7e2553","008751","ab5236","5f574f","c2c3c7","fff1e8","ff004d","ffa300","ffec27","00e436","29adff","83769c","ff77a8","ffccaa"]},{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"]},{id:"slso8",name:"SLSO8",author:"Luis Miguel Maldonado",colors:["0d2b45","203c56","544e68","8d697a","d08159","ffaa5e","ffd4a3","ffecd6"]},{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"]},{id:"sweetie-16",name:"Sweetie 16",author:"",colors:["1a1c2c","5d275d","b13e53","ef7d57","ffcd75","a7f070","38b764","257179","29366f","3b5dc9","41a6f6","73eff7","f4f4f4","94b0c2","566c86","333c57"]},{id:"toxic-haze",name:"Toxic Haze",author:"sillyTheJester",colors:["e5ff00","b8d14a","9ab06e","708763","4c5c52","393e40","242424"]},{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"]}];function qe(e){let t=String(e||"").toLowerCase();return An.find(n=>n.id===t||n.name.toLowerCase()===t)||null}le();var Xe=1,Be=2048,_t=[{id:"none",label:"None",kind:"none"},{id:"bayer2",label:"Bayer 2\xD72",kind:"ordered"},{id:"bayer4",label:"Bayer 4\xD74",kind:"ordered"},{id:"bayer8",label:"Bayer 8\xD78",kind:"ordered"},{id:"bayer16",label:"Bayer 16\xD716",kind:"ordered"},{id:"cluster4",label:"Clustered dot 4\xD74",kind:"ordered"},{id:"cluster8",label:"Clustered dot 8\xD78",kind:"ordered"},{id:"lines",label:"Horizontal lines",kind:"ordered"},{id:"bluenoise",label:"Blue noise",kind:"ordered"},{id:"custom",label:"Custom matrix",kind:"ordered"},{id:"floyd-steinberg",label:"Floyd\u2013Steinberg",kind:"diffusion"},{id:"atkinson",label:"Atkinson",kind:"diffusion"},{id:"sierra-lite",label:"Sierra Lite",kind:"diffusion"},{id:"sierra",label:"Sierra",kind:"diffusion"},{id:"burkes",label:"Burkes",kind:"diffusion"},{id:"jarvis",label:"Jarvis\u2013Judice\u2013Ninke",kind:"diffusion"},{id:"stucki",label:"Stucki",kind:"diffusion"}],Tt=e=>(_t.find(t=>t.id===e)||{kind:"none"}).kind,St={none:"none","floyd-steinberg":"floyd-steinberg",atkinson:"atkinson",ordered:"bayer8","2x2 bayer":"bayer2","4x4 bayer":"bayer4","clustered 4x4":"cluster4"},Mn=Object.freeze({version:Xe,size:{mode:"width",width:96,height:0,block:8,resample:"box"},adjust:{brightness:0,contrast:0,saturation:0,hue:0,gamma:1},frame:{aspect:"original",zoom:1,x:.5,y:.5},palette:{source:"builtin",id:"endesga-32",name:"Endesga 32",colors:[],count:16,distance:"oklab"},dither:{method:"bayer4",strength:.6,matrix:null},alpha:{threshold:.5},cleanup:{orphans:!1,smooth:!1},outline:{mode:"none",color:"#000000",corners:!1},export:{size:"scale",scale:4,indexed:!0,grid:!1,gridColor:"#000000"}}),K=(e,t,n,r)=>{let o=Number(e);return Number.isFinite(o)?Math.min(n,Math.max(t,o)):r},pe=(e,t,n)=>t.includes(e)?e:n,Ne=(e,t)=>typeof e=="boolean"?e:t;function Un(){return fe({})}function fe(e={}){let t=Mn,n=e||{},r={},o=n.size||{},i=n.adjust||{},a=n.palette||{},s=n.dither||{},c=n.alpha||{},l=n.cleanup||{},u=n.outline||{},d=n.export||{};r.version=Xe,r.size={mode:pe(o.mode,["width","block"],t.size.mode),width:Math.round(K(o.width,1,Be,t.size.width)),height:Math.round(K(o.height,0,Be,t.size.height)),block:K(o.block,1,256,t.size.block),resample:pe(o.resample,["box","nearest"],t.size.resample)},r.adjust={brightness:K(i.brightness,-1,1,0),contrast:K(i.contrast,-1,1,0),saturation:K(i.saturation,-1,1,0),hue:K(i.hue,-180,180,0),gamma:K(i.gamma,.2,5,1)};let f=n.frame||{};r.frame={aspect:pe(f.aspect,et.map(g=>g.id),"original"),zoom:K(f.zoom,1,8,1),x:K(f.x,0,1,.5),y:K(f.y,0,1,.5)};let m=pe(a.source,["builtin","custom","extract","none"],t.palette.source);if(r.palette={source:m,id:typeof a.id=="string"?a.id:m==="builtin"?t.palette.id:"",name:typeof a.name=="string"?a.name:"",colors:[],count:Math.round(K(a.count,2,256,t.palette.count)),distance:pe(a.distance,["oklab","rgb"],t.palette.distance)},m==="builtin"){let g=qe(r.palette.id)||qe(t.palette.id);r.palette.id=g.id,r.palette.name=g.name,r.palette.colors=g.colors.map(x=>"#"+x)}else m==="custom"?(r.palette.colors=(Array.isArray(a.colors)?a.colors:[]).filter(Je).map(Q).slice(0,256),r.palette.colors.length||(r.palette.colors=["#000000","#ffffff"]),r.palette.name=r.palette.name||"Custom"):m==="extract"?r.palette.name=`Extracted (${r.palette.count})`:r.palette.name="None";let b=_t.some(g=>g.id===s.method)?s.method:t.dither.method;return r.dither={method:b,strength:K(s.strength,0,1,t.dither.strength),matrix:qr(s.matrix)},r.alpha={threshold:K(c.threshold,0,1,t.alpha.threshold)},r.cleanup={orphans:Ne(l.orphans,!1),smooth:Ne(l.smooth,!1)},r.outline={mode:pe(u.mode,["none","outer","inner"],"none"),color:Je(u.color)?Q(u.color):t.outline.color,corners:Ne(u.corners,!1)},r.export={size:pe(d.size,["scale","source"],"scale"),scale:Math.round(K(d.scale,1,64,t.export.scale)),indexed:Ne(d.indexed,t.export.indexed),grid:Ne(d.grid,!1),gridColor:Je(d.gridColor)?Q(d.gridColor):t.export.gridColor},r}function qr(e){if(!Array.isArray(e)||!e.length||!Array.isArray(e[0]))return null;let t=Math.min(16,e.length),n=Math.min(16,e[0].length),r=[];for(let o=0;o<t;o++){let i=[];for(let a=0;a<n;a++){let s=Number((e[o]||[])[a]);i.push(Number.isFinite(s)?s:0)}r.push(i)}return r}var et=[{id:"original",label:"Original",ratio:null},{id:"1:1",label:"1:1",ratio:1},{id:"4:3",label:"4:3",ratio:4/3},{id:"3:4",label:"3:4",ratio:3/4},{id:"3:2",label:"3:2",ratio:3/2},{id:"2:3",label:"2:3",ratio:2/3},{id:"16:9",label:"16:9",ratio:16/9},{id:"9:16",label:"9:16",ratio:9/16}];function At(e,t,n={}){let r=(et.find(l=>l.id===n.aspect)||et[0]).ratio||e/t,o=e,i=e/r;i>t&&(i=t,o=t*r);let a=Math.max(1,n.zoom||1);o=Math.max(1,Math.min(e,Math.round(o/a))),i=Math.max(1,Math.min(t,Math.round(i/a)));let s=n.x??.5,c=n.y??.5;return{x:Math.round((e-o)*s),y:Math.round((t-i)*c),w:o,h:i}}function Rt(e,t,n){let r,o;return n.mode==="block"?(r=Math.max(1,Math.round(e/n.block)),o=Math.max(1,Math.round(t/n.block))):(r=n.width,o=n.height||Math.max(1,Math.round(r*t/e))),{width:Math.min(Be,r),height:Math.min(Be,o)}}function Jr(e,t){let n={};for(let r of Object.keys(e)){if(r==="version")continue;let o=e[r],i=t[r];if(o&&typeof o=="object"&&!Array.isArray(o)){let a={};for(let s of Object.keys(o))JSON.stringify(o[s])!==JSON.stringify(i&&i[s])&&(a[s]=o[s]);Object.keys(a).length&&(n[r]=a)}else JSON.stringify(o)!==JSON.stringify(i)&&(n[r]=o)}return n}var Cn={enc(e){let t=new TextEncoder().encode(e),n="";for(let r of t)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},dec(e){let t=atob(e.replace(/-/g,"+").replace(/_/g,"/"));return new TextDecoder().decode(Uint8Array.from(t,n=>n.charCodeAt(0)))}};function Mt(e){let t=fe(e),n=Jr(t,Un());return n.palette&&(t.palette.source!=="custom"&&(delete n.palette.colors,delete n.palette.name),t.palette.source!=="builtin"&&delete n.palette.id,t.palette.source!=="extract"&&delete n.palette.count),n.palette&&!Object.keys(n.palette).length&&delete n.palette,n}function Zr(e){return Cn.enc(JSON.stringify({v:Xe,...Mt(e)}))}function Qr(e){let t=String(e),n=/[#&?]s=([A-Za-z0-9_-]+)/.exec(t);n&&(t=n[1]);let r=JSON.parse(Cn.dec(t));return delete r.v,fe(r)}function eo(e){return JSON.stringify({$schema:"image-to-pixel/settings",version:Xe,...Mt(e)},null,2)}function to(e){let t=typeof e=="string"?JSON.parse(e):e;return delete t.$schema,fe(t)}function no(e,t){let n=JSON.parse(JSON.stringify(e));for(let r of Object.keys(t||{}))t[r]&&typeof t[r]=="object"&&!Array.isArray(t[r])&&n[r]&&typeof n[r]=="object"?Object.assign(n[r],t[r]):n[r]=t[r];return fe(n)}le();var kn="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";function ro(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):new Uint8Array(Buffer.from(e,"base64"))}function be(e){let t=[[0]];for(let n=1;n<e;n*=2){let r=[];for(let o=0;o<n*2;o++)r.push(new Array(n*2));for(let o=0;o<n;o++)for(let i=0;i<n;i++){let a=4*t[o][i];r[o][i]=a,r[o][i+n]=a+2,r[o+n][i]=a+3,r[o+n][i+n]=a+1}t=r}return t}function Ln(e){let t=e.length,n=e[0].length,r=[];for(let i=0;i<t;i++)for(let a=0;a<n;a++)r.push({i:i*n+a,v:e[i][a]});r.sort((i,a)=>i.v-a.v||i.i-a.i);let o=new Uint8Array(n*t);return r.forEach((i,a)=>{o[i.i]=a}),o}function oo(e){let t=[];for(let n=0;n<e;n++){let r=[];for(let o=0;o<e;o++){let i=(o+.5)/e*2*Math.PI,a=(n+.5)/e*2*Math.PI;r.push(-(Math.cos(i)+Math.cos(a))+(o*e+n)*1e-9)}t.push(r)}return t}var io=[[7,13,11,4],[12,16,14,8],[10,15,6,2],[5,9,3,1]],Ut=new Map;function Ct(e,t=null){if(e==="custom"){let o=t&&t.length?t:be(4);return{w:o[0].length,h:o.length,levels:o.length*o[0].length,values:Ln(o)}}if(Ut.has(e))return Ut.get(e);let n,r=o=>({w:o[0].length,h:o.length,levels:o.length*o[0].length,values:Ln(o)});switch(e){case"bayer2":n=r(be(2));break;case"bayer4":n=r(be(4));break;case"bayer8":n=r(be(8));break;case"bayer16":n=r(be(16));break;case"cluster4":n=r(io);break;case"cluster8":n=r(oo(8));break;case"lines":n=r([[0],[2],[1],[3]]);break;case"bluenoise":n={w:64,h:64,levels:256,values:ro(kn)};break;default:n=r(be(4))}return Ut.set(e,n),n}function ao(e){let t=String(e).split(/\r?\n|;/).map(r=>r.trim()).filter(r=>r&&!/^\//.test(r)).map(r=>r.replace(/[[\]]/g,"").split(/[\s,]+/).filter(Boolean).map(Number));if(!t.length)throw new Error("Matrix is empty");let n=t[0].length;if(t.some(r=>r.length!==n||r.some(o=>!Number.isFinite(o))))throw new Error("Every row needs the same number of values");if(n>16||t.length>16)throw new Error("Matrices are limited to 16\xD716");return t}var we=(e,t)=>t.map(([n,r,o])=>[n,r,o/e]),kt={"floyd-steinberg":we(16,[[1,0,7],[-1,1,3],[0,1,5],[1,1,1]]),atkinson:we(8,[[1,0,1],[2,0,1],[-1,1,1],[0,1,1],[1,1,1],[0,2,1]]),"sierra-lite":we(4,[[1,0,2],[-1,1,1],[0,1,1]]),sierra:we(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]]),burkes:we(32,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2]]),jarvis:we(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]]),stucki:we(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]])},Pt=12;function In(e){let t=1;for(let[n,r]of e)r>0&&(t=Math.max(t,Math.floor(-n/r)+1));return t}var Fn=(e,t,n)=>e-1+n*(t-1)+1;le();function je(e,t=16,n={}){let{maxSamples:r=4e4,alphaThreshold:o=.5}=n,i=e.width*e.height,a=Math.max(1,Math.floor(i/r)),s=[];for(let f=0;f<i;f+=a){let m=f*4;e.data[m+3]<o*255||s.push([e.data[m],e.data[m+1],e.data[m+2]])}if(!s.length)return["#000000","#ffffff"].slice(0,Math.max(1,t));let c=[s];for(;c.length<t;){let f=-1,m=-1,b=0;if(c.forEach((y,h)=>{if(!(y.length<2))for(let E=0;E<3;E++){let p=255,_=0;for(let M of y)M[E]<p&&(p=M[E]),M[E]>_&&(_=M[E]);let T=(_-p)*Math.sqrt(y.length);T>m&&(m=T,f=h,b=E)}}),f<0||m<=0)break;let g=c[f].slice().sort((y,h)=>y[b]-h[b]),x=g.length>>1;c.splice(f,1,g.slice(0,x),g.slice(x))}let l=c.map(f=>so(f));for(let f=0;f<6;f++){let m=l.map(()=>[0,0,0,0]);for(let b of s){let g=0,x=1/0;for(let h=0;h<l.length;h++){let E=b[0]-l[h][0],p=b[1]-l[h][1],_=b[2]-l[h][2],T=E*E+p*p+_*_;T<x&&(x=T,g=h)}let y=m[g];y[0]+=b[0],y[1]+=b[1],y[2]+=b[2],y[3]++}l=l.map((b,g)=>m[g][3]?[m[g][0]/m[g][3],m[g][1]/m[g][3],m[g][2]/m[g][3]]:b)}let u=[...new Set(l.map(f=>Ce(f)))],d=f=>{let m=parseInt(f.slice(1),16);return .2126*(m>>16)+.7152*(m>>8&255)+.0722*(m&255)};return u.sort((f,m)=>d(f)-d(m))}function so(e){let t=0,n=0,r=0;for(let o of e)t+=o[0],n+=o[1],r+=o[2];return[t/e.length,n/e.length,r/e.length]}le();function nt(e,t,n,r="box",o=null){let i=o?o.x:0,a=o?o.y:0,s=o?o.w:e.width,c=o?o.h:e.height,l=e.data,u=e.width,d=new Float32Array(t*n*4),f=r==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(s/t))),m=r==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(c/n))),b=new Int32Array(t*f),g=new Int32Array(n*m);for(let x=0;x<t;x++)for(let y=0;y<f;y++)b[x*f+y]=i+Math.min(s-1,Math.floor((2*(x*f+y)+1)*s/(2*t*f)));for(let x=0;x<n;x++)for(let y=0;y<m;y++)g[x*m+y]=a+Math.min(c-1,Math.floor((2*(x*m+y)+1)*c/(2*n*m)));for(let x=0;x<n;x++)for(let y=0;y<t;y++){let h=0,E=0,p=0,_=0;for(let M=0;M<m;M++){let S=g[x*m+M]*u;for(let O=0;O<f;O++){let L=(S+b[y*f+O])*4,X=l[L+3]/255;h+=l[L]/255*X,E+=l[L+1]/255*X,p+=l[L+2]/255*X,_+=X}}let T=(x*t+y)*4;_>0&&(d[T]=h/_,d[T+1]=E/_,d[T+2]=p/_),d[T+3]=_/(f*m)}return d}function rt(e,{brightness:t=0,contrast:n=0,saturation:r=0,hue:o=0,gamma:i=1}){if(!t&&!n&&!r&&!o&&i===1)return e;let a=n>=0?1/(1-.99*n):1+n,s=1/i,c=Math.cos(o*Math.PI/180),l=Math.sin(o*Math.PI/180),u=[.213+.787*c-.213*l,.715-.715*c-.715*l,.072-.072*c+.928*l,.213-.213*c+.143*l,.715+.285*c+.14*l,.072-.072*c-.283*l,.213-.213*c-.787*l,.715-.715*c+.715*l,.072+.928*c+.072*l];for(let d=0;d<e.length;d+=4){let f=e[d]+t,m=e[d+1]+t,b=e[d+2]+t;f=(f-.5)*a+.5,m=(m-.5)*a+.5,b=(b-.5)*a+.5;let g=f*Qe[0]+m*Qe[1]+b*Qe[2],x=1+r;if(f=g+(f-g)*x,m=g+(m-g)*x,b=g+(b-g)*x,o){let y=u[0]*f+u[1]*m+u[2]*b,h=u[3]*f+u[4]*m+u[5]*b,E=u[6]*f+u[7]*m+u[8]*b;f=y,m=h,b=E}e[d]=Math.pow(de(f),s),e[d+1]=Math.pow(de(m),s),e[d+2]=Math.pow(de(b),s)}return e}function On(e,t){for(let n=3;n<e.length;n+=4)e[n]=e[n]>=t&&e[n]>0?1:0;return e}var de=e=>e<0?0:e>1?1:e;function Dn(e,t){let n=e.length,r=new Float64Array(n*3),o=new Float64Array(n*3);return e.forEach((i,a)=>{o.set([i[0]/255,i[1]/255,i[2]/255],a*3),r.set(t===1?[i[0]/255,i[1]/255,i[2]/255]:Ze(i[0]/255,i[1]/255,i[2]/255),a*3)}),{n,coords:r,rgb:o,distance:t}}var Lt=[.299,.587,.114];function Nn(e,t,n,r){let o,i,a,s=1,c=1,l=1;e.distance===1?(o=t,i=n,a=r,s=Lt[0],c=Lt[1],l=Lt[2]):[o,i,a]=Ze(t,n,r);let u=0,d=1/0,f=e.coords;for(let m=0;m<e.n;m++){let b=o-f[m*3],g=i-f[m*3+1],x=a-f[m*3+2],y=s*b*b+c*g*g+l*x*x;y<d&&(d=y,u=m)}return u}function Bn(e,t,n,r){let o=new Uint8ClampedArray(t*n*4),i=r.quantize?Dn(r.palette,r.distance):null,a=r.kind==="ordered"?r.map:null,s=a?r.spread*r.settings.dither.strength:0;for(let c=0;c<n;c++)for(let l=0;l<t;l++){let u=(c*t+l)*4;if(e[u+3]<.5)continue;let d=e[u],f=e[u+1],m=e[u+2];if(i){if(a){let g=(a.values[c%a.h*a.w+l%a.w]+.5)/a.levels-.5;d=de(d+g*s),f=de(f+g*s),m=de(m+g*s)}let b=Nn(i,d,f,m);o[u]=r.palette[b][0],o[u+1]=r.palette[b][1],o[u+2]=r.palette[b][2]}else o[u]=Math.round(d*255),o[u+1]=Math.round(f*255),o[u+2]=Math.round(m*255);o[u+3]=255}return o}function Xn(e,t,n,r){let o=new Uint8ClampedArray(t*n*4),i=Dn(r.palette,r.distance),a=new Float32Array(t*n*3),s=r.settings.dither.strength,c=r.kernel;for(let l=0;l<n;l++)for(let u=0;u<t;u++){let d=l*t+u,f=d*4;if(e[f+3]<.5)continue;let m=de(e[f]+a[d*3]*s),b=de(e[f+1]+a[d*3+1]*s),g=de(e[f+2]+a[d*3+2]*s),x=Nn(i,m,b,g),y=m-i.rgb[x*3],h=b-i.rgb[x*3+1],E=g-i.rgb[x*3+2];for(let[p,_,T]of c){let M=u+p,S=l+_;if(M<0||M>=t||S>=n)continue;let O=(S*t+M)*3;a[O]+=y*T,a[O+1]+=h*T,a[O+2]+=E*T}o[f]=r.palette[x][0],o[f+1]=r.palette[x][1],o[f+2]=r.palette[x][2],o[f+3]=255}return o}var tt=(e,t)=>e[t+3]===0?-1:e[t]<<16|e[t+1]<<8|e[t+2],jn=[[0,-1],[1,0],[0,1],[-1,0]];function Gn(e,t,n){let r=e.slice();for(let o=0;o<n;o++)for(let i=0;i<t;i++){let a=(o*t+i)*4,s=tt(r,a),c=[],l=[];for(let[f,m]of jn){let b=i+f,g=o+m;if(b<0||g<0||b>=t||g>=n)continue;let x=(g*t+b)*4;c.push(tt(r,x)),l.push(x)}if(c.length<2||c.includes(s))continue;let u=0,d=0;for(let f=0;f<c.length;f++){let m=0;for(let b=0;b<c.length;b++)c[b]===c[f]&&m++;m>d&&(d=m,u=f)}e.set(r.subarray(l[u],l[u]+4),a)}return e}function zn(e,t,n){let r=e.slice();for(let o=0;o<n;o++)for(let i=0;i<t;i++){let a=(o*t+i)*4,s=tt(r,a),c=[],l=[];for(let u=-1;u<=1;u++)for(let d=-1;d<=1;d++){let f=Math.min(t-1,Math.max(0,i+d)),b=(Math.min(n-1,Math.max(0,o+u))*t+f)*4;c.push(tt(r,b)),l.push(b)}for(let u=0;u<9;u++){if(c[u]===s)continue;let d=0;for(let f=0;f<9;f++)c[f]===c[u]&&d++;if(d>=5){e.set(r.subarray(l[u],l[u]+4),a);break}}}return e}function Hn(e,t,n,{mode:r,color:o,corners:i}){if(r==="none")return e;let a=e.slice(),s=(u,d)=>u>=0&&d>=0&&u<t&&d<n&&a[(d*t+u)*4+3]>0,c=(u,d)=>u>=0&&d>=0&&u<t&&d<n,l=i?[[0,-1],[1,0],[0,1],[-1,0],[-1,-1],[1,-1],[1,1],[-1,1]]:jn;for(let u=0;u<n;u++)for(let d=0;d<t;d++){let f=s(d,u),m=!1;for(let[b,g]of l){let x=d+b,y=u+g;if(c(x,y)&&(r==="outer"?!f&&s(x,y):f&&!s(x,y))){m=!0;break}}if(m){let b=(u*t+d)*4;e[b]=o[0],e[b+1]=o[1],e[b+2]=o[2],e[b+3]=255}}return e}function It(e,t){let n=fe(e),r=At(t.width,t.height,n.frame),{width:o,height:i}=Rt(r.w,r.h,n.size),a=n.palette.colors;n.palette.source==="extract"&&(a=co(t,n,o,i,r));let s=n.palette.source!=="none"&&a.length>0,c=s?a.map(ce):[],l=s?Tt(n.dither.method):"none";n.dither.strength<=0&&(l="none");let u=l==="ordered"?Ct(n.dither.method,n.dither.matrix):null,d=l==="diffusion"?kt[n.dither.method]:null,f=d?In(d):1;return{settings:n,srcWidth:t.width,srcHeight:t.height,crop:r,width:o,height:i,quantize:s,kind:l,palette:c,paletteHex:s?a.slice():null,distance:n.palette.distance==="rgb"?1:0,spread:s?Rn(c):0,map:u,kernel:d,skew:f,waves:d?Fn(o,i,f):0,outline:{mode:n.outline.mode,color:ce(n.outline.color),corners:n.outline.corners}}}function co(e,t,n,r,o){let i=Math.min(1,160/Math.max(n,r)),a=Math.max(1,Math.round(n*i)),s=Math.max(1,Math.round(r*i)),c=nt(e,a,s,"box",o);rt(c,t.adjust);let l=new Uint8ClampedArray(c.length);for(let u=0;u<c.length;u++)l[u]=Math.round(c[u]*255);return je({data:l,width:a,height:s},t.palette.count,{alphaThreshold:Math.max(.01,t.alpha.threshold)})}function Ft(e,t){let{width:n,height:r,settings:o}=e,i=nt(t,n,r,o.size.resample,e.crop);rt(i,o.adjust),On(i,o.alpha.threshold);let a=e.kind==="diffusion"?Xn(i,n,r,e):Bn(i,n,r,e);return o.cleanup.orphans&&Gn(a,n,r),o.cleanup.smooth&&zn(a,n,r),Hn(a,n,r,e.outline),a}var fo="2.0.0",Ge=4,Wn="glcanvas",H=class extends Error{constructor(e,t){super(e),this.name="ShaderMateError",t&&Object.assign(this,t)}},Vn=new Set;function xe(e,...t){Vn.has(e)||(Vn.add(e),console.warn("[ShaderMate]",...t))}var Xt=typeof window<"u"&&typeof document<"u",uo=e=>Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView),Yn=e=>e==null?[]:Array.isArray(e)?e:[e],$n=e=>e>0&&(e&e-1)===0;function lo(e){var t,n,r,o;if(e==null)return null;if(Array.isArray(e))return[(t=e[0])!=null?t:0,(n=e[1])!=null?n:0,(r=e[2])!=null?r:0,(o=e[3])!=null?o:1];if(typeof e=="string"&&Xt){let i=document.createElement("canvas");i.width=i.height=1;let a=i.getContext("2d");a.fillStyle=e,a.fillRect(0,0,1,1);let s=a.getImageData(0,0,1,1).data;return[s[0]/255,s[1]/255,s[2]/255,s[3]/255]}return null}function mo(){if(!Xt)return!1;let e=location.hostname;return location.protocol==="file:"||e==="localhost"||e==="127.0.0.1"||e===""||e.endsWith(".local")}var ho=class{constructor(e){this.gl=e,this._items=new Map,this._nextId=1}add(e,t){let n=this._nextId++;return this._items.set(n,{obj:e,count:1,type:t}),n}ref(e){let t=this._items.get(e);return t&&t.count++,e}get(e){let t=this._items.get(e);return t?t.obj:null}unref(e){let t=this._items.get(e);t&&(t.count--,t.count<=0&&this._destroy(e,t))}_destroy(e,t){let{obj:n,type:r}=t,o=this.gl;switch(r){case"texture2D":case"textureCube":o.deleteTexture(n);break;case"fbo":o.deleteFramebuffer(n);break;case"buffer":o.deleteBuffer(n);break;case"program":o.deleteProgram(n);break}this._items.delete(e)}dispose(){for(let[e,t]of[...this._items])this._destroy(e,t)}};function po(e){let t=new Map;function n(s,c){return t.has(s)||t.set(s,new Set),t.get(s).add(c),()=>r(s,c)}function r(s,c){let l=t.get(s);l&&l.delete(c)}function o(s,c){let l=u=>{r(s,l),c(u)};return n(s,l)}function i(s,c){let l=t.get(s);if(l)for(let u of[...l])try{u(c)}catch(d){console.error(`[ShaderMate] error in "${s}" listener`,d)}e&&e(s,c)}function a(){t.clear()}return{on:n,off:r,once:o,emit:i,clear:a}}var Kn={linear:e=>e,inQuad:e=>e*e,outQuad:e=>e*(2-e),inOutQuad:e=>e<.5?2*e*e:-1+(4-2*e)*e,inCubic:e=>e*e*e,outCubic:e=>1-Math.pow(1-e,3),inOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,outExpo:e=>e===1?1:1-Math.pow(2,-10*e),outBack:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),outElastic:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e*10-.75)*(2*Math.PI)/3)+1};function bo(){let e=new Map;function t(o,i,a,s,c={}){let{duration:l=500,delay:u=0}=c,d=typeof c.ease=="function"?c.ease:Kn[c.ease]||Kn.outCubic,f=e.get(o);f&&f.resolve(!1);let m=i(),b=Array.isArray(s)||ArrayBuffer.isView(s),g=b?Array.from(m??s):Number(m??0),x=b?Array.from(s):Number(s);return new Promise(y=>{let h={start:performance.now()+u,resolve:E=>{e.delete(o),y(E)},update(E){let p=l>0?wo((E-this.start)/l):1;if(p<0)return;let _=d(p);a(b?g.map((T,M)=>T+(x[M]-T)*_):g+(x-g)*_),p>=1&&this.resolve(!0)}};e.set(o,h)})}function n(o){for(let i of[...e.values()])i.update(o)}function r(o){if(o===void 0){for(let a of[...e.values()])a.resolve(!1);return}let i=e.get(o);i&&i.resolve(!1)}return{tween:t,update:n,cancel:r,get size(){return e.size}}}var wo=e=>e<0?e:e>1?1:e;function xo(e){let t;if(typeof e=="string")t=[{src:e}];else if(Array.isArray(e))t=e.map(o=>typeof o=="string"?{src:o}:{...o});else if(e&&typeof e=="object")t=[{...e}];else throw new H("ShaderMate: expected a shader (string), a pass object, or an array of passes");if(!t.length)throw new H("ShaderMate: no passes given");t.forEach((o,i)=>{var a,s,c,l,u;if(o.src==null&&(o.src=(l=(c=(s=(a=o.shader)!=null?a:o.frag)!=null?s:o.fragment)!=null?c:o.glsl)!=null?l:o.url),o.src==null)throw new H(`Pass ${(u=o.name)!=null?u:i} has no shader source (use "shader")`);o.name==null&&(o.name=t.length===1?"main":"pass"+i),o.uniforms==null&&(o.uniforms={})}),t.some(o=>o.screen)||(t[t.length-1].screen=!0),t.filter(o=>o.screen).length>1&&console.warn("[ShaderMate] Multiple screen:true passes; last drawn wins.");let n=t.map(o=>o.name),r=n.filter((o,i)=>n.indexOf(o)!==i);if(r.length)throw new H("Duplicate pass names: "+[...new Set(r)].join(", "));for(let o of t){let i=Array.isArray(o.channels)?o.channels:o.channels?[o.channels]:[];for(o.channels=i.slice(0,Ge).map(a=>cr(a,n,o.name));o.channels.length<Ge;)o.channels.push(null)}return t}var go=e=>typeof HTMLElement<"u"&&e instanceof HTMLElement,yo=e=>typeof ImageBitmap<"u"&&e instanceof ImageBitmap,Eo=e=>typeof WebGLTexture<"u"&&e instanceof WebGLTexture;function cr(e,t=[],n=""){if(e==null||e===!1)return null;if(typeof e=="string")return t.includes(e)?{pass:e}:{url:e};if(go(e)||yo(e))return{element:e};if(Eo(e))return{texture:e};let r={...e};return r.pass==null&&r.id!=null&&(r.pass=r.id),r.url==null&&r.image!=null&&(r.url=r.image),r.element==null&&r.canvas!=null&&(r.element=r.canvas),r.pass==null&&r.src!=null&&r.url==null&&r.video==null&&(r.url=r.src),r.pass!=null&&!t.includes(r.pass)&&console.warn(`[ShaderMate] Pass "${n}": channel references unknown pass "${r.pass}"`),r}function Ot(e){return/[\r\n]/.test(e)||/^\s*(void|#|precision|uniform|in |out |\/\/|\/\*)/.test(e)||/[{};]/.test(e)}var vo=e=>typeof WebGL2RenderingContext<"u"&&e instanceof WebGL2RenderingContext;function _o(e,t={}){let n=Object.assign({alpha:t.alpha!==!1,premultipliedAlpha:t.premultipliedAlpha!==!1,preserveDrawingBuffer:!!t.preserveDrawingBuffer,antialias:!!t.antialias,powerPreference:t.powerPreference||"default"},t.contextAttributes),r=t.webgl===void 0?"auto":String(t.webgl),o=null;if((r==="auto"||r==="2")&&(o=e.getContext("webgl2",n)),!o&&(r==="auto"||r==="1")&&(o=e.getContext("webgl",n)||e.getContext("experimental-webgl",n)),!o)throw new H("WebGL not supported");return o}function To(e,t){let n={};return t?(n.EXT_color_buffer_float=e.getExtension("EXT_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear")):(n.OES_texture_float=e.getExtension("OES_texture_float"),n.OES_texture_half_float=e.getExtension("OES_texture_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear"),n.OES_texture_half_float_linear=e.getExtension("OES_texture_half_float_linear"),n.OES_standard_derivatives=e.getExtension("OES_standard_derivatives"),n.WEBGL_color_buffer_float=e.getExtension("WEBGL_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.WEBGL_depth_texture=e.getExtension("WEBGL_depth_texture"),n.EXT_shader_texture_lod=e.getExtension("EXT_shader_texture_lod")),n}function So(e){let t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),e.STATIC_DRAW),{bind(n){e.bindBuffer(e.ARRAY_BUFFER,t);let r=e.getAttribLocation(n,"a_position");r!==-1&&(e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,0,0))},draw(){e.drawArrays(e.TRIANGLES,0,6)},dispose(){e.deleteBuffer(t)}}}function Ao(e,t){var n;let r=t.split(`
|
|
11
11
|
`),o=r.findIndex(a=>/^\s*#line\s+1\b/.test(a))+1,i=[];for(let a of e.split(`
|
|
12
12
|
`)){let s=/ERROR:\s*\d+:(\d+):\s*(.*)/.exec(a);if(!s)continue;let c=parseInt(s[1],10),l=o>0?o+c-1:c-1;i.push({line:c,message:s[2].trim(),source:(n=r[l])!=null?n:"",physical:l})}return i}function qn(e,t,n,{label:r="",showExpandedOnError:o=!0}={}){let i=e.createShader(t);if(e.shaderSource(i,n),e.compileShader(i),e.getShaderParameter(i,e.COMPILE_STATUS))return{shader:i};let a=e.getShaderInfoLog(i)||"";e.deleteShader(i);let s=Ao(a,n),c=t===e.VERTEX_SHADER?"Vertex":"Fragment",l=s.length?s.map(d=>`line ${d.line}: ${d.message}`).join(`
|
|
13
13
|
`):a.trim(),u=new H(`${c} shader compile error${r?` in pass "${r}"`:""}:
|
|
@@ -17,14 +17,14 @@ ${l}`,{pass:r,stage:c,log:a,errors:s,source:n});if(o){let d=new Set(s.map(m=>m.p
|
|
|
17
17
|
`+f})}else console.error("[ShaderMate] "+u.message);return{error:u}}function fr(e,t,n,r){let o=qn(e,e.VERTEX_SHADER,t,r);if(o.error)return o;let i=qn(e,e.FRAGMENT_SHADER,n,r);if(i.error)return e.deleteShader(o.shader),i;let a=e.createProgram();if(e.attachShader(a,o.shader),e.attachShader(a,i.shader),e.linkProgram(a),e.deleteShader(o.shader),e.deleteShader(i.shader),!e.getProgramParameter(a,e.LINK_STATUS)){let s=e.getProgramInfoLog(a)||"";e.deleteProgram(a);let c=new H(`Program link error${r&&r.label?` in pass "${r.label}"`:""}: ${s}`,{pass:r&&r.label,log:s});return console.error("[ShaderMate] "+c.message),{error:c}}return{program:a}}function Jn(e,t){let n=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),r={};for(let o=0;o<n;o++){let i=e.getActiveUniform(t,o);i&&(r[i.name.replace(/\[0\]$/,"")]={loc:e.getUniformLocation(t,i.name),type:i.type,size:i.size})}return r}var ur=`#version 300 es
|
|
18
18
|
layout(location=0) in vec2 a_position;
|
|
19
19
|
void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,lr=`attribute vec2 a_position;
|
|
20
|
-
void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,
|
|
20
|
+
void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,Ro=`#define texture2D(s,u) texture(s,u)
|
|
21
21
|
#define textureCube(s,u) texture(s,u)
|
|
22
22
|
#define TEX(s,u) texture(s,u)
|
|
23
23
|
#define TEX_LOD(s,u,l) textureLod(s,u,l)
|
|
24
|
-
`,
|
|
24
|
+
`,Mo=`#define texture(s,u) texture2D(s,u)
|
|
25
25
|
#define TEX(s,u) texture2D(s,u)
|
|
26
26
|
#define TEX_LOD(s,u,l) texture2D(s,u)
|
|
27
|
-
`,
|
|
27
|
+
`,Uo=`
|
|
28
28
|
#line 100000
|
|
29
29
|
void main(){
|
|
30
30
|
vec4 c = vec4(0.0);
|
|
@@ -36,12 +36,12 @@ void main(){
|
|
|
36
36
|
vec4 c = vec4(0.0);
|
|
37
37
|
mainImage(c, gl_FragCoord.xy);
|
|
38
38
|
gl_FragColor = c;
|
|
39
|
-
}`,
|
|
39
|
+
}`,ko=`#version 300 es
|
|
40
40
|
precision highp float;
|
|
41
41
|
uniform sampler2D u_tex; uniform vec2 u_size; out vec4 o;
|
|
42
42
|
void main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`,Po=`precision highp float;
|
|
43
43
|
uniform sampler2D u_tex; uniform vec2 u_size;
|
|
44
|
-
void main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;function Lo(e,t,n){let r=fr(e,t?ur:lr,t?
|
|
44
|
+
void main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;function Lo(e,t,n){let r=fr(e,t?ur:lr,t?ko:Po,{label:"blit"});if(r.error)throw r.error;let o=r.program,i=e.getUniformLocation(o,"u_tex"),a=e.getUniformLocation(o,"u_size");return{draw(s,c,l){e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,c,l),e.useProgram(o),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,s),e.uniform1i(i,0),e.uniform2f(a,c,l),n.bind(o),n.draw()},dispose(){e.deleteProgram(o)}}}function jt(e,t){return t==="repeat"?e.REPEAT:t==="mirror"||t==="mirrored"?e.MIRRORED_REPEAT:e.CLAMP_TO_EDGE}function Gt(e,t){return t==="nearest"?e.NEAREST:e.LINEAR}function Io(e,t,n,r){let o=t?e.RGBA8:e.RGBA,i=e.RGBA,a=e.UNSIGNED_BYTE;return r.float==="full"||r.float===32?t?(o=e.RGBA32F,a=e.FLOAT):n.OES_texture_float&&(a=e.FLOAT):r.float&&(t?(o=e.RGBA16F,a=e.HALF_FLOAT):n.OES_texture_half_float?a=n.OES_texture_half_float.HALF_FLOAT_OES:n.OES_texture_float&&(a=e.FLOAT)),{ifmt:o,fmt:i,type:a}}function Fo(e,t,n,r){let o=e.createTexture();e.bindTexture(e.TEXTURE_2D,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,t,4,4,0,n,r,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,o,0);let a=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteFramebuffer(i),e.deleteTexture(o),a}function Zn(e,t,n,r,o,i,a){let s=Io(e,i,a,o),c=s;Fo(e,s.ifmt,s.fmt,s.type)||(xe("fmt-fallback","Requested float format not renderable on this device; falling back to 8-bit."),c={ifmt:i?e.RGBA8:e.RGBA,fmt:e.RGBA,type:e.UNSIGNED_BYTE});let l=o.filter;c.type!==e.UNSIGNED_BYTE&&l!=="nearest"&&((i?c.type===e.HALF_FLOAT||a.OES_texture_float_linear:c.type===e.FLOAT?a.OES_texture_float_linear:a.OES_texture_half_float_linear)||(l="nearest"));let u=e.createTexture();e.bindTexture(e.TEXTURE_2D,u);let d=jt(e,o.wrap),f=Gt(e,l);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,d),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,d),e.texImage2D(e.TEXTURE_2D,0,c.ifmt,n,r,0,c.fmt,c.type,null);let m=null;o.depth&&(!i&&!a.WEBGL_depth_texture?xe("depth-tex","depth: true needs WebGL2 or WEBGL_depth_texture; ignoring."):(m=e.createTexture(),e.bindTexture(e.TEXTURE_2D,m),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,i?e.DEPTH_COMPONENT16:e.DEPTH_COMPONENT,n,r,0,e.DEPTH_COMPONENT,e.UNSIGNED_SHORT,null)));let b=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,b),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,u,0),m&&e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,m,0);let g=e.checkFramebufferStatus(e.FRAMEBUFFER);return g!==e.FRAMEBUFFER_COMPLETE&&console.warn("[ShaderMate] Framebuffer incomplete:",g),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(u,"texture2D"),depthId:m?t.add(m,"texture2D"):null,fboId:t.add(b,"fbo"),width:n,height:r,fmt:c}}function ot(e,t){t&&(e.unref(t.texId),t.depthId&&e.unref(t.depthId),e.unref(t.fboId))}function Oo(e,t,n){let r=o=>Math.max(1,Math.round(o));return e==null||e==="screen"||e==="canvas"?[t,n]:e==="half"?[r(t/2),r(n/2)]:e==="quarter"?[r(t/4),r(n/4)]:typeof e=="number"?[r(t*e),r(n*e)]:Array.isArray(e)?[r(e[0]),r(e[1])]:typeof e=="object"&&e.width&&e.height?[r(e.width),r(e.height)]:[t,n]}var Do={iResolution:"vec3",iTime:"float",iTimeDelta:"float",iFrame:"int",iFrameRate:"float",iMouse:"vec4",iDate:"vec4",iScroll:"vec2",iSampleRate:"float",iChannelTime:"float[4]",iChannelResolution:"vec3[4]",u_resolution:"vec2",u_time:"float",u_delta:"float",u_frame:"int",u_fps:"float",u_mouse:"vec2",u_mouseUV:"vec2",u_mouseDown:"float",u_date:"vec4",u_scroll:"vec2",u_pixelRatio:"float",u_aspect:"float",u_time_delta:"float",u_refresh_rate:"float",u_drag:"vec2",u_wheel:"float"},zt=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,""),No=`#define iGlobalTime iTime
|
|
45
45
|
`;function Bo(e,t){let n=zt(e);return!/\bfragColor\b/.test(n)||!/\bvoid\s+main\s*\(/.test(n)||/\bout\s+vec4\s+fragColor\b/.test(n)||/#define\s+fragColor\b/.test(n)?"":t?`out vec4 fragColor;
|
|
46
46
|
`:`#define fragColor gl_FragColor
|
|
47
47
|
`}var Xo={u_camera_pos:"vec3",u_camera_dir:"vec3",u_camera_view:"mat4",u_recursion:"int",u_max_recursion:"int",u_color_gamut:"int"},jo=["u_audio","u_keyboard","u_webcam","u_main"];function Go(e){let t=zt(e);return/\bfragColor\b/.test(t)&&/\bvoid\s+main\s*\(/.test(t)&&!/\bmainImage\s*\(/.test(t)}function zo(e,t=[],n={}){let r=zt(e),o="",i=c=>new RegExp("uniform\\s+(?:\\w+\\s+)*"+c+"\\b").test(r),a=c=>new RegExp("\\b"+c+"\\b").test(r),s=Object.assign({},Do,n.fragcoord?Xo:null);n.mouseVec4&&(s.u_mouse="vec4"),n.scrollFloat&&(s.u_scroll="float");for(let c in s){if(!a(c)||i(c))continue;let l=s[c],u=/^(\w+)\[(\d+)\]$/.exec(l);o+=u?`uniform ${u[1]} ${c}[${u[2]}];
|
|
@@ -67,16 +67,16 @@ ${b}
|
|
|
67
67
|
`),o.builtins&&!t&&r&&(u+=`#extension GL_OES_standard_derivatives : enable
|
|
68
68
|
`),o.header&&(u+=`precision highp float;
|
|
69
69
|
precision highp int;
|
|
70
|
-
`),o.builtins){u+=t?Mo
|
|
70
|
+
`),o.builtins){u+=t?Ro:Mo,u+=No;let b=Bo(c,t),g=/\bout\s+(?:\w+\s+)*vec4\s+\w+\s*;/.test(Qn(c));b?u+=b:t&&!g&&(u+=`out vec4 outColor;
|
|
71
71
|
`)}o.uniforms&&(u+=zo(c,i,a)),o.defines&&(u+=Wo(n));let d=Qn(c),f=o.mainWrap&&/\bmainImage\s*\(/.test(d)&&!/\bvoid\s+main\s*\(/.test(d),m=u+`#line 1
|
|
72
|
-
`+c;return f&&(m+=t?
|
|
72
|
+
`+c;return f&&(m+=t?Uo:Co),m}function at(e,t,n,r,o,i={},a={},{dynamic:s=!1,flipDefault:c=!1}={}){let l=e.createTexture();e.bindTexture(e.TEXTURE_2D,l);let u=i.flipY===void 0?c:!!i.flipY,d=!a.isGL2&&!($n(r)&&$n(o));d&&i.wrap&&i.wrap!=="clamp"&&xe("npot-wrap","Non-power-of-two texture in WebGL1: forcing wrap to clamp.");let f=d?e.CLAMP_TO_EDGE:jt(e,i.wrap),m=!!i.mipmap&&!s&&!d,b=Gt(e,i.filter),g=m?i.filter==="nearest"?e.NEAREST_MIPMAP_NEAREST:e.LINEAR_MIPMAP_LINEAR:b;e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,g),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,b),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,f);let x=()=>{e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,u),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!!i.premultiplyAlpha),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1)};return x(),m&&e.generateMipmap(e.TEXTURE_2D),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(l,"texture2D"),width:r,height:o,source:n,update:s?()=>{n.readyState!==void 0&&n.readyState<2||(e.bindTexture(e.TEXTURE_2D,l),x(),e.bindTexture(e.TEXTURE_2D,null))}:()=>{}}}function $o(e,t,n,r={},o={}){return new Promise((i,a)=>{let s=new Image;s.crossOrigin=r.crossOrigin===void 0?"anonymous":r.crossOrigin,s.onload=()=>i(at(e,t,s,s.naturalWidth,s.naturalHeight,r,o)),s.onerror=()=>a(new Error(`Failed to load image "${n}"`)),s.src=n})}var Ko=["+X","-X","+Y","-Y","+Z","-Z"];function qo(e,t,n,r={}){return new Promise((o,i)=>{if(!Array.isArray(n)||n.length!==6)return i(new Error("cubemap needs an array of 6 URLs"));let a=e.createTexture();e.bindTexture(e.TEXTURE_CUBE_MAP,a);let s=jt(e,r.wrap),c=Gt(e,r.filter);e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MIN_FILTER,c),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MAG_FILTER,c),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_S,s),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_T,s);let l=[e.TEXTURE_CUBE_MAP_POSITIVE_X,e.TEXTURE_CUBE_MAP_NEGATIVE_X,e.TEXTURE_CUBE_MAP_POSITIVE_Y,e.TEXTURE_CUBE_MAP_NEGATIVE_Y,e.TEXTURE_CUBE_MAP_POSITIVE_Z,e.TEXTURE_CUBE_MAP_NEGATIVE_Z],u=0,d=0,f=0,m=!1;n.forEach((b,g)=>{let x=new Image;x.crossOrigin="anonymous",x.onload=()=>{m||(d||(d=x.width,f=x.height),e.bindTexture(e.TEXTURE_CUBE_MAP,a),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.texImage2D(l[g],0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,x),++u===6&&(r.mipmap&&e.generateMipmap(e.TEXTURE_CUBE_MAP),e.bindTexture(e.TEXTURE_CUBE_MAP,null),o({texId:t.add(a,"textureCube"),width:d,height:f,cubemap:!0,update(){}})))},x.onerror=()=>{m||(m=!0,e.deleteTexture(a),i(new Error(`Failed to load cubemap face ${Ko[g]}: "${b}"`)))},x.src=b})})}function Jo(e){let t=e.play&&e.play();t&&t.catch&&t.catch(()=>{let n=()=>{e.play().catch(()=>{})};window.addEventListener("pointerdown",n,{once:!0}),window.addEventListener("keydown",n,{once:!0})})}function Zo(e,t,n,r={},o={}){return new Promise((i,a)=>{let s=document.createElement("video");Object.assign(s,{src:n,crossOrigin:"anonymous",loop:r.loop!==!1,muted:r.muted!==!1,playsInline:!0,autoplay:!0}),s.addEventListener("error",()=>a(new Error(`Failed to load video "${n}"`)),{once:!0}),s.addEventListener("canplay",()=>{Jo(s);let c=at(e,t,s,s.videoWidth,s.videoHeight,{...r,flipY:r.flipY===void 0?!0:r.flipY},o,{dynamic:!0});c.getTime=()=>s.currentTime,c.media=s,c.dispose=()=>{s.pause(),s.removeAttribute("src"),s.load()},i(c)},{once:!0}),s.load()})}function Qo(e,t,n={},r={}){let o=typeof n.camera=="object"?n.camera:{facingMode:"user"};return navigator.mediaDevices.getUserMedia({video:o,audio:!1}).then(i=>new Promise(a=>{let s=document.createElement("video");Object.assign(s,{srcObject:i,muted:!0,playsInline:!0,autoplay:!0}),s.addEventListener("loadedmetadata",()=>{s.play().catch(()=>{});let c=at(e,t,s,s.videoWidth,s.videoHeight,{...n,flipY:n.flipY===void 0?!0:n.flipY},r,{dynamic:!0});c.media=s,c.dispose=()=>{s.pause(),i.getTracks().forEach(l=>l.stop())},a(c)},{once:!0})}))}function er(e,t,n,{mic:r=!1}={}){let o=n.layout==="spectrogram",i=n.fftSize||(o?1024:512),a=window.AudioContext||window.webkitAudioContext;return new Promise((s,c)=>{var l;let u=new a,d=u.createAnalyser();d.fftSize=i,d.smoothingTimeConstant=(l=n.smoothing)!=null?l:.8;let f=d.frequencyBinCount,m=new Uint8Array(i),b=o?f:2,g=o?3:1,x=new Uint8Array(f*b*g),y=o?new Uint8Array(f):null,h=null;o&&(h=u.createAnalyser(),h.fftSize=i,h.smoothingTimeConstant=0);let E=e.createTexture(),p=o?e.RGB:e.LUMINANCE,_=()=>{e.bindTexture(e.TEXTURE_2D,E),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,p,f,b,0,p,e.UNSIGNED_BYTE,x),e.bindTexture(e.TEXTURE_2D,null)};e.bindTexture(e.TEXTURE_2D,E),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),_();let T=()=>u.currentTime,M=()=>{},S=()=>{let Z=()=>{u.state==="suspended"&&u.resume()};Z(),window.addEventListener("pointerdown",Z,{once:!0}),window.addEventListener("keydown",Z,{once:!0}),s({texId:t.add(E,"texture2D"),width:f,height:b,analyser:d,context:u,getTime:T,update(){if(o){let ne=f*3;x.copyWithin(ne,0,x.length-ne),d.getByteFrequencyData(y),d.getByteTimeDomainData(m);for(let Y=0;Y<f;Y++)x[Y*3]=y[Y],x[Y*3+1]=m[Y*2];h.getByteFrequencyData(y);for(let Y=0;Y<f;Y++)x[Y*3+2]=y[Y]}else d.getByteFrequencyData(x.subarray(0,f)),d.getByteTimeDomainData(m),x.set(m.subarray(0,f),f);_()},dispose(){M(),u.close&&u.close()}})};if(r){navigator.mediaDevices.getUserMedia({audio:!0,video:!1}).then(Z=>{let ne=u.createMediaStreamSource(Z);ne.connect(d),h&&ne.connect(h),M=()=>Z.getTracks().forEach(Y=>Y.stop()),S()}).catch(c);return}let O=n.audio||n.audioFFT,L=O instanceof HTMLMediaElement?O:new Audio,X=L!==O;X&&Object.assign(L,{src:O,crossOrigin:"anonymous",loop:n.loop!==!1,autoplay:!0}),T=()=>L.currentTime;let D=()=>{let Z=u.createMediaElementSource(L);if(Z.connect(d),h&&Z.connect(h),d.connect(u.destination),X){let ne=()=>{u.state==="suspended"&&u.resume(),L.play().catch(()=>{})};ne(),window.addEventListener("pointerdown",ne,{once:!0}),window.addEventListener("keydown",ne,{once:!0}),M=()=>{L.pause(),L.removeAttribute("src"),L.load()}}S()};L.readyState>=3?D():(L.addEventListener("canplay",D,{once:!0}),L.addEventListener("error",()=>c(new Error(`Failed to load audio "${O}"`)),{once:!0}),X&&L.load())})}var ei=e=>typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement,tr=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement;function ti(e,t,n,r={},o={}){let i=n.videoWidth||n.naturalWidth||n.width||1,a=n.videoHeight||n.naturalHeight||n.height||1,s=ei(n)||tr(n),c=r.dynamic===void 0?s:!!r.dynamic,l=at(e,t,n,i,a,r,o,{dynamic:c,flipDefault:s});if(tr(n)&&(l.getTime=()=>n.currentTime),c){let u=l.update;l.update=()=>{l.width=n.videoWidth||n.naturalWidth||n.width||1,l.height=n.videoHeight||n.naturalHeight||n.height||1,u()}}return Promise.resolve(l)}function ni(e,t,n){let r=t.add(n.texture,n.cube?"textureCube":"texture2D");return t.ref(r),Promise.resolve({texId:r,width:n.width||1,height:n.height||1,cubemap:!!n.cube,update(){}})}function ri(e,t,n={}){let i=new Uint8Array(768),a=new Uint8Array(256),s=new Uint8Array(256),c=new Uint8Array(256),l=n.keyboard&&typeof n.keyboard=="object"&&n.keyboard.target||window,u=x=>{if(typeof x.keyCode=="number"&&x.keyCode)return x.keyCode&255;let y=x.key||"";return y.length===1?y.toUpperCase().charCodeAt(0)&255:0},d=x=>{let y=u(x);a[y]||(s[y]=255,c[y]=c[y]?0:255),a[y]=255},f=x=>{a[u(x)]=0},m=()=>a.fill(0);l.addEventListener("keydown",d),l.addEventListener("keyup",f),window.addEventListener("blur",m);let b=e.createTexture();e.bindTexture(e.TEXTURE_2D,b),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);let g=()=>{e.bindTexture(e.TEXTURE_2D,b),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,256,3,0,e.LUMINANCE,e.UNSIGNED_BYTE,i),e.bindTexture(e.TEXTURE_2D,null)};return g(),Promise.resolve({texId:t.add(b,"texture2D"),width:256,height:3,keyboard:!0,update(){i.set(a,0),i.set(s,256),i.set(c,256*2),g(),s.fill(0)},dispose(){l.removeEventListener("keydown",d),l.removeEventListener("keyup",f),window.removeEventListener("blur",m)}})}function Dt(e,t,n,r){return n.texture?ni(e,t,n):n.element?ti(e,t,n.element,n,r):n.url?$o(e,t,n.url,n,r):n.video?Zo(e,t,n.video,n,r):n.camera?Qo(e,t,n,r):n.mic?er(e,t,n,{mic:!0}):n.keyboard?ri(e,t,n):n.audio||n.audioFFT?er(e,t,n):n.cubemap?qo(e,t,n.cubemap,n):Promise.reject(new Error("Unrecognised channel: "+JSON.stringify(n)))}function oi(e){return e?e.cubemap||e.texture&&e.cube?"cube":"2D":null}var mr=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"");function ii(e){let t=/^[ \t]*\/\/[ \t]*(?:=+[ \t]*)?(?:Pass[ \t]*:?[ \t]*([^\n=—–-]+?)|(Main)|(Common))[ \t]*(?:[—–-]+[^\n]*)?(?:=+)?[ \t]*$/gim,n=[],r;for(;r=t.exec(e);)n.push({index:r.index,end:r.index+r[0].length,raw:r[0],pass:r[1],main:!!r[2],common:!!r[3]});if(!n.length)return null;let o={common:e.slice(0,n[0].index).trim(),passes:[]};return n.forEach((i,a)=>{let s=e.slice(i.end,a+1<n.length?n[a+1].index:e.length).trim();if(i.common){o.common=(o.common?o.common+`
|
|
73
73
|
`:"")+s;return}let c=i.main?"main":String(i.pass).trim(),l=/buffer\s*type\s*:\s*(\w+)/i.exec(i.raw),u=/^(\d+)$/.exec(c);o.passes.push({name:i.main?"main":u?"pass"+u[1]:c.replace(/[^\w]+/g,"_").replace(/^_+|_+$/g,"").toLowerCase(),label:c,main:i.main,src:s,bufferType:l?l[1].toLowerCase():"2d"})}),o.common&&/[{};]/.test(mr(o.common)),o}function ai(e){let t={},n=/\[([^\]]*)\]/.exec(e||"");if(!n)return t;for(let r of n[1].toLowerCase().split(/[\s,]+/))r==="nearest"||r==="linear"?t.filter=r:r==="clamp"||r==="repeat"||r==="mirror"?t.wrap=r:r==="mipmap"?t.mipmap=!0:(r==="flipy"||r==="flip")&&(t.flipY=!0);return t}function nr(e){let t={},n={},r=e.split(`
|
|
74
|
-
`),o=/^\s*uniform\s+(?:(?:lowp|mediump|highp)\s+)?(\w+)\s+(\w+)(?:\s*\[\s*\d+\s*\])?\s*(?:=\s*([^;]+))?;\s*(?:\/\/(.*))?$/;return{source:r.map(a=>{var s,c,l;let u=o.exec(a);if(!u)return a;let[,d,f,m,b=""]=u,g=b.trim();if(/^sampler/.test(d)){let y=si(f,g,d);y&&(n[f]=y)}else{let y={},h=S=>(S.match(/-?\d*\.?\d+(?:e-?\d+)?/g)||[]).map(Number),E=/\[([^\]]*)\]/.exec(g),p=h(g.replace(/\[[^\]]*\]/,"")),_=/vec(\d)/.test(d)?+d.match(/vec(\d)/)[1]:1,T=/^bool/.test(d),
|
|
75
|
-
`),uniforms:t,samplers:n}}function si(e,t,n){let r=ai(t),o=t.replace(/\[[^\]]*\]/g,"").trim(),i=/^ref:\s*(.+)$/i.exec(o);if(i){let a=i[1].trim(),s;return(s=/^pass\s*(\d+)(?::out(\d+))?$/i.exec(a))?{pass:"pass"+s[1],...r}:(s=/^pass:\s*(\S+)/i.exec(a))?{pass:s[1],...r}:/^main$/i.test(a)?{pass:"main",...r}:(s=/^sampler\s+(\w+)/i.exec(a))?{sameAs:s[1],...r}:null}if(e==="u_audio"||/audio/i.test(e)&&/^(mic|\[CAM\]|\[VIDEO\])?$/i.test(o))return/^https?:|^data:/i.test(o)?{audio:o,layout:"spectrogram"}:{mic:!0,layout:"spectrogram"};if(e==="u_webcam")return{camera:!0,...r};if(e==="u_keyboard")return{keyboard:!0};if(/^(https?:|data:)/i.test(o)){let a=o.split(/\s+/)[0];return/\.(mp4|webm|mov|ogv|m4v)(\?|$)/i.test(a)?{video:a,...r}:/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(a)?{audio:a,layout:"spectrogram"}:n==="samplerCube"?null:{url:a,...r}}return null}function ci(e){return/\bu_mouse\s*\.\s*[xyzw]*[zw]/.test(mr(e))}var fi=35678,ui=35680,li=e=>e.filter(t=>!t.cfg.screen);function di(e,t,n={}){let r=[],o=li(t),i=t.find(c=>c.cfg.screen),a=new Map(t.map(c=>[c.name,c])),s=Object.assign({},e.cfg.annotatedSamplers,e.cfg.samplers);for(let c in e.uniformInfo){let l=e.uniformInfo[c];if(l.type!==fi&&l.type!==ui||/^iChannel\d$/.test(c))continue;let u=n[c]||s[c]||null,d;if(u&&u.sameAs&&(u=s[u.sameAs]||n[u.sameAs]||null),u||(c==="u_passes"&&l.size>1?u={array:o.slice(0,l.size)}:c==="u_main"?u=i?{pass:i.name}:null:(d=/^u_pass(\d+)$/.exec(c))&&o[+d[1]-1]?u={pass:o[+d[1]-1].name}:c.startsWith("u_")&&a.has(c.slice(2))?u={pass:c.slice(2)}:c==="u_audio"?u={mic:!0,layout:"spectrogram"}:c==="u_keyboard"?u={keyboard:!0}:c==="u_webcam"&&(u={camera:!0})),u&&u.pass!=null&&!a.has(u.pass)){let f=/^pass(\d+)$/.exec(u.pass);f&&o[+f[1]-1]?u={...u,pass:o[+f[1]-1].name}:u.pass==="main"&&i&&(u={...u,pass:i.name})}u&&r.push({name:c,info:l,spec:u})}return r}function mi(e){let t=e.find(n=>n.cfg.screen);return t?e.some(n=>(n.samplers||[]).some(r=>r.spec.pass===t.name)||n.cfg.channels.some(r=>r&&r.pass===t.name)):!1}function hi(e,{target:t=window,speed:n=1.5,sensitivity:r=.004}={}){let o=[0,0,0],i=-Math.PI/2,a=0,s=new Set,c=!1,l=0,u=0,d=[0,0,-1],f=new Float32Array(16),m=(T,R)=>{let S=T.key.length===1?T.key.toLowerCase():T.key;R?s.add(S):s.delete(S)},b=T=>m(T,!0),g=T=>m(T,!1),x=T=>{T.button===0&&(c=!0,l=T.clientX,u=T.clientY)},y=T=>{c&&(i+=(T.clientX-l)*r,a-=(T.clientY-u)*r,a=Math.max(-1.55,Math.min(1.55,a)),l=T.clientX,u=T.clientY)},h=()=>{c=!1},E=T=>{let R=d,S=-T.deltaY*.002*n;o[0]+=R[0]*S,o[1]+=R[1]*S,o[2]+=R[2]*S},p=()=>s.clear();t.addEventListener("keydown",b),t.addEventListener("keyup",g),e.addEventListener("pointerdown",x),window.addEventListener("pointermove",y),window.addEventListener("pointerup",h),e.addEventListener("wheel",E,{passive:!0}),window.addEventListener("blur",p);function _(){let T=d,R=[0,1,0],S=[T[1]*R[2]-T[2]*R[1],T[2]*R[0]-T[0]*R[2],T[0]*R[1]-T[1]*R[0]],O=Math.hypot(S[0],S[1],S[2])||1;S=S.map(X=>X/O);let L=[S[1]*T[2]-S[2]*T[1],S[2]*T[0]-S[0]*T[2],S[0]*T[1]-S[1]*T[0]];return f.set([S[0],L[0],-T[0],0,S[1],L[1],-T[1],0,S[2],L[2],-T[2],0,-(S[0]*o[0]+S[1]*o[1]+S[2]*o[2]),-(L[0]*o[0]+L[1]*o[1]+L[2]*o[2]),T[0]*o[0]+T[1]*o[1]+T[2]*o[2],1]),{right:S,up:L}}return{pos:o,dir:d,view:f,update(T){d[0]=Math.cos(a)*Math.cos(i),d[1]=Math.sin(a),d[2]=Math.cos(a)*Math.sin(i);let{right:R}=_(),S=n*T*(s.has("Shift")?3:1),O=(L,X)=>{o[0]+=L[0]*X,o[1]+=L[1]*X,o[2]+=L[2]*X};(s.has("w")||s.has("ArrowUp"))&&O(d,S),(s.has("s")||s.has("ArrowDown"))&&O(d,-S),(s.has("d")||s.has("ArrowRight"))&&O(R,S),(s.has("a")||s.has("ArrowLeft"))&&O(R,-S),(s.has("e")||s.has(" "))&&(o[1]+=S),(s.has("q")||s.has("c"))&&(o[1]-=S),_()},dispose(){t.removeEventListener("keydown",b),t.removeEventListener("keyup",g),e.removeEventListener("pointerdown",x),window.removeEventListener("pointermove",y),window.removeEventListener("pointerup",h),e.removeEventListener("wheel",E),window.removeEventListener("blur",p)}}}var hr=Object.create(null),q=(e,...t)=>t.forEach(n=>{hr[n.toLowerCase()]=e});q({kind:"f",n:1},"float","number","f","1f","1fv","float[]","uniform1f","uniform1fv");q({kind:"f",n:2},"vec2","2f","2fv","vec2[]","uniform2f","uniform2fv");q({kind:"f",n:3},"vec3","3f","3fv","vec3[]","uniform3f","uniform3fv");q({kind:"f",n:4},"vec4","4f","4fv","vec4[]","uniform4f","uniform4fv");q({kind:"i",n:1},"int","bool","boolean","i","1i","1iv","int[]","bool[]","uniform1i","uniform1iv");q({kind:"i",n:2},"ivec2","bvec2","2i","2iv","ivec2[]","bvec2[]","uniform2i","uniform2iv");q({kind:"i",n:3},"ivec3","bvec3","3i","3iv","ivec3[]","bvec3[]","uniform3i","uniform3iv");q({kind:"i",n:4},"ivec4","bvec4","4i","4iv","ivec4[]","bvec4[]","uniform4i","uniform4iv");q({kind:"u",n:1},"uint","1ui","1uiv","uint[]");q({kind:"u",n:2},"uvec2","2ui","2uiv","uvec2[]");q({kind:"u",n:3},"uvec3","3ui","3uiv","uvec3[]");q({kind:"u",n:4},"uvec4","4ui","4uiv","uvec4[]");q({kind:"m",n:2},"mat2","matrix2fv","mat2fv","uniformmatrix2fv");q({kind:"m",n:3},"mat3","matrix3fv","mat3fv","uniformmatrix3fv");q({kind:"m",n:4},"mat4","matrix4fv","mat4fv","uniformmatrix4fv");function pi(e){return typeof e!="string"?null:hr[e.trim().toLowerCase()]||null}var bi={5126:{kind:"f",n:1},35664:{kind:"f",n:2},35665:{kind:"f",n:3},35666:{kind:"f",n:4},5124:{kind:"i",n:1},35667:{kind:"i",n:2},35668:{kind:"i",n:3},35669:{kind:"i",n:4},35670:{kind:"i",n:1},35671:{kind:"i",n:2},35672:{kind:"i",n:3},35673:{kind:"i",n:4},5125:{kind:"u",n:1},36294:{kind:"u",n:2},36295:{kind:"u",n:3},36296:{kind:"u",n:4},35674:{kind:"m",n:2},35675:{kind:"m",n:3},35676:{kind:"m",n:4}};function wi(e){return bi[e]}var xi=5126,rr=35666;function Ht(e){return e!=null&&typeof e=="object"&&!uo(e)&&"value"in e}var or=e=>typeof e=="boolean"?e?1:0:e;function Nt(e,t){return typeof e=="number"||typeof e=="boolean"?new Array(t).fill(or(e)):ArrayBuffer.isView(e)?e:Array.isArray(e)&&e.some(n=>typeof n=="boolean")?e.map(or):e}function gi(e,t,n,r,o){let i=n.n;switch(n.kind){case"f":return i===1&&typeof r=="number"?e.uniform1f(t,r):e["uniform"+i+"fv"](t,Nt(r,i));case"i":return i===1&&(typeof r=="number"||typeof r=="boolean")?e.uniform1i(t,+r):e["uniform"+i+"iv"](t,Nt(r,i));case"u":return i===1&&typeof r=="number"?e.uniform1ui(t,r):e["uniform"+i+"uiv"](t,Nt(r,i));case"m":return e["uniformMatrix"+i+"fv"](t,!!o,r)}}function ir(e,t,n,{strict:r=!1,warnMissing:o=!1,label:i=""}={}){if(n)for(let a in n){let s=n[a],c=Ht(s)?s:null,l=c?c.value:s;if(l==null)continue;let u=t[a];if(!u||!u.loc){if(r)throw new H("Unknown uniform: "+a);o&&xe("missing-uniform:"+i+":"+a,`Uniform "${a}" not found in ${i?`pass "${i}"`:"shader"} (misspelled, undeclared, or optimized out).`);continue}let d;if(c&&c.type!=null){if(d=pi(c.type),!d){if(r)throw new H("Unknown uniform type: "+c.type+" for "+a);xe("bad-type:"+a,"Unknown uniform type",c.type,a);continue}}else if(d=wi(u.type),!d)continue;gi(e,u.loc,d,l,c&&c.transpose)}}function yi(e,t,n={}){let r=n.target==="canvas"?e:n.target&&typeof n.target=="object"?n.target:window,o=+n.smooth||0,i={x:0,y:0,down:!1,over:!1,dragX:0,dragY:0,wheel:0},a={x:0,y:0,clickX:0,clickY:0,down:!1,over:!1,uvX:0,uvY:0,dragX:0,dragY:0,wheel:0,clicked:!1},s=!1,c=0,l=0,u=!1;function d(){let E=e.getBoundingClientRect(),p=t?t():"fill";if(!E.width||!E.height||p!=="contain"&&p!=="cover")return E;let _=e.width/e.height,T=E.width/E.height,R,S;return T>_==(p==="contain")?(S=E.height,R=S*_):(R=E.width,S=R/_),{left:E.left+(E.width-R)/2,top:E.top+(E.height-S)/2,width:R,height:S,bottom:0,right:0}}function f(E,p){let _=d();return!_.width||!_.height?[0,0]:[(E-_.left)*(e.width/_.width),(_.top+_.height-p)*(e.height/_.height)]}let m=(E,p)=>{let[_,T]=f(E,p);return[_/e.width,T/e.height]},b=E=>{let[p,_]=f(E.clientX,E.clientY);i.down&&(i.dragX+=p-c,i.dragY+=_-l),c=p,l=_,i.x=p,i.y=_,i.over=p>=0&&_>=0&&p<=e.width&&_<=e.height,u||(u=!0,a.x=p,a.y=_)},g=E=>{E.button!==void 0&&E.button!==0||(b(E),!(r===window&&!i.over)&&(i.down=!0,a.down=!0,s=!0,c=i.x,l=i.y,a.clickX=i.x,a.clickY=i.y,o||(a.x=i.x,a.y=i.y)))},x=()=>{i.down=!1,a.down=!1},y=()=>{i.over=!1},h=E=>{i.wheel+=-E.deltaY*.002};return n.touch!==!1&&r===e&&(e.style.touchAction="none"),r.addEventListener("pointermove",b,{passive:!0}),r.addEventListener("pointerdown",g,{passive:!0}),window.addEventListener("pointerup",x,{passive:!0}),window.addEventListener("pointercancel",x,{passive:!0}),r.addEventListener("pointerleave",y,{passive:!0}),r.addEventListener("wheel",h,{passive:!0}),{state:a,toShader:f,toUV:m,update(){if(o>0&&o<1){let E=1-Math.pow(1-o,1);a.x+=(i.x-a.x)*E,a.y+=(i.y-a.y)*E}else a.x=i.x,a.y=i.y;a.over=i.over,a.clicked=s,s=!1,a.dragX=i.dragX,a.dragY=i.dragY,a.wheel=i.wheel,a.uvX=e.width?a.x/e.width:0,a.uvY=e.height?a.y/e.height:0},dispose(){r.removeEventListener("pointermove",b),r.removeEventListener("pointerdown",g),window.removeEventListener("pointerup",x),window.removeEventListener("pointercancel",x),r.removeEventListener("pointerleave",y),r.removeEventListener("wheel",h)}}}function Ei(e){if(!e)return 0;if(typeof e=="number")return e;if(Array.isArray(e))return e[0]/e[1];if(typeof e=="string"){let t=e.split(/[:/x]/).map(Number);return t.length===2&&t[1]?t[0]/t[1]:Number(e)||0}return 0}function vi(e={},t=!0){var n,r,o,i,a,s;let c=(n=e.size)!=null?n:e.sizing,l={mode:t?"canvas":"window",width:0,height:0,aspect:Ei(e.aspect),fit:e.fit||"contain",pixelRatio:(o=(r=e.pixelRatio)!=null?r:e.dpr)!=null?o:"auto",maxPixelRatio:(i=e.maxPixelRatio)!=null?i:2,scale:(s=(a=e.scale)!=null?a:e.renderScale)!=null?s:1};return Array.isArray(c)?(l.mode="fixed",l.width=c[0],l.height=c[1]):typeof c=="string"?l.mode=c==="screen"||c==="fullscreen"?"window":c==="element"?"canvas":c:c&&typeof c=="object"&&(l.mode="fixed",l.width=c.width,l.height=c.height,c.fit&&(l.fit=c.fit)),l.mode==="fixed"&&(l.aspect=l.width/l.height),l}function _i(e,t={},n=!0){let r=vi(t,n),o=()=>r.pixelRatio==="auto"?Math.min(window.devicePixelRatio||1,r.maxPixelRatio):Number(r.pixelRatio)||1,i=!1;function a(){return r.mode==="window"?{w:window.innerWidth,h:window.innerHeight}:{w:e.clientWidth||window.innerWidth,h:e.clientHeight||window.innerHeight}}function s(){if(r.mode==="fixed")return{w:r.width,h:r.height};let l=a(),u=o()*r.scale,d=l.w,f=l.h;return r.aspect&&(d/f>r.aspect?d=f*r.aspect:f=d/r.aspect),{w:d*u,h:f*u}}function c(){i||(i=!0,r.mode==="window"&&(e.style.cssText+=";display:block;position:fixed;left:0;top:0;width:100%;height:100%;"),(r.mode==="fixed"||r.aspect)&&(e.style.objectFit=r.fit))}return{cfg:r,fit:()=>r.mode==="fixed"||r.aspect?r.fit:"fill",setFixed(l,u){r.mode="fixed",r.width=l,r.height=u,r.aspect=l/u,i=!1},update(){c();let l=s(),u=Math.max(1,Math.round(l.w)),d=Math.max(1,Math.round(l.h));return e.width===u&&e.height===d?!1:(e.width=u,e.height=d,!0)},observe(l){let u=!1,d=()=>{u||(u=!0,requestAnimationFrame(()=>{u=!1,l()}))};window.addEventListener("resize",d);let f=null;return r.mode==="canvas"&&typeof ResizeObserver<"u"&&(f=new ResizeObserver(d),f.observe(e)),()=>{window.removeEventListener("resize",d),f&&f.disconnect()}}}}function Ti(e,{enabled:t=!0,margin:n="100px",onChange:r}={}){let o=typeof document>"u"?!0:!document.hidden,i=!0,a=()=>r&&r(o&&i),s=()=>{o=!document.hidden,a()},c=null;return t&&(document.addEventListener("visibilitychange",s),typeof IntersectionObserver<"u"&&(c=new IntersectionObserver(l=>{for(let u of l)i=u.isIntersecting;a()},{rootMargin:n}),c.observe(e))),{get visible(){return o&&i},dispose(){t&&document.removeEventListener("visibilitychange",s),c&&c.disconnect()}}}var Si={font:'"Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',mono:'"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace',bg:"#1f1f1f",bgAlt:"#181818",raised:"#2a2d2e",hover:"#37373d",border:"#3c3c3c",text:"#cccccc",textStrong:"#ececec",label:"#9d9d9d",accent:"#4daafc",number:"#4daafc",string:"#d1977f",red:"#e46962",redSoft:"#4e3534",redText:"#f9dedc",radius:"8px",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)"};function pr(e){return Object.assign({},Si,e&&typeof e=="object"?e:null)}function ar({visible:e=!1,key:t="F1",position:n="top-left",theme:r}={}){let o=pr(r),i=document.createElement("div"),[a,s]=n.split("-");i.style.cssText=`position:fixed;${a==="bottom"?"bottom":"top"}:12px;${s==="right"?"right":"left"}:12px;z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${o.border};border-radius:${o.radius};background:${o.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${o.shadow};color:${o.text};font:12px/1.5 ${o.mono};pointer-events:none;display:none`,document.body.appendChild(i);let c=(y,h)=>`<div style="display:flex;justify-content:space-between;gap:14px"><span style="color:${o.label}">${y}</span><span style="color:${o.textStrong}">${h}</span></div>`,l=!1,u=0,d=0,f=0,m=0;function b(y=!0){l=!!y,i.style.display=l?"block":"none",u=d=f=0}let g=()=>b(!l),x=y=>{y.key===t&&(y.preventDefault(),g())};return t&&window.addEventListener("keydown",x),b(e),{show:b,toggle:g,isVisible:()=>l,update(y){if(!l)return;u+=y.rawDt,d+=y.cpuMs,f++;let h=performance.now();if(h-m<250)return;m=h;let E=u/f*1e3;i.innerHTML=`<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px"><b style="color:${o.accent};font-size:16px;font-weight:600">${(1e3/E).toFixed(0)}<span style="font-size:11px;color:${o.label};font-weight:400"> fps</span></b><span style="color:${o.label}">${E.toFixed(1)} ms</span></div>`+c("cpu",(d/f).toFixed(2)+" ms")+c("frame",y.frame)+c("time",y.time.toFixed(2)+" s")+c("size",`${y.width}\xD7${y.height}`)+c("passes",y.passes),u=d=f=0},dispose(){t&&window.removeEventListener("keydown",x),i.remove()}}}function Ai(e,t){let n=pr(t),r=null;function o(){if(!r)return;let a=e.getBoundingClientRect();Object.assign(r.style,{left:a.left+"px",top:a.top+"px",width:a.width+"px",height:a.height+"px"})}let i=a=>String(a).replace(/&/g,"&").replace(/</g,"<");return{show(a){r||(r=document.createElement("div"),r.style.cssText=`position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;background:${n.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${n.text};font:13px/1.55 ${n.font}`,document.body.appendChild(r),window.addEventListener("resize",o));let s=a.errors||[],c=i(a.message.split(`
|
|
76
|
-
`)[0]),l="";s.length?l=s.map(u=>`<div style="display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};margin-bottom:8px"><span style="color:${n.red};font-family:${n.mono};font-size:12px">line ${u.line}</span><span style="color:${n.textStrong}">${i(u.message)}</span><span></span><code style="color:${n.label};font-family:${n.mono};font-size:12px;white-space:pre-wrap">${i(u.source.trim())}</code></div>`).join(""):a.log&&(l=`<pre style="margin:0;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};color:${n.label};font:12px/1.5 ${n.mono};white-space:pre-wrap">${i(a.log)}</pre>`),r.innerHTML=`<div style="display:flex;align-items:center;gap:10px;margin-bottom:12px"><span style="display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${n.redSoft};color:${n.redText};font-size:11.5px;font-weight:500">Shader error</span><b style="color:${n.textStrong};font-weight:600">${c}</b></div>`+l,r.style.display="block",o()},hide(){r&&(r.style.display="none")},dispose(){r&&(r.remove(),window.removeEventListener("resize",o),r=null)}}}function
|
|
74
|
+
`),o=/^\s*uniform\s+(?:(?:lowp|mediump|highp)\s+)?(\w+)\s+(\w+)(?:\s*\[\s*\d+\s*\])?\s*(?:=\s*([^;]+))?;\s*(?:\/\/(.*))?$/;return{source:r.map(a=>{var s,c,l;let u=o.exec(a);if(!u)return a;let[,d,f,m,b=""]=u,g=b.trim();if(/^sampler/.test(d)){let y=si(f,g,d);y&&(n[f]=y)}else{let y={},h=S=>(S.match(/-?\d*\.?\d+(?:e-?\d+)?/g)||[]).map(Number),E=/\[([^\]]*)\]/.exec(g),p=h(g.replace(/\[[^\]]*\]/,"")),_=/vec(\d)/.test(d)?+d.match(/vec(\d)/)[1]:1,T=/^bool/.test(d),M;if(m){let S=h(m);M=_===1?T?/true/.test(m):(s=S[0])!=null?s:0:S.slice(0,_)}else p.length&&(M=_===1?p[0]:p.length>=_?p.slice(0,_):new Array(_).fill(p[0]));if(E){let S=h(E[1]);S.length>=2&&(y.min=S[0],y.max=S[1],S.length>=3&&(y.step=S[2]))}(M!==void 0||E)&&(y.value=M!==void 0?M:_===1?(c=y.min)!=null?c:0:new Array(_).fill((l=y.min)!=null?l:0),t[f]=y)}return m?a.replace(/\s*=\s*[^;]+;/,";"):a}).join(`
|
|
75
|
+
`),uniforms:t,samplers:n}}function si(e,t,n){let r=ai(t),o=t.replace(/\[[^\]]*\]/g,"").trim(),i=/^ref:\s*(.+)$/i.exec(o);if(i){let a=i[1].trim(),s;return(s=/^pass\s*(\d+)(?::out(\d+))?$/i.exec(a))?{pass:"pass"+s[1],...r}:(s=/^pass:\s*(\S+)/i.exec(a))?{pass:s[1],...r}:/^main$/i.test(a)?{pass:"main",...r}:(s=/^sampler\s+(\w+)/i.exec(a))?{sameAs:s[1],...r}:null}if(e==="u_audio"||/audio/i.test(e)&&/^(mic|\[CAM\]|\[VIDEO\])?$/i.test(o))return/^https?:|^data:/i.test(o)?{audio:o,layout:"spectrogram"}:{mic:!0,layout:"spectrogram"};if(e==="u_webcam")return{camera:!0,...r};if(e==="u_keyboard")return{keyboard:!0};if(/^(https?:|data:)/i.test(o)){let a=o.split(/\s+/)[0];return/\.(mp4|webm|mov|ogv|m4v)(\?|$)/i.test(a)?{video:a,...r}:/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(a)?{audio:a,layout:"spectrogram"}:n==="samplerCube"?null:{url:a,...r}}return null}function ci(e){return/\bu_mouse\s*\.\s*[xyzw]*[zw]/.test(mr(e))}var fi=35678,ui=35680,li=e=>e.filter(t=>!t.cfg.screen);function di(e,t,n={}){let r=[],o=li(t),i=t.find(c=>c.cfg.screen),a=new Map(t.map(c=>[c.name,c])),s=Object.assign({},e.cfg.annotatedSamplers,e.cfg.samplers);for(let c in e.uniformInfo){let l=e.uniformInfo[c];if(l.type!==fi&&l.type!==ui||/^iChannel\d$/.test(c))continue;let u=n[c]||s[c]||null,d;if(u&&u.sameAs&&(u=s[u.sameAs]||n[u.sameAs]||null),u||(c==="u_passes"&&l.size>1?u={array:o.slice(0,l.size)}:c==="u_main"?u=i?{pass:i.name}:null:(d=/^u_pass(\d+)$/.exec(c))&&o[+d[1]-1]?u={pass:o[+d[1]-1].name}:c.startsWith("u_")&&a.has(c.slice(2))?u={pass:c.slice(2)}:c==="u_audio"?u={mic:!0,layout:"spectrogram"}:c==="u_keyboard"?u={keyboard:!0}:c==="u_webcam"&&(u={camera:!0})),u&&u.pass!=null&&!a.has(u.pass)){let f=/^pass(\d+)$/.exec(u.pass);f&&o[+f[1]-1]?u={...u,pass:o[+f[1]-1].name}:u.pass==="main"&&i&&(u={...u,pass:i.name})}u&&r.push({name:c,info:l,spec:u})}return r}function mi(e){let t=e.find(n=>n.cfg.screen);return t?e.some(n=>(n.samplers||[]).some(r=>r.spec.pass===t.name)||n.cfg.channels.some(r=>r&&r.pass===t.name)):!1}function hi(e,{target:t=window,speed:n=1.5,sensitivity:r=.004}={}){let o=[0,0,0],i=-Math.PI/2,a=0,s=new Set,c=!1,l=0,u=0,d=[0,0,-1],f=new Float32Array(16),m=(T,M)=>{let S=T.key.length===1?T.key.toLowerCase():T.key;M?s.add(S):s.delete(S)},b=T=>m(T,!0),g=T=>m(T,!1),x=T=>{T.button===0&&(c=!0,l=T.clientX,u=T.clientY)},y=T=>{c&&(i+=(T.clientX-l)*r,a-=(T.clientY-u)*r,a=Math.max(-1.55,Math.min(1.55,a)),l=T.clientX,u=T.clientY)},h=()=>{c=!1},E=T=>{let M=d,S=-T.deltaY*.002*n;o[0]+=M[0]*S,o[1]+=M[1]*S,o[2]+=M[2]*S},p=()=>s.clear();t.addEventListener("keydown",b),t.addEventListener("keyup",g),e.addEventListener("pointerdown",x),window.addEventListener("pointermove",y),window.addEventListener("pointerup",h),e.addEventListener("wheel",E,{passive:!0}),window.addEventListener("blur",p);function _(){let T=d,M=[0,1,0],S=[T[1]*M[2]-T[2]*M[1],T[2]*M[0]-T[0]*M[2],T[0]*M[1]-T[1]*M[0]],O=Math.hypot(S[0],S[1],S[2])||1;S=S.map(X=>X/O);let L=[S[1]*T[2]-S[2]*T[1],S[2]*T[0]-S[0]*T[2],S[0]*T[1]-S[1]*T[0]];return f.set([S[0],L[0],-T[0],0,S[1],L[1],-T[1],0,S[2],L[2],-T[2],0,-(S[0]*o[0]+S[1]*o[1]+S[2]*o[2]),-(L[0]*o[0]+L[1]*o[1]+L[2]*o[2]),T[0]*o[0]+T[1]*o[1]+T[2]*o[2],1]),{right:S,up:L}}return{pos:o,dir:d,view:f,update(T){d[0]=Math.cos(a)*Math.cos(i),d[1]=Math.sin(a),d[2]=Math.cos(a)*Math.sin(i);let{right:M}=_(),S=n*T*(s.has("Shift")?3:1),O=(L,X)=>{o[0]+=L[0]*X,o[1]+=L[1]*X,o[2]+=L[2]*X};(s.has("w")||s.has("ArrowUp"))&&O(d,S),(s.has("s")||s.has("ArrowDown"))&&O(d,-S),(s.has("d")||s.has("ArrowRight"))&&O(M,S),(s.has("a")||s.has("ArrowLeft"))&&O(M,-S),(s.has("e")||s.has(" "))&&(o[1]+=S),(s.has("q")||s.has("c"))&&(o[1]-=S),_()},dispose(){t.removeEventListener("keydown",b),t.removeEventListener("keyup",g),e.removeEventListener("pointerdown",x),window.removeEventListener("pointermove",y),window.removeEventListener("pointerup",h),e.removeEventListener("wheel",E),window.removeEventListener("blur",p)}}}var hr=Object.create(null),q=(e,...t)=>t.forEach(n=>{hr[n.toLowerCase()]=e});q({kind:"f",n:1},"float","number","f","1f","1fv","float[]","uniform1f","uniform1fv");q({kind:"f",n:2},"vec2","2f","2fv","vec2[]","uniform2f","uniform2fv");q({kind:"f",n:3},"vec3","3f","3fv","vec3[]","uniform3f","uniform3fv");q({kind:"f",n:4},"vec4","4f","4fv","vec4[]","uniform4f","uniform4fv");q({kind:"i",n:1},"int","bool","boolean","i","1i","1iv","int[]","bool[]","uniform1i","uniform1iv");q({kind:"i",n:2},"ivec2","bvec2","2i","2iv","ivec2[]","bvec2[]","uniform2i","uniform2iv");q({kind:"i",n:3},"ivec3","bvec3","3i","3iv","ivec3[]","bvec3[]","uniform3i","uniform3iv");q({kind:"i",n:4},"ivec4","bvec4","4i","4iv","ivec4[]","bvec4[]","uniform4i","uniform4iv");q({kind:"u",n:1},"uint","1ui","1uiv","uint[]");q({kind:"u",n:2},"uvec2","2ui","2uiv","uvec2[]");q({kind:"u",n:3},"uvec3","3ui","3uiv","uvec3[]");q({kind:"u",n:4},"uvec4","4ui","4uiv","uvec4[]");q({kind:"m",n:2},"mat2","matrix2fv","mat2fv","uniformmatrix2fv");q({kind:"m",n:3},"mat3","matrix3fv","mat3fv","uniformmatrix3fv");q({kind:"m",n:4},"mat4","matrix4fv","mat4fv","uniformmatrix4fv");function pi(e){return typeof e!="string"?null:hr[e.trim().toLowerCase()]||null}var bi={5126:{kind:"f",n:1},35664:{kind:"f",n:2},35665:{kind:"f",n:3},35666:{kind:"f",n:4},5124:{kind:"i",n:1},35667:{kind:"i",n:2},35668:{kind:"i",n:3},35669:{kind:"i",n:4},35670:{kind:"i",n:1},35671:{kind:"i",n:2},35672:{kind:"i",n:3},35673:{kind:"i",n:4},5125:{kind:"u",n:1},36294:{kind:"u",n:2},36295:{kind:"u",n:3},36296:{kind:"u",n:4},35674:{kind:"m",n:2},35675:{kind:"m",n:3},35676:{kind:"m",n:4}};function wi(e){return bi[e]}var xi=5126,rr=35666;function Ht(e){return e!=null&&typeof e=="object"&&!uo(e)&&"value"in e}var or=e=>typeof e=="boolean"?e?1:0:e;function Nt(e,t){return typeof e=="number"||typeof e=="boolean"?new Array(t).fill(or(e)):ArrayBuffer.isView(e)?e:Array.isArray(e)&&e.some(n=>typeof n=="boolean")?e.map(or):e}function gi(e,t,n,r,o){let i=n.n;switch(n.kind){case"f":return i===1&&typeof r=="number"?e.uniform1f(t,r):e["uniform"+i+"fv"](t,Nt(r,i));case"i":return i===1&&(typeof r=="number"||typeof r=="boolean")?e.uniform1i(t,+r):e["uniform"+i+"iv"](t,Nt(r,i));case"u":return i===1&&typeof r=="number"?e.uniform1ui(t,r):e["uniform"+i+"uiv"](t,Nt(r,i));case"m":return e["uniformMatrix"+i+"fv"](t,!!o,r)}}function ir(e,t,n,{strict:r=!1,warnMissing:o=!1,label:i=""}={}){if(n)for(let a in n){let s=n[a],c=Ht(s)?s:null,l=c?c.value:s;if(l==null)continue;let u=t[a];if(!u||!u.loc){if(r)throw new H("Unknown uniform: "+a);o&&xe("missing-uniform:"+i+":"+a,`Uniform "${a}" not found in ${i?`pass "${i}"`:"shader"} (misspelled, undeclared, or optimized out).`);continue}let d;if(c&&c.type!=null){if(d=pi(c.type),!d){if(r)throw new H("Unknown uniform type: "+c.type+" for "+a);xe("bad-type:"+a,"Unknown uniform type",c.type,a);continue}}else if(d=wi(u.type),!d)continue;gi(e,u.loc,d,l,c&&c.transpose)}}function yi(e,t,n={}){let r=n.target==="canvas"?e:n.target&&typeof n.target=="object"?n.target:window,o=+n.smooth||0,i={x:0,y:0,down:!1,over:!1,dragX:0,dragY:0,wheel:0},a={x:0,y:0,clickX:0,clickY:0,down:!1,over:!1,uvX:0,uvY:0,dragX:0,dragY:0,wheel:0,clicked:!1},s=!1,c=0,l=0,u=!1;function d(){let E=e.getBoundingClientRect(),p=t?t():"fill";if(!E.width||!E.height||p!=="contain"&&p!=="cover")return E;let _=e.width/e.height,T=E.width/E.height,M,S;return T>_==(p==="contain")?(S=E.height,M=S*_):(M=E.width,S=M/_),{left:E.left+(E.width-M)/2,top:E.top+(E.height-S)/2,width:M,height:S,bottom:0,right:0}}function f(E,p){let _=d();return!_.width||!_.height?[0,0]:[(E-_.left)*(e.width/_.width),(_.top+_.height-p)*(e.height/_.height)]}let m=(E,p)=>{let[_,T]=f(E,p);return[_/e.width,T/e.height]},b=E=>{let[p,_]=f(E.clientX,E.clientY);i.down&&(i.dragX+=p-c,i.dragY+=_-l),c=p,l=_,i.x=p,i.y=_,i.over=p>=0&&_>=0&&p<=e.width&&_<=e.height,u||(u=!0,a.x=p,a.y=_)},g=E=>{E.button!==void 0&&E.button!==0||(b(E),!(r===window&&!i.over)&&(i.down=!0,a.down=!0,s=!0,c=i.x,l=i.y,a.clickX=i.x,a.clickY=i.y,o||(a.x=i.x,a.y=i.y)))},x=()=>{i.down=!1,a.down=!1},y=()=>{i.over=!1},h=E=>{i.wheel+=-E.deltaY*.002};return n.touch!==!1&&r===e&&(e.style.touchAction="none"),r.addEventListener("pointermove",b,{passive:!0}),r.addEventListener("pointerdown",g,{passive:!0}),window.addEventListener("pointerup",x,{passive:!0}),window.addEventListener("pointercancel",x,{passive:!0}),r.addEventListener("pointerleave",y,{passive:!0}),r.addEventListener("wheel",h,{passive:!0}),{state:a,toShader:f,toUV:m,update(){if(o>0&&o<1){let E=1-Math.pow(1-o,1);a.x+=(i.x-a.x)*E,a.y+=(i.y-a.y)*E}else a.x=i.x,a.y=i.y;a.over=i.over,a.clicked=s,s=!1,a.dragX=i.dragX,a.dragY=i.dragY,a.wheel=i.wheel,a.uvX=e.width?a.x/e.width:0,a.uvY=e.height?a.y/e.height:0},dispose(){r.removeEventListener("pointermove",b),r.removeEventListener("pointerdown",g),window.removeEventListener("pointerup",x),window.removeEventListener("pointercancel",x),r.removeEventListener("pointerleave",y),r.removeEventListener("wheel",h)}}}function Ei(e){if(!e)return 0;if(typeof e=="number")return e;if(Array.isArray(e))return e[0]/e[1];if(typeof e=="string"){let t=e.split(/[:/x]/).map(Number);return t.length===2&&t[1]?t[0]/t[1]:Number(e)||0}return 0}function vi(e={},t=!0){var n,r,o,i,a,s;let c=(n=e.size)!=null?n:e.sizing,l={mode:t?"canvas":"window",width:0,height:0,aspect:Ei(e.aspect),fit:e.fit||"contain",pixelRatio:(o=(r=e.pixelRatio)!=null?r:e.dpr)!=null?o:"auto",maxPixelRatio:(i=e.maxPixelRatio)!=null?i:2,scale:(s=(a=e.scale)!=null?a:e.renderScale)!=null?s:1};return Array.isArray(c)?(l.mode="fixed",l.width=c[0],l.height=c[1]):typeof c=="string"?l.mode=c==="screen"||c==="fullscreen"?"window":c==="element"?"canvas":c:c&&typeof c=="object"&&(l.mode="fixed",l.width=c.width,l.height=c.height,c.fit&&(l.fit=c.fit)),l.mode==="fixed"&&(l.aspect=l.width/l.height),l}function _i(e,t={},n=!0){let r=vi(t,n),o=()=>r.pixelRatio==="auto"?Math.min(window.devicePixelRatio||1,r.maxPixelRatio):Number(r.pixelRatio)||1,i=!1;function a(){return r.mode==="window"?{w:window.innerWidth,h:window.innerHeight}:{w:e.clientWidth||window.innerWidth,h:e.clientHeight||window.innerHeight}}function s(){if(r.mode==="fixed")return{w:r.width,h:r.height};let l=a(),u=o()*r.scale,d=l.w,f=l.h;return r.aspect&&(d/f>r.aspect?d=f*r.aspect:f=d/r.aspect),{w:d*u,h:f*u}}function c(){i||(i=!0,r.mode==="window"&&(e.style.cssText+=";display:block;position:fixed;left:0;top:0;width:100%;height:100%;"),(r.mode==="fixed"||r.aspect)&&(e.style.objectFit=r.fit))}return{cfg:r,fit:()=>r.mode==="fixed"||r.aspect?r.fit:"fill",setFixed(l,u){r.mode="fixed",r.width=l,r.height=u,r.aspect=l/u,i=!1},update(){c();let l=s(),u=Math.max(1,Math.round(l.w)),d=Math.max(1,Math.round(l.h));return e.width===u&&e.height===d?!1:(e.width=u,e.height=d,!0)},observe(l){let u=!1,d=()=>{u||(u=!0,requestAnimationFrame(()=>{u=!1,l()}))};window.addEventListener("resize",d);let f=null;return r.mode==="canvas"&&typeof ResizeObserver<"u"&&(f=new ResizeObserver(d),f.observe(e)),()=>{window.removeEventListener("resize",d),f&&f.disconnect()}}}}function Ti(e,{enabled:t=!0,margin:n="100px",onChange:r}={}){let o=typeof document>"u"?!0:!document.hidden,i=!0,a=()=>r&&r(o&&i),s=()=>{o=!document.hidden,a()},c=null;return t&&(document.addEventListener("visibilitychange",s),typeof IntersectionObserver<"u"&&(c=new IntersectionObserver(l=>{for(let u of l)i=u.isIntersecting;a()},{rootMargin:n}),c.observe(e))),{get visible(){return o&&i},dispose(){t&&document.removeEventListener("visibilitychange",s),c&&c.disconnect()}}}var Si={font:'"Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',mono:'"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace',bg:"#1f1f1f",bgAlt:"#181818",raised:"#2a2d2e",hover:"#37373d",border:"#3c3c3c",text:"#cccccc",textStrong:"#ececec",label:"#9d9d9d",accent:"#4daafc",number:"#4daafc",string:"#d1977f",red:"#e46962",redSoft:"#4e3534",redText:"#f9dedc",radius:"8px",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)"};function pr(e){return Object.assign({},Si,e&&typeof e=="object"?e:null)}function ar({visible:e=!1,key:t="F1",position:n="top-left",theme:r}={}){let o=pr(r),i=document.createElement("div"),[a,s]=n.split("-");i.style.cssText=`position:fixed;${a==="bottom"?"bottom":"top"}:12px;${s==="right"?"right":"left"}:12px;z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${o.border};border-radius:${o.radius};background:${o.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${o.shadow};color:${o.text};font:12px/1.5 ${o.mono};pointer-events:none;display:none`,document.body.appendChild(i);let c=(y,h)=>`<div style="display:flex;justify-content:space-between;gap:14px"><span style="color:${o.label}">${y}</span><span style="color:${o.textStrong}">${h}</span></div>`,l=!1,u=0,d=0,f=0,m=0;function b(y=!0){l=!!y,i.style.display=l?"block":"none",u=d=f=0}let g=()=>b(!l),x=y=>{y.key===t&&(y.preventDefault(),g())};return t&&window.addEventListener("keydown",x),b(e),{show:b,toggle:g,isVisible:()=>l,update(y){if(!l)return;u+=y.rawDt,d+=y.cpuMs,f++;let h=performance.now();if(h-m<250)return;m=h;let E=u/f*1e3;i.innerHTML=`<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px"><b style="color:${o.accent};font-size:16px;font-weight:600">${(1e3/E).toFixed(0)}<span style="font-size:11px;color:${o.label};font-weight:400"> fps</span></b><span style="color:${o.label}">${E.toFixed(1)} ms</span></div>`+c("cpu",(d/f).toFixed(2)+" ms")+c("frame",y.frame)+c("time",y.time.toFixed(2)+" s")+c("size",`${y.width}\xD7${y.height}`)+c("passes",y.passes),u=d=f=0},dispose(){t&&window.removeEventListener("keydown",x),i.remove()}}}function Ai(e,t){let n=pr(t),r=null;function o(){if(!r)return;let a=e.getBoundingClientRect();Object.assign(r.style,{left:a.left+"px",top:a.top+"px",width:a.width+"px",height:a.height+"px"})}let i=a=>String(a).replace(/&/g,"&").replace(/</g,"<");return{show(a){r||(r=document.createElement("div"),r.style.cssText=`position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;background:${n.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${n.text};font:13px/1.55 ${n.font}`,document.body.appendChild(r),window.addEventListener("resize",o));let s=a.errors||[],c=i(a.message.split(`
|
|
76
|
+
`)[0]),l="";s.length?l=s.map(u=>`<div style="display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};margin-bottom:8px"><span style="color:${n.red};font-family:${n.mono};font-size:12px">line ${u.line}</span><span style="color:${n.textStrong}">${i(u.message)}</span><span></span><code style="color:${n.label};font-family:${n.mono};font-size:12px;white-space:pre-wrap">${i(u.source.trim())}</code></div>`).join(""):a.log&&(l=`<pre style="margin:0;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};color:${n.label};font:12px/1.5 ${n.mono};white-space:pre-wrap">${i(a.log)}</pre>`),r.innerHTML=`<div style="display:flex;align-items:center;gap:10px;margin-bottom:12px"><span style="display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${n.redSoft};color:${n.redText};font-size:11.5px;font-weight:500">Shader error</span><b style="color:${n.textStrong};font-weight:600">${c}</b></div>`+l,r.style.display="block",o()},hide(){r&&(r.style.display="none")},dispose(){r&&(r.remove(),window.removeEventListener("resize",o),r=null)}}}function Ri(e,t){function n(a="image/png",s){return t(),e.toDataURL(a,s)}function r(a="image/png",s){return t(),new Promise((c,l)=>e.toBlob(u=>u?c(u):l(new Error("toBlob failed")),a,s))}async function o(a="shadermate.png",s,c){s||(s=/\.jpe?g$/i.test(a)?"image/jpeg":/\.webp$/i.test(a)?"image/webp":"image/png");let l=await r(s,c);sr(l,a)}function i({fps:a=60,mimeType:s,bitsPerSecond:c=8e6,duration:l=0,download:u}={}){if(typeof MediaRecorder>"u"||!e.captureStream)throw new Error("MediaRecorder not supported");let d=e.captureStream(a),f=s||["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm","video/mp4"].find(y=>MediaRecorder.isTypeSupported(y))||"",m=new MediaRecorder(d,{mimeType:f||void 0,videoBitsPerSecond:c}),b=[];m.ondataavailable=y=>{y.data.size&&b.push(y.data)};let g=new Promise(y=>{m.onstop=()=>y(new Blob(b,{type:m.mimeType}))});m.start(100);let x={recorder:m,stop(){return m.state!=="inactive"&&m.stop(),d.getTracks().forEach(y=>y.stop()),g},done:g};if(l>0){let y=new Promise(h=>setTimeout(()=>h(x.stop()),l));return u?y.then(h=>(sr(h,typeof u=="string"?u:"shadermate.webm"),h)):y}return x}return{screenshot:n,toBlob:r,download:o,record:i}}function sr(e,t){let n=URL.createObjectURL(e),r=document.createElement("a");r.href=n,r.download=t,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}function Mi(e,t){var n;if(typeof e=="string"||Array.isArray(e))return{...t||{},passes:e};if(e&&typeof e=="object"&&(e.shader!=null||e.passes!=null||e.src!=null)){let r={...e};return r.passes==null?r.passes={src:(n=r.shader)!=null?n:r.src,uniforms:r.passUniforms,channels:r.channels,pingpong:r.pingpong,float:r.float}:r.channels!=null&&console.warn("[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead."),r}throw new H("createShader: pass a shader string, an array of passes, or { shader | passes, ...options }")}function Ui(e){if(e&&typeof e=="object"&&typeof e.getContext=="function")return{canvas:e,given:!0};if(typeof e=="string"){let n=document.getElementById(e);if(!n)try{n=document.querySelector(e)}catch{}if(!n)throw new H(`Canvas not found: "${e}"`);return{canvas:n,given:!0}}let t=document.getElementById(Wn);return t?{canvas:t,given:!0}:(t=document.createElement("canvas"),t.id=Wn,(document.body||document.documentElement).appendChild(t),{canvas:t,given:!1})}function it(e,t,n){let r=e[t];Ht(r)?r.value=n:e[t]=n}var Bt=(e,t)=>Ht(e[t])?e[t].value:e[t];function br(e,t){var n,r,o;if(!Xt)throw new H("ShaderMate needs a browser environment (window/document).");let i=Mi(e,t),a=i.autoSetup!==!1,s=Object.assign({},a?dr:Vo,i.inject),c=Yn(i.defines),l=typeof i.common=="string"?i.common:"",u=i.dialect||"auto",d=i.samplers||{},f=i.uniforms||{},m=i.includes||{},b=!!i.strictUniforms,g=i.warnMissingUniforms!==!1,x=i.showExpandedOnError!==!1,y=i.errorOverlay===void 0||i.errorOverlay==="auto"?mo():!!i.errorOverlay,h,E,p;i.gl?(p=i.gl,h=p.canvas,E=!0):({canvas:h,given:E}=Ui(i.canvas),p=_o(h,i));let _=vo(p),T=To(p,_),M={isGL2:_,ext:T},S=new ho(p),O=!!(_||T.OES_standard_derivatives),L=lo((n=i.background)!=null?n:i.clearColor)||[0,0,0,0];p.clearColor(L[0],L[1],L[2],L[3]);let X=po(),{emit:D,on:Z,off:ne,once:Y}=X,He=So(p),Pe=_i(h,i,E),ye=yi(h,Pe.fit,i.pointer===!1?{target:"canvas",smooth:0}:typeof i.pointer=="object"?i.pointer:{}),Le=bo(),Ee=y?Ai(h,i.theme):null,oe=null;i.stats&&(oe=ar({visible:i.stats===!0||i.stats==="visible",key:i.statsKey===void 0?"F1":i.statsKey,position:i.statsPosition,theme:i.theme}));let B=[],ee=new Map,ve=[],ie=!1,me=!1,_e=null,sn=()=>{},he=performance.now(),cn=0,Ie=0,ue=i.time||0,W=i.autoplay!==!1&&!i.startPaused&&!i.paused,dt=(r=i.timeScale)!=null?r:1,We=i.fixedDelta||0,Ve=i.maxFps||i.fps||0,Te=i.loop||0,Nr=(o=i.maxDelta)!=null?o:.1,fn=!0,mt=null,un=60,Fe=[],re=null,Se=null,Ae=!1,Br=Ti(h,{enabled:i.pauseWhenHidden!==!1,onChange:w=>{fn=w,w&&(he=performance.now()),D("visibility",w)}});function ht(w){mt=w,Ee&&Ee.show(w),D("error",w),i.onError&&i.onError(w)}function ln(){mt=null,Ee&&Ee.hide()}let pt=async w=>{let v=await fetch(w);if(!v.ok)throw new H(`Failed to fetch ${w}: ${v.status} ${v.statusText}`);return v.text()},Xr=async w=>m[w]!=null?m[w]:pt(w),Ye=null;async function jr(){if(Ye!==null)return Ye;if(!l)return Ye="";let w=Ot(l)?l:await pt(l),v=nr(w);for(let A in v.uniforms)A in f||(f[A]=v.uniforms[A]);return Object.assign(d,v.samplers,d),Ye=v.source}async function dn(w,v,A=ve){let U=Ot(v)?v:await pt(v),C=await jr(),R=nr(U);U=R.source;for(let te in R.uniforms)!(te in w.uniforms)&&!(te in f)&&(w.uniforms[te]=R.uniforms[te]);w.annotatedSamplers=R.samplers;let k=C?C+`
|
|
77
77
|
#line 1
|
|
78
|
-
`+
|
|
79
|
-
`+v.common:v.common);let A=v.passes.find(C=>C.bufferType!=="2d");if(A)throw new H(`Pass "${A.label}" uses a ${A.bufferType} buffer; ShaderMate supports 2D buffers only.`);let k=v.passes.map(C=>C.main?{name:"main",shader:C.src,screen:!0}:{name:C.name,shader:C.src,pingpong:!0,float:!0});return k.some(C=>C.screen)||(k[k.length-1].screen=!0),k}async function pn(){ve=xo(Gr(i.passes));for(let w of ve)w.iterations>1&&!w.screen&&(w.pingpong=!0);for(let w=0;w<ve.length;w++){let v=ve[w],{program:A,source:k,compiled:C,fragcoord:M}=await dn(v,v.src);if(ie){p.deleteProgram(A);return}let U={cfg:v,name:v.name,index:w,programId:S.add(A,"program"),uniformInfo:Jn(p,A),source:k,compiled:C,fragcoord:M,target:null,targetPrev:null,texChannels:new Array(Ge).fill(null),samplers:[]};B.push(U),ee.set(U.name,U)}await Promise.all(B.map(hn)),!ie&&(Ae=mi(B),Ae&&!Se&&(Se=Lo(p,_,He)),!re&&B.some(w=>w.uniformInfo.u_camera_pos||w.uniformInfo.u_camera_dir||w.uniformInfo.u_camera_view)&&(re=hi(h,typeof i.camera=="object"?i.camera:{})),mn())}function wt(w,v,A){let k=null;return v.targetPrev?k=A==="prev"||A!=="current"&&v.index>=w.index?v.targetPrev:v.target:v===w?xe("self:"+w.name,`Pass "${w.name}" reads its own output; add pingpong: true.`):v.cfg.screen?xe("screen:"+v.name,`Pass "${w.name}" can't read screen pass "${v.name}" (it has no texture).`):k=v.target,k}function zr(w,v,A=0){let k=w.cfg,C=S.get(w.programId),M=w.uniformInfo,U=ye.state,I=(P,J)=>{let G=M[P];G&&p.uniform1f(G.loc,J)},z=(P,J)=>{let G=M[P];G&&p.uniform1i(G.loc,J)};if(w.targetPrev){let P=w.targetPrev;w.targetPrev=w.target,w.target=P}let F,N;k.screen&&!Ae?(p.bindFramebuffer(p.FRAMEBUFFER,null),F=h.width,N=h.height):(p.bindFramebuffer(p.FRAMEBUFFER,S.get(w.target.fboId)),F=w.target.width,N=w.target.height);let j=k.screen?1:F/h.width,$=k.screen?1:N/h.height;if(p.viewport(0,0,F,N),p.useProgram(C),p.clear(p.COLOR_BUFFER_BIT|(w.target&&w.target.depthId?p.DEPTH_BUFFER_BIT:0)),I("iTime",v.time),I("u_time",v.time),I("iTimeDelta",v.dt),I("u_delta",v.dt),I("u_time_delta",v.dt),z("iFrame",v.frame),z("u_frame",v.frame),I("iFrameRate",v.fps),I("u_fps",v.fps),I("u_refresh_rate",v.refreshRate),I("iSampleRate",44100),M.iResolution&&p.uniform3f(M.iResolution.loc,F,N,1),M.u_resolution&&p.uniform2f(M.u_resolution.loc,F,N),I("u_aspect",F/N),I("u_pixelRatio",v.dpr),M.iDate&&p.uniform4fv(M.iDate.loc,v.date),M.u_date&&p.uniform4fv(M.u_date.loc,v.date),M.iScroll&&p.uniform2f(M.iScroll.loc,v.scrollX,v.scrollY),M.u_scroll&&(M.u_scroll.type===xi?p.uniform1f(M.u_scroll.loc,U.wheel):p.uniform2f(M.u_scroll.loc,v.scrollX,v.scrollY)),I("u_wheel",U.wheel),M.u_drag&&p.uniform2f(M.u_drag.loc,U.dragX*j,U.dragY*$),z("u_recursion",A),z("u_max_recursion",k.iterations||1),z("u_color_gamut",0),re&&(M.u_camera_pos&&p.uniform3fv(M.u_camera_pos.loc,re.pos),M.u_camera_dir&&p.uniform3fv(M.u_camera_dir.loc,re.dir),M.u_camera_view&&p.uniformMatrix4fv(M.u_camera_view.loc,!1,re.view)),M.iMouse){let P=U.down?1:-1,J=U.clicked?1:-1;p.uniform4f(M.iMouse.loc,U.x*j,U.y*$,U.clickX*j*P,U.clickY*$*J)}if(M.u_mouse)if(M.u_mouse.type===rr){let P=U.down?1:-1;p.uniform4f(M.u_mouse.loc,U.x*j,U.y*$,U.clickX*j*P,U.clickY*$*P)}else p.uniform2f(M.u_mouse.loc,U.x*j,U.y*$);M.u_mouseUV&&p.uniform2f(M.u_mouseUV.loc,U.uvX,U.uvY),I("u_mouseDown",U.down?1:0);let te=[0,0,0,0],Re=new Float32Array(12);for(let P=0;P<Ge;P++){let J=k.channels[P];if(!J)continue;let G=null,ae=0,ke=0,Tn=!1,Sn=v.time;if(J.pass!=null){let se=ee.get(J.pass),Ke=se?wt(w,se,J.buffer):null;Ke&&(G=S.get(Ke.texId),ae=Ke.width,ke=Ke.height)}else{let se=w.texChannels[P];se&&(G=S.get(se.texId),ae=se.width,ke=se.height,Tn=!!se.cubemap,se.getTime&&(Sn=se.getTime()))}G&&(p.activeTexture(p.TEXTURE0+P),p.bindTexture(Tn?p.TEXTURE_CUBE_MAP:p.TEXTURE_2D,G),z("iChannel"+P,P),te[P]=Sn,Re[P*3]=ae,Re[P*3+1]=ke,Re[P*3+2]=1)}M.iChannelTime&&(M.iChannelTime.type===rr?p.uniform4fv:p.uniform1fv).call(p,M.iChannelTime.loc,te),M.iChannelResolution&&p.uniform3fv(M.iChannelResolution.loc,Re);let De=Ge;for(let P of w.samplers){let J=(G,ae)=>(p.activeTexture(p.TEXTURE0+De),p.bindTexture(ae?p.TEXTURE_CUBE_MAP:p.TEXTURE_2D,G),De++);if(P.spec.array){let G=P.spec.array.map(ae=>{let ke=wt(w,ae,P.spec.buffer);return ke?J(S.get(ke.texId),!1):0});p.uniform1iv(P.info.loc,G)}else if(P.spec.pass!=null){let G=ee.get(P.spec.pass),ae=G?wt(w,G,P.spec.buffer):null;ae&&p.uniform1i(P.info.loc,J(S.get(ae.texId),!1))}else if(P.wrap){p.uniform1i(P.info.loc,J(S.get(P.wrap.texId),!!P.wrap.cubemap)),P.wrap.getTime&&I(P.name+"_time",P.wrap.getTime());let G=M[P.name+"_resolution"];G&&p.uniform2f(G.loc,P.wrap.width,P.wrap.height)}}ir(p,M,f,{strict:!1}),ir(p,M,k.uniforms,{strict:b,warnMissing:g,label:w.name}),He.bind(C),He.draw()}function xt(w,{advance:v=W,rawDt:A}={}){let k=performance.now();if(A===void 0&&(A=Math.max(0,(w-he)*.001)),he=w,A>.002&&A<.1&&(Fe.push(A),Fe.length>30&&Fe.shift(),Fe.length>=10)){let F=[...Fe].sort((N,j)=>N-j);un=Math.round(1/F[F.length>>1])}let C=We>0?We:Math.min(A,Nr);v?(ue+=C*dt,Te>0&&(ue=(ue%Te+Te)%Te)):C=0,Ie++;let M=A>0?1/A:0;Le.update(w),ye.update();let U={time:ue,frame:Ie,dt:C,fps:M};D("beforeFrame",U),i.onFrame&&i.onFrame(U);let I=new Date,z={time:ue,frame:Ie,dt:C,fps:M,dpr:window.devicePixelRatio||1,date:[I.getFullYear(),I.getMonth()+1,I.getDate(),I.getHours()*3600+I.getMinutes()*60+I.getSeconds()+I.getMilliseconds()/1e3],scrollX:window.scrollX||0,scrollY:window.scrollY||0,refreshRate:un};re&&re.update(A);for(let F of B){for(let N of F.texChannels)N&&N.update&&N.update();for(let N of F.samplers)N.wrap&&N.wrap.update&&N.wrap.update()}for(let F of B){let N=Math.max(1,F.cfg.iterations|0);for(let j=0;j<N;j++)zr(F,z,j);F.cfg.screen&&Ae&&Se&&Se.draw(S.get(F.target.texId),h.width,h.height)}p.bindFramebuffer(p.FRAMEBUFFER,null),D("afterFrame",U),oe&&oe.update({rawDt:A,cpuMs:performance.now()-k,frame:Ie,time:ue,width:h.width,height:h.height,passes:B.length})}function bn(w){if(_e=requestAnimationFrame(bn),!me||!fn){he=w;return}if(!W&&Le.size===0&&i.renderWhilePaused!==!0){he=w;return}Ve>0&&w-cn<1e3/Ve-.5||(cn=w,xt(w))}function Me(){!me||ie||xt(performance.now(),{advance:!1,rawDt:0})}function wn(){ie||_e!=null||(he=performance.now(),_e=requestAnimationFrame(bn))}function xn(){_e!=null&&cancelAnimationFrame(_e),_e=null}function gn(){ie||(ie=!0,xn(),sn(),ye.dispose(),Br.dispose(),Le.cancel(),oe&&oe.dispose(),Ee&&Ee.dispose(),re&&re.dispose(),Se&&Se.dispose(),h.removeEventListener("webglcontextlost",yn),h.removeEventListener("webglcontextrestored",En),Hr(),He.dispose(),D("destroy"),X.clear(),!E&&h.parentNode&&h.parentNode.removeChild(h))}function Hr(){for(let w of B)S.unref(w.programId),ot(S,w.target),ot(S,w.targetPrev),w.texChannels.forEach(v=>{v&&(v.dispose&&v.dispose(),S.unref(v.texId))}),(w.samplers||[]).forEach(v=>{v.wrap&&(v.wrap.dispose&&v.wrap.dispose(),S.unref(v.wrap.texId))});B.length=0,ee.clear()}function yn(w){w.preventDefault(),xn(),me=!1,console.warn("[ShaderMate] WebGL context lost."),D("contextlost")}async function En(){console.warn("[ShaderMate] WebGL context restored, rebuilding."),S._items.clear(),B.length=0,ee.clear();try{await pn(),me=!0,wn(),D("contextrestored")}catch(w){ht(w)}}h.addEventListener("webglcontextlost",yn),h.addEventListener("webglcontextrestored",En);let $e=Mi(h,Me);function gt(w,v,A){if(w&&typeof w=="object"){for(let C in w)gt(C,w[C],v);return V}Le.cancel(w);let k=!1;for(let C of B)A&&C.name!==A||w in C.cfg.uniforms&&(it(C.cfg.uniforms,w,v),k=!0);if(!k)if(A){let C=ee.get(A);if(!C)throw new H(`set: unknown pass "${A}"`);it(C.cfg.uniforms,w,v)}else it(f,w,v);return!W&&me&&Oe(),V}function vn(w,v){for(let A of B)if(!(v&&A.name!==v)&&w in A.cfg.uniforms)return Bt(A.cfg.uniforms,w);return Bt(f,w)}function Wr(w,v,A={}){let k=A.pass,C=()=>{for(let M of B)if((!k||M.name===k)&&w in M.cfg.uniforms)return M.cfg.uniforms;return f};return Le.tween(w,()=>Bt(C(),w),M=>it(C(),w,M),v,A)}let yt=!1;function Oe(){yt||(yt=!0,requestAnimationFrame(()=>{yt=!1,W||Me()}))}async function Vr(w,v){let A=v?ee.get(v):B.find(k=>k.cfg.screen)||B[0];if(!A)throw new H(`setShader: unknown pass "${v}"`);try{let{program:k,source:C,compiled:M}=await dn(A.cfg,w,ve);if(ie){p.deleteProgram(k);return}S.unref(A.programId),A.programId=S.add(k,"program"),A.uniformInfo=Jn(p,k),A.cfg.src=w,A.source=C,A.compiled=M,await hn(A),ln(),D("shader",{pass:A.name}),W||Oe()}catch(k){throw ht(k),k}}async function Yr(w,v,A){let k=A?ee.get(A):B.find(U=>U.cfg.screen)||B[0];if(!k)throw new H(`setChannel: unknown pass "${A}"`);let C=cr(v,[...ee.keys()],k.name),M=k.texChannels[w];M&&(M.dispose&&M.dispose(),S.unref(M.texId),k.texChannels[w]=null),k.cfg.channels[w]=C,C&&C.pass==null&&(k.texChannels[w]=await Dt(p,S,C,R)),W||Oe()}let V={version:fo,canvas:h,gl:p,isWebGL2:_,theme:i.theme,get camera(){return re},uniforms:f,get passes(){return B},get ready(){return _n},get loaded(){return me},get error(){return mt},play(){return W||(W=!0,he=performance.now(),D("play")),V},pause(){return W&&(W=!1,D("pause")),V},toggle(){return W?V.pause():V.play()},get playing(){return W},step(w=1){for(let v=0;v<w;v++)xt(performance.now(),{advance:!0,rawDt:We||1/60});return V},render:Me,destroy:gn,dispose:gn,get time(){return ue},set time(w){ue=w,W||Oe()},get frame(){return Ie},get timeScale(){return dt},set timeScale(w){dt=w},get maxFps(){return Ve},set maxFps(w){Ve=w||0},get loop(){return Te},set loop(w){Te=w||0},seek(w){return ue=w,W||Oe(),V},setFixedDelta(w){return We=w||0,V},set:gt,get:vn,tween:Wr,setUniform:gt,getUniform:vn,setShader:Vr,setChannel:Yr,getPass:w=>ee.get(w)||null,getTexture(w){let v=w?ee.get(w):B.find(A=>!A.cfg.screen)||B[0];return v&&v.target?S.get(v.target.texId):null},readPixels({pass:w,x:v=0,y:A=0,width:k,height:C,float:M}={}){let U=w?ee.get(w):null;Me(),U&&U.target?p.bindFramebuffer(p.FRAMEBUFFER,S.get(U.target.fboId)):p.bindFramebuffer(p.FRAMEBUFFER,null);let I=k??(U&&U.target?U.target.width:h.width),z=C??(U&&U.target?U.target.height:h.height),F=new Uint8Array(I*z*4);if(U&&U.target&&U.target.fmt.type!==p.UNSIGNED_BYTE){let j=new Float32Array(I*z*4);if(p.readPixels(v,A,I,z,p.RGBA,p.FLOAT,j),M!==!1)F=j;else for(let $=0;$<j.length;$++)F[$]=Math.max(0,Math.min(255,Math.round(j[$]*255)))}else p.readPixels(v,A,I,z,p.RGBA,p.UNSIGNED_BYTE,F);return p.bindFramebuffer(p.FRAMEBUFFER,null),{data:F,width:I,height:z,float:F instanceof Float32Array}},resize:bt,setSize(w,v){return Pe.setFixed(w,v),bt(),V},get width(){return h.width},get height(){return h.height},pointer:ye.state,domToShader:ye.toShader,domToUV:ye.toUV,screenshot:$e.screenshot,toBlob:$e.toBlob,download:$e.download,record:$e.record,on:Z,off:ne,once:Y,stats:{show:(w=!0)=>{oe||(oe=ar({visible:!1,key:i.statsKey===void 0?"F1":i.statsKey,theme:i.theme})),oe.show(w)},toggle:()=>V.stats.show(!(oe&&oe.isVisible()))}};Pe.update(),p.viewport(0,0,h.width,h.height),sn=Pe.observe(bt);let _n=(async()=>(await pn(),ie||(me=!0,ln(),D("load",V),i.onReady&&i.onReady(V),wn(),W||Me()),V))();return _n.catch(w=>{ie||ht(w)}),V}var wr=`
|
|
78
|
+
`+U:U,I=await Ho(k,{loader:Xr}),z=u==="fragcoord"||u==="auto"&&Go(I),F=[],N=A.filter(te=>!te.screen);A.forEach(te=>F.push("u_"+te.name)),N.forEach((te,Me)=>{let De="u_pass"+(Me+1);F.includes(De)||F.push(De)});let j=Yo(I,{isGL2:_,defines:[...c,...Yn(w.defines)],enableDerivatives:O,inject:s,channelTypes:w.channels.map(oi),builtinOpts:{fragcoord:z,mouseVec4:z||u==="fragcoord"||ci(I),scrollFloat:z||u==="fragcoord",samplerNames:F,passCount:N.length}}),$=fr(p,_?ur:lr,j,{label:w.name,showExpandedOnError:x});if($.error)throw $.error;return{program:$.program,source:U,compiled:j,fragcoord:z}}function mn(){for(let w of B){let v=w.cfg;if(v.screen&&!Ae)continue;let[A,U]=v.screen?[h.width,h.height]:Oo(v.size,h.width,h.height);w.target&&w.target.width===A&&w.target.height===U||(ot(S,w.target),ot(S,w.targetPrev),w.target=Zn(p,S,A,U,v,_,T),w.targetPrev=v.pingpong||v.screen&&Ae?Zn(p,S,A,U,v,_,T):null)}}function bt(){ie||Pe.update()&&(p.viewport(0,0,h.width,h.height),mn(),D("resize",{width:h.width,height:h.height}),!W&&me&&Re())}async function hn(w){await Promise.all(w.cfg.channels.map(async(v,A)=>{if(!(!v||v.pass!=null))try{w.texChannels[A]=await Dt(p,S,v,M)}catch(U){console.warn(`[ShaderMate] Pass "${w.name}" channel ${A}: ${U.message}`),D("error",U)}})),w.samplers=di(w,B,d),await Promise.all(w.samplers.map(async v=>{if(!(v.spec.pass!=null||v.spec.array))try{v.wrap=await Dt(p,S,v.spec,M)}catch(A){console.warn(`[ShaderMate] Pass "${w.name}" sampler ${v.name}: ${A.message}`),D("error",A)}}))}function Gr(w){if(typeof w!="string"||!Ot(w))return w;let v=ii(w);if(!v)return w;v.common&&(l=l?l+`
|
|
79
|
+
`+v.common:v.common);let A=v.passes.find(C=>C.bufferType!=="2d");if(A)throw new H(`Pass "${A.label}" uses a ${A.bufferType} buffer; ShaderMate supports 2D buffers only.`);let U=v.passes.map(C=>C.main?{name:"main",shader:C.src,screen:!0}:{name:C.name,shader:C.src,pingpong:!0,float:!0});return U.some(C=>C.screen)||(U[U.length-1].screen=!0),U}async function pn(){ve=xo(Gr(i.passes));for(let w of ve)w.iterations>1&&!w.screen&&(w.pingpong=!0);for(let w=0;w<ve.length;w++){let v=ve[w],{program:A,source:U,compiled:C,fragcoord:R}=await dn(v,v.src);if(ie){p.deleteProgram(A);return}let k={cfg:v,name:v.name,index:w,programId:S.add(A,"program"),uniformInfo:Jn(p,A),source:U,compiled:C,fragcoord:R,target:null,targetPrev:null,texChannels:new Array(Ge).fill(null),samplers:[]};B.push(k),ee.set(k.name,k)}await Promise.all(B.map(hn)),!ie&&(Ae=mi(B),Ae&&!Se&&(Se=Lo(p,_,He)),!re&&B.some(w=>w.uniformInfo.u_camera_pos||w.uniformInfo.u_camera_dir||w.uniformInfo.u_camera_view)&&(re=hi(h,typeof i.camera=="object"?i.camera:{})),mn())}function wt(w,v,A){let U=null;return v.targetPrev?U=A==="prev"||A!=="current"&&v.index>=w.index?v.targetPrev:v.target:v===w?xe("self:"+w.name,`Pass "${w.name}" reads its own output; add pingpong: true.`):v.cfg.screen?xe("screen:"+v.name,`Pass "${w.name}" can't read screen pass "${v.name}" (it has no texture).`):U=v.target,U}function zr(w,v,A=0){let U=w.cfg,C=S.get(w.programId),R=w.uniformInfo,k=ye.state,I=(P,J)=>{let G=R[P];G&&p.uniform1f(G.loc,J)},z=(P,J)=>{let G=R[P];G&&p.uniform1i(G.loc,J)};if(w.targetPrev){let P=w.targetPrev;w.targetPrev=w.target,w.target=P}let F,N;U.screen&&!Ae?(p.bindFramebuffer(p.FRAMEBUFFER,null),F=h.width,N=h.height):(p.bindFramebuffer(p.FRAMEBUFFER,S.get(w.target.fboId)),F=w.target.width,N=w.target.height);let j=U.screen?1:F/h.width,$=U.screen?1:N/h.height;if(p.viewport(0,0,F,N),p.useProgram(C),p.clear(p.COLOR_BUFFER_BIT|(w.target&&w.target.depthId?p.DEPTH_BUFFER_BIT:0)),I("iTime",v.time),I("u_time",v.time),I("iTimeDelta",v.dt),I("u_delta",v.dt),I("u_time_delta",v.dt),z("iFrame",v.frame),z("u_frame",v.frame),I("iFrameRate",v.fps),I("u_fps",v.fps),I("u_refresh_rate",v.refreshRate),I("iSampleRate",44100),R.iResolution&&p.uniform3f(R.iResolution.loc,F,N,1),R.u_resolution&&p.uniform2f(R.u_resolution.loc,F,N),I("u_aspect",F/N),I("u_pixelRatio",v.dpr),R.iDate&&p.uniform4fv(R.iDate.loc,v.date),R.u_date&&p.uniform4fv(R.u_date.loc,v.date),R.iScroll&&p.uniform2f(R.iScroll.loc,v.scrollX,v.scrollY),R.u_scroll&&(R.u_scroll.type===xi?p.uniform1f(R.u_scroll.loc,k.wheel):p.uniform2f(R.u_scroll.loc,v.scrollX,v.scrollY)),I("u_wheel",k.wheel),R.u_drag&&p.uniform2f(R.u_drag.loc,k.dragX*j,k.dragY*$),z("u_recursion",A),z("u_max_recursion",U.iterations||1),z("u_color_gamut",0),re&&(R.u_camera_pos&&p.uniform3fv(R.u_camera_pos.loc,re.pos),R.u_camera_dir&&p.uniform3fv(R.u_camera_dir.loc,re.dir),R.u_camera_view&&p.uniformMatrix4fv(R.u_camera_view.loc,!1,re.view)),R.iMouse){let P=k.down?1:-1,J=k.clicked?1:-1;p.uniform4f(R.iMouse.loc,k.x*j,k.y*$,k.clickX*j*P,k.clickY*$*J)}if(R.u_mouse)if(R.u_mouse.type===rr){let P=k.down?1:-1;p.uniform4f(R.u_mouse.loc,k.x*j,k.y*$,k.clickX*j*P,k.clickY*$*P)}else p.uniform2f(R.u_mouse.loc,k.x*j,k.y*$);R.u_mouseUV&&p.uniform2f(R.u_mouseUV.loc,k.uvX,k.uvY),I("u_mouseDown",k.down?1:0);let te=[0,0,0,0],Me=new Float32Array(12);for(let P=0;P<Ge;P++){let J=U.channels[P];if(!J)continue;let G=null,ae=0,Ue=0,Tn=!1,Sn=v.time;if(J.pass!=null){let se=ee.get(J.pass),Ke=se?wt(w,se,J.buffer):null;Ke&&(G=S.get(Ke.texId),ae=Ke.width,Ue=Ke.height)}else{let se=w.texChannels[P];se&&(G=S.get(se.texId),ae=se.width,Ue=se.height,Tn=!!se.cubemap,se.getTime&&(Sn=se.getTime()))}G&&(p.activeTexture(p.TEXTURE0+P),p.bindTexture(Tn?p.TEXTURE_CUBE_MAP:p.TEXTURE_2D,G),z("iChannel"+P,P),te[P]=Sn,Me[P*3]=ae,Me[P*3+1]=Ue,Me[P*3+2]=1)}R.iChannelTime&&(R.iChannelTime.type===rr?p.uniform4fv:p.uniform1fv).call(p,R.iChannelTime.loc,te),R.iChannelResolution&&p.uniform3fv(R.iChannelResolution.loc,Me);let De=Ge;for(let P of w.samplers){let J=(G,ae)=>(p.activeTexture(p.TEXTURE0+De),p.bindTexture(ae?p.TEXTURE_CUBE_MAP:p.TEXTURE_2D,G),De++);if(P.spec.array){let G=P.spec.array.map(ae=>{let Ue=wt(w,ae,P.spec.buffer);return Ue?J(S.get(Ue.texId),!1):0});p.uniform1iv(P.info.loc,G)}else if(P.spec.pass!=null){let G=ee.get(P.spec.pass),ae=G?wt(w,G,P.spec.buffer):null;ae&&p.uniform1i(P.info.loc,J(S.get(ae.texId),!1))}else if(P.wrap){p.uniform1i(P.info.loc,J(S.get(P.wrap.texId),!!P.wrap.cubemap)),P.wrap.getTime&&I(P.name+"_time",P.wrap.getTime());let G=R[P.name+"_resolution"];G&&p.uniform2f(G.loc,P.wrap.width,P.wrap.height)}}ir(p,R,f,{strict:!1}),ir(p,R,U.uniforms,{strict:b,warnMissing:g,label:w.name}),He.bind(C),He.draw()}function xt(w,{advance:v=W,rawDt:A}={}){let U=performance.now();if(A===void 0&&(A=Math.max(0,(w-he)*.001)),he=w,A>.002&&A<.1&&(Fe.push(A),Fe.length>30&&Fe.shift(),Fe.length>=10)){let F=[...Fe].sort((N,j)=>N-j);un=Math.round(1/F[F.length>>1])}let C=We>0?We:Math.min(A,Nr);v?(ue+=C*dt,Te>0&&(ue=(ue%Te+Te)%Te)):C=0,Ie++;let R=A>0?1/A:0;Le.update(w),ye.update();let k={time:ue,frame:Ie,dt:C,fps:R};D("beforeFrame",k),i.onFrame&&i.onFrame(k);let I=new Date,z={time:ue,frame:Ie,dt:C,fps:R,dpr:window.devicePixelRatio||1,date:[I.getFullYear(),I.getMonth()+1,I.getDate(),I.getHours()*3600+I.getMinutes()*60+I.getSeconds()+I.getMilliseconds()/1e3],scrollX:window.scrollX||0,scrollY:window.scrollY||0,refreshRate:un};re&&re.update(A);for(let F of B){for(let N of F.texChannels)N&&N.update&&N.update();for(let N of F.samplers)N.wrap&&N.wrap.update&&N.wrap.update()}for(let F of B){let N=Math.max(1,F.cfg.iterations|0);for(let j=0;j<N;j++)zr(F,z,j);F.cfg.screen&&Ae&&Se&&Se.draw(S.get(F.target.texId),h.width,h.height)}p.bindFramebuffer(p.FRAMEBUFFER,null),D("afterFrame",k),oe&&oe.update({rawDt:A,cpuMs:performance.now()-U,frame:Ie,time:ue,width:h.width,height:h.height,passes:B.length})}function bn(w){if(_e=requestAnimationFrame(bn),!me||!fn){he=w;return}if(!W&&Le.size===0&&i.renderWhilePaused!==!0){he=w;return}Ve>0&&w-cn<1e3/Ve-.5||(cn=w,xt(w))}function Re(){!me||ie||xt(performance.now(),{advance:!1,rawDt:0})}function wn(){ie||_e!=null||(he=performance.now(),_e=requestAnimationFrame(bn))}function xn(){_e!=null&&cancelAnimationFrame(_e),_e=null}function gn(){ie||(ie=!0,xn(),sn(),ye.dispose(),Br.dispose(),Le.cancel(),oe&&oe.dispose(),Ee&&Ee.dispose(),re&&re.dispose(),Se&&Se.dispose(),h.removeEventListener("webglcontextlost",yn),h.removeEventListener("webglcontextrestored",En),Hr(),He.dispose(),D("destroy"),X.clear(),!E&&h.parentNode&&h.parentNode.removeChild(h))}function Hr(){for(let w of B)S.unref(w.programId),ot(S,w.target),ot(S,w.targetPrev),w.texChannels.forEach(v=>{v&&(v.dispose&&v.dispose(),S.unref(v.texId))}),(w.samplers||[]).forEach(v=>{v.wrap&&(v.wrap.dispose&&v.wrap.dispose(),S.unref(v.wrap.texId))});B.length=0,ee.clear()}function yn(w){w.preventDefault(),xn(),me=!1,console.warn("[ShaderMate] WebGL context lost."),D("contextlost")}async function En(){console.warn("[ShaderMate] WebGL context restored, rebuilding."),S._items.clear(),B.length=0,ee.clear();try{await pn(),me=!0,wn(),D("contextrestored")}catch(w){ht(w)}}h.addEventListener("webglcontextlost",yn),h.addEventListener("webglcontextrestored",En);let $e=Ri(h,Re);function gt(w,v,A){if(w&&typeof w=="object"){for(let C in w)gt(C,w[C],v);return V}Le.cancel(w);let U=!1;for(let C of B)A&&C.name!==A||w in C.cfg.uniforms&&(it(C.cfg.uniforms,w,v),U=!0);if(!U)if(A){let C=ee.get(A);if(!C)throw new H(`set: unknown pass "${A}"`);it(C.cfg.uniforms,w,v)}else it(f,w,v);return!W&&me&&Oe(),V}function vn(w,v){for(let A of B)if(!(v&&A.name!==v)&&w in A.cfg.uniforms)return Bt(A.cfg.uniforms,w);return Bt(f,w)}function Wr(w,v,A={}){let U=A.pass,C=()=>{for(let R of B)if((!U||R.name===U)&&w in R.cfg.uniforms)return R.cfg.uniforms;return f};return Le.tween(w,()=>Bt(C(),w),R=>it(C(),w,R),v,A)}let yt=!1;function Oe(){yt||(yt=!0,requestAnimationFrame(()=>{yt=!1,W||Re()}))}async function Vr(w,v){let A=v?ee.get(v):B.find(U=>U.cfg.screen)||B[0];if(!A)throw new H(`setShader: unknown pass "${v}"`);try{let{program:U,source:C,compiled:R}=await dn(A.cfg,w,ve);if(ie){p.deleteProgram(U);return}S.unref(A.programId),A.programId=S.add(U,"program"),A.uniformInfo=Jn(p,U),A.cfg.src=w,A.source=C,A.compiled=R,await hn(A),ln(),D("shader",{pass:A.name}),W||Oe()}catch(U){throw ht(U),U}}async function Yr(w,v,A){let U=A?ee.get(A):B.find(k=>k.cfg.screen)||B[0];if(!U)throw new H(`setChannel: unknown pass "${A}"`);let C=cr(v,[...ee.keys()],U.name),R=U.texChannels[w];R&&(R.dispose&&R.dispose(),S.unref(R.texId),U.texChannels[w]=null),U.cfg.channels[w]=C,C&&C.pass==null&&(U.texChannels[w]=await Dt(p,S,C,M)),W||Oe()}let V={version:fo,canvas:h,gl:p,isWebGL2:_,theme:i.theme,get camera(){return re},uniforms:f,get passes(){return B},get ready(){return _n},get loaded(){return me},get error(){return mt},play(){return W||(W=!0,he=performance.now(),D("play")),V},pause(){return W&&(W=!1,D("pause")),V},toggle(){return W?V.pause():V.play()},get playing(){return W},step(w=1){for(let v=0;v<w;v++)xt(performance.now(),{advance:!0,rawDt:We||1/60});return V},render:Re,destroy:gn,dispose:gn,get time(){return ue},set time(w){ue=w,W||Oe()},get frame(){return Ie},get timeScale(){return dt},set timeScale(w){dt=w},get maxFps(){return Ve},set maxFps(w){Ve=w||0},get loop(){return Te},set loop(w){Te=w||0},seek(w){return ue=w,W||Oe(),V},setFixedDelta(w){return We=w||0,V},set:gt,get:vn,tween:Wr,setUniform:gt,getUniform:vn,setShader:Vr,setChannel:Yr,getPass:w=>ee.get(w)||null,getTexture(w){let v=w?ee.get(w):B.find(A=>!A.cfg.screen)||B[0];return v&&v.target?S.get(v.target.texId):null},readPixels({pass:w,x:v=0,y:A=0,width:U,height:C,float:R}={}){let k=w?ee.get(w):null;Re(),k&&k.target?p.bindFramebuffer(p.FRAMEBUFFER,S.get(k.target.fboId)):p.bindFramebuffer(p.FRAMEBUFFER,null);let I=U??(k&&k.target?k.target.width:h.width),z=C??(k&&k.target?k.target.height:h.height),F=new Uint8Array(I*z*4);if(k&&k.target&&k.target.fmt.type!==p.UNSIGNED_BYTE){let j=new Float32Array(I*z*4);if(p.readPixels(v,A,I,z,p.RGBA,p.FLOAT,j),R!==!1)F=j;else for(let $=0;$<j.length;$++)F[$]=Math.max(0,Math.min(255,Math.round(j[$]*255)))}else p.readPixels(v,A,I,z,p.RGBA,p.UNSIGNED_BYTE,F);return p.bindFramebuffer(p.FRAMEBUFFER,null),{data:F,width:I,height:z,float:F instanceof Float32Array}},resize:bt,setSize(w,v){return Pe.setFixed(w,v),bt(),V},get width(){return h.width},get height(){return h.height},pointer:ye.state,domToShader:ye.toShader,domToUV:ye.toUV,screenshot:$e.screenshot,toBlob:$e.toBlob,download:$e.download,record:$e.record,on:Z,off:ne,once:Y,stats:{show:(w=!0)=>{oe||(oe=ar({visible:!1,key:i.statsKey===void 0?"F1":i.statsKey,theme:i.theme})),oe.show(w)},toggle:()=>V.stats.show(!(oe&&oe.isVisible()))}};Pe.update(),p.viewport(0,0,h.width,h.height),sn=Pe.observe(bt);let _n=(async()=>(await pn(),ie||(me=!0,ln(),D("load",V),i.onReady&&i.onReady(V),wn(),W||Re()),V))();return _n.catch(w=>{ie||ht(w)}),V}var wr=`
|
|
80
80
|
// 256\xD71, palette colours in x = 0..count-1
|
|
81
81
|
uniform sampler2D u_palette;
|
|
82
82
|
uniform int u_count;
|
|
@@ -298,7 +298,7 @@ void main() {
|
|
|
298
298
|
if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
|
-
`;var ze=(e,t)=>{let n=document.createElement("canvas");return n.width=e,n.height=t,n};async function Sr(){if(typeof document>"u")throw new Error("No DOM");let e=ze(1,1).getContext("webgl2");if(!e)throw new Error("WebGL 2 is not available");if(!e.getExtension("EXT_color_buffer_float"))throw new Error("Float render targets are not available");let t=e.getExtension("WEBGL_debug_renderer_info"),n=String(t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER));e.getExtension("WEBGL_lose_context")?.loseContext();let r=ze(1,1),o=ze(1,1),i=ze(256,1),a=ze(1,1),s=h=>({element:h,filter:"nearest",wrap:"clamp"}),c=br({canvas:r,webgl:2,size:[1,1],pixelRatio:1,autoplay:!1,pauseWhenHidden:!1,pointer:!1,errorOverlay:!1,warnMissingUniforms:!1,preserveDrawingBuffer:!0,premultipliedAlpha:!1,antialias:!1,dialect:"shadermate",common:wr,samplers:{u_palette:s(i),u_matrix:s(a)},uniforms:{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:.5,u_mode:0,u_levels:1,u_amount:0,u_skew:1,u_strength:1,u_kn:0,u_kernel:new Float32Array(Pt*3),u_outline:0,u_corners:0,u_outlineColor:[0,0,0]},passes:[{name:"prep",shader:xr,float:"full",filter:"nearest",channels:[{...s(o),dynamic:!1}]},{name:"quant",shader:gr,filter:"nearest",channels:["prep"]},{name:"diffuse",shader:yr,float:"full",filter:"nearest",pingpong:!0,iterations:2,channels:["prep","diffuse"]},{name:"resolve",shader:Er,filter:"nearest",channels:["quant","diffuse"]},{name:"orphan",shader:vr,filter:"nearest",channels:["resolve"]},{name:"smooth",shader:_r,filter:"nearest",channels:["orphan"]},{name:"out",shader:Tr,screen:!0,channels:["smooth"]}]}),l=null;if(c.on("error",h=>{l=h}),await c.ready,l||c.error)throw c.destroy(),l||c.error;let u=(h,E)=>{for(let p in E)c.set(p,E[p],h)},d=null,f="",m="";async function b(h){if(h.canvas===d&&!h.dirty)return;o.width=h.width,o.height=h.height;let E=o.getContext("2d");E.clearRect(0,0,o.width,o.height),E.drawImage(h.canvas,0,0),await c.setChannel(0,{...s(o),dynamic:!1},"prep"),d=h.canvas}function g(h){let E=h.palette.map(T=>T.join(",")).join(";");if(E===f)return;f=E;let p=i.getContext("2d"),_=p.createImageData(256,1);h.palette.forEach((T,R)=>_.data.set([T[0],T[1],T[2],255],R*4)),p.putImageData(_,0,0)}function x(h){let E=h?`${h.w}x${h.h}:${h.levels}:${h.values.join(",")}`:"none";if(E===m)return;m=E;let p=h||{w:1,h:1,values:[0]};a.width=p.w,a.height=p.h;let _=a.getContext("2d"),T=_.createImageData(p.w,p.h);for(let R=0;R<p.values.length;R++)T.data.set([p.values[R],0,0,255],R*4);_.putImageData(T,0,0)}async function y(h,E){let p=h.settings;await b(E),h.quantize&&g(h),x(h.map),(c.width!==h.width||c.height!==h.height)&&c.setSize(h.width,h.height);let _=h.kind==="diffusion",T=new Array(Pt).fill(null).map((D,Z)=>h.kernel&&h.kernel[Z]||[0,0,0]);c.set({u_count:h.palette.length||1,u_distance:h.distance,u_resample:p.size.resample==="nearest"?1:0,u_adjust:[p.adjust.brightness,p.adjust.contrast,p.adjust.saturation,p.adjust.gamma],u_hue:p.adjust.hue,u_crop:[h.crop.x,h.crop.y,h.crop.w,h.crop.h],u_alphaCut:p.alpha.threshold,u_mode:h.quantize?h.kind==="ordered"?2:1:0,u_levels:h.map?h.map.levels:1,u_amount:h.map?h.spread*p.dither.strength:0,u_skew:h.skew,u_strength:p.dither.strength,u_kn:h.kernel?h.kernel.length:0,u_kernel:new Float32Array(T.flat()),u_outline:{none:0,outer:1,inner:2}[h.outline.mode],u_corners:h.outline.corners?1:0,u_outlineColor:h.outline.color.map(D=>D/255)}),u("diffuse",{u_on:_?1:0}),u("resolve",{u_on:_?1:0}),u("orphan",{u_on:p.cleanup.orphans?1:0}),u("smooth",{u_on:p.cleanup.smooth?1:0}),c.getPass("diffuse").cfg.iterations=_?h.waves:1;let{data:R}=c.readPixels(),S=h.width,O=h.height,L=new Uint8ClampedArray(S*O*4),X=S*4;for(let D=0;D<O;D++)L.set(R.subarray((O-1-D)*X,(O-D)*X),D*X);return L}return{name:"webgl",renderer:n,software:/swiftshader|llvmpipe|softpipe|software|basic render/i.test(n),run:y,shader:c,destroy(){c.destroy()}}}var Wt=typeof document<"u",Ar=e=>e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e&&e.data&&e.data.length===e.width*e.height*4;async function Mr(e){if(typeof Blob<"u"&&e instanceof Blob){if(typeof createImageBitmap=="function")try{return await createImageBitmap(e)}catch{}e=URL.createObjectURL(e)}if(!Wt)throw new Error("Loading images by URL needs a browser; pass { width, height, data } in Node.");let t=new Image;return t.crossOrigin="anonymous",t.decoding="async",t.src=e,await t.decode(),t}function Ci(e){return{width:e.naturalWidth||e.videoWidth||e.displayWidth||e.codedWidth||e.width||0,height:e.naturalHeight||e.videoHeight||e.displayHeight||e.codedHeight||e.height||0}}function Ui(e){if(e&&!Ar(e)&&typeof e=="object"){if(e.canvas&&typeof e.canvas=="object"&&"getContext"in e.canvas)return e.canvas;if(e.elt&&typeof e.elt=="object"&&"getContext"in e.elt)return e.elt}return e}async function st(e,t={}){let n=t.maxSize||4096,r=Ui(e);if((typeof r=="string"||typeof Blob<"u"&&r instanceof Blob)&&(r=await Mr(r)),r&&typeof r.complete=="boolean"&&!r.complete&&r.decode&&await r.decode(),Ar(r)){let u={width:r.width,height:r.height,data:r.data,canvas:null};return Wt&&Object.defineProperty(u,"canvas",{configurable:!0,get(){let d=document.createElement("canvas");d.width=r.width,d.height=r.height;let f=new ImageData(new Uint8ClampedArray(r.data),r.width,r.height);return d.getContext("2d").putImageData(f,0,0),Object.defineProperty(u,"canvas",{value:d}),d}}),u}if(!Wt)throw new Error("Unsupported source in a non-browser environment. Pass { width, height, data }.");let{width:o,height:i}=Ci(r);if(!o||!i)throw new Error("Source has no size yet (is the image or video loaded?)");let a=Math.min(1,n/Math.max(o,i));o=Math.max(1,Math.round(o*a)),i=Math.max(1,Math.round(i*a));let s=t.canvas||document.createElement("canvas");s.width=o,s.height=i;let c=s.getContext("2d",{willReadFrequently:!0});c.clearRect(0,0,o,i),c.imageSmoothingEnabled=a<1,c.imageSmoothingQuality="high",c.drawImage(r,0,0,o,i);let l=null;return{width:o,height:i,canvas:s,dirty:!0,get data(){return l||(l=c.getImageData(0,0,o,i).data)}}}le();function ge(e,t=1,n={}){t=Math.max(1,Math.round(t));let r=e.width*t,o=e.height*t,i=new Uint8ClampedArray(r*o*4),a=e.data,s=e.width;for(let c=0;c<o;c++){let l=c/t|0;for(let u=0;u<r;u++){let d=(l*s+(u/t|0))*4,f=(c*r+u)*4;i[f]=a[d],i[f+1]=a[d+1],i[f+2]=a[d+2],i[f+3]=a[d+3]}}if(n.grid&&t>=3){let[c,l,u]=ce(n.gridColor||"#000000"),d=n.gridAlpha??.35;for(let f=0;f<o;f++)for(let m=0;m<r;m++){if(m%t&&f%t)continue;let b=(f*r+m)*4,g=i[b+3]/255,x=d+g*(1-d);i[b]=(c*d+i[b]*g*(1-d))/x,i[b+1]=(l*d+i[b+1]*g*(1-d))/x,i[b+2]=(u*d+i[b+2]*g*(1-d))/x,i[b+3]=x*255}}return{width:r,height:o,data:i}}function Vt(e,t,n){t=Math.max(1,Math.round(t)),n=Math.max(1,Math.round(n));let r=new Uint8ClampedArray(t*n*4),o=new Int32Array(t);for(let i=0;i<t;i++)o[i]=Math.min(e.width-1,Math.floor((i+.5)*e.width/t));for(let i=0;i<n;i++){let a=Math.min(e.height-1,Math.floor((i+.5)*e.height/n));for(let s=0;s<t;s++){let c=(a*e.width+o[s])*4,l=(i*t+s)*4;r[l]=e.data[c],r[l+1]=e.data[c+1],r[l+2]=e.data[c+2],r[l+3]=e.data[c+3]}}return{width:t,height:n,data:r}}function Yt(e,t=1/0){let n=new Set,r=e.data;for(let o=0;o<r.length&&!(r[o+3]!==0&&(n.add(r[o]<<16|r[o+1]<<8|r[o+2]),n.size>t));o+=4);return[...n].map(o=>Ce([o>>16,o>>8&255,o&255]))}function Pi(e){for(let t=3;t<e.data.length;t+=4)if(e.data[t]<255)return!0;return!1}function Li(e,t=8){let{width:n,height:r,data:o}=e,i=(u,d)=>Math.abs(o[u]-o[d])<=t&&Math.abs(o[u+1]-o[d+1])<=t&&Math.abs(o[u+2]-o[d+2])<=t&&Math.abs(o[u+3]-o[d+3])<=t,a=(u,d)=>d?a(d,u%d):u,s=0,c=Math.max(1,Math.floor(r/64)),l=Math.max(1,Math.floor(n/64));for(let u=0;u<r;u+=c){let d=1;for(let f=1;f<n;f++)if(i((u*n+f)*4,(u*n+f-1)*4))d++;else if(s=a(s,d),d=1,s===1)return 1}for(let u=0;u<n;u+=l){let d=1;for(let f=1;f<r;f++)if(i((f*n+u)*4,((f-1)*n+u)*4))d++;else if(s=a(s,d),d=1,s===1)return 1}return s||1}function $t(e,t=1,n={}){let r=t>1||n.grid?ge(e,t,n):e,o=n.canvas||document.createElement("canvas");return o.width=r.width,o.height=r.height,o.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(r.data),r.width,r.height),0,0),o}function Ii(e,t,n="application/octet-stream"){let r=e instanceof Blob?e:new Blob([e],{type:n}),o=URL.createObjectURL(r),i=document.createElement("a");i.href=o,i.download=t,i.rel="noopener",document.body.appendChild(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(o),1e4)}var ct=null;function ft(e,t=0){if(!ct){ct=new Uint32Array(256);for(let n=0;n<256;n++){let r=n;for(let o=0;o<8;o++)r=r&1?3988292384^r>>>1:r>>>1;ct[n]=r>>>0}}t=~t>>>0;for(let n=0;n<e.length;n++)t=ct[(t^e[n])&255]^t>>>8;return~t>>>0}var Fi=[137,80,78,71,13,10,26,10];async function Oi(e){if(typeof CompressionStream=="function"){let n=new CompressionStream("deflate"),r=new Blob([e]).stream().pipeThrough(n);return new Uint8Array(await new Response(r).arrayBuffer())}let{deflateSync:t}=await import("node:zlib");return new Uint8Array(t(e))}function Ue(e,t){let n=new Uint8Array(12+t.length),r=new DataView(n.buffer);r.setUint32(0,t.length);for(let o=0;o<4;o++)n[4+o]=e.charCodeAt(o);return n.set(t,8),r.setUint32(8+t.length,ft(n.subarray(4,8+t.length))),n}function Di(e){let t=e.data,n=e.width*e.height,r=new Map,o=[],i=new Uint8Array(n);for(let a=0;a<n;a++){let s=a*4,c=t[s+3]===0?-1:(t[s]<<24|t[s+1]<<16|t[s+2]<<8|t[s+3])>>>0,l=r.get(c);if(l===void 0){if(o.length===256)return null;l=o.length,r.set(c,l),o.push(c===-1?[0,0,0,0]:[t[s],t[s+1],t[s+2],t[s+3]])}i[a]=l}return{colors:o,indices:i}}async function ut(e,t={}){t.width&&t.height?e=Vt(e,t.width,t.height):(t.scale&&t.scale>1||t.grid)&&(e=ge(e,t.scale||1,t));let{width:n,height:r}=e,o=t.indexed===!1?null:Di(e),i=new Uint8Array(13),a=new DataView(i.buffer);a.setUint32(0,n),a.setUint32(4,r);let s=[new Uint8Array(Fi)],c;if(o){let f=o.colors.length<=2?1:o.colors.length<=4?2:o.colors.length<=16?4:8;i.set([f,3,0,0,0],8);let m=Math.ceil(n*f/8);c=new Uint8Array((m+1)*r);for(let b=0;b<r;b++){let g=b*(m+1)+1;for(let x=0;x<n;x++){let y=o.indices[b*n+x],h=x*f;c[g+(h>>3)]|=y<<8-f-(h&7)}}if(s.push(Ue("IHDR",i)),s.push(Ue("PLTE",Uint8Array.from(o.colors.flatMap(b=>b.slice(0,3))))),o.colors.some(b=>b[3]<255)){let b=o.colors.length;for(;b>0&&o.colors[b-1][3]===255;)b--;s.push(Ue("tRNS",Uint8Array.from(o.colors.slice(0,b).map(g=>g[3]))))}}else{i.set([8,6,0,0,0],8),c=new Uint8Array((n*4+1)*r);for(let f=0;f<r;f++)c.set(e.data.subarray?e.data.subarray(f*n*4,(f+1)*n*4):Array.prototype.slice.call(e.data,f*n*4,(f+1)*n*4),f*(n*4+1)+1);s.push(Ue("IHDR",i))}s.push(Ue("IDAT",await Oi(c))),s.push(Ue("IEND",new Uint8Array(0)));let l=s.reduce((f,m)=>f+m.length,0),u=new Uint8Array(l),d=0;for(let f of s)u.set(f,d),d+=f.length;return u}var Vi=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement,Yi=e=>typeof VideoFrame<"u"&&e instanceof VideoFrame;async function Qt(e={}){let t=e.backend||"auto",n=null,r=null;if(t!=="cpu"&&typeof document<"u")try{n=await Sr()}catch(l){if(r=l,t==="webgl")throw l}let o=typeof document<"u"?document.createElement("canvas"):null,i={source:null,frame:null},a=Promise.resolve();async function s(l){if(l===i.source&&i.frame&&!Vi(l)&&!Yi(l))return i.frame.dirty=!1,i.frame;let u=await st(l,{maxSize:e.maxSourceSize,canvas:o});return i={source:l,frame:u},u}async function c(l,u){let d=typeof performance<"u"?performance.now():Date.now(),f=await s(l),m=It(u,f),b,g="cpu",x=m.kind==="diffusion"&&(e.diffusion==="cpu"||e.diffusion!=="gpu"&&n&&n.software);n&&f.canvas&&!x?(b=await n.run(m,f),g="webgl"):b=Ft(m,f);let y=(typeof performance<"u"?performance.now():Date.now())-d;return Ur(m,b,g,y)}return{get backend(){return n?"webgl":"cpu"},get renderer(){return n?n.renderer:""},get fallbackReason(){return r?String(r.message||r):""},process(l,u={}){let d=a.then(()=>c(l,u));return a=d.catch(()=>{}),d},invalidate(){i={source:null,frame:null}},destroy(){n&&n.destroy(),n=null},get shader(){return n?n.shader:null}}}function Ur(e,t,n="cpu",r=0){return{width:e.width,height:e.height,data:t,palette:e.paletteHex?e.paletteHex.slice():null,settings:e.settings,kind:e.kind,waves:e.waves,crop:{x:e.crop.x/e.srcWidth,y:e.crop.y/e.srcHeight,w:e.crop.w/e.srcWidth,h:e.crop.h/e.srcHeight},backend:n,ms:r,usedColors(){return Yt(this)},toImageData(){return new ImageData(new Uint8ClampedArray(this.data),this.width,this.height)},toCanvas(i=1,a={}){return $t(this,i,a)},toPNG(i={}){return ut(this,i)},async toBlob(i={}){return new Blob([await ut(this,i)],{type:"image/png"})}}}var lt=null;async function $i(e,t){return t===void 0&&e&&typeof e=="object"&&"image"in e&&"width"in e?Ki(e):(lt||(lt=Qt()),(await lt).process(e,t))}async function Ki(e){let{image:t,width:n,dither:r="none",strength:o=0,palette:i=null,resolution:a="original"}=e,s={source:"none"};if(Array.isArray(i))s={source:"custom",colors:i};else if(typeof i=="string"){let{fetchLospec:d}=await Promise.resolve().then(()=>(Zt(),Cr)),f=await d(i);s={source:"custom",colors:f.colors,name:f.name}}let c=fe({size:{width:n},palette:s,dither:{method:St[String(r).toLowerCase()]||"none",strength:o/100},alpha:{threshold:0}});lt||(lt=Qt());let u=await(await lt).process(t,c);if(a==="original"){let d=await st(t),f=document.createElement("canvas");f.width=d.width,f.height=d.height;let m=f.getContext("2d");return m.imageSmoothingEnabled=!1,m.drawImage(u.toCanvas(1),0,0,f.width,f.height),f}return u.toCanvas(1)}qt();Zt();var Pr=[{id:"balanced",name:"Balanced",description:"Endesga 32, Bayer 4\xD74. A good first look at most photos.",settings:{size:{width:96},palette:{source:"builtin",id:"endesga-32"},dither:{method:"bayer4",strength:.6}}},{id:"game-boy",name:"Game Boy",description:"Four greens, 160 px wide, ordered dither.",settings:{size:{width:160},palette:{source:"builtin",id:"game-boy-dmg"},dither:{method:"bayer4",strength:1},adjust:{contrast:.15}}},{id:"pico-8",name:"PICO-8",description:"128 px, the PICO-8 palette, blue-noise dither.",settings:{size:{width:128},palette:{source:"builtin",id:"pico-8"},dither:{method:"bluenoise",strength:.7}}},{id:"one-bit",name:"1-bit Atkinson",description:"Classic Mac look: two colours, Atkinson diffusion.",settings:{size:{width:192},palette:{source:"builtin",id:"1-bit-monitor"},dither:{method:"atkinson",strength:1},adjust:{contrast:.2}}},{id:"faithful",name:"Faithful colour",description:"Palette extracted from the image, Floyd\u2013Steinberg.",settings:{size:{width:128},palette:{source:"extract",count:24},dither:{method:"floyd-steinberg",strength:.75}}},{id:"sprite",name:"Clean sprite",description:"No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.",settings:{size:{width:48,resample:"nearest"},palette:{source:"extract",count:12},dither:{method:"none"},cleanup:{orphans:!0},outline:{mode:"outer",color:"#1a1c2c"}}},{id:"cga",name:"CGA",description:"16 hard colours with an 8\xD78 Bayer pattern.",settings:{size:{width:160},palette:{source:"builtin",id:"cga-16"},dither:{method:"bayer8",strength:1}}},{id:"newsprint",name:"Newsprint",description:"Grey clustered-dot halftone.",settings:{size:{width:220},palette:{source:"builtin",id:"grayscale-4"},dither:{method:"cluster8",strength:1},adjust:{saturation:-1}}},{id:"soft",name:"Soft painterly",description:"Resurrect 64 with Sierra Lite and a light smooth.",settings:{size:{width:112},palette:{source:"builtin",id:"resurrect-64"},dither:{method:"sierra-lite",strength:.6},cleanup:{smooth:!0}}}],qi=e=>Pr.find(t=>t.id===e)||null;le();le();var tn=class{constructor(){this.buf=new Uint8Array(65536),this.n=0}byte(t){if(this.n===this.buf.length){let n=new Uint8Array(this.buf.length*2);n.set(this.buf),this.buf=n}this.buf[this.n++]=t}bytes(t){for(let n=0;n<t.length;n++)this.byte(t[n])}u16(t){this.byte(t&255),this.byte(t>>8&255)}str(t){for(let n=0;n<t.length;n++)this.byte(t.charCodeAt(n))}result(){return this.buf.slice(0,this.n)}};function Ji(e,t,n){let r=1<<t,o=r+1,i=t+1,a=o+1,s=new Map,c=0,l=0,u=[],d=[],f=b=>{for(c|=b<<l,l+=i;l>=8;)d.push(c&255),c>>>=8,l-=8,d.length===255&&(u.push(d),d=[])};f(r);let m=e[0];for(let b=1;b<e.length;b++){let g=e[b],x=m*256+g,y=s.get(x);if(y!==void 0){m=y;continue}f(m),a<4096?(s.set(x,a++),a>1<<i&&i<12&&i++):(f(r),s=new Map,i=t+1,a=o+1),m=g}f(m),f(o),l>0&&d.push(c&255),d.length&&u.push(d),n.byte(t);for(let b of u)n.byte(b.length),n.bytes(b);n.byte(0)}var en=(e,t)=>e[t+3]<128?-1:e[t]<<16|e[t+1]<<8|e[t+2];function Lr(e,t){let n=[...e].filter(s=>s!==-1),r=n.map(s=>[s>>16,s>>8&255,s&255]),o=t?r.length:-1;t&&r.push([0,0,0]);let i=1;for(;1<<i<r.length;)i++;for(;r.length<1<<i;)r.push([0,0,0]);let a=new Map(n.map((s,c)=>[s,c]));return{colors:r,bits:i,tIndex:o,index:a}}function Zi(e,t){let n=je(e,t).map(ce),r=new Uint8ClampedArray(e.data),o=new Map;for(let i=0;i<r.length;i+=4){if(r[i+3]<128)continue;let a=r[i]<<16|r[i+1]<<8|r[i+2],s=o.get(a);if(s===void 0){let c=1/0;s=0;for(let l=0;l<n.length;l++){let u=r[i]-n[l][0],d=r[i+1]-n[l][1],f=r[i+2]-n[l][2],m=u*u*3+d*d*4+f*f*2;m<c&&(c=m,s=l)}o.set(a,s)}r.set(n[s],i)}return{...e,data:r}}function Qi(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(1,Math.round(t.scale||1)),r=e.map(m=>({...n>1?ge(m,n):m,delay:m.delay??t.delay??100})),o=r[0].width,i=r[0].height,a=!1,s=new Set,c=r.map(m=>{let b=new Set;for(let g=0;g<m.data.length;g+=4){let x=en(m.data,g);x===-1&&(a=!0),b.add(x),s.add(x)}return b}),l=m=>m.size-(m.has(-1)?1:0),d=l(s)+(a?1:0)<=256?Lr(s,a):null,f=new tn;if(f.str("GIF89a"),f.u16(o),f.u16(i),f.byte(d?240|d.bits-1:0),f.byte(0),f.byte(0),d)for(let m of d.colors)f.bytes(m);return r.length>1&&t.loop!==-1&&(f.byte(33),f.byte(255),f.byte(11),f.str("NETSCAPE2.0"),f.byte(3),f.byte(1),f.u16(t.loop||0),f.byte(0)),r.forEach((m,b)=>{let g=m,x=d,y=c[b];if(!x){let E=a?255:256;if(l(y)>E){g=Zi(m,E),y=new Set;for(let p=0;p<g.data.length;p+=4)y.add(en(g.data,p))}x=Lr(y,y.has(-1))}if(f.byte(33),f.byte(249),f.byte(4),f.byte((a?2:1)<<2|(x.tIndex>=0?1:0)),f.u16(Math.max(2,Math.round(g.delay/10))),f.byte(x.tIndex>=0?x.tIndex:0),f.byte(0),f.byte(44),f.u16(0),f.u16(0),f.u16(o),f.u16(i),f.byte(x===d?0:128|x.bits-1),x!==d)for(let E of x.colors)f.bytes(E);let h=new Uint8Array(o*i);for(let E=0;E<h.length;E++){let p=en(g.data,E*4);h[E]=p===-1?x.tIndex:x.index.get(p)}Ji(h,Math.max(2,x.bits),f)}),f.byte(59),f.result()}var Ir=new TextEncoder;function ea(e){let t=[],n=[],r=0,o=new Set;for(let u of e){let d=u.name.replace(/\\/g,"/").replace(/^\/+/,"");if(o.has(d)){let T=/^(.*?)(\.[^.]*)?$/.exec(d),R=2;for(;o.has(`${T[1]}-${R}${T[2]||""}`);)R++;d=`${T[1]}-${R}${T[2]||""}`}o.add(d);let f=Ir.encode(d),m=typeof u.data=="string"?Ir.encode(u.data):u.data,b=ft(m),g=u.date||new Date,x=g.getHours()<<11|g.getMinutes()<<5|g.getSeconds()>>1,y=g.getFullYear()-1980<<9|g.getMonth()+1<<5|g.getDate(),h=new Uint8Array(30+f.length),E=new DataView(h.buffer);E.setUint32(0,67324752,!0),E.setUint16(4,20,!0),E.setUint16(6,2048,!0),E.setUint16(8,0,!0),E.setUint16(10,x,!0),E.setUint16(12,y,!0),E.setUint32(14,b,!0),E.setUint32(18,m.length,!0),E.setUint32(22,m.length,!0),E.setUint16(26,f.length,!0),E.setUint16(28,0,!0),h.set(f,30);let p=new Uint8Array(46+f.length),_=new DataView(p.buffer);_.setUint32(0,33639248,!0),_.setUint16(4,20,!0),_.setUint16(6,20,!0),_.setUint16(8,2048,!0),_.setUint16(10,0,!0),_.setUint16(12,x,!0),_.setUint16(14,y,!0),_.setUint32(16,b,!0),_.setUint32(20,m.length,!0),_.setUint32(24,m.length,!0),_.setUint16(28,f.length,!0),_.setUint32(42,r,!0),p.set(f,46),t.push(h,m),n.push(p),r+=h.length+m.length}let i=n.reduce((u,d)=>u+d.length,0),a=new Uint8Array(22),s=new DataView(a.buffer);s.setUint32(0,101010256,!0),s.setUint16(8,e.length,!0),s.setUint16(10,e.length,!0),s.setUint32(12,i,!0),s.setUint32(16,r,!0);let c=new Uint8Array(r+i+22),l=0;for(let u of[...t,...n,a])c.set(u,l),l+=u.length;return c}var nn=(e,t)=>({width:e,height:t,data:new Uint8ClampedArray(e*t*4)});function ta(e,t,n,r,o=0,i=0,a=t.width,s=t.height){for(let c=0;c<s;c++){let l=((i+c)*t.width+o)*4,u=((r+c)*e.width+n)*4;e.data.set(t.data.subarray?t.data.subarray(l,l+a*4):Array.prototype.slice.call(t.data,l,l+a*4),u)}}function Fr(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(0,t.padding|0),r=Math.max(...e.map(f=>f.width)),o=Math.max(...e.map(f=>f.height)),i=Math.max(1,Math.min(e.length,t.columns||Math.ceil(Math.sqrt(e.length)))),a=Math.ceil(e.length/i),s=i*r+(i-1)*n,c=a*o+(a-1)*n,l=nn(s,c),u={};e.forEach((f,m)=>{let b=m%i*(r+n),g=Math.floor(m/i)*(o+n);ta(l,f,b,g),u[f.name||`frame-${String(m).padStart(3,"0")}`]={frame:{x:b,y:g,w:f.width,h:f.height},sourceSize:{w:f.width,h:f.height},...f.delay!=null?{duration:Math.round(f.delay)}:{}}});let d={frames:u,meta:{app:"image-to-pixel",image:(t.name||"sheet")+".png",size:{w:s,h:c},scale:"1",columns:i,rows:a,padding:n}};return{image:l,atlas:d}}function na(e,t={}){let n=Math.max(1,t.tileWidth||8),r=Math.max(1,t.tileHeight||n),o=Math.ceil(e.width/n),i=Math.ceil(e.height/r),a=[],s=new Map,c=[],l=[],u=(b,g)=>{let x=nn(n,r);for(let y=0;y<r;y++)for(let h=0;h<n;h++){let E=b*n+h,p=g*r+y;if(E>=e.width||p>=e.height)continue;let _=(p*e.width+E)*4;x.data.set([e.data[_],e.data[_+1],e.data[_+2],e.data[_+3]],(y*n+h)*4)}return x},d=b=>{let g="";for(let x=0;x<b.data.length;x+=4)g+=b.data[x+3]===0?".":String.fromCharCode(b.data[x]+1,b.data[x+1]+1,b.data[x+2]+1);return g},f=(b,g,x)=>{let y=nn(n,r);for(let h=0;h<r;h++)for(let E=0;E<n;E++){let p=((x?r-1-h:h)*n+(g?n-1-E:E))*4;y.data.set(b.data.subarray(p,p+4),(h*n+E)*4)}return y};for(let b=0;b<i;b++)for(let g=0;g<o;g++){let x=u(g,b),y=s.get(d(x)),h=0;if(y===void 0&&t.flips)for(let[E,p,_]of[[1,0,1],[0,1,2],[1,1,3]]){let T=s.get(d(f(x,E,p)));if(T!==void 0){y=T,h=_;break}}y===void 0&&(y=a.length,a.push(x),s.set(d(x),y)),c.push(y),l.push(h)}return{image:Fr(a,{columns:t.columns||Math.min(16,a.length)}).image,map:{width:o,height:i,tileWidth:n,tileHeight:r,tiles:c,...t.flips?{flips:l}:{}},count:a.length}}var ra=(e,t,n=4e3)=>new Promise((r,o)=>{let i=setTimeout(()=>{e.removeEventListener(t,a),o(new Error(`Timed out waiting for "${t}"`))},n),a=()=>{clearTimeout(i),r()};e.addEventListener(t,a,{once:!0})}),oa={1:"loading was aborted",2:"a network error stopped the download",3:"the browser could not decode it",4:"this browser can't play this video's format"};function rn(e){let t=e.error?e.error.code:0,n=new Error(oa[t]||"the video could not be loaded");return n.code=t,e.error&&e.error.message&&(n.detail=e.error.message),n}var Or=(e,t,n)=>new Promise((r,o)=>{let i=()=>{clearTimeout(c),e.removeEventListener(t,a),e.removeEventListener("error",s)},a=()=>{i(),r()},s=()=>{i(),o(rn(e))},c=setTimeout(()=>{i(),o(new Error(`no response from the video decoder after ${n/1e3} s`))},n);e.addEventListener(t,a,{once:!0}),e.addEventListener("error",s,{once:!0})});async function on(e,{timeout:t=6e4}={}){if(e.error)throw rn(e);return e.readyState<1&&await Or(e,"loadedmetadata",t),e.readyState<2&&await Or(e,"loadeddata",t).catch(n=>{if(n.code)throw n}),e}async function ia(e){let t=new Uint8Array(await e.arrayBuffer()),n={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"};for(let i=0;i+24<t.length;i++)if(t[i]===115&&t[i+1]===116&&t[i+2]===115&&t[i+3]===100){let a=String.fromCharCode(t[i+16],t[i+17],t[i+18],t[i+19]);if(n[a])return n[a]}let r=new TextDecoder("latin1").decode(t.subarray(0,Math.min(t.length,1<<20))),o=/V_(VP8|VP9|AV1|MPEG4\/ISO\/AVC|MPEGH\/ISO\/HEVC)/.exec(r);return o?{VP8:"VP8",VP9:"VP9",AV1:"AV1","MPEG4/ISO/AVC":"H.264","MPEGH/ISO/HEVC":"H.265 (HEVC)"}[o[1]]:""}async function an(e,t){if(t=Math.max(0,Math.min(t,(e.duration||0)-1e-4)),Math.abs(e.currentTime-t)<1e-6&&e.readyState>=2)return;let n="requestVideoFrameCallback"in e?new Promise(o=>{e.requestVideoFrameCallback(()=>o()),setTimeout(o,500)}):null,r=ra(e,"seeked");e.currentTime=t,await r,n&&await n}async function aa(e,t=30){if(!("requestVideoFrameCallback"in e))return t;await on(e);let n={t:e.currentTime,muted:e.muted,paused:e.paused},r=[];try{e.muted=!0,await new Promise(a=>{let s=setTimeout(a,1200),c=(l,u)=>{r.push(u.mediaTime),r.length>=12?(clearTimeout(s),a()):e.requestVideoFrameCallback(c)};e.requestVideoFrameCallback(c),e.play().catch(()=>{clearTimeout(s),a()})})}finally{e.pause(),e.muted=n.muted,await an(e,n.t).catch(()=>{})}let o=[];for(let a=1;a<r.length;a++){let s=r[a]-r[a-1];s>.001&&o.push(s)}if(o.length<3)return t;o.sort((a,s)=>a-s);let i=1/o[Math.floor(o.length/2)];for(let a of[12,15,23.976,24,25,29.97,30,48,50,59.94,60])if(Math.abs(i-a)<.6)return a;return Math.round(i)}function Dr({duration:e,fps:t,start:n=0,end:r=e,maxFrames:o=1/0}){let i=[],a=Math.min(o,Math.max(1,Math.floor((r-n)*t+1e-6)));for(let s=0;s<a;s++)i.push(n+(s+.5)/t);return i}async function sa(e,t){await on(e);let n=e.paused;e.pause();let r=Dr({duration:e.duration,...t});for(let o=0;o<r.length;o++){if(t.signal&&t.signal.aborted)throw new DOMException("Aborted","AbortError");await an(e,r[o]),await t.onFrame({index:o,time:r[o],total:r.length})}return n||e.play().catch(()=>{}),r.length}var ps="3.0.0";export{et as ASPECTS,Rn as DEFAULTS,_t as DITHER_METHODS,Ut as KERNELS,St as LEGACY_DITHER,Be as MAX_SIZE,An as PALETTES,Pr as PRESETS,Xe as SETTINGS_VERSION,ps as VERSION,be as bayer,na as buildTileset,Rt as compactSettings,Qt as createPixelator,ea as createZip,At as cropRect,Qr as decodeSettings,kn as defaultSettings,Li as detectGrid,Tt as ditherKind,Ii as downloadBlob,Qi as encodeGIF,ut as encodePNG,Zr as encodeSettings,aa as estimateFps,je as extractPalette,kr as fetchLospec,sa as forEachFrame,Dr as frameTimes,qe as getPalette,qi as getPreset,Pi as hasTransparency,Mr as loadImage,Jt as lospecSlug,It as makePlan,Ur as makeResult,rn as mediaError,no as mergeSettings,fe as normalizeSettings,Ze as oklab,Fr as packSpriteSheet,ce as parseColor,ao as parseMatrix,Gi as parsePalette,$i as pixelate,Vt as resizeNearest,Mt as resolveSize,Ft as runCPU,an as seekTo,to as settingsFromJSON,eo as settingsToJSON,ia as sniffVideoCodec,Ct as thresholdMap,$t as toCanvas,st as toFrame,zi as toGPL,Ce as toHex,Hi as toHexFile,Wi as toPaletteJSON,Yt as uniqueColors,ge as upscale,on as videoReady};
|
|
301
|
+
`;var ze=(e,t)=>{let n=document.createElement("canvas");return n.width=e,n.height=t,n};async function Sr(){if(typeof document>"u")throw new Error("No DOM");let e=ze(1,1).getContext("webgl2");if(!e)throw new Error("WebGL 2 is not available");if(!e.getExtension("EXT_color_buffer_float"))throw new Error("Float render targets are not available");let t=e.getExtension("WEBGL_debug_renderer_info"),n=String(t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER));e.getExtension("WEBGL_lose_context")?.loseContext();let r=ze(1,1),o=ze(1,1),i=ze(256,1),a=ze(1,1),s=h=>({element:h,filter:"nearest",wrap:"clamp"}),c=br({canvas:r,webgl:2,size:[1,1],pixelRatio:1,autoplay:!1,pauseWhenHidden:!1,pointer:!1,errorOverlay:!1,warnMissingUniforms:!1,preserveDrawingBuffer:!0,premultipliedAlpha:!1,antialias:!1,dialect:"shadermate",common:wr,samplers:{u_palette:s(i),u_matrix:s(a)},uniforms:{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:.5,u_mode:0,u_levels:1,u_amount:0,u_skew:1,u_strength:1,u_kn:0,u_kernel:new Float32Array(Pt*3),u_outline:0,u_corners:0,u_outlineColor:[0,0,0]},passes:[{name:"prep",shader:xr,float:"full",filter:"nearest",channels:[{...s(o),dynamic:!1}]},{name:"quant",shader:gr,filter:"nearest",channels:["prep"]},{name:"diffuse",shader:yr,float:"full",filter:"nearest",pingpong:!0,iterations:2,channels:["prep","diffuse"]},{name:"resolve",shader:Er,filter:"nearest",channels:["quant","diffuse"]},{name:"orphan",shader:vr,filter:"nearest",channels:["resolve"]},{name:"smooth",shader:_r,filter:"nearest",channels:["orphan"]},{name:"out",shader:Tr,screen:!0,channels:["smooth"]}]}),l=null;if(c.on("error",h=>{l=h}),await c.ready,l||c.error)throw c.destroy(),l||c.error;let u=(h,E)=>{for(let p in E)c.set(p,E[p],h)},d=null,f="",m="";async function b(h){if(h.canvas===d&&!h.dirty)return;o.width=h.width,o.height=h.height;let E=o.getContext("2d");E.clearRect(0,0,o.width,o.height),E.drawImage(h.canvas,0,0),await c.setChannel(0,{...s(o),dynamic:!1},"prep"),d=h.canvas}function g(h){let E=h.palette.map(T=>T.join(",")).join(";");if(E===f)return;f=E;let p=i.getContext("2d"),_=p.createImageData(256,1);h.palette.forEach((T,M)=>_.data.set([T[0],T[1],T[2],255],M*4)),p.putImageData(_,0,0)}function x(h){let E=h?`${h.w}x${h.h}:${h.levels}:${h.values.join(",")}`:"none";if(E===m)return;m=E;let p=h||{w:1,h:1,values:[0]};a.width=p.w,a.height=p.h;let _=a.getContext("2d"),T=_.createImageData(p.w,p.h);for(let M=0;M<p.values.length;M++)T.data.set([p.values[M],0,0,255],M*4);_.putImageData(T,0,0)}async function y(h,E){let p=h.settings;await b(E),h.quantize&&g(h),x(h.map),(c.width!==h.width||c.height!==h.height)&&c.setSize(h.width,h.height);let _=h.kind==="diffusion",T=new Array(Pt).fill(null).map((D,Z)=>h.kernel&&h.kernel[Z]||[0,0,0]);c.set({u_count:h.palette.length||1,u_distance:h.distance,u_resample:p.size.resample==="nearest"?1:0,u_adjust:[p.adjust.brightness,p.adjust.contrast,p.adjust.saturation,p.adjust.gamma],u_hue:p.adjust.hue,u_crop:[h.crop.x,h.crop.y,h.crop.w,h.crop.h],u_alphaCut:p.alpha.threshold,u_mode:h.quantize?h.kind==="ordered"?2:1:0,u_levels:h.map?h.map.levels:1,u_amount:h.map?h.spread*p.dither.strength:0,u_skew:h.skew,u_strength:p.dither.strength,u_kn:h.kernel?h.kernel.length:0,u_kernel:new Float32Array(T.flat()),u_outline:{none:0,outer:1,inner:2}[h.outline.mode],u_corners:h.outline.corners?1:0,u_outlineColor:h.outline.color.map(D=>D/255)}),u("diffuse",{u_on:_?1:0}),u("resolve",{u_on:_?1:0}),u("orphan",{u_on:p.cleanup.orphans?1:0}),u("smooth",{u_on:p.cleanup.smooth?1:0}),c.getPass("diffuse").cfg.iterations=_?h.waves:1;let{data:M}=c.readPixels(),S=h.width,O=h.height,L=new Uint8ClampedArray(S*O*4),X=S*4;for(let D=0;D<O;D++)L.set(M.subarray((O-1-D)*X,(O-D)*X),D*X);return L}return{name:"webgl",renderer:n,software:/swiftshader|llvmpipe|softpipe|software|basic render/i.test(n),run:y,shader:c,destroy(){c.destroy()}}}var Wt=typeof document<"u",Ar=e=>e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e&&e.data&&e.data.length===e.width*e.height*4;async function Rr(e){if(typeof Blob<"u"&&e instanceof Blob){if(typeof createImageBitmap=="function")try{return await createImageBitmap(e)}catch{}e=URL.createObjectURL(e)}if(!Wt)throw new Error("Loading images by URL needs a browser; pass { width, height, data } in Node.");let t=new Image;return t.crossOrigin="anonymous",t.decoding="async",t.src=e,await t.decode(),t}function Ci(e){return{width:e.naturalWidth||e.videoWidth||e.displayWidth||e.codedWidth||e.width||0,height:e.naturalHeight||e.videoHeight||e.displayHeight||e.codedHeight||e.height||0}}function ki(e){if(e&&!Ar(e)&&typeof e=="object"){if(e.canvas&&typeof e.canvas=="object"&&"getContext"in e.canvas)return e.canvas;if(e.elt&&typeof e.elt=="object"&&"getContext"in e.elt)return e.elt}return e}async function st(e,t={}){let n=t.maxSize||4096,r=ki(e);if((typeof r=="string"||typeof Blob<"u"&&r instanceof Blob)&&(r=await Rr(r)),r&&typeof r.complete=="boolean"&&!r.complete&&r.decode&&await r.decode(),Ar(r)){let u={width:r.width,height:r.height,data:r.data,canvas:null};return Wt&&Object.defineProperty(u,"canvas",{configurable:!0,get(){let d=document.createElement("canvas");d.width=r.width,d.height=r.height;let f=new ImageData(new Uint8ClampedArray(r.data),r.width,r.height);return d.getContext("2d").putImageData(f,0,0),Object.defineProperty(u,"canvas",{value:d}),d}}),u}if(!Wt)throw new Error("Unsupported source in a non-browser environment. Pass { width, height, data }.");let{width:o,height:i}=Ci(r);if(!o||!i)throw new Error("Source has no size yet (is the image or video loaded?)");let a=Math.min(1,n/Math.max(o,i));o=Math.max(1,Math.round(o*a)),i=Math.max(1,Math.round(i*a));let s=t.canvas||document.createElement("canvas");s.width=o,s.height=i;let c=s.getContext("2d",{willReadFrequently:!0});c.clearRect(0,0,o,i),c.imageSmoothingEnabled=a<1,c.imageSmoothingQuality="high",c.drawImage(r,0,0,o,i);let l=null;return{width:o,height:i,canvas:s,dirty:!0,get data(){return l||(l=c.getImageData(0,0,o,i).data)}}}le();function ge(e,t=1,n={}){t=Math.max(1,Math.round(t));let r=e.width*t,o=e.height*t,i=new Uint8ClampedArray(r*o*4),a=e.data,s=e.width;for(let c=0;c<o;c++){let l=c/t|0;for(let u=0;u<r;u++){let d=(l*s+(u/t|0))*4,f=(c*r+u)*4;i[f]=a[d],i[f+1]=a[d+1],i[f+2]=a[d+2],i[f+3]=a[d+3]}}if(n.grid&&t>=3){let[c,l,u]=ce(n.gridColor||"#000000"),d=n.gridAlpha??.35;for(let f=0;f<o;f++)for(let m=0;m<r;m++){if(m%t&&f%t)continue;let b=(f*r+m)*4,g=i[b+3]/255,x=d+g*(1-d);i[b]=(c*d+i[b]*g*(1-d))/x,i[b+1]=(l*d+i[b+1]*g*(1-d))/x,i[b+2]=(u*d+i[b+2]*g*(1-d))/x,i[b+3]=x*255}}return{width:r,height:o,data:i}}function Vt(e,t,n){t=Math.max(1,Math.round(t)),n=Math.max(1,Math.round(n));let r=new Uint8ClampedArray(t*n*4),o=new Int32Array(t);for(let i=0;i<t;i++)o[i]=Math.min(e.width-1,Math.floor((i+.5)*e.width/t));for(let i=0;i<n;i++){let a=Math.min(e.height-1,Math.floor((i+.5)*e.height/n));for(let s=0;s<t;s++){let c=(a*e.width+o[s])*4,l=(i*t+s)*4;r[l]=e.data[c],r[l+1]=e.data[c+1],r[l+2]=e.data[c+2],r[l+3]=e.data[c+3]}}return{width:t,height:n,data:r}}function Yt(e,t=1/0){let n=new Set,r=e.data;for(let o=0;o<r.length&&!(r[o+3]!==0&&(n.add(r[o]<<16|r[o+1]<<8|r[o+2]),n.size>t));o+=4);return[...n].map(o=>Ce([o>>16,o>>8&255,o&255]))}function Pi(e){for(let t=3;t<e.data.length;t+=4)if(e.data[t]<255)return!0;return!1}function Li(e,t=8){let{width:n,height:r,data:o}=e,i=(u,d)=>Math.abs(o[u]-o[d])<=t&&Math.abs(o[u+1]-o[d+1])<=t&&Math.abs(o[u+2]-o[d+2])<=t&&Math.abs(o[u+3]-o[d+3])<=t,a=(u,d)=>d?a(d,u%d):u,s=0,c=Math.max(1,Math.floor(r/64)),l=Math.max(1,Math.floor(n/64));for(let u=0;u<r;u+=c){let d=1;for(let f=1;f<n;f++)if(i((u*n+f)*4,(u*n+f-1)*4))d++;else if(s=a(s,d),d=1,s===1)return 1}for(let u=0;u<n;u+=l){let d=1;for(let f=1;f<r;f++)if(i((f*n+u)*4,((f-1)*n+u)*4))d++;else if(s=a(s,d),d=1,s===1)return 1}return s||1}function $t(e,t=1,n={}){let r=t>1||n.grid?ge(e,t,n):e,o=n.canvas||document.createElement("canvas");return o.width=r.width,o.height=r.height,o.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(r.data),r.width,r.height),0,0),o}function Ii(e,t,n="application/octet-stream"){let r=e instanceof Blob?e:new Blob([e],{type:n}),o=URL.createObjectURL(r),i=document.createElement("a");i.href=o,i.download=t,i.rel="noopener",document.body.appendChild(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(o),1e4)}var ct=null;function ft(e,t=0){if(!ct){ct=new Uint32Array(256);for(let n=0;n<256;n++){let r=n;for(let o=0;o<8;o++)r=r&1?3988292384^r>>>1:r>>>1;ct[n]=r>>>0}}t=~t>>>0;for(let n=0;n<e.length;n++)t=ct[(t^e[n])&255]^t>>>8;return~t>>>0}var Fi=[137,80,78,71,13,10,26,10];async function Oi(e){if(typeof CompressionStream=="function"){let n=new CompressionStream("deflate"),r=new Blob([e]).stream().pipeThrough(n);return new Uint8Array(await new Response(r).arrayBuffer())}let{deflateSync:t}=await import("node:zlib");return new Uint8Array(t(e))}function ke(e,t){let n=new Uint8Array(12+t.length),r=new DataView(n.buffer);r.setUint32(0,t.length);for(let o=0;o<4;o++)n[4+o]=e.charCodeAt(o);return n.set(t,8),r.setUint32(8+t.length,ft(n.subarray(4,8+t.length))),n}function Di(e){let t=e.data,n=e.width*e.height,r=new Map,o=[],i=new Uint8Array(n);for(let a=0;a<n;a++){let s=a*4,c=t[s+3]===0?-1:(t[s]<<24|t[s+1]<<16|t[s+2]<<8|t[s+3])>>>0,l=r.get(c);if(l===void 0){if(o.length===256)return null;l=o.length,r.set(c,l),o.push(c===-1?[0,0,0,0]:[t[s],t[s+1],t[s+2],t[s+3]])}i[a]=l}return{colors:o,indices:i}}async function ut(e,t={}){t.width&&t.height?e=Vt(e,t.width,t.height):(t.scale&&t.scale>1||t.grid)&&(e=ge(e,t.scale||1,t));let{width:n,height:r}=e,o=t.indexed===!1?null:Di(e),i=new Uint8Array(13),a=new DataView(i.buffer);a.setUint32(0,n),a.setUint32(4,r);let s=[new Uint8Array(Fi)],c;if(o){let f=o.colors.length<=2?1:o.colors.length<=4?2:o.colors.length<=16?4:8;i.set([f,3,0,0,0],8);let m=Math.ceil(n*f/8);c=new Uint8Array((m+1)*r);for(let b=0;b<r;b++){let g=b*(m+1)+1;for(let x=0;x<n;x++){let y=o.indices[b*n+x],h=x*f;c[g+(h>>3)]|=y<<8-f-(h&7)}}if(s.push(ke("IHDR",i)),s.push(ke("PLTE",Uint8Array.from(o.colors.flatMap(b=>b.slice(0,3))))),o.colors.some(b=>b[3]<255)){let b=o.colors.length;for(;b>0&&o.colors[b-1][3]===255;)b--;s.push(ke("tRNS",Uint8Array.from(o.colors.slice(0,b).map(g=>g[3]))))}}else{i.set([8,6,0,0,0],8),c=new Uint8Array((n*4+1)*r);for(let f=0;f<r;f++)c.set(e.data.subarray?e.data.subarray(f*n*4,(f+1)*n*4):Array.prototype.slice.call(e.data,f*n*4,(f+1)*n*4),f*(n*4+1)+1);s.push(ke("IHDR",i))}s.push(ke("IDAT",await Oi(c))),s.push(ke("IEND",new Uint8Array(0)));let l=s.reduce((f,m)=>f+m.length,0),u=new Uint8Array(l),d=0;for(let f of s)u.set(f,d),d+=f.length;return u}var Vi=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement,Yi=e=>typeof VideoFrame<"u"&&e instanceof VideoFrame;async function Qt(e={}){let t=e.backend||"auto",n=null,r=null;if(t!=="cpu"&&typeof document<"u")try{n=await Sr()}catch(l){if(r=l,t==="webgl")throw l}let o=typeof document<"u"?document.createElement("canvas"):null,i={source:null,frame:null},a=Promise.resolve();async function s(l){if(l===i.source&&i.frame&&!Vi(l)&&!Yi(l))return i.frame.dirty=!1,i.frame;let u=await st(l,{maxSize:e.maxSourceSize,canvas:o});return i={source:l,frame:u},u}async function c(l,u){let d=typeof performance<"u"?performance.now():Date.now(),f=await s(l),m=It(u,f),b,g="cpu",x=m.kind==="diffusion"&&(e.diffusion==="cpu"||e.diffusion!=="gpu"&&n&&n.software);n&&f.canvas&&!x?(b=await n.run(m,f),g="webgl"):b=Ft(m,f);let y=(typeof performance<"u"?performance.now():Date.now())-d;return kr(m,b,g,y)}return{get backend(){return n?"webgl":"cpu"},get renderer(){return n?n.renderer:""},get fallbackReason(){return r?String(r.message||r):""},process(l,u={}){let d=a.then(()=>c(l,u));return a=d.catch(()=>{}),d},invalidate(){i={source:null,frame:null}},destroy(){n&&n.destroy(),n=null},get shader(){return n?n.shader:null}}}function kr(e,t,n="cpu",r=0){return{width:e.width,height:e.height,data:t,palette:e.paletteHex?e.paletteHex.slice():null,settings:e.settings,kind:e.kind,waves:e.waves,crop:{x:e.crop.x/e.srcWidth,y:e.crop.y/e.srcHeight,w:e.crop.w/e.srcWidth,h:e.crop.h/e.srcHeight},backend:n,ms:r,usedColors(){return Yt(this)},toImageData(){return new ImageData(new Uint8ClampedArray(this.data),this.width,this.height)},toCanvas(i=1,a={}){return $t(this,i,a)},toPNG(i={}){return ut(this,i)},async toBlob(i={}){return new Blob([await ut(this,i)],{type:"image/png"})}}}var lt=null;async function $i(e,t){return t===void 0&&e&&typeof e=="object"&&"image"in e&&"width"in e?Ki(e):(lt||(lt=Qt()),(await lt).process(e,t))}async function Ki(e){let{image:t,width:n,dither:r="none",strength:o=0,palette:i=null,resolution:a="original"}=e,s={source:"none"};if(Array.isArray(i))s={source:"custom",colors:i};else if(typeof i=="string"){let{fetchLospec:d}=await Promise.resolve().then(()=>(Zt(),Cr)),f=await d(i);s={source:"custom",colors:f.colors,name:f.name}}let c=fe({size:{width:n},palette:s,dither:{method:St[String(r).toLowerCase()]||"none",strength:o/100},alpha:{threshold:0}});lt||(lt=Qt());let u=await(await lt).process(t,c);if(a==="original"){let d=await st(t),f=document.createElement("canvas");f.width=d.width,f.height=d.height;let m=f.getContext("2d");return m.imageSmoothingEnabled=!1,m.drawImage(u.toCanvas(1),0,0,f.width,f.height),f}return u.toCanvas(1)}qt();Zt();var Pr=[{id:"balanced",name:"Balanced",description:"Endesga 32, Bayer 4\xD74. A good first look at most photos.",settings:{size:{width:96},palette:{source:"builtin",id:"endesga-32"},dither:{method:"bayer4",strength:.6}}},{id:"game-boy",name:"Game Boy",description:"Four greens, 160 px wide, ordered dither.",settings:{size:{width:160},palette:{source:"builtin",id:"game-boy-dmg"},dither:{method:"bayer4",strength:1},adjust:{contrast:.15}}},{id:"pico-8",name:"PICO-8",description:"128 px, the PICO-8 palette, blue-noise dither.",settings:{size:{width:128},palette:{source:"builtin",id:"pico-8"},dither:{method:"bluenoise",strength:.7}}},{id:"one-bit",name:"1-bit Atkinson",description:"Classic Mac look: two colours, Atkinson diffusion.",settings:{size:{width:192},palette:{source:"builtin",id:"1-bit-monitor"},dither:{method:"atkinson",strength:1},adjust:{contrast:.2}}},{id:"faithful",name:"Faithful colour",description:"Palette extracted from the image, Floyd\u2013Steinberg.",settings:{size:{width:128},palette:{source:"extract",count:24},dither:{method:"floyd-steinberg",strength:.75}}},{id:"sprite",name:"Clean sprite",description:"No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.",settings:{size:{width:48,resample:"nearest"},palette:{source:"extract",count:12},dither:{method:"none"},cleanup:{orphans:!0},outline:{mode:"outer",color:"#1a1c2c"}}},{id:"cga",name:"CGA",description:"16 hard colours with an 8\xD78 Bayer pattern.",settings:{size:{width:160},palette:{source:"builtin",id:"cga-16"},dither:{method:"bayer8",strength:1}}},{id:"newsprint",name:"Newsprint",description:"Grey clustered-dot halftone.",settings:{size:{width:220},palette:{source:"builtin",id:"grayscale-4"},dither:{method:"cluster8",strength:1},adjust:{saturation:-1}}},{id:"soft",name:"Soft painterly",description:"Resurrect 64 with Sierra Lite and a light smooth.",settings:{size:{width:112},palette:{source:"builtin",id:"resurrect-64"},dither:{method:"sierra-lite",strength:.6},cleanup:{smooth:!0}}}],qi=e=>Pr.find(t=>t.id===e)||null;le();le();var tn=class{constructor(){this.buf=new Uint8Array(65536),this.n=0}byte(t){if(this.n===this.buf.length){let n=new Uint8Array(this.buf.length*2);n.set(this.buf),this.buf=n}this.buf[this.n++]=t}bytes(t){for(let n=0;n<t.length;n++)this.byte(t[n])}u16(t){this.byte(t&255),this.byte(t>>8&255)}str(t){for(let n=0;n<t.length;n++)this.byte(t.charCodeAt(n))}result(){return this.buf.slice(0,this.n)}};function Ji(e,t,n){let r=1<<t,o=r+1,i=t+1,a=o+1,s=new Map,c=0,l=0,u=[],d=[],f=b=>{for(c|=b<<l,l+=i;l>=8;)d.push(c&255),c>>>=8,l-=8,d.length===255&&(u.push(d),d=[])};f(r);let m=e[0];for(let b=1;b<e.length;b++){let g=e[b],x=m*256+g,y=s.get(x);if(y!==void 0){m=y;continue}f(m),a<4096?(s.set(x,a++),a>1<<i&&i<12&&i++):(f(r),s=new Map,i=t+1,a=o+1),m=g}f(m),f(o),l>0&&d.push(c&255),d.length&&u.push(d),n.byte(t);for(let b of u)n.byte(b.length),n.bytes(b);n.byte(0)}var en=(e,t)=>e[t+3]<128?-1:e[t]<<16|e[t+1]<<8|e[t+2];function Lr(e,t){let n=[...e].filter(s=>s!==-1),r=n.map(s=>[s>>16,s>>8&255,s&255]),o=t?r.length:-1;t&&r.push([0,0,0]);let i=1;for(;1<<i<r.length;)i++;for(;r.length<1<<i;)r.push([0,0,0]);let a=new Map(n.map((s,c)=>[s,c]));return{colors:r,bits:i,tIndex:o,index:a}}function Zi(e,t){let n=je(e,t).map(ce),r=new Uint8ClampedArray(e.data),o=new Map;for(let i=0;i<r.length;i+=4){if(r[i+3]<128)continue;let a=r[i]<<16|r[i+1]<<8|r[i+2],s=o.get(a);if(s===void 0){let c=1/0;s=0;for(let l=0;l<n.length;l++){let u=r[i]-n[l][0],d=r[i+1]-n[l][1],f=r[i+2]-n[l][2],m=u*u*3+d*d*4+f*f*2;m<c&&(c=m,s=l)}o.set(a,s)}r.set(n[s],i)}return{...e,data:r}}function Qi(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(1,Math.round(t.scale||1)),r=e.map(m=>({...n>1?ge(m,n):m,delay:m.delay??t.delay??100})),o=r[0].width,i=r[0].height,a=!1,s=new Set,c=r.map(m=>{let b=new Set;for(let g=0;g<m.data.length;g+=4){let x=en(m.data,g);x===-1&&(a=!0),b.add(x),s.add(x)}return b}),l=m=>m.size-(m.has(-1)?1:0),d=l(s)+(a?1:0)<=256?Lr(s,a):null,f=new tn;if(f.str("GIF89a"),f.u16(o),f.u16(i),f.byte(d?240|d.bits-1:0),f.byte(0),f.byte(0),d)for(let m of d.colors)f.bytes(m);return r.length>1&&t.loop!==-1&&(f.byte(33),f.byte(255),f.byte(11),f.str("NETSCAPE2.0"),f.byte(3),f.byte(1),f.u16(t.loop||0),f.byte(0)),r.forEach((m,b)=>{let g=m,x=d,y=c[b];if(!x){let E=a?255:256;if(l(y)>E){g=Zi(m,E),y=new Set;for(let p=0;p<g.data.length;p+=4)y.add(en(g.data,p))}x=Lr(y,y.has(-1))}if(f.byte(33),f.byte(249),f.byte(4),f.byte((a?2:1)<<2|(x.tIndex>=0?1:0)),f.u16(Math.max(2,Math.round(g.delay/10))),f.byte(x.tIndex>=0?x.tIndex:0),f.byte(0),f.byte(44),f.u16(0),f.u16(0),f.u16(o),f.u16(i),f.byte(x===d?0:128|x.bits-1),x!==d)for(let E of x.colors)f.bytes(E);let h=new Uint8Array(o*i);for(let E=0;E<h.length;E++){let p=en(g.data,E*4);h[E]=p===-1?x.tIndex:x.index.get(p)}Ji(h,Math.max(2,x.bits),f)}),f.byte(59),f.result()}var Ir=new TextEncoder;function ea(e){let t=[],n=[],r=0,o=new Set;for(let u of e){let d=u.name.replace(/\\/g,"/").replace(/^\/+/,"");if(o.has(d)){let T=/^(.*?)(\.[^.]*)?$/.exec(d),M=2;for(;o.has(`${T[1]}-${M}${T[2]||""}`);)M++;d=`${T[1]}-${M}${T[2]||""}`}o.add(d);let f=Ir.encode(d),m=typeof u.data=="string"?Ir.encode(u.data):u.data,b=ft(m),g=u.date||new Date,x=g.getHours()<<11|g.getMinutes()<<5|g.getSeconds()>>1,y=g.getFullYear()-1980<<9|g.getMonth()+1<<5|g.getDate(),h=new Uint8Array(30+f.length),E=new DataView(h.buffer);E.setUint32(0,67324752,!0),E.setUint16(4,20,!0),E.setUint16(6,2048,!0),E.setUint16(8,0,!0),E.setUint16(10,x,!0),E.setUint16(12,y,!0),E.setUint32(14,b,!0),E.setUint32(18,m.length,!0),E.setUint32(22,m.length,!0),E.setUint16(26,f.length,!0),E.setUint16(28,0,!0),h.set(f,30);let p=new Uint8Array(46+f.length),_=new DataView(p.buffer);_.setUint32(0,33639248,!0),_.setUint16(4,20,!0),_.setUint16(6,20,!0),_.setUint16(8,2048,!0),_.setUint16(10,0,!0),_.setUint16(12,x,!0),_.setUint16(14,y,!0),_.setUint32(16,b,!0),_.setUint32(20,m.length,!0),_.setUint32(24,m.length,!0),_.setUint16(28,f.length,!0),_.setUint32(42,r,!0),p.set(f,46),t.push(h,m),n.push(p),r+=h.length+m.length}let i=n.reduce((u,d)=>u+d.length,0),a=new Uint8Array(22),s=new DataView(a.buffer);s.setUint32(0,101010256,!0),s.setUint16(8,e.length,!0),s.setUint16(10,e.length,!0),s.setUint32(12,i,!0),s.setUint32(16,r,!0);let c=new Uint8Array(r+i+22),l=0;for(let u of[...t,...n,a])c.set(u,l),l+=u.length;return c}var nn=(e,t)=>({width:e,height:t,data:new Uint8ClampedArray(e*t*4)});function ta(e,t,n,r,o=0,i=0,a=t.width,s=t.height){for(let c=0;c<s;c++){let l=((i+c)*t.width+o)*4,u=((r+c)*e.width+n)*4;e.data.set(t.data.subarray?t.data.subarray(l,l+a*4):Array.prototype.slice.call(t.data,l,l+a*4),u)}}function Fr(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(0,t.padding|0),r=Math.max(...e.map(f=>f.width)),o=Math.max(...e.map(f=>f.height)),i=Math.max(1,Math.min(e.length,t.columns||Math.ceil(Math.sqrt(e.length)))),a=Math.ceil(e.length/i),s=i*r+(i-1)*n,c=a*o+(a-1)*n,l=nn(s,c),u={};e.forEach((f,m)=>{let b=m%i*(r+n),g=Math.floor(m/i)*(o+n);ta(l,f,b,g),u[f.name||`frame-${String(m).padStart(3,"0")}`]={frame:{x:b,y:g,w:f.width,h:f.height},sourceSize:{w:f.width,h:f.height},...f.delay!=null?{duration:Math.round(f.delay)}:{}}});let d={frames:u,meta:{app:"image-to-pixel",image:(t.name||"sheet")+".png",size:{w:s,h:c},scale:"1",columns:i,rows:a,padding:n}};return{image:l,atlas:d}}function na(e,t={}){let n=Math.max(1,t.tileWidth||8),r=Math.max(1,t.tileHeight||n),o=Math.ceil(e.width/n),i=Math.ceil(e.height/r),a=[],s=new Map,c=[],l=[],u=(b,g)=>{let x=nn(n,r);for(let y=0;y<r;y++)for(let h=0;h<n;h++){let E=b*n+h,p=g*r+y;if(E>=e.width||p>=e.height)continue;let _=(p*e.width+E)*4;x.data.set([e.data[_],e.data[_+1],e.data[_+2],e.data[_+3]],(y*n+h)*4)}return x},d=b=>{let g="";for(let x=0;x<b.data.length;x+=4)g+=b.data[x+3]===0?".":String.fromCharCode(b.data[x]+1,b.data[x+1]+1,b.data[x+2]+1);return g},f=(b,g,x)=>{let y=nn(n,r);for(let h=0;h<r;h++)for(let E=0;E<n;E++){let p=((x?r-1-h:h)*n+(g?n-1-E:E))*4;y.data.set(b.data.subarray(p,p+4),(h*n+E)*4)}return y};for(let b=0;b<i;b++)for(let g=0;g<o;g++){let x=u(g,b),y=s.get(d(x)),h=0;if(y===void 0&&t.flips)for(let[E,p,_]of[[1,0,1],[0,1,2],[1,1,3]]){let T=s.get(d(f(x,E,p)));if(T!==void 0){y=T,h=_;break}}y===void 0&&(y=a.length,a.push(x),s.set(d(x),y)),c.push(y),l.push(h)}return{image:Fr(a,{columns:t.columns||Math.min(16,a.length)}).image,map:{width:o,height:i,tileWidth:n,tileHeight:r,tiles:c,...t.flips?{flips:l}:{}},count:a.length}}var ra=(e,t,n=4e3)=>new Promise((r,o)=>{let i=setTimeout(()=>{e.removeEventListener(t,a),o(new Error(`Timed out waiting for "${t}"`))},n),a=()=>{clearTimeout(i),r()};e.addEventListener(t,a,{once:!0})}),oa={1:"loading was aborted",2:"a network error stopped the download",3:"the browser could not decode it",4:"this browser can't play this video's format"};function rn(e){let t=e.error?e.error.code:0,n=new Error(oa[t]||"the video could not be loaded");return n.code=t,e.error&&e.error.message&&(n.detail=e.error.message),n}var Or=(e,t,n)=>new Promise((r,o)=>{let i=()=>{clearTimeout(c),e.removeEventListener(t,a),e.removeEventListener("error",s)},a=()=>{i(),r()},s=()=>{i(),o(rn(e))},c=setTimeout(()=>{i(),o(new Error(`no response from the video decoder after ${n/1e3} s`))},n);e.addEventListener(t,a,{once:!0}),e.addEventListener("error",s,{once:!0})});async function on(e,{timeout:t=6e4}={}){if(e.error)throw rn(e);return e.readyState<1&&await Or(e,"loadedmetadata",t),e.readyState<2&&await Or(e,"loadeddata",t).catch(n=>{if(n.code)throw n}),e}async function ia(e){let t=new Uint8Array(await e.arrayBuffer()),n={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"};for(let i=0;i+24<t.length;i++)if(t[i]===115&&t[i+1]===116&&t[i+2]===115&&t[i+3]===100){let a=String.fromCharCode(t[i+16],t[i+17],t[i+18],t[i+19]);if(n[a])return n[a]}let r=new TextDecoder("latin1").decode(t.subarray(0,Math.min(t.length,1<<20))),o=/V_(VP8|VP9|AV1|MPEG4\/ISO\/AVC|MPEGH\/ISO\/HEVC)/.exec(r);return o?{VP8:"VP8",VP9:"VP9",AV1:"AV1","MPEG4/ISO/AVC":"H.264","MPEGH/ISO/HEVC":"H.265 (HEVC)"}[o[1]]:""}async function an(e,t){if(t=Math.max(0,Math.min(t,(e.duration||0)-1e-4)),Math.abs(e.currentTime-t)<1e-6&&e.readyState>=2)return;let n="requestVideoFrameCallback"in e?new Promise(o=>{e.requestVideoFrameCallback(()=>o()),setTimeout(o,500)}):null,r=ra(e,"seeked");e.currentTime=t,await r,n&&await n}async function aa(e,t=30){if(!("requestVideoFrameCallback"in e))return t;await on(e);let n={t:e.currentTime,muted:e.muted,paused:e.paused},r=[];try{e.muted=!0,await new Promise(a=>{let s=setTimeout(a,1200),c=(l,u)=>{r.push(u.mediaTime),r.length>=12?(clearTimeout(s),a()):e.requestVideoFrameCallback(c)};e.requestVideoFrameCallback(c),e.play().catch(()=>{clearTimeout(s),a()})})}finally{e.pause(),e.muted=n.muted,await an(e,n.t).catch(()=>{})}let o=[];for(let a=1;a<r.length;a++){let s=r[a]-r[a-1];s>.001&&o.push(s)}if(o.length<3)return t;o.sort((a,s)=>a-s);let i=1/o[Math.floor(o.length/2)];for(let a of[12,15,23.976,24,25,29.97,30,48,50,59.94,60])if(Math.abs(i-a)<.6)return a;return Math.round(i)}function Dr({duration:e,fps:t,start:n=0,end:r=e,maxFrames:o=1/0}){let i=[],a=Math.min(o,Math.max(1,Math.floor((r-n)*t+1e-6)));for(let s=0;s<a;s++)i.push(n+(s+.5)/t);return i}async function sa(e,t){await on(e);let n=e.paused;e.pause();let r=Dr({duration:e.duration,...t});for(let o=0;o<r.length;o++){if(t.signal&&t.signal.aborted)throw new DOMException("Aborted","AbortError");await an(e,r[o]),await t.onFrame({index:o,time:r[o],total:r.length})}return n||e.play().catch(()=>{}),r.length}var ps="3.1.0";export{et as ASPECTS,Mn as DEFAULTS,_t as DITHER_METHODS,kt as KERNELS,St as LEGACY_DITHER,Be as MAX_SIZE,An as PALETTES,Pr as PRESETS,Xe as SETTINGS_VERSION,ps as VERSION,be as bayer,na as buildTileset,Mt as compactSettings,Qt as createPixelator,ea as createZip,At as cropRect,Qr as decodeSettings,Un as defaultSettings,Li as detectGrid,Tt as ditherKind,Ii as downloadBlob,Qi as encodeGIF,ut as encodePNG,Zr as encodeSettings,aa as estimateFps,je as extractPalette,Ur as fetchLospec,sa as forEachFrame,Dr as frameTimes,qe as getPalette,qi as getPreset,Pi as hasTransparency,Rr as loadImage,Jt as lospecSlug,It as makePlan,kr as makeResult,rn as mediaError,no as mergeSettings,fe as normalizeSettings,Ze as oklab,Fr as packSpriteSheet,ce as parseColor,ao as parseMatrix,Gi as parsePalette,$i as pixelate,Vt as resizeNearest,Rt as resolveSize,Ft as runCPU,an as seekTo,to as settingsFromJSON,eo as settingsToJSON,ia as sniffVideoCodec,Ct as thresholdMap,$t as toCanvas,st as toFrame,zi as toGPL,Ce as toHex,Hi as toHexFile,Wi as toPaletteJSON,Yt as uniqueColors,ge as upscale,on as videoReady};
|
|
302
302
|
/*! Bundled license information:
|
|
303
303
|
|
|
304
304
|
shadermate/dist/shadermate.esm.js:
|