Skip to content

Commit

Permalink
LibWeb/Painting: Do not clip border radius when it is out of viewport
Browse files Browse the repository at this point in the history
Painting optimization to do less unnecessary work.
  • Loading branch information
kalenikaliaksandr authored and awesomekling committed Oct 19, 2023
1 parent b835d2b commit 708574d
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ ErrorOr<NonnullRefPtr<BorderRadiusCornerClipper>> BorderRadiusCornerClipper::cre
.corner_bitmap_size = corners_bitmap_size
};

return try_make_ref_counted<BorderRadiusCornerClipper>(corner_data, corner_bitmap.release_nonnull(), corner_clip);
return try_make_ref_counted<BorderRadiusCornerClipper>(corner_data, corner_bitmap.release_nonnull(), corner_clip, border_rect);
}

void BorderRadiusCornerClipper::sample_under_corners(Gfx::Painter& page_painter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,21 @@ class BorderRadiusCornerClipper : public RefCounted<BorderRadiusCornerClipper> {
DevicePixelSize corner_bitmap_size;
} m_data;

BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr<Gfx::Bitmap> corner_bitmap, CornerClip corner_clip)
DevicePixelRect border_rect() const { return m_border_rect; }

BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr<Gfx::Bitmap> 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)
{
}

private:
NonnullRefPtr<Gfx::Bitmap> m_corner_bitmap;
bool m_has_sampled { false };
CornerClip m_corner_clip { false };
DevicePixelRect m_border_rect;
};

struct ScopedCornerRadiusClip {
Expand Down
4 changes: 4 additions & 0 deletions Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -482,13 +482,17 @@ 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<int>()))
return CommandResult::Continue;
auto& painter = state.painter();
corner_clipper->sample_under_corners(painter);
return CommandResult::Continue;
}

CommandResult BlitCornerClipping::execute(CommandExecutionState& state) const
{
if (state.would_be_fully_clipped_by_painter(corner_clipper->border_rect().to_type<int>()))
return CommandResult::Continue;
auto& painter = state.painter();
corner_clipper->blit_corner_clipping(painter);
return CommandResult::Continue;
Expand Down

0 comments on commit 708574d

Please sign in to comment.