mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 13:27:35 +00:00
LibWeb: Check if corners have radius after converting to device pixels
Check needs to happen after conversion because non-zero radius in CSSPixels could turn into zero in device pixels. Fixes https://github.com/SerenityOS/serenity/issues/22765
This commit is contained in:
parent
6087d2feec
commit
64a48065b0
4 changed files with 27 additions and 5 deletions
12
Tests/LibWeb/Layout/expected/misc/corner-radius.txt
Normal file
12
Tests/LibWeb/Layout/expected/misc/corner-radius.txt
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
|
||||||
|
BlockContainer <html> at (0,0) content-size 800x48 [BFC] children: not-inline
|
||||||
|
BlockContainer <body> at (8,8) content-size 1x32 children: not-inline
|
||||||
|
BlockContainer <div> at (8,8) content-size 1x32 [BFC] children: inline
|
||||||
|
frag 0 from ImageBox start: 0, length: 0, rect: [8,8 16x32] baseline: 32
|
||||||
|
ImageBox <img> at (8,8) content-size 16x32 children: not-inline
|
||||||
|
|
||||||
|
ViewportPaintable (Viewport<#document>) [0,0 800x600]
|
||||||
|
PaintableWithLines (BlockContainer<HTML>) [0,0 800x48]
|
||||||
|
PaintableWithLines (BlockContainer<BODY>) [8,8 1x32]
|
||||||
|
PaintableWithLines (BlockContainer<DIV>) [8,8 1x32] overflow: [8,8 16x32]
|
||||||
|
ImagePaintable (ImageBox<IMG>) [8,8 16x32]
|
10
Tests/LibWeb/Layout/input/misc/corner-radius.html
Normal file
10
Tests/LibWeb/Layout/input/misc/corner-radius.html
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<!doctype html><style>
|
||||||
|
body {
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
div {
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
/* Test passes if it renders without crashing. */
|
||||||
|
</style><body><div><img>
|
|
@ -111,17 +111,17 @@ void BorderRadiusCornerClipper::blit_corner_clipping(Gfx::Painter& painter)
|
||||||
ScopedCornerRadiusClip::ScopedCornerRadiusClip(PaintContext& context, DevicePixelRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip)
|
ScopedCornerRadiusClip::ScopedCornerRadiusClip(PaintContext& context, DevicePixelRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip)
|
||||||
: m_context(context)
|
: m_context(context)
|
||||||
, m_id(context.allocate_corner_clipper_id())
|
, m_id(context.allocate_corner_clipper_id())
|
||||||
, m_has_radius(border_radii.has_any_radius())
|
|
||||||
, m_border_rect(border_rect)
|
, m_border_rect(border_rect)
|
||||||
{
|
{
|
||||||
if (!m_has_radius)
|
|
||||||
return;
|
|
||||||
CornerRadii const corner_radii {
|
CornerRadii const corner_radii {
|
||||||
.top_left = border_radii.top_left.as_corner(context),
|
.top_left = border_radii.top_left.as_corner(context),
|
||||||
.top_right = border_radii.top_right.as_corner(context),
|
.top_right = border_radii.top_right.as_corner(context),
|
||||||
.bottom_right = border_radii.bottom_right.as_corner(context),
|
.bottom_right = border_radii.bottom_right.as_corner(context),
|
||||||
.bottom_left = border_radii.bottom_left.as_corner(context)
|
.bottom_left = border_radii.bottom_left.as_corner(context)
|
||||||
};
|
};
|
||||||
|
m_has_radius = corner_radii.has_any_radius();
|
||||||
|
if (!m_has_radius)
|
||||||
|
return;
|
||||||
m_context.recording_painter().sample_under_corners(m_id, corner_radii, border_rect.to_type<int>(), corner_clip);
|
m_context.recording_painter().sample_under_corners(m_id, corner_radii, border_rect.to_type<int>(), corner_clip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -438,7 +438,7 @@ void PaintableBox::apply_clip_overflow_rect(PaintContext& context, PaintPhase ph
|
||||||
.bottom_right = border_radii_data.bottom_right.as_corner(context),
|
.bottom_right = border_radii_data.bottom_right.as_corner(context),
|
||||||
.bottom_left = border_radii_data.bottom_left.as_corner(context)
|
.bottom_left = border_radii_data.bottom_left.as_corner(context)
|
||||||
};
|
};
|
||||||
if (border_radii_data.has_any_radius()) {
|
if (corner_radii.has_any_radius()) {
|
||||||
VERIFY(!m_corner_clipper_id.has_value());
|
VERIFY(!m_corner_clipper_id.has_value());
|
||||||
m_corner_clipper_id = context.allocate_corner_clipper_id();
|
m_corner_clipper_id = context.allocate_corner_clipper_id();
|
||||||
context.recording_painter().sample_under_corners(*m_corner_clipper_id, corner_radii, context.rounded_device_rect(*clip_rect).to_type<int>(), CornerClip::Outside);
|
context.recording_painter().sample_under_corners(*m_corner_clipper_id, corner_radii, context.rounded_device_rect(*clip_rect).to_type<int>(), CornerClip::Outside);
|
||||||
|
@ -648,7 +648,7 @@ void PaintableWithLines::paint(PaintContext& context, PaintPhase phase) const
|
||||||
.bottom_right = border_radii.bottom_right.as_corner(context),
|
.bottom_right = border_radii.bottom_right.as_corner(context),
|
||||||
.bottom_left = border_radii.bottom_left.as_corner(context)
|
.bottom_left = border_radii.bottom_left.as_corner(context)
|
||||||
};
|
};
|
||||||
if (border_radii.has_any_radius()) {
|
if (corner_radii.has_any_radius()) {
|
||||||
corner_clip_id = context.allocate_corner_clipper_id();
|
corner_clip_id = context.allocate_corner_clipper_id();
|
||||||
context.recording_painter().sample_under_corners(*corner_clip_id, corner_radii, clip_box.to_type<int>(), CornerClip::Outside);
|
context.recording_painter().sample_under_corners(*corner_clip_id, corner_radii, clip_box.to_type<int>(), CornerClip::Outside);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue