osiris_display/display/
screen.rs

1use 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    /// Creates a new (320 x 180) 57600-pixels screen.
16    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}