52 lines
1.2 KiB
JavaScript
52 lines
1.2 KiB
JavaScript
|
import BlurhashWorker from 'worker-loader!../_workers/blurhash' // eslint-disable-line
|
||
|
|
||
|
const RESOLUTION = 32
|
||
|
let worker
|
||
|
let canvas
|
||
|
let canvasContext2D
|
||
|
|
||
|
export function init () {
|
||
|
worker = worker || new BlurhashWorker()
|
||
|
}
|
||
|
|
||
|
export async function decode (blurhash) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
try {
|
||
|
init()
|
||
|
|
||
|
const onMessage = ({ data: { encoded, decoded, imageData, error } }) => {
|
||
|
if (encoded !== blurhash) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
worker.removeEventListener('message', onMessage)
|
||
|
|
||
|
if (error) {
|
||
|
return reject(error)
|
||
|
}
|
||
|
|
||
|
if (decoded) {
|
||
|
resolve(decoded)
|
||
|
} else {
|
||
|
if (!canvas) {
|
||
|
canvas = document.createElement('canvas')
|
||
|
canvas.height = RESOLUTION
|
||
|
canvas.width = RESOLUTION
|
||
|
canvasContext2D = canvas.getContext('2d')
|
||
|
}
|
||
|
|
||
|
canvasContext2D.putImageData(imageData, 0, 0)
|
||
|
canvas.toBlob(blob => {
|
||
|
resolve(URL.createObjectURL(blob))
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
worker.addEventListener('message', onMessage)
|
||
|
worker.postMessage({ encoded: blurhash })
|
||
|
} catch (e) {
|
||
|
reject(e)
|
||
|
}
|
||
|
})
|
||
|
}
|