LibWeb: Make 2D canvas save/restore perform save/restore on painter

This ensures that any internal state maintained by the painter gets
synchronized appropriately.
This commit is contained in:
Andreas Kling 2024-08-15 14:52:40 +02:00 committed by Andreas Kling
parent 8540954bf8
commit 0d57de4236
Notes: github-actions[bot] 2024-08-20 07:37:26 +00:00
3 changed files with 13 additions and 0 deletions

View file

@ -6,6 +6,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibGfx/Painter.h>
#include <LibWeb/HTML/Canvas/CanvasState.h>
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

View file

@ -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();

View file

@ -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;