Start on `Scene::push_surface`

Antonio Scandurra and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

crates/gpui/src/platform/mac.rs          |  1 +
crates/gpui/src/platform/mac/renderer.rs |  4 ++++
crates/gpui/src/scene.rs                 | 14 +++++++++++++-
3 files changed, 18 insertions(+), 1 deletion(-)

Detailed changes

crates/gpui/src/platform/mac.rs 🔗

@@ -13,6 +13,7 @@ use cocoa::base::{BOOL, NO, YES};
 pub use dispatcher::Dispatcher;
 pub use fonts::FontSystem;
 use platform::{MacForegroundPlatform, MacPlatform};
+pub use renderer::Surface;
 use std::{rc::Rc, sync::Arc};
 use window::Window;
 

crates/gpui/src/platform/mac/renderer.rs 🔗

@@ -37,6 +37,10 @@ struct PathSprite {
     shader_data: shaders::GPUISprite,
 }
 
+pub struct Surface {
+    pub bounds: RectF,
+}
+
 impl Renderer {
     pub fn new(
         device: metal::Device,

crates/gpui/src/scene.rs 🔗

@@ -10,7 +10,7 @@ use crate::{
     fonts::{FontId, GlyphId},
     geometry::{rect::RectF, vector::Vector2F},
     json::ToJson,
-    platform::CursorStyle,
+    platform::{current::Surface, CursorStyle},
     ImageData,
 };
 pub use mouse_region::*;
@@ -34,6 +34,7 @@ pub struct Layer {
     quads: Vec<Quad>,
     underlines: Vec<Underline>,
     images: Vec<Image>,
+    surfaces: Vec<Surface>,
     shadows: Vec<Shadow>,
     glyphs: Vec<Glyph>,
     image_glyphs: Vec<ImageGlyph>,
@@ -249,6 +250,10 @@ impl Scene {
         self.active_layer().push_image(image)
     }
 
+    pub fn push_surface(&mut self, surface: Surface) {
+        self.active_layer().push_surface(surface)
+    }
+
     pub fn push_underline(&mut self, underline: Underline) {
         self.active_layer().push_underline(underline)
     }
@@ -329,6 +334,7 @@ impl Layer {
             quads: Default::default(),
             underlines: Default::default(),
             images: Default::default(),
+            surfaces: Default::default(),
             shadows: Default::default(),
             image_glyphs: Default::default(),
             glyphs: Default::default(),
@@ -391,6 +397,12 @@ impl Layer {
         }
     }
 
+    fn push_surface(&mut self, surface: Surface) {
+        if can_draw(surface.bounds) {
+            self.surfaces.push(surface);
+        }
+    }
+
     pub fn images(&self) -> &[Image] {
         self.images.as_slice()
     }