From 560c3824b95b3130f05dbceeebff23fbfc7f69ad Mon Sep 17 00:00:00 2001 From: Cory Virok Date: Sun, 13 Oct 2024 11:21:46 -0700 Subject: [PATCH] LibWeb: Implemented the CanvasRenderingContext2D::createImageData() spec The only real change here is to use the absolute magnitude of the width/height when creating the ImageData. This fixes the crash on this WPT test: https://wpt.fyi/results/html/canvas/element/pixel-manipulation/2d.imageData.create2.double.html?label=master&product=ladybird --- .../Text/expected/canvas/convert-dims.txt | 1 + .../LibWeb/Text/input/canvas/convert-dims.html | 15 +++++++++++++++ .../LibWeb/HTML/CanvasRenderingContext2D.cpp | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/canvas/convert-dims.txt create mode 100644 Tests/LibWeb/Text/input/canvas/convert-dims.html diff --git a/Tests/LibWeb/Text/expected/canvas/convert-dims.txt b/Tests/LibWeb/Text/expected/canvas/convert-dims.txt new file mode 100644 index 00000000000..7ef22e9a431 --- /dev/null +++ b/Tests/LibWeb/Text/expected/canvas/convert-dims.txt @@ -0,0 +1 @@ +PASS diff --git a/Tests/LibWeb/Text/input/canvas/convert-dims.html b/Tests/LibWeb/Text/input/canvas/convert-dims.html new file mode 100644 index 00000000000..b454df3edac --- /dev/null +++ b/Tests/LibWeb/Text/input/canvas/convert-dims.html @@ -0,0 +1,15 @@ +

FAIL (fallback content)

+ + diff --git a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp index aa7736adb88..31b82b65150 100644 --- a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp +++ b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp @@ -321,9 +321,25 @@ void CanvasRenderingContext2D::fill(Path2D& path, StringView fill_rule) fill_internal(path.path(), parse_fill_rule(fill_rule)); } +// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createimagedata WebIDL::ExceptionOr> CanvasRenderingContext2D::create_image_data(int width, int height, Optional const& settings) const { - return ImageData::create(realm(), width, height, settings); + // 1. If one or both of sw and sh are zero, then throw an "IndexSizeError" DOMException. + if (width == 0 || height == 0) + return WebIDL::IndexSizeError::create(realm(), "Width and height must not be zero"_string); + + int abs_width = abs(width); + int abs_height = abs(height); + + // 2. Let newImageData be a new ImageData object. + // 3. Initialize newImageData given the absolute magnitude of sw, the absolute magnitude of sh, settings set to settings, and defaultColorSpace set to this's color space. + auto image_data = TRY(ImageData::create(realm(), abs_width, abs_height, settings)); + + // 4. Initialize the image data of newImageData to transparent black. + // ... this is handled by ImageData::create() + + // 5. Return newImageData. + return image_data; } // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-getimagedata