ableos/ableos/src/graphics_api/pixel_format.rs

46 lines
1.1 KiB
Rust

use core::ops::{BitAnd, BitOr, Shr};
pub type Rgba = u32;
pub fn get_r(rgba: Rgba) -> u8 {
rgba.bitand(0xff_00_00_00).shr(0o30) as u8
}
pub fn get_g(rgba: Rgba) -> u8 {
rgba.bitand(0xff_00_00).shr(0o20) as u8
}
pub fn get_b(rgba: Rgba) -> u8 {
rgba.bitand(0xff_00).shr(0o10) as u8
}
pub fn get_a(rgba: Rgba) -> u8 {
(rgba & 0xff) as u8
}
pub fn set_r(rgba: Rgba, r: u8) -> Rgba {
rgba.bitand(0x_00_ff_ff_ff).bitor((r as Rgba).shr(0o30))
}
pub fn set_g(rgba: Rgba, g: u8) -> Rgba {
rgba.bitand(0xff_00_ff_ff).bitor((g as Rgba).shr(0o20))
}
pub fn set_b(rgba: Rgba, b: u8) -> Rgba {
rgba.bitand(0xff_ff_00_ff).bitor((b as Rgba).shr(0o10))
}
pub fn set_a(rgba: Rgba, a: u8) -> Rgba {
rgba.bitand(0xff_ff_ff_00).bitor(a as Rgba)
}
pub fn rgba_div(a: Rgba, b: Rgba) -> Rgba {
set_r(0, get_r(a) / get_r(b))
| set_g(0, get_g(a) / get_g(b))
| set_g(0, get_b(a) / get_b(b))
| set_g(0, get_a(a) / get_a(b))
}
pub fn new_rgba(r: u8, g: u8, b: u8, a: u8) -> Rgba {
set_r(0, r) | set_g(0, g) | set_b(0, b) | set_a(0, a)
}