Serenity Operating System
1/*
2 * Copyright (c) 2023, MacDue <macdue@dueutil.tech>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <LibGfx/PaintStyle.h>
10#include <LibWeb/Bindings/PlatformObject.h>
11#include <LibWeb/HTML/Canvas/CanvasDrawImage.h>
12
13namespace Web::HTML {
14
15class CanvasPatternPaintStyle final : public Gfx::PaintStyle {
16public:
17 enum class Repetition {
18 Repeat,
19 RepeatX,
20 RepeatY,
21 NoRepeat
22 };
23
24 static ErrorOr<NonnullRefPtr<CanvasPatternPaintStyle>> create(Gfx::Bitmap const& bitmap, Repetition repetition)
25 {
26 return adopt_nonnull_ref_or_enomem(new (nothrow) CanvasPatternPaintStyle(bitmap, repetition));
27 }
28
29 virtual void paint(Gfx::IntRect physical_bounding_box, PaintFunction paint) const override;
30
31private:
32 CanvasPatternPaintStyle(Gfx::Bitmap const& bitmap, Repetition repetition)
33 : m_bitmap(bitmap)
34 , m_repetition(repetition)
35 {
36 }
37
38 NonnullRefPtr<Gfx::Bitmap const> m_bitmap;
39 Repetition m_repetition { Repetition::Repeat };
40};
41
42class CanvasPattern final : public Bindings::PlatformObject {
43 WEB_PLATFORM_OBJECT(CanvasPattern, Bindings::PlatformObject);
44
45public:
46 static WebIDL::ExceptionOr<JS::GCPtr<CanvasPattern>> create(JS::Realm&, CanvasImageSource const& image, StringView repetition);
47
48 ~CanvasPattern();
49
50 NonnullRefPtr<Gfx::PaintStyle> to_gfx_paint_style() { return m_pattern; }
51
52private:
53 CanvasPattern(JS::Realm&, CanvasPatternPaintStyle&);
54
55 virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
56
57 NonnullRefPtr<CanvasPatternPaintStyle> m_pattern;
58};
59
60}