From 28028be2fc63c153643fa3c0e0c30af352c8c348 Mon Sep 17 00:00:00 2001 From: MacDue Date: Fri, 2 Dec 2022 19:20:25 +0000 Subject: [PATCH] LibWeb: Support `repeating-radial-gradient()`s --- Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 8 +++++++- Userland/Libraries/LibWeb/CSS/StyleValue.cpp | 2 ++ Userland/Libraries/LibWeb/CSS/StyleValue.h | 10 +++++++--- .../Libraries/LibWeb/Painting/GradientPainting.cpp | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index b0640d6e3f..00bb73d464 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -2655,8 +2655,14 @@ RefPtr Parser::parse_radial_gradient_function(ComponentValue const& if (!component_value.is_function()) return {}; + auto repeating_gradient = GradientRepeating::No; + auto function_name = component_value.function().name(); + function_name = consume_if_starts_with(function_name, "repeating-"sv, [&] { + repeating_gradient = GradientRepeating::Yes; + }); + if (!function_name.equals_ignoring_case("radial-gradient"sv)) return {}; @@ -2786,7 +2792,7 @@ RefPtr Parser::parse_radial_gradient_function(ComponentValue const& if (!color_stops.has_value()) return {}; - return RadialGradientStyleValue::create(ending_shape, size, at_position, move(*color_stops)); + return RadialGradientStyleValue::create(ending_shape, size, at_position, move(*color_stops), repeating_gradient); } Optional Parser::parse_position(TokenStream& tokens, PositionValue initial_value) diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp index 9fbe190757..72494261ec 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp @@ -1984,6 +1984,8 @@ bool PositionValue::operator==(PositionValue const& other) const String RadialGradientStyleValue::to_string() const { StringBuilder builder; + if (is_repeating()) + builder.append("repeating-"sv); builder.appendff("radial-gradient({} "sv, m_ending_shape == EndingShape::Circle ? "circle"sv : "ellipse"sv); diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index 2696577914..9bdaa3e01e 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -1232,10 +1232,10 @@ public: using Size = Variant; - static NonnullRefPtr create(EndingShape ending_shape, Size size, PositionValue position, Vector color_stop_list) + static NonnullRefPtr create(EndingShape ending_shape, Size size, PositionValue position, Vector color_stop_list, GradientRepeating repeating) { VERIFY(color_stop_list.size() >= 2); - return adopt_ref(*new RadialGradientStyleValue(ending_shape, size, position, move(color_stop_list))); + return adopt_ref(*new RadialGradientStyleValue(ending_shape, size, position, move(color_stop_list), repeating)); } virtual String to_string() const override; @@ -1255,15 +1255,18 @@ public: Gfx::FloatSize resolve_size(Layout::Node const&, Gfx::FloatPoint, Gfx::FloatRect const&) const; + bool is_repeating() const { return m_repeating == GradientRepeating::Yes; } + virtual ~RadialGradientStyleValue() override = default; private: - RadialGradientStyleValue(EndingShape ending_shape, Size size, PositionValue position, Vector color_stop_list) + RadialGradientStyleValue(EndingShape ending_shape, Size size, PositionValue position, Vector color_stop_list, GradientRepeating repeating) : AbstractImageStyleValue(Type::RadialGradient) , m_ending_shape(ending_shape) , m_size(size) , m_position(position) , m_color_stop_list(move(color_stop_list)) + , m_repeating(repeating) { } @@ -1271,6 +1274,7 @@ private: Size m_size; PositionValue m_position; Vector m_color_stop_list; + GradientRepeating m_repeating; struct ResolvedData { Painting::RadialGradientData data; diff --git a/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp b/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp index 3bac34b8a9..5247baeed1 100644 --- a/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp +++ b/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp @@ -163,7 +163,7 @@ RadialGradientData resolve_radial_gradient_data(Layout::Node const& node, Gfx::F radial_gradient.color_stop_list(), [&](auto const& length_percentage) { return length_percentage.resolved(node, gradient_length).to_px(node) / gradient_size.width(); }, - false); + radial_gradient.is_repeating()); return { resolved_color_stops }; }