1use crate::utils::{decode_565, encode_rgb565_unchecked, sum_n};
2
3#[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#[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#[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}