From 6648e244a097688bd42f35bd7e759b89feecc08c Mon Sep 17 00:00:00 2001 From: Simon Desloges Date: Thu, 15 Jul 2021 23:18:32 -0400 Subject: [PATCH] Add a document method that returns a layer's bounding box (#273) * Add a document method that returns a layer's bounding box * Moved `use` to the top of the file * Add layer local bounding box method --- core/document/src/document.rs | 10 ++++++++++ core/document/src/layers/mod.rs | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/core/document/src/document.rs b/core/document/src/document.rs index 93b471be7..17b1baacb 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 b9f294a4e..5d1d1e960 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),