q565/decode/
ops.rs

1use crate::utils::{decode_565, encode_rgb565_unchecked, sum_n};
2
3// OP: 0x101
4#[inline(always)]
5pub(crate) const fn indexed_diff(color_array: &[u16; 64], byte: u8, second_byte: u8) -> u16 {
6    let g_diff = ((byte & 0b0001_1100) >> 2) as i8 - 4;
7    let r_diff = (byte & 0b0000_0011) as i8 - 2;
8    let b_diff = (second_byte >> 6) as i8 - 2;
9    let index = (second_byte & 0b0011_1111) as usize;
10
11    apply_diff(color_array[index], r_diff, g_diff, b_diff)
12}
13
14// OP: 0x01
15#[inline(always)]
16pub(crate) const fn direct_small_diff(prev: u16, byte: u8) -> u16 {
17    let (r_diff, g_diff, b_diff) = (
18        ((byte >> 4) & 0b11) as i8 - 2,
19        ((byte >> 2) & 0b11) as i8 - 2,
20        (byte & 0b11) as i8 - 2,
21    );
22
23    apply_diff(prev, r_diff, g_diff, b_diff)
24}
25
26// OP: 0x100
27#[inline(always)]
28pub(crate) const fn direct_bigger_diff(prev: u16, byte: u8, rg_bg_diffs: u8) -> u16 {
29    let g_diff = (byte & 0b0001_1111) as i8 - 16;
30    let (rg_diff, bg_diff) = (
31        (rg_bg_diffs >> 4) as i8 - 8,
32        (rg_bg_diffs & 0b1111) as i8 - 8,
33    );
34    let (r_diff, b_diff) = (rg_diff + g_diff, bg_diff + g_diff);
35
36    apply_diff(prev, r_diff, g_diff, b_diff)
37}
38
39#[inline]
40pub(crate) const fn apply_diff(prev: u16, r_diff: i8, g_diff: i8, b_diff: i8) -> u16 {
41    let [r, g, b] = decode_565(prev);
42    encode_rgb565_unchecked([
43        sum_n::<5>(r, r_diff),
44        sum_n::<6>(g, g_diff),
45        sum_n::<5>(b, b_diff),
46    ])
47}