forked from AbleOS/ableos_userland
55 lines
1.5 KiB
Rust
55 lines
1.5 KiB
Rust
use core::ptr;
|
|
|
|
use alloc::vec::Vec;
|
|
|
|
use super::color::Color3;
|
|
/// NOTE: Assumes the layout of RGBA
|
|
pub struct FrameBuffer {
|
|
pub width: u32,
|
|
pub height: u32,
|
|
pub data: Vec<u32>,
|
|
}
|
|
|
|
impl FrameBuffer {
|
|
pub fn new(width: u32, height: u32) -> Self {
|
|
let data = vec![0; (width * height) as usize];
|
|
FrameBuffer {
|
|
width,
|
|
height,
|
|
data,
|
|
}
|
|
}
|
|
|
|
/// WARNING: Slow
|
|
pub fn set_pixel(&mut self, x: u32, y: u32, color: u32) {
|
|
let index = (y * self.width + x) as usize;
|
|
self.data[index] = color;
|
|
}
|
|
|
|
/// WARNING: Slow
|
|
pub fn get_pixel(&self, x: u32, y: u32) -> u32 {
|
|
let index = (y * self.width + x) as usize;
|
|
self.data[index]
|
|
}
|
|
|
|
/// Quickly writes the provided color to the whole framebuffer
|
|
pub fn clear(&mut self, color: Color3) {
|
|
unsafe {
|
|
// TODO: properly clear instead of only copying red
|
|
ptr::write_bytes(self.data.as_mut_ptr(), color.r, self.data.len());
|
|
}
|
|
}
|
|
|
|
// TODO(Able): Test preformance of clear2
|
|
#[allow(dead_code)]
|
|
fn clear2(&mut self, color: u32) {
|
|
self.data.fill(color);
|
|
}
|
|
/// Check the size of one framebuffer vs the other.
|
|
/// NOTE: Just because this returns false does not mean that something is wrong
|
|
/// there are cases that this makes sense
|
|
pub fn check_size(&self, other: &FrameBuffer) -> bool {
|
|
self.width == other.width && self.height == other.height
|
|
}
|
|
}
|