57 lines
1.6 KiB
JavaScript
57 lines
1.6 KiB
JavaScript
import { writeFileSync } from 'fs';
|
|
import { deflateSync } from 'zlib';
|
|
|
|
function makePng(size, r, g, b) {
|
|
const crcTable = new Uint32Array(256);
|
|
for (let n = 0; n < 256; n++) {
|
|
let c = n;
|
|
for (let k = 0; k < 8; k++) {
|
|
c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1);
|
|
}
|
|
crcTable[n] = c;
|
|
}
|
|
|
|
function crc32(buf) {
|
|
let c = ~0;
|
|
for (let i = 0; i < buf.length; i++) {
|
|
c = crcTable[(c ^ buf[i]) & 0xFF] ^ (c >>> 8);
|
|
}
|
|
return ~c >>> 0;
|
|
}
|
|
|
|
function writeChunk(type, data) {
|
|
const len = Buffer.alloc(4);
|
|
len.writeUInt32BE(data.length, 0);
|
|
const typeBuf = Buffer.from(type, 'ascii');
|
|
const crc = Buffer.alloc(4);
|
|
crc.writeUInt32BE(crc32(Buffer.concat([typeBuf, data])), 0);
|
|
return Buffer.concat([len, typeBuf, data, crc]);
|
|
}
|
|
|
|
const ihdrData = Buffer.from([
|
|
0x00, 0x00, 0x00, size, 0x00, 0x00, 0x00, size,
|
|
0x08, 0x02, 0x00, 0x00, 0x00,
|
|
]);
|
|
const ihdrChunk = writeChunk('IHDR', ihdrData);
|
|
|
|
const raw = [];
|
|
for (let y = 0; y < size; y++) {
|
|
raw.push(0);
|
|
for (let x = 0; x < size; x++) {
|
|
raw.push(r, g, b, 255);
|
|
}
|
|
}
|
|
const rawBuf = Buffer.from(raw);
|
|
const compressed = deflateSync(rawBuf);
|
|
const idatChunk = writeChunk('IDAT', compressed);
|
|
const iendChunk = writeChunk('IEND', Buffer.alloc(0));
|
|
|
|
const sig = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
|
|
return Buffer.concat([sig, ihdrChunk, idatChunk, iendChunk]);
|
|
}
|
|
|
|
writeFileSync('icons/icon16.png', makePng(16, 99, 102, 241));
|
|
writeFileSync('icons/icon48.png', makePng(48, 99, 102, 241));
|
|
writeFileSync('icons/icon128.png', makePng(128, 99, 102, 241));
|
|
console.log('Icons created');
|