Browse Source

LibWeb: Shrink the inner border radii to accommodate the border widths

This fixes the shape of the subreddit logo on new reddit.
MacDue 3 years ago
parent
commit
b68f48eb71

+ 1 - 1
Userland/Libraries/LibWeb/Painting/CanvasPaintable.cpp

@@ -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))

+ 1 - 1
Userland/Libraries/LibWeb/Painting/ImagePaintable.cpp

@@ -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()));
         }
     }

+ 1 - 1
Userland/Libraries/LibWeb/Painting/NestedBrowsingContextPaintable.cpp

@@ -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)

+ 7 - 6
Userland/Libraries/LibWeb/Painting/PaintableBox.cpp

@@ -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()) {

+ 6 - 1
Userland/Libraries/LibWeb/Painting/PaintableBox.h

@@ -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;