/* * Copyright (c) 2023, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include namespace Web::HTML { GC_DEFINE_ALLOCATOR(BitmapDecodedImageData); ErrorOr> BitmapDecodedImageData::create(JS::Realm& realm, Vector&& frames, size_t loop_count, bool animated) { return realm.create(move(frames), loop_count, animated); } BitmapDecodedImageData::BitmapDecodedImageData(Vector&& frames, size_t loop_count, bool animated) : m_frames(move(frames)) , m_loop_count(loop_count) , m_animated(animated) { } BitmapDecodedImageData::~BitmapDecodedImageData() = default; size_t BitmapDecodedImageData::external_memory_size() const { size_t size = JS::vector_external_memory_size(m_frames); for (auto const& frame : m_frames) { if (frame.frame) size = JS::saturating_add_external_memory_size(size, frame.frame->bitmap().data_size()); } return size; } RefPtr BitmapDecodedImageData::frame(size_t frame_index, Gfx::IntSize) const { if (frame_index >= m_frames.size()) return nullptr; return m_frames[frame_index].frame; } int BitmapDecodedImageData::frame_duration(size_t frame_index) const { if (frame_index >= m_frames.size()) return 0; return m_frames[frame_index].duration; } Optional BitmapDecodedImageData::intrinsic_width() const { return m_frames.first().frame->width(); } Optional BitmapDecodedImageData::intrinsic_height() const { return m_frames.first().frame->height(); } Optional BitmapDecodedImageData::intrinsic_aspect_ratio() const { return CSSPixels(m_frames.first().frame->width()) / CSSPixels(m_frames.first().frame->height()); } Optional BitmapDecodedImageData::frame_rect(size_t frame_index) const { return m_frames[frame_index].frame->rect(); } void BitmapDecodedImageData::paint(DisplayListRecordingContext& context, size_t frame_index, Gfx::IntRect dst_rect, Gfx::IntRect clip_rect, Gfx::ScalingMode scaling_mode) const { context.display_list_recorder().draw_scaled_decoded_image_frame(dst_rect, clip_rect, *m_frames[frame_index].frame, scaling_mode); } }