xref: /StarryEngine/starry_server/src/base/display.rs (revision 49182ea7bc0263215864dd04cd265e345a4af8f5)
1 use starry_client::base::{color::Color, renderer::Renderer};
2 
3 use super::{
4     image::{Image, ImageRoi},
5     rect::Rect,
6 };
7 
8 /// 一个显示窗口
9 pub struct Display {
10     /// 左上角x坐标
11     pub x: i32,
12     /// 左上角y坐标
13     pub y: i32,
14     /// 帧缓冲区
15     pub image: Image,
16 }
17 
18 impl Display {
19     /// 创建新窗口
20     pub fn new(x: i32, y: i32, width: i32, height: i32) -> Self {
21         Display {
22             x,
23             y,
24             image: Image::new(width, height),
25         }
26     }
27 
28     /// # 函数功能
29     /// 向一个矩形区域内填充单一颜色
30     ///
31     /// ## 参数值
32     /// - rect: 矩形区域(绝对位置)
33     /// - color: 填充的颜色
34     pub fn rect(&mut self, rect: &Rect, color: Color) {
35         self.image.rect(
36             rect.left() - self.x,
37             rect.top() - self.y,
38             rect.width().try_into().unwrap_or(0),
39             rect.height().try_into().unwrap_or(0),
40             color,
41         );
42     }
43 
44     /// # 函数功能
45     /// 获得矩形区域相应的Roi
46     ///
47     /// ## 参数值
48     /// - rect: 矩形区域(绝对位置)
49     ///
50     /// ## 返回值
51     /// 矩形区域对应的Roi
52     pub fn roi(&mut self, rect: &Rect) -> ImageRoi {
53         // 得到相对位置的矩形
54         self.image.roi(&Rect::new(
55             rect.left() - self.x,
56             rect.top() - self.y,
57             rect.width(),
58             rect.height(),
59         ))
60     }
61 
62     /// 窗口调整大小
63     pub fn resize(&mut self, width: i32, height: i32) {
64         self.image = Image::new(width, height)
65     }
66 
67     /// 获得展示窗口矩形
68     pub fn screen_rect(&self) -> Rect {
69         Rect::new(self.x, self.y, self.image.width(), self.image.height())
70     }
71 }
72