UNPKG

image-size

Version:
89 lines (86 loc) 2.12 kB
// lib/types/utils.ts var decoder = new TextDecoder(); var toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end)); var getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset); var readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false); // lib/types/icns.ts var SIZE_HEADER = 4 + 4; var FILE_LENGTH_OFFSET = 4; var ENTRY_LENGTH_OFFSET = 4; var ICON_TYPE_SIZE = { ICON: 32, "ICN#": 32, // m => 16 x 16 "icm#": 16, icm4: 16, icm8: 16, // s => 16 x 16 "ics#": 16, ics4: 16, ics8: 16, is32: 16, s8mk: 16, icp4: 16, // l => 32 x 32 icl4: 32, icl8: 32, il32: 32, l8mk: 32, icp5: 32, ic11: 32, // h => 48 x 48 ich4: 48, ich8: 48, ih32: 48, h8mk: 48, // . => 64 x 64 icp6: 64, ic12: 32, // t => 128 x 128 it32: 128, t8mk: 128, ic07: 128, // . => 256 x 256 ic08: 256, ic13: 256, // . => 512 x 512 ic09: 512, ic14: 512, // . => 1024 x 1024 ic10: 1024 }; function readImageHeader(input, imageOffset) { const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET; return [ toUTF8String(input, imageOffset, imageLengthOffset), readUInt32BE(input, imageLengthOffset) ]; } function getImageSize(type) { const size = ICON_TYPE_SIZE[type]; return { width: size, height: size, type }; } var ICNS = { validate: (input) => toUTF8String(input, 0, 4) === "icns", calculate(input) { const inputLength = input.length; const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET); let imageOffset = SIZE_HEADER; const images = []; while (imageOffset < fileLength && imageOffset < inputLength) { const imageHeader = readImageHeader(input, imageOffset); const imageSize = getImageSize(imageHeader[0]); images.push(imageSize); imageOffset += imageHeader[1]; } if (images.length === 0) { throw new TypeError("Invalid ICNS, no sizes found"); } return { width: images[0].width, height: images[0].height, ...images.length > 1 ? { images } : {} }; } }; export { ICNS };