use super::rgb555::encode_rgb555;
use crate::reordered_rgb555::morton_interleave;
#[must_use]
pub fn encode_reordered_rgb555(bgra: &[u8], w: i32, h: i32, big_endian: bool) -> Vec<u8> {
let wu = w as usize;
let hu = h as usize;
let n = wu * hu;
let row_major = encode_rgb555(bgra, w, h, big_endian, false);
let bits = (std::cmp::max(wu, hu) as f64).log2().ceil() as u32;
let max_z = if wu > 0 && hu > 0 {
morton_interleave((wu - 1) as u32, (hu - 1) as u32, bits) as usize + 1
} else {
0
};
let out_words = std::cmp::max(max_z, n);
let mut out = vec![0u8; out_words * 2];
for y in 0..hu {
for x in 0..wu {
let z = morton_interleave(x as u32, y as u32, bits) as usize;
let src = (y * wu + x) * 2;
let dst = z * 2;
if dst + 1 < out.len() {
out[dst] = row_major[src];
out[dst + 1] = row_major[src + 1];
}
}
}
out
}