physis/bcn/
bc1.rs

1// SPDX-FileCopyrightText: 2023 Rudolf Kolbe
2// SPDX-License-Identifier: MIT
3
4use 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    // C insanity.....
16    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}