///|
pub fn encode_ico(img : ImageData) -> Bytes raise EncodeError {
validate_rgba8_image(img)
if img.width > 256 || img.height > 256 {
raise InvalidDimensions(
"ICO dimensions must be <= 256x256: " +
img.width.to_string() +
"x" +
img.height.to_string(),
)
}
let png = encode_png(img)
let header = FixedArray::make(22, b'\x00')
write_u16le(header, 0, 0)
write_u16le(header, 2, 1)
write_u16le(header, 4, 1)
header[6] = (if img.width == 256 { 0 } else { img.width }).to_byte()
header[7] = (if img.height == 256 { 0 } else { img.height }).to_byte()
header[8] = b'\x00'
header[9] = b'\x00'
write_u16le(header, 10, 1)
write_u16le(header, 12, 32)
write_u32le(header, 14, png.length().reinterpret_as_uint())
write_u32le(header, 18, 22U)
concat_bytes([Bytes::from_array(header), png])
}