diff --git a/components/canvas/azure_backend.rs b/components/canvas/azure_backend.rs index fa48d869c40..9b9d94c5052 100644 --- a/components/canvas/azure_backend.rs +++ b/components/canvas/azure_backend.rs @@ -189,9 +189,9 @@ impl GenericPathBuilder for azure_hl::PathBuilder { anticlockwise, ); } - fn get_current_point(&mut self) -> Point2D { + fn get_current_point(&mut self) -> Option> { let AzPoint { x, y } = azure_hl::PathBuilder::get_current_point(self); - Point2D::new(x as f32, y as f32) + Some(Point2D::new(x as f32, y as f32)) } fn line_to(&mut self, point: Point2D) { azure_hl::PathBuilder::line_to(self, point as Point2D); diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs index 29dd1743b46..12bc87f84e1 100644 --- a/components/canvas/canvas_data.rs +++ b/components/canvas/canvas_data.rs @@ -108,7 +108,7 @@ pub trait GenericPathBuilder { end_angle: f32, anticlockwise: bool, ); - fn get_current_point(&mut self) -> Point2D; + fn get_current_point(&mut self) -> Option>; fn line_to(&mut self, point: Point2D); fn move_to(&mut self, point: Point2D); fn quadratic_curve_to(&mut self, control_point: &Point2D, end_point: &Point2D); @@ -205,8 +205,10 @@ impl<'a> PathBuilderRef<'a> { Some(i) => i, None => return None, }; - let current_point = self.builder.get_current_point(); - Some(inverse.transform_point(Point2D::new(current_point.x, current_point.y))) + match self.builder.get_current_point() { + Some(point) => Some(inverse.transform_point(Point2D::new(point.x, point.y))), + None => None, + } } } diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 438689bae03..cda608ae0ec 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -564,22 +564,18 @@ impl GenericPathBuilder for PathBuilder { } } - fn get_current_point(&mut self) -> Point2D { + fn get_current_point(&mut self) -> Option> { let path = self.finish(); self.0 = Some(path.as_raqote().clone().into()); - for op in path.as_raqote().ops.iter().rev() { - match op { - PathOp::MoveTo(point) | PathOp::LineTo(point) => { - return Point2D::new(point.x, point.y) - }, - PathOp::CubicTo(_, _, point) => return Point2D::new(point.x, point.y), - PathOp::QuadTo(_, point) => return Point2D::new(point.x, point.y), - PathOp::Close => {}, - }; - } - panic!("dead end"); + path.as_raqote().ops.iter().last().and_then(|op| match op { + PathOp::MoveTo(point) | PathOp::LineTo(point) => Some(Point2D::new(point.x, point.y)), + PathOp::CubicTo(_, _, point) => Some(Point2D::new(point.x, point.y)), + PathOp::QuadTo(_, point) => Some(Point2D::new(point.x, point.y)), + PathOp::Close => None, + }) } + fn line_to(&mut self, point: Point2D) { self.0.as_mut().unwrap().line_to(point.x, point.y); }