diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs index dd28b902efd..0dff6744418 100644 --- a/components/canvas/canvas_data.rs +++ b/components/canvas/canvas_data.rs @@ -154,7 +154,18 @@ struct PathBuilderRef<'a, B: Backend> { } impl PathBuilderRef<'_, B> { + /// + fn ensure_there_is_a_subpath(&mut self, point: &Point2D) { + if self.builder.get_current_point().is_none() { + self.builder.move_to(*point); + } + } + + /// fn line_to(&mut self, pt: &Point2D) { + // 2. If the object's path has no subpaths, then ensure there is a subpath for (x, y). + self.ensure_there_is_a_subpath(pt); + let pt = self.transform.transform_point(*pt); self.builder.line_to(pt); } @@ -182,14 +193,22 @@ impl PathBuilderRef<'_, B> { self.move_to(&first); } + /// fn quadratic_curve_to(&mut self, cp: &Point2D, endpoint: &Point2D) { + // 2. Ensure there is a subpath for (cpx, cpy). + self.ensure_there_is_a_subpath(cp); + self.builder.quadratic_curve_to( &self.transform.transform_point(*cp), &self.transform.transform_point(*endpoint), ) } + /// fn bezier_curve_to(&mut self, cp1: &Point2D, cp2: &Point2D, endpoint: &Point2D) { + // 2. Ensure there is a subpath for (cp1x, cp1y). + self.ensure_there_is_a_subpath(cp1); + self.builder.bezier_curve_to( &self.transform.transform_point(*cp1), &self.transform.transform_point(*cp2), @@ -210,6 +229,7 @@ impl PathBuilderRef<'_, B> { .arc(center, radius, start_angle, end_angle, ccw); } + /// fn arc_to(&mut self, cp1: &Point2D, cp2: &Point2D, radius: f32) { let cp0 = if let (Some(inverse), Some(point)) = (self.transform.inverse(), self.builder.get_current_point()) @@ -218,6 +238,9 @@ impl PathBuilderRef<'_, B> { } else { *cp1 }; + + // 2. Ensure there is a subpath for (x1, y1) is done by one of self.line_to calls + if (cp0.x == cp1.x && cp0.y == cp1.y) || cp1 == cp2 || radius == 0.0 { self.line_to(cp1); return; diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 51075f1c63a..02d87dfcd54 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -710,7 +710,7 @@ impl GenericPathBuilder for PathBuilder { 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, + PathOp::Close => path.ops.first().and_then(get_first_point), }) } @@ -733,6 +733,15 @@ impl GenericPathBuilder for PathBuilder { } } +fn get_first_point(op: &PathOp) -> Option> { + 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, + } +} + pub trait ToRaqoteStyle { type Target; diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini index 217cd1d735b..1fda8aa0448 100644 --- a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini +++ b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini @@ -37,9 +37,6 @@ [corner-shape-render-precise.html?corner-top-left-shape=bevel&border-width=10px&border-color=black] expected: FAIL -[corner-shape-render-precise.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel] - expected: FAIL - [corner-shape-render-precise.html?corner-shape=superellipse(8)&border-radius=10px&box-shadow=10px 10px 0 10px black] expected: FAIL @@ -91,11 +88,5 @@ [corner-shape-render-precise.html?corner-shape=superellipse(-2)&border-top-left-radius=40%&border-width=20px] expected: FAIL -[corner-shape-render-precise.html?corner-top-left-shape=bevel&border-width=10px] - expected: FAIL - [corner-shape-render-precise.html?corner-shape=notch&border-radius=30px&border-width=30px] expected: FAIL - -[corner-shape-render-precise.html?corner-top-right-shape=bevel&border-width=10px] - expected: FAIL