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;