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}