From 13c4c735b810fe7ca63c4a64a168e8c9f80bbdde Mon Sep 17 00:00:00 2001 From: MacDue Date: Mon, 20 Jun 2022 12:10:24 +0100 Subject: [PATCH] LibWeb: Add 'inside' clip mode to BorderRadiusCornerClipper The default clip mode 'outside' clips everything outside the corner, 'inside' does the opposite :^) --- .../LibWeb/Painting/BorderRadiusCornerClipper.cpp | 8 +++++--- .../LibWeb/Painting/BorderRadiusCornerClipper.h | 11 +++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp index a87876bf933..6e73d7fa00f 100644 --- a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp +++ b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp @@ -10,7 +10,7 @@ namespace Web::Painting { -ErrorOr BorderRadiusCornerClipper::create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii) +ErrorOr BorderRadiusCornerClipper::create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip) { VERIFY(border_radii.has_any_radius()); @@ -43,7 +43,7 @@ ErrorOr BorderRadiusCornerClipper::create(Gfx::IntRec .corner_bitmap_size = corners_bitmap_size }; - return BorderRadiusCornerClipper { corner_data, corner_bitmap.release_nonnull() }; + return BorderRadiusCornerClipper { corner_data, corner_bitmap.release_nonnull(), corner_clip }; } void BorderRadiusCornerClipper::sample_under_corners(Gfx::Painter& page_painter) @@ -60,7 +60,9 @@ void BorderRadiusCornerClipper::sample_under_corners(Gfx::Painter& page_painter) for (int col = 0; col < mask_src.width(); ++col) { auto corner_location = mask_src.location().translated(col, row); auto mask_pixel = m_corner_bitmap->get_pixel(corner_location); - u8 mask_alpha = ~mask_pixel.alpha(); + u8 mask_alpha = mask_pixel.alpha(); + if (m_corner_clip == CornerClip::Outside) + mask_alpha = ~mask_pixel.alpha(); auto final_pixel = Color(); if (mask_alpha > 0) { auto page_pixel = page_painter.get_pixel(page_location.translated(col, row)); diff --git a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h index 6186c679fcc..cdb8176503a 100644 --- a/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h +++ b/Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h @@ -11,9 +11,14 @@ namespace Web::Painting { +enum class CornerClip { + Outside, + Inside +}; + class BorderRadiusCornerClipper { public: - static ErrorOr create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii); + static ErrorOr create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip = CornerClip::Outside); void sample_under_corners(Gfx::Painter& page_painter); void blit_corner_clipping(Gfx::Painter& page_painter); @@ -40,10 +45,12 @@ private: NonnullRefPtr m_corner_bitmap; bool m_has_sampled { false }; + CornerClip m_corner_clip { false }; - BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr corner_bitmap) + BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr corner_bitmap, CornerClip corner_clip) : m_data(move(corner_data)) , m_corner_bitmap(corner_bitmap) + , m_corner_clip(corner_clip) { } };