mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 08:27:35 +00:00
LibWeb: Add 'inside' clip mode to BorderRadiusCornerClipper
The default clip mode 'outside' clips everything outside the corner, 'inside' does the opposite :^)
This commit is contained in:
parent
08baeb1e7d
commit
13c4c735b8
2 changed files with 14 additions and 5 deletions
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
namespace Web::Painting {
|
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());
|
VERIFY(border_radii.has_any_radius());
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ ErrorOr<BorderRadiusCornerClipper> BorderRadiusCornerClipper::create(Gfx::IntRec
|
||||||
.corner_bitmap_size = corners_bitmap_size
|
.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)
|
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) {
|
for (int col = 0; col < mask_src.width(); ++col) {
|
||||||
auto corner_location = mask_src.location().translated(col, row);
|
auto corner_location = mask_src.location().translated(col, row);
|
||||||
auto mask_pixel = m_corner_bitmap->get_pixel(corner_location);
|
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();
|
auto final_pixel = Color();
|
||||||
if (mask_alpha > 0) {
|
if (mask_alpha > 0) {
|
||||||
auto page_pixel = page_painter.get_pixel(page_location.translated(col, row));
|
auto page_pixel = page_painter.get_pixel(page_location.translated(col, row));
|
||||||
|
|
|
@ -11,9 +11,14 @@
|
||||||
|
|
||||||
namespace Web::Painting {
|
namespace Web::Painting {
|
||||||
|
|
||||||
|
enum class CornerClip {
|
||||||
|
Outside,
|
||||||
|
Inside
|
||||||
|
};
|
||||||
|
|
||||||
class BorderRadiusCornerClipper {
|
class BorderRadiusCornerClipper {
|
||||||
public:
|
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 sample_under_corners(Gfx::Painter& page_painter);
|
||||||
void blit_corner_clipping(Gfx::Painter& page_painter);
|
void blit_corner_clipping(Gfx::Painter& page_painter);
|
||||||
|
@ -40,10 +45,12 @@ private:
|
||||||
|
|
||||||
NonnullRefPtr<Gfx::Bitmap> m_corner_bitmap;
|
NonnullRefPtr<Gfx::Bitmap> m_corner_bitmap;
|
||||||
bool m_has_sampled { false };
|
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_data(move(corner_data))
|
||||||
, m_corner_bitmap(corner_bitmap)
|
, m_corner_bitmap(corner_bitmap)
|
||||||
|
, m_corner_clip(corner_clip)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue