From 5aeb8ebebc15f46a38cbe9e1f281cd8350eef70f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 15 Aug 2024 07:19:25 +0200 Subject: [PATCH] LibWeb: Clip underlying Painter in CRC2D::clip() --- Userland/Libraries/LibGfx/Painter.h | 2 ++ Userland/Libraries/LibGfx/PainterSkia.cpp | 7 +++++++ Userland/Libraries/LibGfx/PainterSkia.h | 1 + Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h | 6 ------ .../LibWeb/HTML/CanvasRenderingContext2D.cpp | 13 +++++-------- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Userland/Libraries/LibGfx/Painter.h b/Userland/Libraries/LibGfx/Painter.h index 510099ab3b3..3710ecf9c73 100644 --- a/Userland/Libraries/LibGfx/Painter.h +++ b/Userland/Libraries/LibGfx/Painter.h @@ -35,6 +35,8 @@ public: virtual void save() = 0; virtual void restore() = 0; + + virtual void clip(Gfx::Path const&, Gfx::WindingRule) = 0; }; } diff --git a/Userland/Libraries/LibGfx/PainterSkia.cpp b/Userland/Libraries/LibGfx/PainterSkia.cpp index f9889920a63..2dd2723da2b 100644 --- a/Userland/Libraries/LibGfx/PainterSkia.cpp +++ b/Userland/Libraries/LibGfx/PainterSkia.cpp @@ -275,4 +275,11 @@ void PainterSkia::restore() impl().canvas()->restore(); } +void PainterSkia::clip(Gfx::Path const& path, Gfx::WindingRule winding_rule) +{ + auto sk_path = to_skia_path(path); + sk_path.setFillType(to_skia_path_fill_type(winding_rule)); + impl().canvas()->clipPath(sk_path, SkClipOp::kIntersect, true); +} + } diff --git a/Userland/Libraries/LibGfx/PainterSkia.h b/Userland/Libraries/LibGfx/PainterSkia.h index bbb7319be67..b0440f39d66 100644 --- a/Userland/Libraries/LibGfx/PainterSkia.h +++ b/Userland/Libraries/LibGfx/PainterSkia.h @@ -27,6 +27,7 @@ public: virtual void set_transform(Gfx::AffineTransform const&) override; virtual void save() override; virtual void restore() override; + virtual void clip(Gfx::Path const&, Gfx::WindingRule) override; private: struct Impl; diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h index 8eb4274b122..db3e6cae7c4 100644 --- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h +++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h @@ -24,11 +24,6 @@ namespace Web::HTML { // https://html.spec.whatwg.org/multipage/canvas.html#canvasstate class CanvasState { public: - struct ClipPath { - Gfx::Path path; - Gfx::WindingRule winding_rule; - }; - virtual ~CanvasState() = default; void save(); @@ -87,7 +82,6 @@ public: bool image_smoothing_enabled { true }; Bindings::ImageSmoothingQuality image_smoothing_quality { Bindings::ImageSmoothingQuality::Low }; float global_alpha = { 1 }; - Optional clip; RefPtr font_style_value { nullptr }; RefPtr current_font { nullptr }; Bindings::CanvasTextAlign text_align { Bindings::CanvasTextAlign::Start }; diff --git a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp index 300163600aa..af4a83c6808 100644 --- a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp +++ b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp @@ -543,15 +543,12 @@ CanvasRenderingContext2D::PreparedText CanvasRenderingContext2D::prepare_text(By void CanvasRenderingContext2D::clip_internal(Gfx::Path& path, Gfx::WindingRule winding_rule) { - // FIXME: This should calculate the new clip path by intersecting the given path with the current one. - // See: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-clip-dev - path.close_all_subpaths(); - if (drawing_state().clip.has_value()) { - auto& current_clip = drawing_state().clip->path; - current_clip.intersect(path); + auto* painter = this->painter(); + if (!painter) return; - } - drawing_state().clip = CanvasState::ClipPath { path, winding_rule }; + + path.close_all_subpaths(); + painter->clip(path, winding_rule); } void CanvasRenderingContext2D::clip(StringView fill_rule)