graphics/
draw_buffer.rs

1use alloc::{vec, vec::Vec};
2
3use crate::{Color, ColorRGB565, Point, RenderingColor};
4
5#[repr(transparent)]
6pub struct Buffer {
7    buffer: Vec<RenderingColor>,
8}
9
10impl AsRef<[Color]> for Buffer {
11    fn as_ref(&self) -> &[Color] {
12        unsafe {
13            let buffer = self.buffer.as_ptr() as *const Color;
14            core::slice::from_raw_parts(buffer, self.buffer.len())
15        }
16    }
17}
18
19impl Buffer {
20    pub fn new_from_resolution(resolution: &Point) -> Self {
21        let buffer_size = get_minimal_buffer_size(resolution);
22
23        Self::new(buffer_size)
24    }
25
26    pub fn new(buffer_size: usize) -> Self {
27        Self {
28            buffer: vec![ColorRGB565::new(0, 0, 0); buffer_size],
29        }
30    }
31}
32
33pub const fn get_recommended_buffer_size(resolution: &Point) -> usize {
34    resolution.get_x() as usize * resolution.get_y() as usize
35}
36
37pub const fn get_minimal_buffer_size(resolution: &Point) -> usize {
38    if resolution.get_x() < resolution.get_y() {
39        resolution.get_y() as usize * resolution.get_y() as usize / 10
40    } else {
41        resolution.get_x() as usize * resolution.get_x() as usize / 10
42    }
43}