From 0094480fd6de0c33e98eef52a0b660a84bd4071d Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Tue, 1 Apr 2025 19:53:16 +0200 Subject: [PATCH] LibWeb: Pass PaintingSurface into DisplayListPlayer::execute() Deleteing set_surface() makes DisplayListPlayer API a bit more intuitive because now caller doesn't have to think whether it's necessary to restore previous surface after execution, instead DisplayListPlayer takes care of it by maintaining a stack of surfaces. --- Libraries/LibWeb/CSS/StyleValues/CursorStyleValue.cpp | 3 +-- Libraries/LibWeb/HTML/RenderingThread.cpp | 3 +-- Libraries/LibWeb/Painting/DisplayList.cpp | 11 +++++++++-- Libraries/LibWeb/Painting/DisplayList.h | 7 +++---- Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp | 7 ++----- Libraries/LibWeb/Painting/SVGMaskable.cpp | 3 +-- Libraries/LibWeb/SVG/SVGDecodedImageData.cpp | 3 +-- 7 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Libraries/LibWeb/CSS/StyleValues/CursorStyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/CursorStyleValue.cpp index d36619904cd..439921dd79c 100644 --- a/Libraries/LibWeb/CSS/StyleValues/CursorStyleValue.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/CursorStyleValue.cpp @@ -94,8 +94,7 @@ Optional CursorStyleValue::make_image_cursor(Layout::NodeWithS case DisplayListPlayerType::SkiaCPU: { auto painting_surface = Gfx::PaintingSurface::wrap_bitmap(bitmap); Painting::DisplayListPlayerSkia display_list_player; - display_list_player.set_surface(painting_surface); - display_list_player.execute(*display_list); + display_list_player.execute(*display_list, painting_surface); break; } } diff --git a/Libraries/LibWeb/HTML/RenderingThread.cpp b/Libraries/LibWeb/HTML/RenderingThread.cpp index 519880ced48..17cec97546d 100644 --- a/Libraries/LibWeb/HTML/RenderingThread.cpp +++ b/Libraries/LibWeb/HTML/RenderingThread.cpp @@ -49,8 +49,7 @@ void RenderingThread::rendering_thread_loop() break; } - m_skia_player->set_surface(task->painting_surface); - m_skia_player->execute(*task->display_list); + m_skia_player->execute(*task->display_list, task->painting_surface); m_main_thread_event_loop.deferred_invoke([callback = move(task->callback)] { callback(); }); diff --git a/Libraries/LibWeb/Painting/DisplayList.cpp b/Libraries/LibWeb/Painting/DisplayList.cpp index f06f6523311..bbde8c16520 100644 --- a/Libraries/LibWeb/Painting/DisplayList.cpp +++ b/Libraries/LibWeb/Painting/DisplayList.cpp @@ -35,13 +35,20 @@ static bool command_is_clip_or_mask(Command const& command) }); } -void DisplayListPlayer::execute(DisplayList& display_list) +void DisplayListPlayer::execute(DisplayList& display_list, RefPtr surface) { + if (surface) + m_surfaces.append(*surface); + ScopeGuard guard = [&surfaces = m_surfaces, pop_surface_from_stack = !!surface] { + if (pop_surface_from_stack) + (void)surfaces.take_last(); + }; + auto const& commands = display_list.commands(); auto const& scroll_state = display_list.scroll_state(); auto device_pixels_per_css_pixel = display_list.device_pixels_per_css_pixel(); - VERIFY(m_surface); + VERIFY(!m_surfaces.is_empty()); for (size_t command_index = 0; command_index < commands.size(); command_index++) { auto scroll_frame_id = commands[command_index].scroll_frame_id; diff --git a/Libraries/LibWeb/Painting/DisplayList.h b/Libraries/LibWeb/Painting/DisplayList.h index 2f908a96486..6ab27a39bfd 100644 --- a/Libraries/LibWeb/Painting/DisplayList.h +++ b/Libraries/LibWeb/Painting/DisplayList.h @@ -26,11 +26,10 @@ class DisplayListPlayer { public: virtual ~DisplayListPlayer() = default; - void execute(DisplayList&); - void set_surface(NonnullRefPtr surface) { m_surface = surface; } + void execute(DisplayList&, RefPtr); protected: - Gfx::PaintingSurface& surface() const { return *m_surface; } + Gfx::PaintingSurface& surface() const { return m_surfaces.last(); } private: virtual void flush() = 0; @@ -74,7 +73,7 @@ private: virtual void apply_mask_bitmap(ApplyMaskBitmap const&) = 0; virtual bool would_be_fully_clipped_by_painter(Gfx::IntRect) const = 0; - RefPtr m_surface; + Vector, 1> m_surfaces; }; class DisplayList : public AtomicRefCounted { diff --git a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp index a51dc3f370b..dc8a4e458d5 100644 --- a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp +++ b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp @@ -972,10 +972,7 @@ void DisplayListPlayerSkia::add_mask(AddMask const& command) auto mask_surface = Gfx::PaintingSurface::create_with_size(m_context, rect.size(), Gfx::BitmapFormat::BGRA8888, Gfx::AlphaType::Premultiplied); - NonnullRefPtr old_surface = surface(); - set_surface(mask_surface); - execute(*command.display_list); - set_surface(old_surface); + execute(*command.display_list, mask_surface); SkMatrix mask_matrix; mask_matrix.setTranslate(rect.x(), rect.y()); @@ -988,7 +985,7 @@ void DisplayListPlayerSkia::paint_nested_display_list(PaintNestedDisplayList con { auto& canvas = surface().canvas(); canvas.translate(command.rect.x(), command.rect.y()); - execute(*command.display_list); + execute(*command.display_list, {}); } void DisplayListPlayerSkia::paint_scrollbar(PaintScrollBar const& command) diff --git a/Libraries/LibWeb/Painting/SVGMaskable.cpp b/Libraries/LibWeb/Painting/SVGMaskable.cpp index 5cb1a2f5aa2..7185c380587 100644 --- a/Libraries/LibWeb/Painting/SVGMaskable.cpp +++ b/Libraries/LibWeb/Painting/SVGMaskable.cpp @@ -100,8 +100,7 @@ RefPtr SVGMaskable::calculate_mask_of_svg(PaintContext& co StackingContext::paint_svg(paint_context, paintable, PaintPhase::Foreground); auto painting_surface = Gfx::PaintingSurface::wrap_bitmap(*mask_bitmap); DisplayListPlayerSkia display_list_player; - display_list_player.set_surface(painting_surface); - display_list_player.execute(display_list); + display_list_player.execute(display_list, painting_surface); return mask_bitmap; }; RefPtr mask_bitmap = {}; diff --git a/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp b/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp index d7cd6fa9d34..a7d6fba1cb3 100644 --- a/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp +++ b/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp @@ -106,8 +106,7 @@ RefPtr SVGDecodedImageData::render(Gfx::IntSize size) const case DisplayListPlayerType::SkiaCPU: { auto painting_surface = Gfx::PaintingSurface::wrap_bitmap(*bitmap); Painting::DisplayListPlayerSkia display_list_player; - display_list_player.set_surface(painting_surface); - display_list_player.execute(*display_list); + display_list_player.execute(*display_list, painting_surface); break; } default: