compositor.rs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. use std::{
  2. fs::File,
  3. io::{Seek, SeekFrom, Write},
  4. sync::{Arc, RwLock},
  5. };
  6. use starry_client::base::renderer::Renderer;
  7. use crate::base::rect::Rect;
  8. use super::{starry_server, window_manager::window_manager, SCREEN_WIDTH};
  9. static mut COMPOSITOR: Option<Arc<Compositor>> = None;
  10. /// 获得合成渲染器实例
  11. pub fn compositor() -> Option<Arc<Compositor>> {
  12. unsafe { COMPOSITOR.clone() }
  13. }
  14. #[allow(dead_code)]
  15. /// 合成渲染器
  16. pub struct Compositor {
  17. /// 数据锁
  18. data: RwLock<CompositorData>,
  19. }
  20. pub struct CompositorData {
  21. /// 待重绘的窗口
  22. redraws: Vec<Rect>,
  23. fb_file: File,
  24. }
  25. #[allow(dead_code)]
  26. impl Compositor {
  27. /// 创建合成渲染器
  28. pub fn new() {
  29. let compositor = Compositor {
  30. data: RwLock::new(CompositorData {
  31. redraws: Vec::new(),
  32. fb_file: File::open("/dev/fb0").expect("[Error] Unable to open framebuffer"),
  33. }),
  34. };
  35. unsafe {
  36. COMPOSITOR = Some(Arc::new(compositor));
  37. }
  38. // println!("[Init] Compositor created successfully!");
  39. }
  40. /// TODO
  41. /// 重绘所有请求的窗口
  42. pub fn redraw_all(&self) {
  43. // println!("[Info] Compositor begin redraw_all...");
  44. let window_manager = window_manager().unwrap();
  45. let server = starry_server().unwrap();
  46. let cursor_rect = window_manager.cursor_rect();
  47. // 对窗口排序
  48. window_manager.rezbuffer();
  49. let mut window_manager_guard = window_manager.data.write().unwrap();
  50. let mut compositor_guard = self.data.write().unwrap();
  51. let mut server_guard = server.data.write().unwrap();
  52. let mut total_redraw_rect_opt: Option<Rect> = None;
  53. for original_rect in compositor_guard.redraws.drain(..) {
  54. // 更新重绘的总矩形区域
  55. if !original_rect.is_empty() {
  56. total_redraw_rect_opt = match total_redraw_rect_opt {
  57. Some(total_redraw) => Some(total_redraw.container(&original_rect)),
  58. None => Some(original_rect),
  59. }
  60. }
  61. let mut cursors = server_guard.cursors.clone();
  62. // 遍历所有显示窗口
  63. for display in server_guard.displays.iter_mut() {
  64. let rect = original_rect.intersection(&display.screen_rect());
  65. if !rect.is_empty() {
  66. // TODO: 填充默认颜色
  67. // 倒序渲染所有窗口
  68. let len = window_manager_guard.zbuffer.len();
  69. for index in (0..len).rev() {
  70. let entry = window_manager_guard.zbuffer.get(index).unwrap();
  71. let _id = entry.0;
  72. let index = entry.2;
  73. if let Some(window) = window_manager_guard.windows.get_mut(&index) {
  74. // TODO: 渲染窗口标题
  75. // 渲染窗体
  76. window.draw(display, &rect);
  77. }
  78. }
  79. }
  80. let cursor_intersect = rect.intersection(&cursor_rect);
  81. if !cursor_intersect.is_empty() {
  82. if let Some(cursor) = cursors.get_mut(&window_manager_guard.cursor_i) {
  83. display.roi(&cursor_intersect).blend(&cursor.roi(
  84. &cursor_intersect.offset(-cursor_rect.left(), -cursor_rect.top()),
  85. ));
  86. }
  87. }
  88. }
  89. }
  90. // println!("[Info] Compositor calculate total redraw rect done!");
  91. // TODO
  92. let mut fb = &compositor_guard.fb_file;
  93. if let Some(total_redraw_rect) = total_redraw_rect_opt {
  94. for display in server_guard.displays.iter_mut() {
  95. let display_redraw = total_redraw_rect.intersection(&display.screen_rect());
  96. if !display_redraw.is_empty() {
  97. for y in 0..display_redraw.height() {
  98. for x in 0..display_redraw.width() {
  99. let pixel = display.image.get_pixel(
  100. x + display_redraw.left() - display.x,
  101. y + display_redraw.top() - display.y,
  102. );
  103. let offset = (((y + display_redraw.top()) * SCREEN_WIDTH as i32)
  104. + x
  105. + display_redraw.left())
  106. * 4;
  107. fb.seek(SeekFrom::Start(offset as u64))
  108. .expect("Unable to seek framebuffer");
  109. fb.write_all(&pixel.to_bgra_bytes())
  110. .expect("Unable to write framebuffer");
  111. }
  112. }
  113. }
  114. }
  115. }
  116. }
  117. /// 窗口请求重绘
  118. pub fn request_redraw(&self, rect: Rect) {
  119. // println!("[Info] Compositor request redraw rect {:?}", rect);
  120. let mut guard = self.data.write().unwrap();
  121. let mut push = true;
  122. for rect in guard.redraws.iter_mut() {
  123. let container = rect.container(&rect);
  124. if container.area() <= rect.area() + rect.area() {
  125. *rect = container;
  126. push = false;
  127. }
  128. }
  129. if push {
  130. guard.redraws.push(rect);
  131. }
  132. }
  133. }