LibWeb: Add one of the two documented constructors to ImageData

Also adds the IDL types:
- dictionary ImageDataSettings
- enum PredefinedColorSpace.
This commit is contained in:
Kenneth Myhra 2024-03-23 21:45:59 +01:00 committed by Andreas Kling
commit 30a02fef91
Notes: sideshowbarker 2024-07-17 18:08:55 +09:00
5 changed files with 52 additions and 2 deletions

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,9 @@
<!DOCTYPE html>
<script src="../include.js"></script>
<script>
test(() => {
let imageData = new ImageData(100, 100);
println(imageData.data);
println(imageData.data.length);
});
</script>

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2020-2022, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2024, Kenneth Myhra <kennethmyhra@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -8,14 +9,36 @@
#include <LibJS/Runtime/TypedArray.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/HTML/ImageData.h>
#include <LibWeb/WebIDL/DOMException.h>
#include <LibWeb/WebIDL/ExceptionOr.h>
namespace Web::HTML {
JS_DEFINE_ALLOCATOR(ImageData);
WebIDL::ExceptionOr<JS::NonnullGCPtr<ImageData>> ImageData::create(JS::Realm& realm, u32 sw, u32 sh, Optional<ImageDataSettings> const&)
{
auto& vm = realm.vm();
// 1. If one or both of sw and sh are zero, then throw an "IndexSizeError" DOMException.
if (sw == 0 || sh == 0)
return WebIDL::IndexSizeError::create(realm, "The source width and height must be greater than zero."_fly_string);
// 2. Initialize this given sw, sh, and settings set to settings.
// 3. Initialize the image data of this to transparent black.
auto data = TRY(JS::Uint8ClampedArray::create(realm, sw * sh * 4));
auto bitmap = TRY_OR_THROW_OOM(vm, Gfx::Bitmap::create_wrapper(Gfx::BitmapFormat::RGBA8888, Gfx::IntSize(sw, sw), 1, sw * sizeof(u32), data->data().data()));
return realm.heap().allocate<ImageData>(realm, realm, bitmap, data);
}
WebIDL::ExceptionOr<JS::NonnullGCPtr<ImageData>> ImageData::construct_impl(JS::Realm& realm, u32 sw, u32 sh, Optional<ImageDataSettings> const& settings)
{
return ImageData::create(realm, sw, sh, settings);
}
JS::GCPtr<ImageData> ImageData::create_with_size(JS::Realm& realm, int width, int height)
{
if (width <= 0 || height <= 0)
return nullptr;

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2020-2022, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2024, Kenneth Myhra <kennethmyhra@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -7,15 +8,23 @@
#pragma once
#include <LibGfx/Forward.h>
#include <LibWeb/Bindings/ImageDataPrototype.h>
#include <LibWeb/Bindings/PlatformObject.h>
namespace Web::HTML {
struct ImageDataSettings {
Bindings::PredefinedColorSpace color_space;
};
class ImageData final : public Bindings::PlatformObject {
WEB_PLATFORM_OBJECT(ImageData, Bindings::PlatformObject);
JS_DECLARE_ALLOCATOR(ImageData);
public:
[[nodiscard]] static WebIDL::ExceptionOr<JS::NonnullGCPtr<ImageData>> create(JS::Realm&, u32 sw, u32 sh, Optional<ImageDataSettings> const& settings = {});
[[nodiscard]] static WebIDL::ExceptionOr<JS::NonnullGCPtr<ImageData>> construct_impl(JS::Realm&, u32 sw, u32 sh, Optional<ImageDataSettings> const& settings = {});
static JS::GCPtr<ImageData> create_with_size(JS::Realm&, int width, int height);
virtual ~ImageData() override;

View file

@ -1,7 +1,14 @@
// https://html.spec.whatwg.org/multipage/canvas.html#imagedata
enum PredefinedColorSpace { "srgb", "display-p3" };
dictionary ImageDataSettings {
PredefinedColorSpace colorSpace;
};
[Exposed=(Window,Worker), Serializable]
interface ImageData {
constructor(unsigned long sw, unsigned long sh, optional ImageDataSettings settings = {});
readonly attribute unsigned long width;
readonly attribute unsigned long height;
readonly attribute Uint8ClampedArray data;