From 017e8a5b8d1396eab3eab330417ff3f6bc2bff12 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Tue, 21 Oct 2025 17:47:15 +0100 Subject: [PATCH] LibGfx: Add a method to reset a Painter to its initial state --- Libraries/LibGfx/Painter.h | 2 ++ Libraries/LibGfx/PainterSkia.cpp | 10 ++++++++++ Libraries/LibGfx/PainterSkia.h | 2 ++ 3 files changed, 14 insertions(+) diff --git a/Libraries/LibGfx/Painter.h b/Libraries/LibGfx/Painter.h index 16df85e8584..293363bc47b 100644 --- a/Libraries/LibGfx/Painter.h +++ b/Libraries/LibGfx/Painter.h @@ -43,6 +43,8 @@ public: virtual void restore() = 0; virtual void clip(Gfx::Path const&, Gfx::WindingRule) = 0; + + virtual void reset() = 0; }; } diff --git a/Libraries/LibGfx/PainterSkia.cpp b/Libraries/LibGfx/PainterSkia.cpp index 1cfd5381d6f..5965175ab16 100644 --- a/Libraries/LibGfx/PainterSkia.cpp +++ b/Libraries/LibGfx/PainterSkia.cpp @@ -134,6 +134,9 @@ static SkPaint to_skia_paint(Gfx::PaintStyle const& style, Optional painting_surface) : m_impl(adopt_own(*new Impl { move(painting_surface) })) { + m_impl->with_canvas([this](auto& canvas) { + m_initial_save_count = canvas.save(); + }); } PainterSkia::~PainterSkia() = default; @@ -335,4 +338,11 @@ void PainterSkia::clip(Gfx::Path const& path, Gfx::WindingRule winding_rule) }); } +void PainterSkia::reset() +{ + impl().with_canvas([&](auto& canvas) { + canvas.restoreToCount(m_initial_save_count); + }); +} + } diff --git a/Libraries/LibGfx/PainterSkia.h b/Libraries/LibGfx/PainterSkia.h index cfde32de402..4cc19762005 100644 --- a/Libraries/LibGfx/PainterSkia.h +++ b/Libraries/LibGfx/PainterSkia.h @@ -32,11 +32,13 @@ public: virtual void save() override; virtual void restore() override; virtual void clip(Gfx::Path const&, Gfx::WindingRule) override; + virtual void reset() override; private: struct Impl; Impl& impl() { return *m_impl; } NonnullOwnPtr m_impl; + u32 m_initial_save_count { 0 }; }; }