summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibWeb/Layout/Box.cpp27
-rw-r--r--Userland/Libraries/LibWeb/Layout/Box.h10
-rw-r--r--Userland/Libraries/LibWeb/Painting/BorderPainting.cpp23
-rw-r--r--Userland/Libraries/LibWeb/Painting/BorderPainting.h8
4 files changed, 39 insertions, 29 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/Box.cpp b/Userland/Libraries/LibWeb/Layout/Box.cpp
index a768702792..73e135c572 100644
--- a/Userland/Libraries/LibWeb/Layout/Box.cpp
+++ b/Userland/Libraries/LibWeb/Layout/Box.cpp
@@ -299,28 +299,13 @@ void Box::paint_box_shadow(PaintContext& context)
context.painter().blit(rect.location() + blur_rect_position, *new_bitmap, rect);
}
-Box::BorderRadiusData Box::normalized_border_radius_data()
+Painting::BorderRadiusData Box::normalized_border_radius_data()
{
- // FIXME: some values should be relative to the height() if specified, but which? For now, all relative values are relative to the width.
- auto bottom_left_radius = computed_values().border_bottom_left_radius().resolved_or_zero(*this, width()).to_px(*this);
- auto bottom_right_radius = computed_values().border_bottom_right_radius().resolved_or_zero(*this, width()).to_px(*this);
- auto top_left_radius = computed_values().border_top_left_radius().resolved_or_zero(*this, width()).to_px(*this);
- auto top_right_radius = computed_values().border_top_right_radius().resolved_or_zero(*this, width()).to_px(*this);
-
- // Scale overlapping curves according to https://www.w3.org/TR/css-backgrounds-3/#corner-overlap
- auto bordered_rect = this->bordered_rect();
- auto f = 1.0f;
- f = min(f, bordered_rect.width() / (float)(top_left_radius + top_right_radius));
- f = min(f, bordered_rect.height() / (float)(top_right_radius + bottom_right_radius));
- f = min(f, bordered_rect.width() / (float)(bottom_left_radius + bottom_right_radius));
- f = min(f, bordered_rect.height() / (float)(top_left_radius + bottom_left_radius));
-
- top_left_radius = (int)(top_left_radius * f);
- top_right_radius = (int)(top_right_radius * f);
- bottom_right_radius = (int)(bottom_right_radius * f);
- bottom_left_radius = (int)(bottom_left_radius * f);
-
- return { top_left_radius, top_right_radius, bottom_right_radius, bottom_left_radius };
+ return Painting::normalized_border_radius_data(*this, bordered_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());
}
// https://www.w3.org/TR/css-display-3/#out-of-flow
diff --git a/Userland/Libraries/LibWeb/Layout/Box.h b/Userland/Libraries/LibWeb/Layout/Box.h
index e11f3116d8..2457b45099 100644
--- a/Userland/Libraries/LibWeb/Layout/Box.h
+++ b/Userland/Libraries/LibWeb/Layout/Box.h
@@ -10,6 +10,7 @@
#include <LibGfx/Rect.h>
#include <LibWeb/Layout/LineBox.h>
#include <LibWeb/Layout/Node.h>
+#include <LibWeb/Painting/BorderPainting.h>
#include <LibWeb/Painting/StackingContext.h>
namespace Web::Layout {
@@ -125,14 +126,7 @@ public:
virtual float width_of_logical_containing_block() const;
- struct BorderRadiusData {
- float top_left { 0 };
- float top_right { 0 };
- float bottom_right { 0 };
- float bottom_left { 0 };
- };
-
- BorderRadiusData normalized_border_radius_data();
+ Painting::BorderRadiusData normalized_border_radius_data();
protected:
Box(DOM::Document& document, DOM::Node* node, NonnullRefPtr<CSS::StyleProperties> style)
diff --git a/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp b/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp
index ba2760d3bf..e2b2b7b117 100644
--- a/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp
+++ b/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp
@@ -10,6 +10,29 @@
namespace Web::Painting {
+BorderRadiusData normalized_border_radius_data(Layout::Node const& node, Gfx::FloatRect const& rect, CSS::Length top_left_radius, CSS::Length top_right_radius, CSS::Length bottom_right_radius, CSS::Length bottom_left_radius)
+{
+ // FIXME: some values should be relative to the height() if specified, but which? For now, all relative values are relative to the width.
+ auto bottom_left_radius_px = bottom_left_radius.resolved_or_zero(node, rect.width()).to_px(node);
+ auto bottom_right_radius_px = bottom_right_radius.resolved_or_zero(node, rect.width()).to_px(node);
+ auto top_left_radius_px = top_left_radius.resolved_or_zero(node, rect.width()).to_px(node);
+ auto top_right_radius_px = top_right_radius.resolved_or_zero(node, rect.width()).to_px(node);
+
+ // Scale overlapping curves according to https://www.w3.org/TR/css-backgrounds-3/#corner-overlap
+ auto f = 1.0f;
+ f = min(f, rect.width() / (float)(top_left_radius_px + top_right_radius_px));
+ f = min(f, rect.height() / (float)(top_right_radius_px + bottom_right_radius_px));
+ f = min(f, rect.width() / (float)(bottom_left_radius_px + bottom_right_radius_px));
+ f = min(f, rect.height() / (float)(top_left_radius_px + bottom_left_radius_px));
+
+ top_left_radius_px = (int)(top_left_radius_px * f);
+ top_right_radius_px = (int)(top_right_radius_px * f);
+ bottom_right_radius_px = (int)(bottom_right_radius_px * f);
+ bottom_left_radius_px = (int)(bottom_left_radius_px * f);
+
+ return BorderRadiusData { top_left_radius_px, top_right_radius_px, bottom_right_radius_px, bottom_left_radius_px };
+}
+
void paint_border(PaintContext& context, BorderEdge edge, const Gfx::FloatRect& rect, const CSS::ComputedValues& style)
{
const auto& border_data = [&] {
diff --git a/Userland/Libraries/LibWeb/Painting/BorderPainting.h b/Userland/Libraries/LibWeb/Painting/BorderPainting.h
index d64bd66954..5be4342420 100644
--- a/Userland/Libraries/LibWeb/Painting/BorderPainting.h
+++ b/Userland/Libraries/LibWeb/Painting/BorderPainting.h
@@ -11,6 +11,14 @@
namespace Web::Painting {
+struct BorderRadiusData {
+ float top_left { 0 };
+ float top_right { 0 };
+ float bottom_right { 0 };
+ float bottom_left { 0 };
+};
+BorderRadiusData normalized_border_radius_data(Layout::Node const&, Gfx::FloatRect const&, CSS::Length top_left_radius, CSS::Length top_right_radius, CSS::Length bottom_right_radius, CSS::Length bottom_left_radius);
+
enum class BorderEdge {
Top,
Right,