mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:07:35 +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) {
|
if (phase == PaintPhase::Foreground) {
|
||||||
auto canvas_rect = absolute_rect().to_rounded<int>();
|
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!
|
// FIXME: This should be done at a different level. Also rect() does not include padding etc!
|
||||||
if (!context.viewport_rect().intersects(canvas_rect))
|
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);
|
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())) {
|
} else if (auto bitmap = layout_box().image_loader().bitmap(layout_box().image_loader().current_frame_index())) {
|
||||||
auto image_rect = absolute_rect().to_rounded<int>();
|
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()));
|
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) {
|
if (phase == PaintPhase::Foreground) {
|
||||||
auto clip_rect = absolute_rect().to_rounded<int>();
|
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();
|
auto* hosted_document = layout_box().dom_node().content_document_without_origin_check();
|
||||||
if (!hosted_document)
|
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);
|
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_left_radius(),
|
||||||
computed_values().border_top_right_radius(),
|
computed_values().border_top_right_radius(),
|
||||||
computed_values().border_bottom_right_radius(),
|
computed_values().border_bottom_right_radius(),
|
||||||
computed_values().border_bottom_left_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
|
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();
|
clip_overflow();
|
||||||
}
|
}
|
||||||
if (overflow_y == CSS::Overflow::Hidden || overflow_x == CSS::Overflow::Hidden) {
|
if (overflow_y == CSS::Overflow::Hidden || overflow_x == CSS::Overflow::Hidden) {
|
||||||
auto border_radii_data = normalized_border_radii_data();
|
auto border_radii_data = normalized_border_radii_data(ShrinkRadiiForBorders::Yes);
|
||||||
auto const& border = box_model().border;
|
|
||||||
border_radii_data.shrink(border.top, border.right, border.bottom, border.left);
|
|
||||||
if (border_radii_data.has_any_radius()) {
|
if (border_radii_data.has_any_radius()) {
|
||||||
auto corner_clipper = BorderRadiusCornerClipper::create(clip_rect, border_radii_data, CornerClip::Outside, BorderRadiusCornerClipper::UseCachedBitmap::No);
|
auto corner_clipper = BorderRadiusCornerClipper::create(clip_rect, border_radii_data, CornerClip::Outside, BorderRadiusCornerClipper::UseCachedBitmap::No);
|
||||||
if (corner_clipper.is_error()) {
|
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();
|
auto scroll_offset = static_cast<Layout::BlockContainer const&>(layout_box()).scroll_offset();
|
||||||
context.painter().translate(-scroll_offset.to_type<int>());
|
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()) {
|
if (border_radii.has_any_radius()) {
|
||||||
auto clipper = BorderRadiusCornerClipper::create(clip_box, border_radii);
|
auto clipper = BorderRadiusCornerClipper::create(clip_box, border_radii);
|
||||||
if (!clipper.is_error()) {
|
if (!clipper.is_error()) {
|
||||||
|
|
|
@ -123,7 +123,12 @@ protected:
|
||||||
|
|
||||||
virtual Gfx::FloatRect compute_absolute_rect() const;
|
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:
|
private:
|
||||||
Optional<OverflowData> m_overflow_data;
|
Optional<OverflowData> m_overflow_data;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue