Ver Fonte

LibWeb: Clip underlying Painter in CRC2D::clip()

Andreas Kling há 11 meses atrás
pai
commit
5aeb8ebebc

+ 2 - 0
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;
 };
 
 }

+ 7 - 0
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);
+}
+
 }

+ 1 - 0
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;

+ 0 - 6
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<ClipPath> clip;
         RefPtr<CSS::CSSStyleValue> font_style_value { nullptr };
         RefPtr<Gfx::Font const> current_font { nullptr };
         Bindings::CanvasTextAlign text_align { Bindings::CanvasTextAlign::Start };

+ 5 - 8
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)