From 708574d3731dba0473fc3607d9826432d862e980 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 18 Oct 2023 16:24:20 +0200 Subject: [PATCH] LibWeb/Painting: Do not clip border radius when it is out of viewport Painting optimization to do less unnecessary work. --- .../Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp | 2 +- .../Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h | 6 +++++- Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp index 2d94995d84..9f7a791000 100644 --- a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp +++ b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp @@ -53,7 +53,7 @@ ErrorOr> BorderRadiusCornerClipper::cre .corner_bitmap_size = corners_bitmap_size }; - return try_make_ref_counted(corner_data, corner_bitmap.release_nonnull(), corner_clip); + return try_make_ref_counted(corner_data, corner_bitmap.release_nonnull(), corner_clip, border_rect); } void BorderRadiusCornerClipper::sample_under_corners(Gfx::Painter& page_painter) diff --git a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h index 9068a6ba73..50aacbd812 100644 --- a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h +++ b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h @@ -41,10 +41,13 @@ public: DevicePixelSize corner_bitmap_size; } m_data; - BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr corner_bitmap, CornerClip corner_clip) + DevicePixelRect border_rect() const { return m_border_rect; } + + BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr corner_bitmap, CornerClip corner_clip, DevicePixelRect const& border_rect) : m_data(move(corner_data)) , m_corner_bitmap(corner_bitmap) , m_corner_clip(corner_clip) + , m_border_rect(border_rect) { } @@ -52,6 +55,7 @@ private: NonnullRefPtr m_corner_bitmap; bool m_has_sampled { false }; CornerClip m_corner_clip { false }; + DevicePixelRect m_border_rect; }; struct ScopedCornerRadiusClip { diff --git a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp index 0c49bd70f3..1a584cd5d1 100644 --- a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp +++ b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp @@ -482,6 +482,8 @@ CommandResult DrawTriangleWave::execute(CommandExecutionState& state) const CommandResult SampleUnderCorners::execute(CommandExecutionState& state) const { + if (state.would_be_fully_clipped_by_painter(corner_clipper->border_rect().to_type())) + return CommandResult::Continue; auto& painter = state.painter(); corner_clipper->sample_under_corners(painter); return CommandResult::Continue; @@ -489,6 +491,8 @@ CommandResult SampleUnderCorners::execute(CommandExecutionState& state) const CommandResult BlitCornerClipping::execute(CommandExecutionState& state) const { + if (state.would_be_fully_clipped_by_painter(corner_clipper->border_rect().to_type())) + return CommandResult::Continue; auto& painter = state.painter(); corner_clipper->blit_corner_clipping(painter); return CommandResult::Continue;