pub fn rgba_to_argb8888(rgba: &[u8]) -> Vec<u8> {
let mut out = vec![0u8; rgba.len()];
write_argb8888(rgba, &mut out);
out
}
pub fn write_argb8888(rgba: &[u8], dst: &mut [u8]) {
for (src, out) in rgba.chunks_exact(4).zip(dst.chunks_exact_mut(4)) {
out[0] = src[2]; out[1] = src[1]; out[2] = src[0]; out[3] = src[3]; }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn swaps_red_and_blue_preserving_alpha() {
let rgba = [0x10, 0x20, 0x30, 0x40, 0xAA, 0xBB, 0xCC, 0xDD];
let out = rgba_to_argb8888(&rgba);
assert_eq!(out, vec![0x30, 0x20, 0x10, 0x40, 0xCC, 0xBB, 0xAA, 0xDD]);
}
#[test]
fn write_into_canvas_only_touches_pixel_bytes() {
let rgba = [1, 2, 3, 4];
let mut dst = [0xFFu8; 8];
write_argb8888(&rgba, &mut dst);
assert_eq!(&dst[..4], &[3, 2, 1, 4]);
assert_eq!(&dst[4..], &[0xFF, 0xFF, 0xFF, 0xFF]);
}
#[test]
fn output_length_matches_input() {
let rgba = vec![0u8; 320 * 32 * 4];
assert_eq!(rgba_to_argb8888(&rgba).len(), rgba.len());
}
}