diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.cpp b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.cpp index c6a7a594a86..9e30b8fca92 100644 --- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.cpp +++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.cpp @@ -6,6 +6,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include namespace Web::HTML { @@ -15,6 +16,9 @@ void CanvasState::save() { // The save() method steps are to push a copy of the current drawing state onto the drawing state stack. m_drawing_state_stack.append(m_drawing_state); + + if (auto* painter = painter_for_canvas_state()) + painter->save(); } // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-restore @@ -24,6 +28,9 @@ void CanvasState::restore() if (m_drawing_state_stack.is_empty()) return; m_drawing_state = m_drawing_state_stack.take_last(); + + if (auto* painter = painter_for_canvas_state()) + painter->restore(); } // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-reset diff --git a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h index db3e6cae7c4..547ef519a82 100644 --- a/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h +++ b/Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h @@ -26,6 +26,9 @@ class CanvasState { public: virtual ~CanvasState() = default; + virtual Gfx::Painter* painter_for_canvas_state() = 0; + virtual Gfx::Path& path_for_canvas_state() = 0; + void save(); void restore(); void reset(); diff --git a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h index 5072cdcb6be..91a6322764d 100644 --- a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h +++ b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.h @@ -106,6 +106,9 @@ private: virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; + virtual Gfx::Painter* painter_for_canvas_state() override { return painter(); } + virtual Gfx::Path& path_for_canvas_state() override { return path(); } + struct PreparedTextGlyph { String glyph; Gfx::IntPoint position;