浏览代码

LibWeb: Add 'inside' clip mode to BorderRadiusCornerClipper

The default clip mode 'outside' clips everything outside the corner,
'inside' does the opposite :^)
MacDue 3 年之前
父节点
当前提交
13c4c735b8

+ 5 - 3
Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp

@@ -10,7 +10,7 @@
 
 namespace Web::Painting {
 
-ErrorOr<BorderRadiusCornerClipper> BorderRadiusCornerClipper::create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii)
+ErrorOr<BorderRadiusCornerClipper> 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> 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));

+ 9 - 2
Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h

@@ -11,9 +11,14 @@
 
 namespace Web::Painting {
 
+enum class CornerClip {
+    Outside,
+    Inside
+};
+
 class BorderRadiusCornerClipper {
 public:
-    static ErrorOr<BorderRadiusCornerClipper> create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii);
+    static ErrorOr<BorderRadiusCornerClipper> 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<Gfx::Bitmap> m_corner_bitmap;
     bool m_has_sampled { false };
+    CornerClip m_corner_clip { false };
 
-    BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr<Gfx::Bitmap> corner_bitmap)
+    BorderRadiusCornerClipper(CornerData corner_data, NonnullRefPtr<Gfx::Bitmap> corner_bitmap, CornerClip corner_clip)
         : m_data(move(corner_data))
         , m_corner_bitmap(corner_bitmap)
+        , m_corner_clip(corner_clip)
     {
     }
 };