From c258616badc3fc9aff57b591389cd489767dccd0 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 27 Mar 2020 12:33:06 -0700 Subject: [PATCH] Add `Path2D::add_path()` --- canvas/src/lib.rs | 12 ++++++++++++ content/src/outline.rs | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/canvas/src/lib.rs b/canvas/src/lib.rs index 825055fa..b3204130 100644 --- a/canvas/src/lib.rs +++ b/canvas/src/lib.rs @@ -569,6 +569,18 @@ impl Path2D { } } + // https://html.spec.whatwg.org/multipage/canvas.html#dom-path2d-addpath + pub fn add_path(&mut self, mut path: Path2D, transform: &Transform2F) { + self.flush_current_contour(); + path.flush_current_contour(); + path.outline.transform(transform); + let last_contour = path.outline.pop_contour(); + for contour in path.outline.into_contours() { + self.outline.push_contour(contour); + } + self.current_contour = last_contour.unwrap_or_else(Contour::new); + } + pub fn into_outline(mut self) -> Outline { self.flush_current_contour(); self.outline diff --git a/content/src/outline.rs b/content/src/outline.rs index 92033220..659e5f6c 100644 --- a/content/src/outline.rs +++ b/content/src/outline.rs @@ -120,6 +120,11 @@ impl Outline { &self.contours } + #[inline] + pub fn into_contours(self) -> Vec { + self.contours + } + /// Removes all contours from this outline. #[inline] pub fn clear(&mut self) { @@ -141,6 +146,18 @@ impl Outline { self.contours.push(contour); } + pub fn pop_contour(&mut self) -> Option { + let last_contour = self.contours.pop(); + + let mut new_bounds = None; + for contour in &mut self.contours { + contour.update_bounds(&mut new_bounds); + } + self.bounds = new_bounds.unwrap_or_else(|| RectF::default()); + + last_contour + } + pub fn transform(&mut self, transform: &Transform2F) { if transform.is_identity() { return;