From 9997d8f178d6c8a3b2bde4774b7967f92156e970 Mon Sep 17 00:00:00 2001 From: Bastiaan van der Plaat Date: Wed, 4 Oct 2023 15:26:27 +0200 Subject: [PATCH] LibWeb: Add spec comments to canvas context2d rect --- .../LibWeb/HTML/Canvas/CanvasPath.cpp | 21 +++++++++++++------ .../Libraries/LibWeb/HTML/Canvas/CanvasPath.h | 2 +- .../LibWeb/HTML/Canvas/CanvasPath.idl | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.cpp b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.cpp index e7f9bed7d7..7f4c4534ff 100644 --- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.cpp +++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.cpp @@ -192,16 +192,25 @@ WebIDL::ExceptionOr CanvasPath::arc_to(double x1, double y1, double x2, do return {}; } -void CanvasPath::rect(float x, float y, float width, float height) +// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-rect +void CanvasPath::rect(double x, double y, double w, double h) { + // 1. If any of the arguments are infinite or NaN, then return. + if (!isfinite(x) || !isfinite(y) || !isfinite(w) || !isfinite(h)) + return; + + // 2. Create a new subpath containing just the four points (x, y), (x+w, y), (x+w, y+h), (x, y+h), in that order, with those four points connected by straight lines. auto transform = active_transform(); m_path.move_to(transform.map(Gfx::FloatPoint { x, y })); - if (width == 0 || height == 0) - return; - m_path.line_to(transform.map(Gfx::FloatPoint { x + width, y })); - m_path.line_to(transform.map(Gfx::FloatPoint { x + width, y + height })); - m_path.line_to(transform.map(Gfx::FloatPoint { x, y + height })); + m_path.line_to(transform.map(Gfx::FloatPoint { x + w, y })); + m_path.line_to(transform.map(Gfx::FloatPoint { x + w, y + h })); + m_path.line_to(transform.map(Gfx::FloatPoint { x, y + h })); + + // 3. Mark the subpath as closed. m_path.close(); + + // 4. Create a new subpath with the point (x, y) as the only point in the subpath. + m_path.move_to(transform.map(Gfx::FloatPoint { x, y })); } } diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.h b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.h index e7811707bf..3285aa5fce 100644 --- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.h +++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.h @@ -24,7 +24,7 @@ public: void quadratic_curve_to(float cx, float cy, float x, float y); void bezier_curve_to(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y); WebIDL::ExceptionOr arc_to(double x1, double y1, double x2, double y2, double radius); - void rect(float x, float y, float width, float height); + void rect(double x, double y, double w, double h); WebIDL::ExceptionOr arc(float x, float y, float radius, float start_angle, float end_angle, bool counter_clockwise); WebIDL::ExceptionOr ellipse(float x, float y, float radius_x, float radius_y, float rotation, float start_angle, float end_angle, bool counter_clockwise); diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.idl b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.idl index 14b93bd405..a0f490fab0 100644 --- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.idl +++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasPath.idl @@ -6,7 +6,7 @@ interface mixin CanvasPath { undefined quadraticCurveTo(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y); undefined bezierCurveTo(unrestricted double cp1x, unrestricted double cp1y, unrestricted double cp2x, unrestricted double cp2y, unrestricted double x, unrestricted double y); undefined arcTo(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radius); - undefined rect(unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height); + undefined rect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h); // FIXME: undefined roundRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h, optional (unrestricted double or DOMPointInit or sequence<(unrestricted double or DOMPointInit)>) radii = 0); undefined arc(unrestricted double x, unrestricted double y, unrestricted double radius, unrestricted double startAngle, unrestricted double endAngle, optional boolean counterclockwise = false); undefined ellipse(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean counterclockwise = false);