Serenity Operating System
at master 77 lines 2.0 kB view raw
1/* 2 * Copyright (c) 2020-2022, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibGfx/Bitmap.h> 8#include <LibJS/Runtime/TypedArray.h> 9#include <LibWeb/Bindings/Intrinsics.h> 10#include <LibWeb/HTML/ImageData.h> 11 12namespace Web::HTML { 13 14JS::GCPtr<ImageData> ImageData::create_with_size(JS::Realm& realm, int width, int height) 15{ 16 17 if (width <= 0 || height <= 0) 18 return nullptr; 19 20 if (width > 16384 || height > 16384) 21 return nullptr; 22 23 auto data_or_error = JS::Uint8ClampedArray::create(realm, width * height * 4); 24 if (data_or_error.is_error()) 25 return nullptr; 26 auto data = JS::NonnullGCPtr<JS::Uint8ClampedArray>(*data_or_error.release_value()); 27 28 auto bitmap_or_error = Gfx::Bitmap::create_wrapper(Gfx::BitmapFormat::RGBA8888, Gfx::IntSize(width, height), 1, width * sizeof(u32), data->data().data()); 29 if (bitmap_or_error.is_error()) 30 return nullptr; 31 return realm.heap().allocate<ImageData>(realm, realm, bitmap_or_error.release_value(), move(data)).release_allocated_value_but_fixme_should_propagate_errors(); 32} 33 34ImageData::ImageData(JS::Realm& realm, NonnullRefPtr<Gfx::Bitmap> bitmap, JS::NonnullGCPtr<JS::Uint8ClampedArray> data) 35 : PlatformObject(realm) 36 , m_bitmap(move(bitmap)) 37 , m_data(move(data)) 38{ 39} 40 41ImageData::~ImageData() = default; 42 43JS::ThrowCompletionOr<void> ImageData::initialize(JS::Realm& realm) 44{ 45 MUST_OR_THROW_OOM(Base::initialize(realm)); 46 set_prototype(&Bindings::ensure_web_prototype<Bindings::ImageDataPrototype>(realm, "ImageData")); 47 48 return {}; 49} 50 51void ImageData::visit_edges(Cell::Visitor& visitor) 52{ 53 Base::visit_edges(visitor); 54 visitor.visit(m_data.ptr()); 55} 56 57unsigned ImageData::width() const 58{ 59 return m_bitmap->width(); 60} 61 62unsigned ImageData::height() const 63{ 64 return m_bitmap->height(); 65} 66 67JS::Uint8ClampedArray* ImageData::data() 68{ 69 return m_data; 70} 71 72const JS::Uint8ClampedArray* ImageData::data() const 73{ 74 return m_data; 75} 76 77}