diff options
author | MacDue <macdue@dueutil.tech> | 2023-02-02 20:47:46 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-02-03 20:36:21 +0100 |
commit | f74e2da87504e5cc7f57a37b39db0660c985b911 (patch) | |
tree | 17ade403de199f2f159979642fa69f305678d39c /Userland/Libraries/LibWeb/HTML/CanvasPattern.h | |
parent | 0c313c586bcde745315bdeb1c438b988052c7a6a (diff) | |
download | serenity-f74e2da87504e5cc7f57a37b39db0660c985b911.zip |
LibWeb: Implement CanvasRenderingContext2D.createPattern()
This is a first pass at implementing CRC2D.createPattern() and the
associated CanvasPattern object. This implementation only works for a
few of the required image sources [like CRC2D.drawImage()], and does
not yet support transforms. Other than that it supports everything
else (which is mainly the various repeat modes).
Diffstat (limited to 'Userland/Libraries/LibWeb/HTML/CanvasPattern.h')
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/CanvasPattern.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/HTML/CanvasPattern.h b/Userland/Libraries/LibWeb/HTML/CanvasPattern.h new file mode 100644 index 0000000000..d8c7fc10f8 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/CanvasPattern.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2023, MacDue <macdue@dueutil.tech> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibGfx/PaintStyle.h> +#include <LibWeb/Bindings/PlatformObject.h> +#include <LibWeb/HTML/Canvas/CanvasDrawImage.h> + +namespace Web::HTML { + +class CanvasPatternPaintStyle final : public Gfx::PaintStyle { +public: + enum class Repetition { + Repeat, + RepeatX, + RepeatY, + NoRepeat + }; + + static NonnullRefPtr<CanvasPatternPaintStyle> create(Gfx::Bitmap const& bitmap, Repetition repetition) + { + return adopt_ref(*new CanvasPatternPaintStyle(bitmap, repetition)); + } + + virtual void paint(Gfx::IntRect physical_bounding_box, PaintFunction paint) const override; + +private: + CanvasPatternPaintStyle(Gfx::Bitmap const& bitmap, Repetition repetition) + : m_bitmap(bitmap) + , m_repetition(repetition) + { + } + + NonnullRefPtr<Gfx::Bitmap const> m_bitmap; + Repetition m_repetition { Repetition::Repeat }; +}; + +class CanvasPattern final : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(CanvasPattern, Bindings::PlatformObject); + +public: + static WebIDL::ExceptionOr<JS::GCPtr<CanvasPattern>> create(JS::Realm&, CanvasImageSource const& image, StringView repetition); + + ~CanvasPattern(); + + NonnullRefPtr<Gfx::PaintStyle> to_gfx_paint_style() { return m_pattern; } + +private: + CanvasPattern(JS::Realm&, CanvasPatternPaintStyle&); + + virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override; + + NonnullRefPtr<CanvasPatternPaintStyle> m_pattern; +}; + +} |