UNPKG

3.49 kBJavaScriptView Raw
1let t
2let e
3const n=()=>e=e||(t=t||document.createElement("canvas")).getContext("2d")
4const o="little"===(()=>{try{const t=new ArrayBuffer(2)
5const e=new Uint8Array(t)
6const n=new Uint16Array(t)
7e[0]=161
8e[1]=178
9if(45729===n[0])return"little"
10if(41394===n[0])return"big"}catch(t){console.error("[getEndianness]",t)}return"unknown"})()?(t,e,n,o)=>(t<<0)+(e<<8)+(n<<16)+(o<<24):(t,e,n,o)=>(t<<24)+(e<<16)+(n<<8)+(o<<0)
11const r=t=>t.length>1?t:`0${t}`
12const c=(t,e,n)=>{const o=t-.5*n
13const r=t+.5*n
14const c=e-.5*n
15const s=e+.5*n
16return(t,e)=>t===o&&e>=c&&e<=s||t===r&&e>=c&&e<=s||e===c&&t>=o&&t<=r||e===s&&t>=o&&t<=r}
17const s=o(0,0,0,0)
18const a=o(244,244,244,150)
19const i=o(32,32,32,255)
20const d=o(255,255,255,255)
21const l=({canvas:t,ZOOM:e,GRID_COUNT:o})=>c=>{const s=t.getBoundingClientRect()
22const a=(c.clientX-s.left)/s.width*t.width,i=(c.clientY-s.top)/s.height*t.height
23const d=Math.round(a-o/2)
24const l=Math.round(i-o/2)
25const g=t.getContext("2d").getImageData(d,l,o,o)
26return{colorHex:((t,e,n)=>{const o=4*(e+n*t.width)
27const c=t.data
28const s=c[o].toString(16)
29const a=c[o+1].toString(16)
30const i=c[o+2].toString(16)
31return`#${r(s)}${r(a)}${r(i)}`.toUpperCase()})(g,o>>1,o>>1),scaledImageData:((t,e,o=e)=>{const r=t
32const c=r.width
33const s=new Uint32Array(r.data.buffer)
34const a=n().getImageData(0,0,c*e,r.height*o)
35const i=a.width
36const d=new Uint32Array(a.data.buffer)
37const l=i*a.height
38for(let t=0;t<l;t++){const n=t%i
39const r=Math.floor(t/i)
40const a=Math.floor(n/e)+Math.floor(r/o)*c
41d[t]=s[a]}return a})(g,e,e)}}
42const g=({sourceCanvas:t,pickerCanvasContext:e,pickerDiv:n,colorPre:o,ZOOM:r,GRID_COUNT:g})=>new Promise(u=>{const h=(({ZOOM:t,GRID_COUNT:e})=>{const n=e*t
43const o=c(n>>1,n>>1,t)
44const r=c(n>>1,n>>1,t+2)
45const l=document.createElement("canvas")
46l.width=l.height=n
47const g=l.getContext("2d").getImageData(0,0,n,n)
48const u=new Uint32Array(g.data.buffer)
49for(let e=0,c=n*n;e<c;e++){const c=e%n
50const l=Math.floor(e/n)
51u[e]=c%t==0||l%t==0?a:s
52o(c,l)&&(u[e]=i)
53r(c,l)&&(u[e]=d)}l.getContext("2d").putImageData(g,0,0)
54return l})({ZOOM:r,GRID_COUNT:g})
55const m=l({canvas:t,ZOOM:r,GRID_COUNT:g})
56let w=null
57const O=t=>{w||window.requestAnimationFrame(()=>{(t=>{const{colorHex:r,scaledImageData:c}=m(t)
58e.putImageData(c,0,0)
59e.drawImage(h,0,0)
60const s=n.getBoundingClientRect()
61n.style.visibility="visible"
62n.style.transform=`translate3d(${Math.round(t.clientX-s.width/2)}px, ${Math.round(t.clientY-s.height/2)}px, 0)`
63o.innerHTML=r
64C=r})(w)
65w=null})
66w=t}
67let C
68t.addEventListener("mousemove",O)
69t.addEventListener("click",()=>{t.removeEventListener("mousemove",O)
70u(C)})
71document.addEventListener("keypress",t=>{"Escape"===t.code&&u("")})})
72window.PICK_COLOR=async({IMAGE_DATA_URL:t,ZOOM:e=10,GRID_COUNT:n=17})=>{if(!Number.isInteger(e))throw new Error(`[LOAD_SCREENSHOT] invalid integer ZOOM: ${e}`)
73if(!Number.isInteger(n)||n%2!=1)throw new Error(`[LOAD_SCREENSHOT] invalid odd integer GRID_COUNT: ${n}`)
74const o=document.getElementById("canvas-source")
75const r=await(({imageDataUrl:t})=>new Promise((e,n)=>{const o=document.createElement("img")
76o.onerror=n
77o.onload=()=>e(o)
78o.src=t}))({imageDataUrl:t})
79o.width=r.width
80o.height=r.height
81o.getContext("2d").drawImage(r,0,0)
82const c=document.getElementById("div-picker")
83const s=document.getElementById("pre-color")
84const a=document.getElementById("canvas-picker")
85const i=a.getContext("2d")
86a.width=a.height=e*n
87const d=await g({sourceCanvas:o,pickerCanvasContext:i,pickerDiv:c,colorPre:s,ZOOM:e,GRID_COUNT:n})
88return d}