Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE html>
<script>
(async () => {
const W = 255, H = 255;
const maskRowSize = Math.floor((W + 31) / 32) * 4;
const maskBytes = maskRowSize * H;
const bytesInRes = 40 + 12 + maskBytes;
function buildChunk1() {
const c = new Uint8Array(62);
c.set([0,0, 1,0, 1,0], 0);
c[6] = W; c[7] = H;
c[10] = 1; c[12] = 32;
c[14] = bytesInRes & 0xff;
c[15] = (bytesInRes >> 8) & 0xff;
c[16] = (bytesInRes >> 16) & 0xff;
c[17] = (bytesInRes >> 24) & 0xff;
c[18] = 22;
const bih = new DataView(c.buffer, 22, 40);
bih.setUint32(0, 40, true);
bih.setInt32(4, W, true);
bih.setInt32(8, H * 2, true);
bih.setUint16(12, 1, true);
bih.setUint16(14, 32, true);
bih.setUint32(16, 3, true);
bih.setUint32(20, 0, true);
return c;
}
function buildChunk2() {
const c = new Uint8Array(12 + maskBytes);
const bf = new DataView(c.buffer, 0, 12);
bf.setUint32(0, 0x00FF0000, true);
bf.setUint32(4, 0x0000FF00, true);
bf.setUint32(8, 0x000000FF, true);
return c;
}
let deliver2;
const stream = new ReadableStream({
async start(controller) {
controller.enqueue(buildChunk1());
await new Promise(r => { deliver2 = r; });
controller.enqueue(buildChunk2());
controller.close();
}
});
const decoder = new ImageDecoder({
type: 'image/x-icon',
data: stream,
desiredWidth: 16,
desiredHeight: 16,
});
await decoder.tracks.ready;
const decodePromise = decoder.decode();
await new Promise(r => step_timeout(r, 500));
deliver2();
try { await decodePromise; } catch(e) {}
await new Promise(r => step_timeout(r, 2000));
})();
</script>