osiris_display/display/
screen.rs1use std::mem::swap;
2
3use crate::display::graphic::{Draw, Image, Pixel, Sprite};
4
5#[derive(Clone, Debug)]
6pub struct Screen {
7 background: Pixel,
8 image: Image,
9}
10
11impl Screen {
12 pub const WIDTH: usize = 320;
13 pub const HEIGHT: usize = 180;
14
15 pub fn new(background: Pixel) -> Self {
17 Screen { background, image: Image::square(Screen::WIDTH, Screen::HEIGHT, background) }
18 }
19
20 pub fn image(&self) -> &Image { &self.image }
21}
22
23impl Draw<Sprite> for Screen {
24 fn draw(&mut self, drawn: &Sprite, x: usize, y: usize) {
25 self.image.draw(drawn.image(), x, y)
26 }
27}
28
29impl Screen {
30 pub fn clip(&mut self, sprite: &Sprite) {
31 let (x,y) = sprite.position();
32 self.draw(sprite, x, y);
33 }
34
35 pub fn clear(&mut self) {
36 let w = self.image.width();
37 let h = self.image.height();
38 self.clip(&Sprite::new(0, 0, Image::square(w, h, self.background)));
39 }
40}
41
42#[derive(Clone, Debug)]
43pub struct ScreenMemory {
44 shown: Screen,
45 drawn: Screen,
46}
47
48impl ScreenMemory {
49 pub fn new(background: Pixel) -> Self {
50 ScreenMemory {
51 shown: Screen::new(background),
52 drawn: Screen::new(background),
53 }
54 }
55
56 pub fn swap(&mut self) {
57 swap(&mut self.shown, &mut self.drawn);
58 }
59
60 pub fn draw_sprite(&mut self, sprite: &Sprite) {
61 let (x,y) = sprite.position();
62 self.drawn.draw(sprite, x, y);
63 }
64 pub fn shown_screen(&self) -> &Screen { &self.shown }
65
66 pub fn copy(&mut self) {
67 self.drawn = self.shown.clone();
68 }
69
70 pub fn clear(&mut self) { self.drawn.clear(); }
71
72 pub fn swap_and_clear(&mut self) {
73 self.swap();
74 self.clear();
75 }
76}