mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:47:44 +00:00
LibWeb: Shrink the inner border radii to accommodate the border widths
This fixes the shape of the subreddit logo on new reddit.
This commit is contained in:
parent
890514a057
commit
b68f48eb71
5 changed files with 16 additions and 10 deletions
|
@ -32,7 +32,7 @@ void CanvasPaintable::paint(PaintContext& context, PaintPhase phase) const
|
|||
|
||||
if (phase == PaintPhase::Foreground) {
|
||||
auto canvas_rect = absolute_rect().to_rounded<int>();
|
||||
ScopedCornerRadiusClip corner_clip { context.painter(), canvas_rect, normalized_border_radii_data() };
|
||||
ScopedCornerRadiusClip corner_clip { context.painter(), canvas_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
|
||||
|
||||
// FIXME: This should be done at a different level. Also rect() does not include padding etc!
|
||||
if (!context.viewport_rect().intersects(canvas_rect))
|
||||
|
|
|
@ -49,7 +49,7 @@ void ImagePaintable::paint(PaintContext& context, PaintPhase phase) const
|
|||
context.painter().draw_text(enclosing_int_rect(absolute_rect()), alt, Gfx::TextAlignment::Center, computed_values().color(), Gfx::TextElision::Right);
|
||||
} else if (auto bitmap = layout_box().image_loader().bitmap(layout_box().image_loader().current_frame_index())) {
|
||||
auto image_rect = absolute_rect().to_rounded<int>();
|
||||
ScopedCornerRadiusClip corner_clip { context.painter(), image_rect, normalized_border_radii_data() };
|
||||
ScopedCornerRadiusClip corner_clip { context.painter(), image_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
|
||||
context.painter().draw_scaled_bitmap(image_rect, *bitmap, bitmap->rect(), 1.0f, to_gfx_scaling_mode(computed_values().image_rendering()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ void NestedBrowsingContextPaintable::paint(PaintContext& context, PaintPhase pha
|
|||
|
||||
if (phase == PaintPhase::Foreground) {
|
||||
auto clip_rect = absolute_rect().to_rounded<int>();
|
||||
ScopedCornerRadiusClip corner_clip { context.painter(), clip_rect, normalized_border_radii_data() };
|
||||
ScopedCornerRadiusClip corner_clip { context.painter(), clip_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
|
||||
|
||||
auto* hosted_document = layout_box().dom_node().content_document_without_origin_check();
|
||||
if (!hosted_document)
|
||||
|
|
|
@ -234,13 +234,16 @@ void PaintableBox::paint_box_shadow(PaintContext& context) const
|
|||
Painting::paint_box_shadow(context, absolute_border_box_rect().to_rounded<int>(), normalized_border_radii_data(), resolved_box_shadow_data);
|
||||
}
|
||||
|
||||
BorderRadiiData PaintableBox::normalized_border_radii_data() const
|
||||
BorderRadiiData PaintableBox::normalized_border_radii_data(ShrinkRadiiForBorders shrink) const
|
||||
{
|
||||
return Painting::normalized_border_radii_data(layout_box(), absolute_border_box_rect(),
|
||||
auto border_radius_data = Painting::normalized_border_radii_data(layout_box(), absolute_border_box_rect(),
|
||||
computed_values().border_top_left_radius(),
|
||||
computed_values().border_top_right_radius(),
|
||||
computed_values().border_bottom_right_radius(),
|
||||
computed_values().border_bottom_left_radius());
|
||||
if (shrink == ShrinkRadiiForBorders::Yes)
|
||||
border_radius_data.shrink(computed_values().border_top().width, computed_values().border_right().width, computed_values().border_bottom().width, computed_values().border_left().width);
|
||||
return border_radius_data;
|
||||
}
|
||||
|
||||
void PaintableBox::before_children_paint(PaintContext& context, PaintPhase phase) const
|
||||
|
@ -265,9 +268,7 @@ void PaintableBox::before_children_paint(PaintContext& context, PaintPhase phase
|
|||
clip_overflow();
|
||||
}
|
||||
if (overflow_y == CSS::Overflow::Hidden || overflow_x == CSS::Overflow::Hidden) {
|
||||
auto border_radii_data = normalized_border_radii_data();
|
||||
auto const& border = box_model().border;
|
||||
border_radii_data.shrink(border.top, border.right, border.bottom, border.left);
|
||||
auto border_radii_data = normalized_border_radii_data(ShrinkRadiiForBorders::Yes);
|
||||
if (border_radii_data.has_any_radius()) {
|
||||
auto corner_clipper = BorderRadiusCornerClipper::create(clip_rect, border_radii_data, CornerClip::Outside, BorderRadiusCornerClipper::UseCachedBitmap::No);
|
||||
if (corner_clipper.is_error()) {
|
||||
|
@ -464,7 +465,7 @@ void PaintableWithLines::paint(PaintContext& context, PaintPhase phase) const
|
|||
auto scroll_offset = static_cast<Layout::BlockContainer const&>(layout_box()).scroll_offset();
|
||||
context.painter().translate(-scroll_offset.to_type<int>());
|
||||
|
||||
auto border_radii = normalized_border_radii_data();
|
||||
auto border_radii = normalized_border_radii_data(ShrinkRadiiForBorders::Yes);
|
||||
if (border_radii.has_any_radius()) {
|
||||
auto clipper = BorderRadiusCornerClipper::create(clip_box, border_radii);
|
||||
if (!clipper.is_error()) {
|
||||
|
|
|
@ -123,7 +123,12 @@ protected:
|
|||
|
||||
virtual Gfx::FloatRect compute_absolute_rect() const;
|
||||
|
||||
Painting::BorderRadiiData normalized_border_radii_data() const;
|
||||
enum class ShrinkRadiiForBorders {
|
||||
Yes,
|
||||
No
|
||||
};
|
||||
|
||||
Painting::BorderRadiiData normalized_border_radii_data(ShrinkRadiiForBorders shrink = ShrinkRadiiForBorders::No) const;
|
||||
|
||||
private:
|
||||
Optional<OverflowData> m_overflow_data;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue