From 2ea806e635a0a00125b238acb3aaefc3147f5ad6 Mon Sep 17 00:00:00 2001 From: Xu Liang Date: Sun, 31 May 2026 14:01:46 +0800 Subject: [PATCH] feat(icons): enhance .ico generation to support multiple sizes for better clarity --- apps/desktop-client/build/icon.ico | Bin 5654 -> 22000 bytes .../scripts/generate-brand-icons.cjs | 49 ++++++++++++------ 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/apps/desktop-client/build/icon.ico b/apps/desktop-client/build/icon.ico index daa925f250649dc76b5efa64afc498355b3e530b..36c8eb8ec4519b842bd59daec2dac97c53042d1e 100644 GIT binary patch literal 22000 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 literal 5654 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 256) - entry.writeUInt8(0, 1) // height (0 => 256) - entry.writeUInt8(0, 2) // palette - entry.writeUInt8(0, 3) // reserved - entry.writeUInt16LE(1, 4) // color planes - entry.writeUInt16LE(32, 6) // bits per pixel - entry.writeUInt32LE(pngBuffer.length, 8) // size of image data - entry.writeUInt32LE(6 + 16, 12) // offset to image data - return Buffer.concat([header, entry, pngBuffer]) + header.writeUInt16LE(count, 4) // image count + const dir = Buffer.alloc(16 * count) + let offset = 6 + 16 * count + pngBuffers.forEach((png, i) => { + const w = png.readUInt32BE(16) // PNG IHDR width (byte 16..19) + const h = png.readUInt32BE(20) // PNG IHDR height (byte 20..23) + const e = i * 16 + dir.writeUInt8(w >= 256 ? 0 : w, e + 0) // width (0 => 256) + dir.writeUInt8(h >= 256 ? 0 : h, e + 1) // height (0 => 256) + dir.writeUInt8(0, e + 2) // palette + dir.writeUInt8(0, e + 3) // reserved + dir.writeUInt16LE(1, e + 4) // color planes + dir.writeUInt16LE(32, e + 6) // bits per pixel + dir.writeUInt32LE(png.length, e + 8) // size of image data + dir.writeUInt32LE(offset, e + 12) // offset to image data + offset += png.length + }) + return Buffer.concat([header, dir, ...pngBuffers]) } function buildAppIcons() { @@ -150,9 +164,12 @@ function buildAppIcons() { } execFileSync('iconutil', ['-c', 'icns', iconset, '-o', path.join(BUILD_DIR, 'icon.icns')]) - // .ico from a 256px render. - const ico256 = svgToPng(squareIconSvg(BRAND_BLUE), 'app-ico', ['-w', '256', '-h', '256']) - fs.writeFileSync(path.join(BUILD_DIR, 'icon.ico'), pngToIco(fs.readFileSync(ico256))) + // .ico with every size Windows asks for (taskbar/Explorer/Alt-Tab/tiles). + const icoSizes = [16, 24, 32, 48, 64, 128, 256] + const icoPngs = icoSizes.map((s) => + fs.readFileSync(svgToPng(squareIconSvg(BRAND_BLUE), `app-ico-${s}`, ['-w', String(s), '-h', String(s)])), + ) + fs.writeFileSync(path.join(BUILD_DIR, 'icon.ico'), pngsToIco(icoPngs)) } function buildMainProcessIcons() {