1use super::color::{color, rgb565_le};
5
6#[inline]
7pub fn decode_bc1_block(data: &[u8], outbuf: &mut [u32]) {
8 let q0 = u16::from_le_bytes([data[0], data[1]]);
9 let q1 = u16::from_le_bytes([data[2], data[3]]);
10 let (r0, g0, b0) = rgb565_le(q0);
11 let (r1, g1, b1) = rgb565_le(q1);
12
13 let mut c: [u32; 4] = [color(r0, g0, b0, 255), color(r1, g1, b1, 255), 0, 0];
14
15 let r0 = r0 as u16;
17 let g0 = g0 as u16;
18 let b0 = b0 as u16;
19 let r1 = r1 as u16;
20 let g1 = g1 as u16;
21 let b1 = b1 as u16;
22
23 if q0 > q1 {
24 c[2] = color(
25 ((r0 * 2 + r1) / 3) as u8,
26 ((g0 * 2 + g1) / 3) as u8,
27 ((b0 * 2 + b1) / 3) as u8,
28 255,
29 );
30 c[3] = color(
31 ((r0 + r1 * 2) / 3) as u8,
32 ((g0 + g1 * 2) / 3) as u8,
33 ((b0 + b1 * 2) / 3) as u8,
34 255,
35 );
36 } else {
37 c[2] = color(
38 ((r0 + r1) / 2) as u8,
39 ((g0 + g1) / 2) as u8,
40 ((b0 + b1) / 2) as u8,
41 255,
42 );
43 c[3] = color(0, 0, 0, 255);
44 }
45 let mut d: usize = u32::from_le_bytes(data[4..8].try_into().unwrap()) as usize;
46 (0..16).for_each(|i| {
47 outbuf[i] = c[d & 3];
48 d >>= 2;
49 });
50}