apollo_hyper_libretro_bindings/
pixels.rs

1#[inline(always)]
2pub fn argb555to888(lo: u8, hi: u8) -> (u8, u8, u8) {
3    let r = (hi & 0b0111_1100) >> 2;
4    let g = ((hi & 0b0000_0011) << 3) + ((lo & 0b1110_0000) >> 5);
5    let b = lo & 0b0001_1111;
6    // Use high bits for empty low bits
7    let r = (r << 3) | (r >> 2);
8    let g = (g << 3) | (g >> 2);
9    let b = (b << 3) | (b >> 2);
10    (r, g, b)
11}
12
13#[inline(always)]
14pub fn rgb565to888(lo: u8, hi: u8) -> (u8, u8, u8) {
15    let r = (hi & 0b1111_1000) >> 3;
16    let g = ((hi & 0b0000_0111) << 3) + ((lo & 0b1110_0000) >> 5);
17    let b = lo & 0b0001_1111;
18    // Use high bits for empty low bits
19    let r = (r << 3) | (r >> 2);
20    let g = (g << 2) | (g >> 3);
21    let b = (b << 3) | (b >> 2);
22    (r, g, b)
23}
24#[inline(always)]
25pub fn rgb332_to_rgb888(col: u8) -> (u8, u8, u8) {
26    let col = col as u32;
27    let r = (((col & 0b1110_0000) >> 5) * 255) / 8;
28    let g = (((col & 0b0001_1100) >> 2) * 255) / 8;
29    let b = ((col & 0b0000_0011) * 255) / 4;
30    assert!(r <= 255);
31    assert!(g <= 255);
32    assert!(b <= 255);
33    (r as u8, g as u8, b as u8)
34}
35#[inline(always)]
36pub fn rgb888_to_rgb332(r: u8, g: u8, b: u8) -> u8 {
37    let r = ((r as u32 * 8) / 256) as u8;
38    let g = ((g as u32 * 8) / 256) as u8;
39    let b = ((b as u32 * 4) / 256) as u8;
40    assert!(r <= 7);
41    assert!(g <= 7);
42    assert!(b <= 3);
43    (r << 5) + (g << 2) + b
44}