diff --git a/core/document/src/document.rs b/core/document/src/document.rs index 93b471be7b..17b1baacbe 100644 --- a/core/document/src/document.rs +++ b/core/document/src/document.rs @@ -227,6 +227,16 @@ impl Document { Ok(()) } + pub fn layer_axis_aligned_bounding_box(&self, path: &[LayerId]) -> Result<[DVec2; 2], DocumentError> { + let layer = self.layer(path)?; + Ok(layer.bounding_box(self.root.transform * layer.transform, layer.style)) + } + + pub fn layer_local_bounding_box(&self, path: &[LayerId]) -> Result<[DVec2; 2], DocumentError> { + let layer = self.layer(path)?; + Ok(layer.bounding_box(layer.transform, layer.style)) + } + fn mark_as_dirty(&mut self, path: &[LayerId]) -> Result<(), DocumentError> { let mut root = &mut self.root; root.cache_dirty = true; diff --git a/core/document/src/layers/mod.rs b/core/document/src/layers/mod.rs index b9f294a4e9..5d1d1e960e 100644 --- a/core/document/src/layers/mod.rs +++ b/core/document/src/layers/mod.rs @@ -6,6 +6,7 @@ pub use ellipse::Ellipse; pub mod line; use glam::{DMat2, DVec2}; use kurbo::BezPath; +use kurbo::Shape as KurboShape; pub use line::Line; pub mod rect; @@ -100,6 +101,12 @@ impl LayerDataTypes { } } } + + pub fn bounding_box(&self, transform: glam::DAffine2, style: style::PathStyle) -> [DVec2; 2] { + let bez_path = self.to_kurbo_path(transform, style); + let bbox = bez_path.bounding_box(); + [DVec2::new(bbox.x0, bbox.y0), DVec2::new(bbox.x1, bbox.y1)] + } } #[derive(Serialize, Deserialize)] @@ -168,6 +175,10 @@ impl Layer { self.data.to_kurbo_path(self.transform, self.style) } + pub fn bounding_box(&self, transform: glam::DAffine2, style: style::PathStyle) -> [DVec2; 2] { + self.data.bounding_box(transform, style) + } + pub fn as_folder_mut(&mut self) -> Result<&mut Folder, DocumentError> { match &mut self.data { LayerDataTypes::Folder(f) => Ok(f),